diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b3736f..6707c5a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -41,8 +41,83 @@
 
 ### Language
 
-*   **[IN PREVIEW]** [Static extension members][]: A new language feature allowing
-    specially declared static functions to be invoked
+* **Breaking Change**: [Static extension members][] are accessible when
+imported with a prefix (issue [671][]). In the extension method **preview**
+launch, importing a library with a prefix hid all extension members in
+addition to hiding the extension name, thereby making them inaccessible
+in the importing library except via the explicit override syntax. Based
+on user feedback, we have changed this to make extensions methods accessible
+even when imported with a prefix.
+
+    ```dart
+      // "thing.dart"
+      class Thing {
+      }
+      extension Show on Thing {
+        void show() {
+          print("This is a thing");
+        }
+     }
+     // "client.dart"
+     import "thing.dart" as p;
+     void test() {
+       p.Thing().show(); // Previously an error, now resolves to Show.show
+     }
+    ```
+
+[Static extension members]: https://github.com/dart-lang/language/blob/master/accepted/2.6/static-extension-members/feature-specification.md
+[671]: https://github.com/dart-lang/language/issues/671
+
+### Core libraries
+
+#### `dart:io`
+
+* **Breaking change**: Added `IOOverrides.serverSocketBind` to aid in writing
+  tests that wish to mock `ServerSocket.bind`.
+
+### Dart VM
+
+* New fields added to existing instances by a reload will now be initialized
+lazily, as if the field was a late field. This makes the initialization order
+program-defined, whereas previously it was undefined.
+
+### Tools
+
+#### Linter
+
+The Linter was updated to `0.1.103`, which includes:
+
+* updates to `prefer_relative_imports` to use a faster and more robust way to check for self-package references
+* updates to our approach to checking for `lib` dir contents (speeding up `avoid_renaming_method_parameters` and
+  making `prefer_relative_imports` and `public_member_api_docs` amenable to internal package formats -- w/o pubspecs)
+
+#### Pub
+
+* `pub get` generates [`.dart_tools/package_config.json`](https://github.com/dart-lang/language/blob/62c036cc41b10fb543102d2f73ee132d1e2b2a0e/accepted/future-releases/language-versioning/package-config-file-v2.md)
+  in addition to `.packages` to support language versioning.
+
+* `pub publish` now warns about the old flutter plugin registration format.
+
+* `pub publish` now warns about the `author` field in pubspec.yaml being.
+  obsolete.
+
+* Show a proper error message when `git` is not installed.
+
+## 2.6.1 - 2019-11-11
+
+This is a patch release that reduces dart2js memory usage (issue [27883][]),
+improves stability on arm64 (issue [39090][]) and updates the Dart FFI
+documentation.
+
+[27883]: https://github.com/dart-lang/sdk/issues/27883
+[39090]: https://github.com/dart-lang/sdk/issues/39090
+
+## 2.6.0 - 2019-11-05
+
+### Language
+
+*   **[IN PREVIEW]** [Static extension members][]: A new language feature
+    allowing specially declared static functions to be invoked
     like instance members on expressions of appropriate static types
     is available in preview.
 
@@ -133,7 +208,7 @@
     for accessing the value in native memory and `[]` and `[]=` for indexed access.
     The method `asExternalTypedData` has been replaced with `asTypedList` extension
     methods. And finally, `Structs` do no longer have a type argument and are
-    accessed the extension member `.ref` on `Pointer`.
+    accessed using the extension member `.ref` on `Pointer`.
     These changes makes the code using `dart:ffi` much more concise.
 *   **Breaking change**: The memory management has been removed (`Pointer.allocate`
     and `Pointer.free`). Instead, memory management is available in
@@ -142,7 +217,7 @@
     instead.
 *   Faster memory load and stores.
 *   The dartanalyzer (commandline and IDEs) now reports `dart:ffi` static errors.
-*   Callbacks are now supported in AOT (ahead-of-time) compiled code.
+*   Callbacks are now supported in AOT (ahead-of-time) compiled code.
 
 ### Dart for the Web
 
diff --git a/DEPS b/DEPS
index 7614351..4c62d63 100644
--- a/DEPS
+++ b/DEPS
@@ -54,7 +54,7 @@
   "gperftools_revision": "e9ab4c53041ac62feefbbb076d326e9a77dd1567",
 
   # Revisions of /third_party/* dependencies.
-  "args_tag": "1.5.0",
+  "args_tag": "1.5.2",
   "async_tag": "2.0.8",
   "bazel_worker_tag": "v0.1.22",
   "benchmark_harness_tag": "81641290dea44c34138a109a37e215482f405f81",
@@ -84,8 +84,7 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.3.2",  # Please see the note above before updating.
 
-  "args_tag" : "1.5.2",
-  "dartdoc_tag" : "v0.29.0",
+  "dartdoc_tag" : "v0.29.1",
   "ffi_tag": "ea88d71b043ee14b268c3aedff14e9eb32e20959",
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
@@ -118,7 +117,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
   "protobuf_rev": "3746c8fd3f2b0147623a8e3db89c3ff4330de760",
-  "pub_rev": "80ac76400ff58fde3c5a335d860d196c3febe837",
+  "pub_rev": "d15067931a6b671a1c9dcc98b5923347676269cf",
   "pub_semver_tag": "1.4.2",
   "quiver-dart_tag": "2.0.0+1",
   "resource_rev": "f8e37558a1c4f54550aa463b88a6a831e3e33cd6",
@@ -176,14 +175,14 @@
   Var("dart_root") + "/tools/sdks": {
       "packages": [{
           "package": "dart/dart-sdk/${{platform}}",
-          "version": "version:2.6.0-dev.4.0",
+          "version": "version:2.6.0",
       }],
       "dep_type": "cipd",
   },
   Var("dart_root") + "/third_party/d8": {
       "packages": [{
           "package": "dart/d8",
-          "version": "version:7.5.149",
+          "version": "version:7.8.279",
       }],
       "dep_type": "cipd",
   },
@@ -427,7 +426,7 @@
     "packages": [
       {
         "package": "dart/language_model",
-        "version": "9fJQZ0TrnAGQKrEtuL3-AXbUfPzYxqpN_OBHr9P4hE4C",
+        "version": "lIRt14qoA1Cocb8j3yw_Fx5cfYou2ddam6ArBm4AI6QC",
       }
     ],
     "dep_type": "cipd",
@@ -468,7 +467,7 @@
     "packages": [
       {
         "package": "dart/cfe/dart2js_dills",
-        "version": "binary_version:36",
+        "version": "binary_version:29_36",
       }
     ],
     "dep_type": "cipd",
diff --git a/benchmarks/IsolateJson/dart/IsolateJson.dart b/benchmarks/IsolateJson/dart/IsolateJson.dart
new file mode 100644
index 0000000..bdc7988
--- /dev/null
+++ b/benchmarks/IsolateJson/dart/IsolateJson.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import 'package:benchmark_harness/benchmark_harness.dart' show BenchmarkBase;
+import 'package:meta/meta.dart';
+
+class JsonDecodingBenchmark {
+  JsonDecodingBenchmark(this.name,
+      {@required this.sample, @required this.numTasks});
+
+  Future<void> report() async {
+    final stopwatch = Stopwatch()..start();
+    final decodedFutures = <Future>[];
+    for (int i = 0; i < numTasks; i++) {
+      decodedFutures.add(decodeJson(sample));
+    }
+    await Future.wait(decodedFutures);
+
+    print("$name(RunTime): ${stopwatch.elapsedMicroseconds} us.");
+  }
+
+  final String name;
+  final Uint8List sample;
+  final int numTasks;
+}
+
+Uint8List createSampleJson(final size) {
+  final list = List.generate(size, (i) => i);
+  final map = <dynamic, dynamic>{};
+  for (int i = 0; i < size; i++) {
+    map['$i'] = list;
+  }
+  return utf8.encode(json.encode(map));
+}
+
+class JsonDecodeRequest {
+  final SendPort sendPort;
+  final Uint8List encodedJson;
+  const JsonDecodeRequest(this.sendPort, this.encodedJson);
+}
+
+Future<Map> decodeJson(Uint8List encodedJson) async {
+  final port = ReceivePort();
+  final inbox = StreamIterator<dynamic>(port);
+  final workerExitedPort = ReceivePort();
+  await Isolate.spawn(
+      jsonDecodingIsolate, JsonDecodeRequest(port.sendPort, encodedJson),
+      onExit: workerExitedPort.sendPort);
+  await inbox.moveNext();
+  final decodedJson = inbox.current;
+  await workerExitedPort.first;
+  port.close();
+  return decodedJson;
+}
+
+Future<void> jsonDecodingIsolate(JsonDecodeRequest request) async {
+  request.sendPort.send(json.decode(utf8.decode(request.encodedJson)));
+}
+
+class SyncJsonDecodingBenchmark extends BenchmarkBase {
+  SyncJsonDecodingBenchmark(String name,
+      {@required this.sample, @required this.iterations})
+      : super(name);
+
+  @override
+  void run() {
+    int l = 0;
+    for (int i = 0; i < iterations; i++) {
+      final Map map = json.decode(utf8.decode(sample));
+      l += map.length;
+    }
+    assert(l > 0);
+  }
+
+  final Uint8List sample;
+  final int iterations;
+}
+
+class BenchmarkConfig {
+  BenchmarkConfig(this.suffix, this.sample);
+
+  final String suffix;
+  final Uint8List sample;
+}
+
+Future<void> main() async {
+  final jsonString =
+      File('benchmarks/IsolateJson/dart/sample.json').readAsStringSync();
+  final json250KB = utf8.encode(jsonString); // 294356 bytes
+  final decoded = json.decode(utf8.decode(json250KB));
+  final decoded1MB = <dynamic, dynamic>{
+    "1": decoded["1"],
+    "2": decoded["1"],
+    "3": decoded["1"],
+    "4": decoded["1"],
+  };
+  final json1MB = utf8.encode(json.encode(decoded1MB)); // 1177397 bytes
+  decoded["1"] = (decoded["1"] as List).sublist(0, 200);
+  final json100KB = utf8.encode(json.encode(decoded)); // 104685 bytes
+  decoded["1"] = (decoded["1"] as List).sublist(0, 100);
+  final json50KB = utf8.encode(json.encode(decoded)); // 51760 bytes
+
+  final configs = <BenchmarkConfig>[
+    BenchmarkConfig("50KB", json50KB),
+    BenchmarkConfig("100KB", json100KB),
+    BenchmarkConfig("250KB", json250KB),
+    BenchmarkConfig("1MB", json1MB),
+  ];
+
+  for (BenchmarkConfig config in configs) {
+    for (final iterations in <int>[1, 4]) {
+      await JsonDecodingBenchmark(
+              "IsolateJson.Decode${config.suffix}x$iterations",
+              sample: config.sample,
+              numTasks: iterations)
+          .report();
+      SyncJsonDecodingBenchmark(
+              "IsolateJson.SyncDecode${config.suffix}x$iterations",
+              sample: config.sample,
+              iterations: iterations)
+          .report();
+    }
+  }
+}
diff --git a/benchmarks/IsolateJson/dart/sample.json b/benchmarks/IsolateJson/dart/sample.json
new file mode 100644
index 0000000..8d3888c
--- /dev/null
+++ b/benchmarks/IsolateJson/dart/sample.json
@@ -0,0 +1 @@
+{"1":[{"1":{"1":"https://images.pexels.com/photos/733416/pexels-photo-733416.jpeg?cs=srgb&dl=animal-dog-pet-733416.jpg&fm=jpg","3":4608,"4":3456},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQw3eEZzgfnJWrfcDcwVIMy_Y1V5XoFESHax7oIlPzSQxJ-9s4o4A","3":200,"4":149},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"You can find photos of bulldogs, retrievers, beagles and of course puppies.","10":"SguaQKdRqRdlsC"},"5":{"1":"lLLVuSKOKaBoUui"}},{"1":{"1":"http://www.petmd.com/sites/default/files/Dogs-and-vomiting.jpg","3":590,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRTC2-E8GsGxryTokj2Djx33PcWpZAMYjiQRoIDS31Ux-ENHEWH","3":200,"4":144},"3":{"1":"PetMD","2":"https://www.petmd.com/dog/conditions/digestive/different-types-dog-vomit-and-what-they-indicate","3":"Different Types of Dog Vomit, and What They Indicate | petMD","4":"Different Types of Dog Vomit, and What They Indicate","10":"rgVRJtKOVXpdLe"},"5":{"1":"xUEbAsVXOsAMkMO"}},{"1":{"1":"https://images.pexels.com/photos/356378/pexels-photo-356378.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcToY88EZcEUA-UgqGCQVzuvR-8YxpK8RzNKMdd4KyeleCu35qyw","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"Free stock photo of animal, dog, pet, cute","10":"WFheUvWgXjwXtD"},"5":{"1":"prHPnfIfXBtFhXY"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/09/dogs-catching-treats-fotos-frei-schnauze-christian-vieler-66-57e8d9d0ec7ee__880.jpg","3":880,"4":660},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTr_sMZE8eDNndt5ttEAqacKcA-7IgQ0naBGd3A9XVG1GCIWdjj","3":200,"4":149},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/dogs-catching-treats-fotos-frei-schnauze-christian-vieler/","3":"Hilarious Expressions Of Dogs Trying To Catch Treats In Mid ...","4":"Dog Catching Treat","10":"hCBhQWwnqCrhel"},"5":{"1":"QalunmBgihmCcmj"}},{"1":{"1":"https://i.ytimg.com/vi/GruPNmCb-fQ/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYVG0JeW7ISz-4OcZ0CiUb0AE3cni6IzuGPYVIbJoAccAM2Umx","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=GruPNmCb-fQ","3":"dogs pictures of dogs","4":"","10":"MJJqMJlsVluLXc"},"5":{"1":"iMAXrPRULaMbSKm"},"7":{"1":{"11":{"1":"dogs pictures of dogs","2":"dogs barking, dogs 101, dogs mating, dogs howling, dogs who fail at being  dogs, dogs and babies, dogs funny, dogs talking, dogs annoying cats with  their frie...","3":"0:55","4":"149947","5":"1439251200000","6":"lifestyle","7":"505","8":"16"}}}},{"1":{"1":"https://i2-prod.mirror.co.uk/incoming/article9769854.ece/ALTERNATES/s615/PROD-Mixed-breed-lab-cross-8-week-old-puppy-in-farm-yard-near-Cochrane-AlbertajpgED.jpg","3":615,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqOXnBZYPgzFX8sgcA1iTrixxTbt15sDmyqN1Sy07IXB4acmbM","3":200,"4":133},"3":{"1":"Irish Mirror","2":"https://www.irishmirror.ie/news/world-news/facts-secret-life-of-dogs-9769971","3":"20 amazing dog facts as you watch Secret Life of Dogs series ...","4":"Mixed breed (lab cross) 8-week old puppy in farm","10":"pRFceHyATKdlWr"},"5":{"1":"pNVdrhPrtToqnQq"}},{"1":{"1":"https://images.pexels.com/photos/36477/dogs-batons-play-bite.jpg?auto=compress&cs=tinysrgb&h=350","3":712,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSrHgf1GKr5sPjRAytMGs5xrzQ4akViEXH5sPlgs3wGKv4IiFVY9A","3":200,"4":98},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dogs/","3":"1000+ Great Dogs Photos · Pexels · Free Stock Photos","4":"White Short Coat Dog","10":"kVfxtLWgXLSNXO"},"5":{"1":"IArTKYCDEkFNdQJ"}},{"1":{"1":"https://s.abcnews.com/images/US/160825_vod_orig_historyofdogs_16x9_992.jpg","3":992,"4":558},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiS1BpxgmU8dZtUcZM9ZhCLH0MVGioF9jOuVeSUeKJorZqblc6Zw","3":200,"4":112},"3":{"1":"ABC News - Go.com","2":"https://abcnews.go.com/Lifestyle/history-dogs-pets/story?id=41671149","3":"The History of Dogs as Pets - ABC News","4":"buffering","10":"qPlCWSIdyKBbrM"},"5":{"1":"fXDVNQwDhIpuOwD"}},{"1":{"1":"https://media.mnn.com/assets/images/2013/10/Corgeek.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtIZicNvg3fENA9X_vbniL40lcfwe7ioZJ6YulS0GmFe6GfGXI1A","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/family/pets/stories/31-photos-of-dogs-wearing-glasses","3":"29 photos of dogs wearing glasses | MNN - Mother Nature Network","4":"Corgeek wearing thick-rimmed glasses","10":"lSHpPWQpaPISjU"},"5":{"1":"GYKvLpLqDGPFJXg"}},{"1":{"1":"https://static.scientificamerican.com/sciam/cache/file/B7943D3A-35D3-4D27-906280F095578EC2.jpg","3":320,"4":320},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNCsn1AuroUrSnWm7f1Wykc9ROorMxkSXPHY-AVOOgV6L-0N0T","3":200,"4":200},"3":{"1":"Scientific American","2":"https://www.scientificamerican.com/article/the-origin-of-dogs/","3":"The Origin of Dogs - Scientific American","4":"","10":"fxsACuFxGdCjOi"},"5":{"1":"hugEXJRCUBEtjsd"}},{"1":{"1":"https://cdn.psychologytoday.com/sites/default/files/styles/image-article_inline_full/public/field_blog_entry_images/2018-03/sandeephanda.jpg?itok=iXHqSFgZ","3":639,"4":430},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFEOQ3smXMSwFXqUvEr1vJ5x21ciMWO0gAiGNpRCvg5rhwxDkD","3":200,"4":134},"3":{"1":"Psychology Today","2":"https://www.psychologytoday.com/us/blog/canine-corner/201803/are-there-some-truths-behind-isle-dogs","3":"Are There Some Truths Behind 'Isle of Dogs'? | Psychology Today","4":"SandeepHanda photo - Creative Commons License CC0","10":"bagMKHtgcbRaDB"},"5":{"1":"modfWdcGLNxQAyJ"}},{"1":{"1":"https://www.healthline.com/hlcmsresource/images/Dog-Breeds-Health-Problems/3180-Pug_green_grass-732x549-thumbnail.jpg","3":732,"4":549},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9fyeRFN6y6AUMwe_0vQvP7mCIf5iurFZrTAcei1CQlN2gfwqrig","3":200,"4":149},"3":{"1":"Healthline","2":"https://www.healthline.com/health/dog-breeds-and-health-issues","3":"12 Common Dog Breeds and Their Health Issues","4":"","10":"JhFfVvGodohGEK"},"5":{"1":"oeXrDfFoklVmGtq"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/09/dogs-catching-treats-fotos-frei-schnauze-christian-vieler-4-57e8d08f5fc8f__880.jpg","3":880,"4":1173},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTHMV0D4vwUH9TK5xMCanXYzWgaKAefyVB33Ehg06OK31Nwqm9g","3":149,"4":200},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/dogs-catching-treats-fotos-frei-schnauze-christian-vieler/","3":"Hilarious Expressions Of Dogs Trying To Catch Treats In Mid ...","4":"Dog Catching Treat","10":"FyEKtGxRPjfnKO"},"5":{"1":"hDUbUkdaJjjbuqP"}},{"1":{"1":"http://www.dogbreedslist.info/uploads/allimg/dog-pictures/Beagle-1.jpg","3":400,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQox7_4om515DH4IbD8Prr6Sbnq30OFIJjaqMeHIjlsLy7nvUfX5w","3":200,"4":149},"3":{"1":"Dog Breeds List","2":"http://www.dogbreedslist.info/all-dog-breeds/","3":"All Dog Breeds, All Dog Types, All Dog List Names & Pictures","4":"Beagle","10":"bfNEoguPVtbtLd"},"5":{"1":"CnXysoILLwWyCtD"}},{"1":{"1":"https://media1.fdncms.com/stranger/imager/u/original/25231124/dog-stock-photos-9.jpg","3":700,"4":508},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIvUyRcVTeIRW3TJQfwIJAZhoPB4cr_OKWIc0zVIZoEv63MkmHYA","3":200,"4":144},"3":{"1":"The Stranger","2":"https://www.thestranger.com/slog/2017/06/21/25230993/drunk-man-killed-by-a-pack-of-dogs","3":"Drunk Man Eaten Alive By a Pack of Dogs - Slog - The Stranger","4":"This is a free stock photo of a dog. If you want to see the","10":"IgSvbNIltWEEwd"},"5":{"1":"cYgCBcJcaUhVfax"}},{"1":{"1":"https://i.dailymail.co.uk/i/pix/2017/04/24/16/3F907F8A00000578-4440672-image-m-84_1493049047546.jpg","3":470,"4":518},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSncPu-uh8ZvUmH5pHt44DzkScX-iiFVHHSJPZXJpob0NJKtJ9ylg","3":181,"4":200},"3":{"1":"Daily Mail","2":"https://www.dailymail.co.uk/sciencetech/article-4440672/Map-shows-breeds-dogs-evolved-globe.html","3":"Map shows how breeds of dogs evolved around the globe | Daily ...","4":"The researchers have spent year sequencing the genomes of dogs, including  golden retrievers (pictured","10":"IexeHMwHeSSRNj"},"5":{"1":"pAbGXlIdKaoFpeq"}},{"1":{"1":"https://www.telegraph.co.uk/content/dam/Pets/spark/royal-canin/rc-7_dogs.jpg?imwidth=450","3":480,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQNFuT_iGr6VUtsCWNJPagVAQbwr38Hf60DH71_60-P6Q43IccrbA","3":200,"4":124},"3":{"1":"The Telegraph","2":"https://www.telegraph.co.uk/pets/essentials/seven-types-of-dog/","3":"The 7 types of dog","4":"7 types of dog","10":"NMEuhtiMRpwOpI"},"5":{"1":"OfowkXWGdhgIatC"}},{"1":{"1":"https://amp.businessinsider.com/images/5ab514477708e97acc0f0cc9-750-562.jpg","3":750,"4":562},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDknn1s15Hxsl9Ia0VWFreeM2JQ3j_1quuxN2gct1k2UNs-mKjDg","3":200,"4":149},"3":{"1":"Business Insider","2":"https://www.businessinsider.com/isle-of-dogs-movie-i-love-dogs-tweets-reactions-2018-3","3":"Isle of Dogs' is pronounced 'I love dogs' and people are ...","4":"Isle of Dogs movie Wes Anderson Fox Searchlight Pictures","10":"iXypfDeEmRoQat"},"5":{"1":"HTpoQgGnRUeWIXc"}},{"1":{"1":"https://images.agoramedia.com/everydayhealth/gcms/Best-and-Worst-Dog-Breeds-for-Allergies-06-1440x810.jpg?width=730","3":730,"4":410},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_xRgFtXHo-nTTWZhLeZWReUdLNv2kLjUdVqneQsYHTG1Ql83_","3":200,"4":112},"3":{"1":"Everyday Health","2":"https://www.everydayhealth.com/allergy-pictures/best-and-worst-dog-breeds-for-people-with-allergies.aspx","3":"Best and Worst Dog Breeds for People With Allergies ...","4":"Best: The Bichon Frise and Labradoodle Are Great Hypoallergenic Dogs","10":"ehAAXIHECfjrGJ"},"5":{"1":"wdVCorFRYSIGGKr"}},{"1":{"1":"http://www.insidedogsworld.com/wp-content/uploads/2016/03/Dog-Pictures.jpg","3":1600,"4":1092},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSwCLO0IhU0gJtCtO7z_oe2TqADEtc_s57hjyxba-omx7Q524EF","3":200,"4":136},"3":{"1":"Inside Dogs World","2":"http://www.insidedogsworld.com/doggy-dna-learn-how-to-determine-your-dogs-breed/","3":"Doggy DNA - Learn How to Determine Your Dog's Breed - Inside ...","4":"Doggy DNA – Learn How to Determine Your Dog's Breed","10":"uuCtKfTFMKWRRC"},"5":{"1":"EQBsTFvYFYLhfah"}},{"1":{"1":"https://www.planwallpaper.com/static/images/3e9c5ad3af07e573b0e74bdb0a1dce3e.jpg","3":1600,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQkrUyVlOK9hkIWgIDkh4os23NxTTL925HmkGHa0KhalcOy29at","3":200,"4":149},"3":{"1":"planwallpaper.com","2":"https://www.planwallpaper.com/pictures-dogs","3":"Nice pictures of different types of dogs including, Labrador ...","4":"Pictures of Dogs","10":"mklFCiXFYyFYkP"},"5":{"1":"FlnaWswreHfokNn"}},{"1":{"1":"https://pbs.twimg.com/profile_images/962016398657536000/ygoklDXh_400x400.jpg","3":400,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR45pwTGoDqneOjTgTvSA6rhDEkmhprQi08wkhcR3qIW3vLNSZuaQ","3":200,"4":200},"3":{"1":"Twitter","2":"https://twitter.com/isleofdogsmovie","3":"Isle of Dogs (@isleofdogsmovie) | Twitter","4":"Isle of Dogs","10":"COMSuLFTKJfFRc"},"5":{"1":"NXbmwUJVPlrVJDq"}},{"1":{"1":"https://www.telegraph.co.uk/content/dam/news/2017/10/16/alamy_trans_NvBQzQNjv4Bq_yHCl97T-pmmS890d_-lMLlnpmZnLOvn-dZ00jolDcU.png?imwidth=450","3":480,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpabtx60ZO8jN9PviVFQHSNuHQE4Hohoo2nEZG0wDm7WRLYtH2cw","3":200,"4":124},"3":{"1":"The Telegraph","2":"https://www.telegraph.co.uk/news/2017/10/16/california-first-us-state-bans-sale-dogs-puppy-mills/","3":"California to be first US state that bans sale of dogs from ...","4":"Follow the author of this article","10":"AbJpjbQJvFhEOp"},"5":{"1":"aLDaXCkraGQRXJj"}},{"1":{"1":"https://images.pexels.com/photos/850602/pexels-photo-850602.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR13B6xa4L-1BX-lW6akzUcZGSagbZX-aZpI4ynZ8H8EBufjEgk","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dogs/","3":"1000+ Great Dogs Photos · Pexels · Free Stock Photos","4":"Photography of Three Dogs Looking Up","10":"bCleKSaPgwaqsp"},"5":{"1":"HqvqIYprPdbySFd"}},{"1":{"1":"https://g77v3827gg2notadhhw9pew7-wpengine.netdna-ssl.com/wp-content/uploads/2017/02/side-effects-of-dog-seizures_canna-pet-e1488305138683-1024x675.jpg","3":1024,"4":675},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcROkfK9Akkc6FPWW6QbNvnIZIvYc2jh6J-FiFW6i6cVMFWGs6CS","3":200,"4":131},"3":{"1":"Canna-Pet","2":"https://canna-pet.com/side-effects-dog-seizures/","3":"Side Effects of Dog Seizures | Canna-Pet","4":"When your dog suffers from a seizure, things can get scary. Unless you have  prior experience dealing ...","10":"CuWqYDalAItEAC"},"5":{"1":"ShraFjJEYLkJTuM"}},{"1":{"1":"https://gfnc1kn6pi-flywheel.netdna-ssl.com/wp-content/uploads/2016/12/beagle.jpg","3":2734,"4":1503},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3tZYFHIKJ_a_DdRQ7iwKDgbdovkQxiOGePEGb4LO0jA1ZiFL9Yg","3":200,"4":109},"3":{"1":"The Happy Puppy Site","2":"https://thehappypuppysite.com/dog-breed-groups/","3":"Different Types Of Dogs: The Dog Breed Groups Explained","4":"","10":"PjvrqgbFNJbdVk"},"5":{"1":"yatyBgWoyTxLMtP"}},{"1":{"1":"http://images6.fanpop.com/image/photos/33200000/cute-puppy-dogs-33237869-1024-768.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRo2A34saU-H_gKu_2IRv3s1V9iDvCSj8GCu5UPEglrHBh4Kp8qEw","3":200,"4":149},"3":{"1":"Fanpop","2":"http://www.fanpop.com/clubs/dogs/images/33237869/title/cute-puppy-photo","3":"Dogs images cute puppy HD wallpaper and background photos ...","4":"Dogs images cute puppy HD wallpaper and background photos","10":"egPjrYYHpdvPme"},"5":{"1":"EEICyeYkCvYwXLO"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/dog-how-to-select-your-new-best-friend-thinkstock99062463.jpg","3":2048,"4":1536},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRIvpifkq9hrRGj8H8kia131DoNNU69BJD13Vbh0RS1Fyc3eir","3":200,"4":149},"3":{"1":"Petfinder","2":"https://www.petfinder.com/pet-adoption/dog-adoption/type-dog-adoption/","3":"What Kind of Dog is Right for You? | Petfinder","4":"How to Select Your New Best Friend","10":"hvnHFcgyhBEWKo"},"5":{"1":"XvtJWtvCTtTUGUE"}},{"1":{"1":"https://phz8.petinsurance.com/-/media/all-phz-images/2016-images-850/painful_condition_dogs850.jpg","3":850,"4":477},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUaqtvYYYQKvrfvutDGGaiNT8vb-nmbFhs4svZisNCJutwkT7s","3":200,"4":112},"3":{"1":"Pet HealthZone - Nationwide Pet Insurance","2":"https://phz8.petinsurance.com/ownership-adoption/pet-ownership/pet-behavior/secret-language-of-dogs","3":"Secret Language of Dogs","4":"5 of the Most Painful Conditions for Dogs Infographic","10":"WvTABueqaEenmO"},"5":{"1":"RnDslGiNkbYImvT"}},{"1":{"1":"https://boygeniusreport.files.wordpress.com/2016/11/puppy-dog.jpg?quality=98&strip=all&w=782","3":782,"4":529},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRtCG9yitxng6vXipfsQ9Ix4kKetdMjZqC6SEsLsaWiUXpvn2DoWw","3":200,"4":135},"3":{"1":"BGR.com","2":"https://bgr.com/2018/04/30/dog-food-recall-illness-2018-australia/","3":"Pet food maker whose food sickened dozens of dogs will now ...","4":"dog food recall","10":"CnJIxRQSgtHwrK"},"5":{"1":"efIduFqGkIJUaKO"}},{"1":{"1":"https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2017/11/14144545/Afghan-Hound.981631440-400x267.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSEOtJxduRSati0Da8xMEWEu-XkITbsLG9p7HRWqPdom6wq7ZpSbQ","3":200,"4":133},"3":{"1":"American Kennel Club","2":"https://www.akc.org/dog-breeds/largest-dog-breeds/","3":"Largest Dog Breeds – American Kennel Club","4":"Afghan Hound","10":"fYEbncuQaxwNql"},"5":{"1":"YAgwGCfdvHlIfNe"}},{"1":{"1":"http://www.termcoord.eu/wp-content/uploads/2014/06/Dog1-300x300.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyYEIkXsOSEDtelosTsFUwgOvndtVRU05csD-Xls1ih23V6xkIQg","3":200,"4":200},"3":{"1":"TermCoord","2":"http://termcoord.eu/2014/06/language-dogs/","3":"The Language of Dogs - Terminology Coordination Unit [DGTRAD ...","4":"Whether you're a cat or dog person, or even a… turtle person, knowing what  your pet is trying to say ...","10":"tqEScIlTpwyTGg"},"5":{"1":"IltOuDYoEvnfdNp"}},{"1":{"1":"https://2.bp.blogspot.com/-fZNgK0_TgOc/WK82Vp7SKoI/AAAAAAAAClQ/Wp-ptafLniU4Qrq21v9_-GceX1wScZklgCLcB/s1600/dog-puppy-info.jpg","3":736,"4":1128},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTef30plTwjVco7_6sYT-1MGDCo13ArTTkrRDKgdS5RY7nHabQ9ZA","3":130,"4":200},"3":{"1":"Companion Animal Psychology","2":"https://www.companionanimalpsychology.com/p/all-about-dogs.html","3":"Companion Animal Psychology: All About Dogs","4":"Essential info for owners of dogs, like this cute mixed-breed puppy","10":"tCihFexyfCGTyK"},"5":{"1":"DXPnPecpPDdVSyL"}},{"1":{"1":"http://discovermagazine.com/~/media/Images/Issues/2016/December/DSC-A1216_01.jpg","3":1200,"4":1054},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcToOmuh2CoCK5KII7an_lwwd9QvDUXWFv-o5C3ZtTpIMkkxeIFMkg","3":200,"4":175},"3":{"1":"Discover Magazine","2":"http://discovermagazine.com/2016/dec/the-origins-of-dogs","3":"The Origins of Dogs | DiscoverMagazine.com","4":"William Zuback/Discover","10":"SYCeycfBKoolRt"},"5":{"1":"qMPWqKXVSSnvyAS"}},{"1":{"1":"https://www.petmd.com/sites/default/files/excess-protein-urine-dogs.jpg","3":590,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXDZ8HeQFcHunFGNZn9x_lNaMnT4RNp6musZ8E9uWkt2E8L97HCA","3":200,"4":144},"3":{"1":"PetMD","2":"https://www.petmd.com/dog/conditions/urinary/c_multi_proteinuria","3":"Excess Protein in the Urine of Dogs | petMD","4":"Excess Protein in the Urine of Dogs","10":"FYHbeBBukLntuP"},"5":{"1":"CyfaFOmUMgNnQab"}},{"1":{"1":"https://timedotcom.files.wordpress.com/2017/04/world-of-dogs-06.jpg","3":2560,"4":1828},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQC_HWVgXvr-oaEoiPhQCqlakG4CjOJhOFpO0iz1offaVxC8saPTA","3":200,"4":142},"3":{"1":"Time","2":"http://time.com/4775436/how-smart-is-a-dog-really/","3":"A Dog's Brain: Inside the Complex Canine Mind | Time","4":"Isabella, a 14 year-old Pomeranian photographed in New York, NY on April","10":"efLLIMPDyVtVHU"},"5":{"1":"muCEStXmFieFAXV"}},{"1":{"1":"https://www.indiewire.com/wp-content/uploads/2018/02/05-isle-of-dogs-1-w710-h473.jpg?w=710","3":710,"4":473},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQZ5l8kHahaV_4Y9pHXud4pFwy4dG1DSUy5Pq5L_BBUcKCRyvo6og","3":200,"4":133},"3":{"1":"IndieWire","2":"https://www.indiewire.com/2018/02/wes-anderson-isle-of-dogs-soundtrack-kurosawa-seven-samurai-1201933682/","3":"Wes Anderson's 'Isle of Dogs' Official Soundtrack Revealed ...","4":"\"Isle of Dogs\"","10":"KIxyaUxLUheWqo"},"5":{"1":"cmMlrpWYBWodKUt"}},{"1":{"1":"https://doggonesafe.com/Resources/Pictures/close%20up%20on%20two%20dogs%20mouths.jpg","3":1600,"4":1066},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSvSC5m7zvD0WLFNVWXbdtql8yUsa_QODDOSoLBxzmueG463wVm","3":200,"4":133},"3":{"1":"Doggone Safe","2":"https://doggonesafe.com/event-2017914","3":"Doggone Safe - Learn How To Effectively Manage Groups of Dogs ...","4":"Learn How To Effectively & Safely Manage Groups of Dogs In an Off Leash  Environment","10":"bMtNLBtEdWoimM"},"5":{"1":"kIroRbkLSsunErY"}},{"1":{"1":"https://ksassets.timeincuk.net/wp/uploads/sites/55/2018/03/Isle-Of-Dogs-Wes-Anderson-920x584.jpg","3":920,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBtFZgJ_dAq_1mez2TICKHMQF8A5Y_H2TOdjTbhKwI5gJpalpj6Q","3":200,"4":126},"3":{"1":"NME.com","2":"https://www.nme.com/news/film/wes-anderson-isle-of-dogs-accused-of-cultural-appropriation-2270903","3":"Wes Anderson's new film 'Isle Of Dogs' accused of cultural ...","4":"Wes Anderson's 'Isle Of Dogs' Credit: Press/Fox Searchlight","10":"WeFAhcACgFtWre"},"5":{"1":"WSjvUvHYAcYxlOV"}},{"1":{"1":"https://www.southwalesargus.co.uk/resources/images/8069964/?type=responsive-gallery-fullscreen","3":1200,"4":853},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSPbAFtbuGs_brIhYaS5WeL1XS3d_-0cobmR3emTzDOfFIAOYcYKA","3":200,"4":142},"3":{"1":"South Wales Argus","2":"https://www.southwalesargus.co.uk/news/16354776.dog-of-the-week-special-urgent-homes-needed-for-influx-of-dogs/","3":"DOG OF THE WEEK SPECIAL: Urgent homes needed for influx of ...","4":"DOG OF THE WEEK SPECIAL: Urgent homes needed for influx of dogs","10":"iPPwrCQrHtUwnj"},"5":{"1":"ThnKbyBJkSonlPR"}},{"1":{"1":"http://images1.fanpop.com/images/photos/1900000/Puppy-3-dogs-1993798-1024-768.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRT4zOhw6SIGsnLaqC8XG3RQTwx1iEJKT98YoiDDYgCKr2dGWhrjw","3":200,"4":149},"3":{"1":"Fanpop","2":"http://www.fanpop.com/clubs/dogs/images/1993798/title/puppy-3-wallpaper","3":"Dogs images Puppy! <3 HD wallpaper and background photos ...","4":"Dogs images Puppy! <3 HD wallpaper and background photos","10":"FIfPysmQXPcEoO"},"5":{"1":"llqdQJtxyVThaQa"}},{"1":{"1":"https://media.newyorker.com/photos/591dccd9394e5718feb60feb/master/w_767,c_limit/NY-Hot-Dogs-23126.jpg","3":767,"4":767},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0ZnFlsmwesaIXdETZY5aoM2LRKo3hoDcKy2mvnKVFW66j1iIY","3":200,"4":200},"3":{"1":"The New Yorker","2":"https://www.newyorker.com/culture/photo-booth/the-resplendent-humanity-of-dogs-up-close","3":"The Resplendent Humanity of Dogs, Up Close | The New Yorker","4":"18","10":"obsdwjSMvUjVkE"},"5":{"1":"dVCLBRwfFqBXWCd"}},{"1":{"1":"https://www.smartcompany.com.au/content/uploads/2015/02/labrador-600.jpg","3":600,"4":476},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1oCXNLUiN5QKs8ocIR9-B6Wp8mEu0ZJthZWrIy4_xQ5X2yVyD0A","3":200,"4":158},"3":{"1":"SmartCompany","2":"https://www.smartcompany.com.au/business-advice/legal/dog-food-brand-purina-accused-of-killing-thousands-of-dogs-in-us-lawsuit/","3":"Dog food brand Purina accused of killing thousands of dogs in ...","4":"Dog food brand Purina accused of killing thousands of dogs in US lawsuit","10":"mAroiaYTrBkUhJ"},"5":{"1":"QclmbLEPrprbuAQ"}},{"1":{"1":"https://pmcvariety.files.wordpress.com/2018/03/klaus-dyba_dog1-e1521434052499.jpg?w=1000&h=563&crop=1","3":1000,"4":563},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmpK4KAjLAgKsfHh3h4UgzoEWBZs8dkmcbPUkNwKCR3BQvVL8E","3":200,"4":112},"3":{"1":"Variety","2":"https://variety.com/2018/digital/news/isle-of-dogs-photo-filters-vsco-1202729830/","3":"Isle of Dogs Photo Filters Launched by VSCO App – Variety","4":"VSCO Isle of Dogs","10":"yIIQcRMdUELwFK"},"5":{"1":"DRwSIJbAJufcUvs"}},{"1":{"1":"https://stylesatlife.com/wp-content/uploads/2015/11/Types-of-Dogs-1.jpg","3":500,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtD7XVGiTjOyaMLl6KKi1zgmt4Ksg3FqjyjYxTHpFfBlTf8Cp9gw","3":200,"4":160},"3":{"1":"Styles At Life","2":"https://stylesatlife.com/articles/types-of-dogs/","3":"25 Different Types of Dogs with Origins and Pictures | Styles ...","4":"Types of Dogs 1","10":"tOJvdJJkojReHe"},"5":{"1":"gHncbSaPleDBLkS"}},{"1":{"1":"https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/10/17/11/pitbull-terrier.jpg","3":1885,"4":1414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTFkzuvCcwzalnLPoz_B_GFuVJbWdy1gU18WCNntvEx6723UA_4","3":200,"4":149},"3":{"1":"The Independent","2":"https://www.independent.co.uk/topic/Dogs","3":"Dogs - latest news, breaking stories and comment - The ...","4":"Hundreds of dogs killed unnecessarily due to misguided laws, say MPs. '","10":"dBrfyemnfqPUHL"},"5":{"1":"bDcFFScCEXkdfSE"}},{"1":{"1":"https://housemydog.com/blog/wp-content/uploads/2017/01/cute-bulldog-smiling-sleeping-dog-narcoleptic-frenchiebutt-millo-2.jpg","3":605,"4":605},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5p9r1S8m6p7LxLVWdn7SIZ7pOxT4LjWxyXmGICcPsSkzdDBC7","3":200,"4":200},"3":{"1":"HouseMyDog","2":"https://housemydog.com/blog/12-photos-of-dogs-and-people-hugging","3":"12 Photos Of Dogs And People Hugging | HouseMyDog Blog","4":"12 Photos of Dogs And People Hugging","10":"BfHFdqIsgdXnvg"},"5":{"1":"hGdfYXJjwBWNhiH"}},{"1":{"1":"http://blog.petmeds.com/wp-content/uploads/2015/12/Dogs-scoot-for-a-variety-of-reasons-720x539.jpg","3":720,"4":539},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJY4S4-LSPElx1yw0jWJlAVtb4nVk_k1iZWjh5nSFLtfqw7eHJ","3":200,"4":149},"3":{"1":"Pet Meds","2":"https://blog.petmeds.com/ask-the-vet/dogs-that-scoot/","3":"The five W's of dogs that scoot","4":"Pug puppy scoots in the grass","10":"QuSVvhWOfrLOve"},"5":{"1":"NSiUBmiSPsgmdbh"}},{"1":{"1":"https://www.petdoors.com/blog/wp-content/uploads/2016/11/20160608_162336.jpg","3":3445,"4":2134},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRxitlvtt6iIOW0ARaZPUAD3TDnUbICzdaNH-MolMhbNFPkcjDLgQ","3":200,"4":124},"3":{"1":"Pet Doors","2":"https://www.petdoors.com/blog/weird-sleeping-positions-of-dogs/","3":"8 Weird Sleeping Positions of Dogs and What They May Mean","4":"tonks sleeping on side","10":"ugFixbcaUjflVW"},"5":{"1":"XjfrAbWCSueIFVj"}},{"1":{"1":"https://www.rover.com/blog/wp-content/uploads/2014/08/puppy-in-popcorn-bucket-960x540.jpg","3":960,"4":540},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkb9P2Sc2YYiAQL-svc-HhRTTRRaoRXmDmCPAhlZXEnxUnC_S_DQ","3":200,"4":112},"3":{"1":"Rover.com","2":"https://www.rover.com/blog/list-of-dog-movies/","3":"Dog best friends in film: A list of dog movies","4":"Puppy in popcorn - list of dog movies","10":"KAbDbSDgeRWRSh"},"5":{"1":"qHkIgRTfksaBNLN"}},{"1":{"1":"http://www.beliefnet.com/columnists/islaminamerica/files/2015/07/puppy-300x200.jpg","3":300,"4":200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTFpW2rKLGgXz98fq6kA1ZfOpppZFQCS7DiWYZc_E9yw92k8g4W","3":200,"4":133},"3":{"1":"Beliefnet","2":"http://www.beliefnet.com/columnists/islaminamerica/2015/08/01/of-dogs-faith-and-islam/","3":"Of Dogs, Faith and Islam\" - Islam In America","4":"The Qu'ran doesn't label dogs as untouchable (in fact, there's quite a nice  vignette of the Prophet ...","10":"wTWCnjOjpgPeqC"},"5":{"1":"pcaojGbsRwBSnlg"}},{"1":{"1":"https://nationalpostcom.files.wordpress.com/2018/08/pot-dog-1.png","3":1000,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSMHAQsQ9v5uiLxRcYzACMQaeYlASsLgRCdf7FQCR7dvd-dq5BpXg","3":200,"4":149},"3":{"1":"National Post","2":"https://nationalpost.com/cannabis/veterinarian-warns-dog-owners-on-cannabis-risks-saying-cases-come-in-weekly","3":"Vet warns of increase in cases of dogs suffering from ...","4":"Aspen, a Husky who was taken to emergency after consuming a presumed  cannabis product at a public ...","10":"ifbKSyggOghgok"},"5":{"1":"QYLiYKmNioYcMKF"}},{"1":{"1":"https://cdn1-www.dogtime.com/assets/uploads/2015/07/file_26979_column_grumpy-dog-earl.jpg","3":399,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUhbiihu3jBahI_uxXELM5b39I1Jfgys43_yg2wcvB9u16gV1d_w","3":199,"4":200},"3":{"1":"Dogtime","2":"https://dogtime.com/trending/26979-meet-grumpy-dog-the-grumpy-cat-of-dogs","3":"Meet Grumpy Dog: The Grumpy Cat Of Dogs - Dogtime","4":"Meet Grumpy Dog: The Grumpy Cat Of Dogs","10":"tkDKCPGmDEwsLp"},"5":{"1":"pKJSXPQvDqeoJwt"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/147083304-dogs-home-alone-all-day-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqYHACs2dhbqxtHrQkONT2kpL_266Yyz1Nr8Qx47NjM54tWY_rvg","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/dogs/dog-care/dogs-home-alone-all-day/","3":"Dogs Who Are Home Alone All Day | Petfinder","4":"Dogs Who Are Home Alone All Day","10":"aRApkLsryspgvr"},"5":{"1":"pTnBSeEyxfvAcdB"}},{"1":{"1":"https://www.what-dog.net/Images/faces2/scroll008.jpg","3":600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeRO06aRgpx_cMscbjMIB1xhtYZOQ1x2lr4JL1zyw1V9dtVQlfzA","3":200,"4":200},"3":{"2":"https://www.what-dog.net/","3":"What is your dog?","4":"","10":"DVhcDonMkEPCvc"},"5":{"1":"XuuDRWfawIEwkmT"}},{"1":{"1":"https://usercontent1.hubstatic.com/7968066.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLTxAtZayQYGIp-mX48YfSTdZ1uZBbCG7C13VvSipFeWpT1XLS0g","3":200,"4":149},"3":{"1":"PetHelpful","2":"https://pethelpful.com/dogs/The-Advantages-and-Disadvantages-of-Having-a-Dog","3":"The Advantages and Disadvantages of Having a Dog | PetHelpful","4":"","10":"PHAjVhJQgBreCM"},"5":{"1":"KGclwXLTfhffRbE"}},{"1":{"1":"http://www.picturesofdogs.co.uk/pictures/poodle1%20copy.jpg","3":450,"4":345},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTEd2IqP7IPgmOq72NfG6kBOSML6oNcKU1RP7GUVcXFhygTyCFiVw","3":200,"4":153},"3":{"2":"http://www.picturesofdogs.co.uk/","3":"Pictures of Dogs- Pictures Please","4":"Pictures of Dogs","10":"MjeyCYwFOOXIiD"},"5":{"1":"IqdKtHYxoHDvClM"}},{"1":{"1":"https://i.ytimg.com/vi/jJGItJSU1aM/hqdefault.jpg","3":480,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT8f2B8tVeG9hrinolfzSFeYqiSgGiK6-HYtLlrUhVDg7YTT-wJgQ","3":200,"4":149},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=jJGItJSU1aM","3":"Different Breeds of Dogs","4":"Different Breeds of Dogs","10":"fJgMXsPToLMMdP"},"5":{"1":"kwiHRNPInpkbNNL"},"7":{"1":{"11":{"1":"Different Breeds of Dogs","2":"A slide show of a different variety of Dogs","3":"4:15","4":"34165","5":"1218844800000","6":"Natasha Eyden","7":"79","8":"20"}}}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2018/2-dogs.jpg","3":1920,"4":1755},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLa94Qb6HvKe7C-Ubn0jxrHHlSj4eemB7DwvDrv6RVjt8Oa7tgSQ","3":200,"4":182},"3":{"1":"Phys.org","2":"https://phys.org/news/2018-10-evidence-dogs-accompanying-humans-europe.html","3":"Evidence of dogs accompanying humans to Europe during Neolithic","4":"Credit: CC0 Public Domain","10":"UlWSqGAKobFJKA"},"5":{"1":"UILGEmQFEFoVAsn"}},{"1":{"1":"https://pixel.nymag.com/imgs/daily/vulture/2018/03/14/14-isle-of-dogs.w1200.h630.jpg","3":1200,"4":630},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTnStaY7_N_-4QdrCvyM4lL2lhbyva5oq2XffsaNXNFpAs9vGM0","3":200,"4":105},"3":{"1":"Vulture","2":"http://www.vulture.com/2018/03/watch-this-video-introducing-the-dogs-of-isle-of-dogs.html","3":"Watch This Short Film Introducing the Dogs of Isle of Dogs","4":"","10":"mypNHTvWswtCOc"},"5":{"1":"lDgHnJMPFmMtKJf"}},{"1":{"1":"https://i.pinimg.com/736x/f5/7e/00/f57e00306f3183cc39fa919fec41418b--teddy-bears-teddy-bear-dogs.jpg","3":736,"4":1169},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJCqloOub7mjnQN642eZl5b6--cZA9bCIbF2djsa8iu49b4ZCGWg","3":125,"4":200},"3":{"1":"Pinterest","2":"https://www.pinterest.com/pin/436075176396371066/","3":"Pin by Debbie Smith on A ! ADORABLE | Pinterest | Dog, Animal ...","4":"Pin by Debbie Smith on A ! ADORABLE | Pinterest | Dog, Animal and Puppys","10":"hKSgDyvRymSNOK"},"5":{"1":"nrkXvuIUqRUTJTg"}},{"1":{"1":"https://s.abcnews.com/images/Video/GTY_dog_day_jef_160826_16x9_992.jpg","3":992,"4":558},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRbFXNRTNnAXdUs_QDs214jo1FjE8COPoo4G-_P9qWw9ARNwuyb","3":200,"4":112},"3":{"1":"ABC News - Go.com","2":"https://abcnews.go.com/Lifestyle/history-dogs-pets/story?id=41671149","3":"The History of Dogs as Pets - ABC News","4":"","10":"dQNaxWEwmsEgUC"},"5":{"1":"bjrXwgWopfKXlyE"}},{"1":{"1":"https://ichef.bbci.co.uk/news/660/cpsprodpb/B45D/production/_100637164_dogs_fox.jpg","3":660,"4":371},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT91tSrZ8U2pYvHbjt0zlEMAUJqWF4MaUv1eQ_LUQljDRpWygA7ag","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/entertainment-arts-43595611","3":"Why Isle of Dogs is no shaggy dog story - BBC News","4":"Isle of Dogs","10":"adxyWuDDKnakQS"},"5":{"1":"NSqbjoIcrHjXDQU"}},{"1":{"1":"http://bdfjade.com/data/out/65/5719631-picture-of-dogs.jpg","3":600,"4":507},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTghCT-JVAlT-a7YLqHgjsIUDd22U7pV1NlFp2lA9z2XY4PrdZncQ","3":200,"4":168},"3":{"1":"BDFjade","2":"http://bdfjade.com/picture-of-dogs.html","3":"Picture Of Dogs - BDFjade","4":"Dogs Background Galleries » PT-5719631 FHDQ Pictures","10":"TtaqJYSoykOYvn"},"5":{"1":"lHKIsGwxfrMSwTa"}},{"1":{"1":"https://www.stayathomemum.com.au/cache/860x380-0/wp-content/uploads/2017/01/photo-1513549054-cb3611a004fe.jpg","3":574,"4":380},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTlsQHCHS3pVNI4Jm3Z7tcezteSPg9GGv676JZLJBEsNjYvYJHBaQ","3":200,"4":132},"3":{"1":"Stay at Home Mum","2":"https://www.stayathomemum.com.au/houseandhome/pets-and-pet-food/10-breeds-of-dogs-suited-to-family-life-and-children/","3":"10 Breeds Of Dogs Suited To Family Life And Children","4":"","10":"vmDYjbCRtwgNQP"},"5":{"1":"WkdpRVbYsEDmsBq"}},{"1":{"1":"https://stylesatlife.com/wp-content/uploads/2015/11/Types-of-Dogs-22.jpg","3":482,"4":420},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr-BIza-ID0B_5mHNYZVelACXRObpmJR0A5-vL7LpFQt16XH8t3g","3":200,"4":174},"3":{"1":"Styles At Life","2":"https://stylesatlife.com/articles/types-of-dogs/","3":"25 Different Types of Dogs with Origins and Pictures | Styles ...","4":"Types of Dogs 22","10":"SmymfRmNuLHFEc"},"5":{"1":"DnhvsmvWSkWTSkR"}},{"1":{"1":"https://images.pexels.com/photos/406014/pexels-photo-406014.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMgpV4Dnq4Jd3rBDSJn7AgBp8tMMC9mvRmrd3mCQFe5fs_pW4u","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"Free stock photo of animal, dog, pet, cute","10":"dxlyAYargfusMe"},"5":{"1":"GwgMRCRrwyIBqXi"}},{"1":{"1":"https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2017/11/13001724/American-Eskimo-Dog-On-White-01-400x267.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTsGNRvlsg6L4sauv_tewVzBQdd7kdb-vT-jKmX6_AB6RWes_V2VA","3":200,"4":133},"3":{"1":"American Kennel Club","2":"https://www.akc.org/dog-breeds/smallest-dog-breeds/","3":"Smallest Dog Breeds – American Kennel Club","4":"American Eskimo Dog","10":"VJLsPEQkfoTgaB"},"5":{"1":"ToAVtwjKBjwaVpB"}},{"1":{"1":"https://www.nc3rs.org.uk/sites/default/files/Images/Animals/Beagles%20in%20safety%20testing%20of%20pharmaceuticals%20-%20RDS.Wellcome.jpg","3":1200,"4":993},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQebnD-bP3tQJxRd0Lw5FaVB6Tmn2b65Or7Snpg04onQpecxfU7ng","3":200,"4":165},"3":{"1":"NC3Rs","2":"https://www.nc3rs.org.uk/3rs-resources/housing-and-husbandry/housing-and-husbandry-dogs","3":"Housing and Husbandry of Dogs | NC3Rs","4":"This page provides advice on the housing of laboratory dogs, tools for  their welfare assessment, ...","10":"pOQBKsUaAExDxp"},"5":{"1":"soKGyPTBNHVPxGm"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2016/07/max_2/lead_720_405.jpg?mod=1533691832","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrD_FLFfRw23FSZMRB5oLYOi28vU0rrIsEPf6O_oqlKVtYth2RRA","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/entertainment/archive/2016/07/the-secret-life-of-pets/490580/","3":"For the Love of Dogs: 'The Secret Life of Pets,' Reviewed ...","4":"Illumination","10":"YYLAymmDrQbMHf"},"5":{"1":"HmwhYiETYOWcYNv"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/d/d9/Collage_of_Nine_Dogs.jpg","3":1665,"4":1463},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRGLQqDCxokM9-_Unrinvx32TEgykSGEiFd8ZN9_ZSsfrEI1ue4iQ","3":200,"4":175},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Dog","3":"Dog - Wikipedia","4":"Collage of Nine Dogs.jpg","10":"uUlLvuUdcuOcIL"},"5":{"1":"uRpIPGNqDVNVpKg"}},{"1":{"1":"http://nldogwhisperer.com/_Media/p4180071_med.jpeg","3":281,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDL2Bb5WHO2ylKI0hZM6TqQdBdlk89CR4BMmWlOK02VWBc-dBbNw","3":200,"4":200},"3":{"1":"Newfoundland's Dog Whisperer","2":"http://nldogwhisperer.com/for-the-love-of-dogs/","3":"For the Love of Dogs | Newfoundland's Dog Whisperer","4":"P4180071","10":"DLKanCBMubnDNQ"},"5":{"1":"WBbNVOrlmjMkMgc"}},{"1":{"1":"https://www.wikihow.com/images/1/1d/Take-Care-of-Your-Dog's-Basic-Needs-Step-35.jpg","3":3200,"4":2400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYXiN0MJz5noouc0Rd01auqVsg8HYdxj4XBWBUl9bMMY8lTVG8yA","3":200,"4":149},"3":{"1":"wikiHow","2":"https://www.wikihow.com/Take-Care-of-Your-Dog%27s-Basic-Needs","3":"How to Take Care of Your Dog's Basic Needs (with Pictures)","4":"","10":"bQvvWVUSirmQyO"},"5":{"1":"XuJuXQFfiNvxlyK"}},{"1":{"1":"https://res.cloudinary.com/dk-find-out/image/upload/q_80,w_640,f_auto/12173877_lnvjts.jpg","3":640,"4":459},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSOCIJw6yuhX0fDgoYYzEQXpa7a4ThCE0N_IaetPAZx_Nb0HoTf","3":200,"4":143},"3":{"1":"DK Find Out!","2":"https://www.dkfindout.com/us/animals-and-nature/dogs/domestic-dogs/","3":"Domestic Dogs | Different Types of Dogs | DK Find Out","4":"Dog-main gdcdzd 12173877 lnvjts ...","10":"LpcncxxURIVDEA"},"5":{"1":"RFwLNBmyxgHhnwp"}},{"1":{"1":"https://amp.thisisinsider.com/images/57991d1dd7c3dbae2f8b4657-750-753.png","3":750,"4":753},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQTpJq9dJS4dwAjqC6XT35fePL5fVdzpOcgr7djBXCQC45K3OFSCw","3":199,"4":200},"3":{"1":"Insider","2":"https://www.thisisinsider.com/dogs-before-and-after-haircuts-2016-7","3":"Dogs before and after haircuts - INSIDER","4":"Dogs Grace Chon","10":"OBPPjJXnGrWwvC"},"5":{"1":"UfREGxjhQAMqYTc"}},{"1":{"1":"https://timedotcom.files.wordpress.com/2017/04/world-of-dogs-07.jpg","3":2560,"4":1828},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQyXm57CVzJ5EUvu0HvCxqJ7QazwoqMvtL_CH8d-njiLP2lJXlk","3":200,"4":142},"3":{"1":"Time","2":"http://time.com/4775436/how-smart-is-a-dog-really/","3":"A Dog's Brain: Inside the Complex Canine Mind | Time","4":"Nina, an 8-month old Mini Australian Shepherd photographed in New York, NY","10":"SeOxdryAqGCQsI"},"5":{"1":"hPksBoksmOBlNAe"}},{"1":{"1":"https://www.sciencefriday.com/wp-content/uploads/2015/07/12872-1.JPG","3":1000,"4":586},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQuiulGxI6NDSiHAn-tomXc8p0pbyoFyE8F5LGL4Al6ov-QIC0uDQ","3":200,"4":117},"3":{"1":"Science Friday","2":"https://www.sciencefriday.com/segments/dogs-theyre-just-like-us/","3":"Dogs, They're Just Like Us - Science Friday","4":"","10":"hyVtWTqlYpfQXU"},"5":{"1":"goAktcmFFRUUUxT"}},{"1":{"1":"http://images.performgroup.com/di/library/sporting_news/dc/50/dog-3jpg_cp4bgn0c2fk31va2bwpmsci2b.jpg?t=1041338754&w=960&quality=70","3":960,"4":540},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRyNLvBbdisDSOVgm54zOFo3euAJl01P_n7MHrsjGwKHnE-Svjr","3":200,"4":112},"3":{"1":"Sporting News","2":"http://www.sportingnews.com/us/other-sports/news/adorable-dogs-2017-westminster-dog-show-photos/q4qu9orrlgq11k3mhptiohrlp","3":"Adorable photos of dogs at the 2017 Westminster Dog Show ...","4":"Dog 3.jpg","10":"rJfjBxOadbyMjm"},"5":{"1":"JSQfIlTHfpFNgrw"}},{"1":{"1":"https://i2-prod.mirror.co.uk/incoming/article6113280.ece/ALTERNATES/s615/PAY--Dog-swallowed-21-inch-riding-crop--whole.jpg","3":615,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRtkEnSyD6xOwHjh59HAejWd4_9LUq3131QxZkw9JCmB0SJs99Jww","3":200,"4":133},"3":{"1":"Daily Mirror","2":"https://www.mirror.co.uk/news/uk-news/sickening-pictures-poorly-boxer-show-7062981","3":"Sickening pictures of poorly boxer show the danger of dogs ...","4":"Hugo the dog who swallowed a 21 inch riding crop","10":"jKlAiLEGdNSLvC"},"5":{"1":"VrBMenmDSMcGMus"}},{"1":{"1":"http://3.bp.blogspot.com/-F2N-smOO2eI/UfCrLF7syeI/AAAAAAAAAE4/Mp4o0J2vw8s/s1600/Type+of+dog+Patuljasti+SPICE.jpg","3":500,"4":477},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYrAmtPktHqaOxLhSZekIE7JAYa75a9Y2IcCaC1RYJZJbZFUg","3":200,"4":190},"3":{"1":"types of dogs","2":"http://all-typesofdogs.blogspot.com/2013/01/type-of-dog-patuljasti-spice.html","3":"Type of dog Patuljasti SPICE - TYPES OF DOGS","4":"Type of dog Patuljasti SPICE","10":"cSrkLMkXibhHAn"},"5":{"1":"hMYJhfkRorfymFf"}},{"1":{"1":"http://www.qygjxz.com/data/out/183/3980549-pictures-of-dogs.jpg","3":1920,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbcM2cUV0OTBqLzu9PI67wGMZ1zscxyhetpuCT7iDcMtL4w4Q8","3":200,"4":124},"3":{"1":"QyGjxZ","2":"http://www.qygjxz.com/pictures-of-dogs.html","3":"Pictures Of Dogs - QyGjxZ","4":"Pictures Of Dogs","10":"LOfwRGKPjLYykB"},"5":{"1":"CjNNRjsPTHWFxeo"}},{"1":{"1":"http://www.pawculture.com/uploads/magic-of-dogs-book-destroyer-card.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzAFi5bs4u5U0ltE5wgvLY7T-WDzDMctigQm98cc6Yt5eltVwI","3":200,"4":200},"3":{"1":"PawCulture","2":"http://www.pawculture.com/get-inspired/magic-of-dogs","3":"Magic of Dogs | PawCulture","4":"Daisy the puppy in a closet","10":"OSmQrTICUnJcUR"},"5":{"1":"mITEEsGnnMdmedm"}},{"1":{"1":"https://www.soidog.org/sites/default/files/Dogs_for_adoption.jpg","3":1200,"4":662},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7CIoAyUpdA0z_qUGMgonqjeI0B9Vj-Ughlhil-aDrCZ8dVlrlYg","3":200,"4":110},"3":{"1":"Soi Dog Foundation","2":"https://www.soidog.org/adopt-a-dog","3":"Dogs For Adoption | Soi Dog Foundation","4":"At the Soi Dog Foundation shelter, hundreds of dogs wait in anticipation of  loving homes.","10":"LTrFnEFufygVUl"},"5":{"1":"ekyHhXeckvbeULy"}},{"1":{"1":"https://www.abc.net.au/news/image/7089596-3x2-940x627.jpg","3":940,"4":627},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpb6cNSSuVCnstfWoSuYxVldq9VBTuPeJtu9Nvw3OiMTOVxNeuQg","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/news/2016-01-22/dog-cruelty-stolen-pets-tourists-fuelling-growth-in-meat/7088380","3":"Dog cruelty: Rise in slaughter of stolen pets as Western ...","4":"... Thousands of dogs have been taken by dog meat smugglers but hundreds  have been saved","10":"QKBMOWnXdPgsOs"},"5":{"1":"poXeMAIMtVwnynW"}},{"1":{"1":"https://ybxzcgnc7b-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/male-dog-names-696x435-2.jpg","3":696,"4":435},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSBtHfW9n6ZlEpWaon8kohv1YMJLwXGWfW9U9AB4uztQ2TyLs2ExA","3":200,"4":124},"3":{"1":"The Labrador Site","2":"https://www.thelabradorsite.com/male-dog-names/","3":"Male Dog Names - 150 Brilliant Boy Puppy Name Ideas","4":"Looking for the best male dog ...","10":"yftxFbRJDNJFiA"},"5":{"1":"CwgdpgemBLeBpKD"}},{"1":{"1":"https://www.sciencemag.org/sites/default/files/styles/inline__450w__no_aspect/public/dogs_16x9_0.jpg?itok=6bVMiQge","3":450,"4":253},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoAY0lBnJg5p3jCKy0bYcuiA-CAS6fwaYe-dwgy0fKfchB82xYow","3":200,"4":112},"3":{"1":"Science","2":"https://www.sciencemag.org/news/2018/08/gene-editing-dogs-offers-hope-treating-human-muscular-dystrophy","3":"Gene editing of dogs offers hope for treating human muscular ...","4":"A colony of dogs at the Royal Veterinary College in London has a mutation  that causes a disease ...","10":"uXDTlpYMRxSysc"},"5":{"1":"hfpslxcHPIhamYL"}},{"1":{"1":"http://www.pbs.org/wgbh/nova/assets/img/posters/meaning-dog-barks-in.jpg","3":322,"4":215},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR83E68kzlY537bxNXFpIzyh4q5OHHa1PZMrJ3n1HOaKfuVDDO7","3":200,"4":133},"3":{"1":"PBS","2":"http://www.pbs.org/wgbh/nova/nature/meaning-dog-barks.html","3":"NOVA - Official Website | The Meaning of Dog Barks","4":"Sources","10":"HeNjnISBGrERNc"},"5":{"1":"yxTUeintWQNxRXd"}},{"1":{"1":"http://cdn.designbeep.com/wp-content/uploads/2011/07/4.dog-love-photos.jpg","3":500,"4":525},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScX6-QU4RNXhufTydEl5dppkHDnc0XMxOKFScQUw8xjadr6Ljc","3":190,"4":200},"3":{"1":"Designbeep","2":"http://designbeep.com/2011/07/29/heart-touching-photos-of-dogs-with-humans/","3":"Heart Touching Photos of Dogs with Humans | Designbeep","4":"humans and dogs","10":"VBfUhIuRdeHujs"},"5":{"1":"uMfRjnatednVxnF"}},{"1":{"1":"https://gfnc1kn6pi-flywheel.netdna-ssl.com/wp-content/uploads/2015/04/2015-0423-1157-fb.jpg","3":1120,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSM1fHGWOoPPAiEUl6E9FQOgXzVpYzf9isnt8a78ScgfGWq8oGP","3":200,"4":104},"3":{"1":"The Happy Puppy Site","2":"https://thehappypuppysite.com/dog-breed-groups/","3":"Different Types Of Dogs: The Dog Breed Groups Explained","4":"a group of small dogs puppies beagle","10":"NlbBUKGIwLLigm"},"5":{"1":"vNMpIKLUHNsBVaG"}},{"1":{"1":"https://www.police.gov.hk/info/img/pdu/German_Shepherd.jpg","3":400,"4":322},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQFxTlVZoUanSWoUXLNE6pXXWLSzJQu9l1FMxKLCdlSsn7uTzv5","3":200,"4":160},"3":{"2":"https://www.police.gov.hk/ppp_en/11_useful_info/pdu/type.html","3":"Type of Dogs | Hong Kong Police Force","4":"Type of Dogs","10":"HmIFpgTtwytwTY"},"5":{"1":"jNsiYMpoJodyirS"}},{"1":{"1":"https://images.penguinrandomhouse.com/cover/9780451497604","3":292,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvd839rC2S7o1c6nOIZt_sQ1hi0p7zWbI7cR_k6-C098hW9qPv","3":129,"4":200},"3":{"1":"Penguin Random House","2":"https://www.penguinrandomhouse.com/books/546898/the-grace-of-dogs-by-andrew-root/9780451497611/","3":"The Grace of Dogs by Andrew Root | PenguinRandomHouse.com","4":"The Grace of Dogs by Andrew Root","10":"TLRVaBgWkJywvH"},"5":{"1":"wKJVsNHAkjobIKG"},"7":{"1":{"10":{"3":"The Grace of Dogs by Andrew Root | PenguinRandomHouse.com","5":"In the bestselling tradition of Inside of a Dog and Marley & Me, a smart,  illuminating, and entertaining read on why the dog-human relationship is ...","6":true,"7":15.949999809265137,"8":"USD"}}}},{"1":{"1":"http://1.bp.blogspot.com/-D1v9yJRY3Xg/T7ZWzWXAleI/AAAAAAAABuU/4r7Cx4Fra0c/s1600/all+types+of+dogs+1.jpg","3":432,"4":625},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAbyyckK5hIAi5GlQ0t8QhR_EItcdEtUPBhiljyqGLDey1uBta","3":138,"4":200},"3":{"1":"My Top Collection","2":"http://mytopcollection.blogspot.com/2012/05/all-types-of-dogs.html","3":"My Top Collection: All types of dogs","4":"All types of dogs","10":"UilxngmFAWEiiK"},"5":{"1":"gboiCenfWAMpIND"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2018/03/wes_andersons_isle_of_dogs_is_a_tenderhearted_eccentric_canine_tale_ew_review/lead_720_405.jpg?mod=1533691928","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQAhkKwPcbRFSxfvQujIzPRVsP1vF0CURiSHZVSFvhQs31Dtth9","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/entertainment/archive/2018/03/isle-of-dogs-review/556292/","3":"Wes Anderson's 'Isle of Dogs' Is Beautiful and Sad: Review ...","4":"Fox Searchlight Pictures. “","10":"oSNOuYnslFqJPQ"},"5":{"1":"WDVuvFIUhbsBclN"}},{"1":{"1":"https://cdn.flickeringmyth.com/wp-content/uploads/2018/03/Isle-of-Dogs-character-posters-5-600x851.jpg","3":600,"4":851},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQw50y6LpR2SFWeRSzXZhCEnBGSZ-8kL88QDFSI5CwcDosNKZCzfQ","3":140,"4":200},"3":{"1":"Flickering Myth","2":"https://www.flickeringmyth.com/2018/03/isle-of-dogs-gets-a-series-of-canine-character-posters/","3":"Isle of Dogs gets a series of canine character posters","4":"ISLE OF DOGS tells the story of ATARI KOBAYASHI, 12-year-old ward to  corrupt Mayor Kobayashi.","10":"hlcUpQnykUBRsD"},"5":{"1":"bJuriALucgcSYfp"}},{"1":{"1":"https://i.ytimg.com/vi/QrBvVOoQXCA/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRw6PNel35EaV_kL94y7L3NITd6CI0PQXT5GvgPyzsk23ThnYvl","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=QrBvVOoQXCA","3":"ISLE OF DOGS | Making of: Puppets | FOX Searchlight","4":"ISLE OF DOGS ...","10":"LaWwplLDmbxIGi"},"5":{"1":"YEASMqwXoGYlCoO"},"7":{"1":{"11":{"1":"ISLE OF DOGS | Making of: Puppets | FOX Searchlight","2":"Now on Digital: http://bit.ly/Isle-Of-Dogs Now on Blu-ray and DVD:  http://bit.ly/Isle_Of_Dogs ISLE OF DOGS tells the story of ATARI KOBAYASHI,  12-year-old wa...","3":"4:01","4":"225512","5":"1522627200000","6":"FoxSearchlight","7":"4097","8":"181"}}}},{"1":{"1":"https://static.pjmedia.com/homeland-security/user-content/53/files/2017/03/AP_17071375979364.sized-770x415x0x587x2759x1487.jpg","3":770,"4":415},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPmnBCkO9u4V6pPdOCN-tdG7t2shwky_RJitakfAZCFZpWQV-y1A","3":200,"4":107},"3":{"1":"PJ Media","2":"https://pjmedia.com/homeland-security/2017/03/14/why-do-so-many-muslims-hate-dogs/","3":"Why Does Islam Teach Hatred of Dogs?","4":"Why Do So Many Muslims Hate Dogs?","10":"knGDhxKVKYAMoa"},"5":{"1":"UXGdXsRnndWjRkG"}},{"1":{"1":"https://ksassets.timeincuk.net/wp/uploads/sites/55/2018/03/M9WC84-copy-920x584.jpg","3":920,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT2qLLzgdW9KLjmU1WyjWV8GdiwT2E0ORCDSG05edJ-CMPngeOZ","3":200,"4":126},"3":{"1":"NME.com","2":"https://www.nme.com/reviews/movie/isle-of-dogs-wes-anderson-film-review","3":"Isle Of Dogs review: \"a canine-tastic classic from Wes Anderson\"","4":"Isle of Dogs review","10":"tqSSbIayecUptP"},"5":{"1":"kDVrLYubfwlIEsJ"}},{"1":{"1":"https://cdn.abcotvs.com/dip/images/4233273_091318wtvddogrescuepg1.jpg","3":540,"4":960},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR32rG3iGhRx5mSI8or0zA-9glC4YGt6D4suZuwCcHCQov1P_hM","3":112,"4":200},"3":{"1":"WTVD","2":"https://abc11.com/peak-lab-rescue-saves-dozens-of-dogs-ahead-of-hurricane-florence/4233351/","3":"Peak Lab Rescue saves dozens of dogs ahead of Hurricane ...","4":"Peak Lab Rescue saves dozens of dogs ahead of Hurricane Florence","10":"idpRKpkMwsFNPM"},"5":{"1":"XqVxubpOOppKldH"}},{"1":{"1":"https://media.npr.org/assets/img/2018/03/20/isleofdogs_domestictrailera_txtd_stereo_pr.max-2000x2000_wide-65e44dee126c79b304eadea538e7a6e431a3b8f5-s800-c85.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQbw9ijmCB3MYzA9W0JI1zLSUByHhz7k8cmM-OX3ZJ8IOAyJqCC","3":200,"4":112},"3":{"1":"NPR","2":"https://www.npr.org/2018/03/22/595194000/the-fast-and-the-furry-us-wes-andersons-masterful-isle-of-dogs","3":"The Fast And The Furry Us: Wes Anderson's Masterful 'Isle Of ...","4":"The Fast And The Furry Us: Wes Anderson's Masterful 'Isle Of Dogs'","10":"TDSoYIgGdaUrsu"},"5":{"1":"fFrdWxxCaWYCrsq"}},{"1":{"1":"https://cdn.kinsights.com/cache/a2/d0/a2d0e228b189836ebc8db503b361d51b.jpg","3":700,"4":305},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKZFyzTBFFkSPnKYJRPYqO__yyePdhoQVpuJ4NMFeNYCeId4gaNg","3":200,"4":87},"3":{"1":"Care.com","2":"https://www.care.com/c/stories/6036/10-fastest-dog-breeds/","3":"10 Fastest Dog Breeds - Care.com","4":"Over the last few centuries, certain types of dogs have been bred for  hunting and racing purposes.","10":"IPkBfAlgpdjjBJ"},"5":{"1":"GdiHoxKRefTnidc"}},{"1":{"1":"https://s.hswstatic.com/gif/frog-1.jpg","3":400,"4":349},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkD4aIcnoKQk8ptMFEszKlT6UyhIkRee-431_9CtgdDMIvowV4","3":200,"4":175},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/amphibians/frog.htm","3":"How Frogs Work | HowStuffWorks","4":"Green tree frog (Hylidae cinerea). See more amphibian pictures.","10":"oIPgOQIeUteTVv"},"5":{"1":"qGflvvGOFClFscO"}},{"1":{"1":"https://media.wired.com/photos/5abc3122ecb0130b0e72616c/master/pass/frogleaf.jpg","3":2400,"4":1800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS269AZWer7OVu1kw705ldxEHbn2J-pHJ6JSnb0xN5xfG_CvoEl","3":200,"4":149},"3":{"1":"Wired","2":"https://www.wired.com/story/some-frogs-may-be-developing-a-resistance-to-the-disastrous-chytrid-fungus/","3":"Some Frogs May Be Developing a Chytrid Fungus Resistance | WIRED","4":"Some Frogs May Be Developing a Resistance to the Disastrous Chytrid Fungus","10":"WADbSMNiLmVldA"},"5":{"1":"GCKOCqfbKuVTFNd"}},{"1":{"1":"https://cosmos-magazine.imgix.net/file/spina/photo/10994/170407_Frogs_Full.jpg?fit=clip&w=835","3":835,"4":557},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaVKwWQteHk6Jw5tfXQqYA56T98oG_gFg8K94grY4KlGoUBOAi","3":200,"4":133},"3":{"1":"Cosmos Magazine","2":"https://cosmosmagazine.com/palaeontology/the-death-of-the-dinosaurs-was-good-news-for-frogs","3":"The death of the dinosaurs was good news for frogs | Cosmos","4":"Two Petropedates cameronensis frogs, from Cameroon.","10":"oGVNAKqmOAwwLE"},"5":{"1":"EoJBsLKWhdkSUpN"}},{"1":{"1":"https://images.theconversation.com/files/117973/original/image-20160408-23649-1qxbogn.jpg?ixlib=rb-1.1.0&rect=0%2C516%2C2537%2C1652&q=45&auto=format&w=926&fit=clip","3":926,"4":603},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcROccUf9pp8ecFARqw_6DGs0uNfy88wxZrrmO3OLJmt4HAO-5l-","3":200,"4":130},"3":{"1":"The Conversation","2":"http://theconversation.com/the-future-for-frogs-looks-bleak-unless-humans-change-their-habits-57505","3":"The future for frogs looks bleak, unless humans change their ...","4":"The future for frogs looks bleak, unless humans change their habits","10":"GVxYqfUfpvOaNP"},"5":{"1":"hdrXHFELxglqDQA"}},{"1":{"1":"https://r.hswstatic.com/w_907/gif/frogs-sysk.jpg","3":907,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4fKzSHuYmdwaVO9r3iz7z6-YU-RoiWrrU_aekfcxdSMs-_dkD","3":200,"4":112},"3":{"1":"Stuff You Should Know","2":"https://www.stuffyoushouldknow.com/podcasts/frogs.htm","3":"How Frogs Work | Stuff You Should Know","4":"How Frogs Work","10":"KcuycTLNCTKyeK"},"5":{"1":"kDRqcVBphsrCkxY"}},{"1":{"1":"https://le-www-live-s.legocdn.com/sc/media/lessons/wedo-2/wedo-projects/images/frogs-metamorphosis-project-image-feb9db40c70bcda57e12f5671d4bc278.jpg?fit=around|700:700&crop=700:700;*,*","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRNbtN7UdIGFNqIJqRNaWtpxRa-8fONHoROYjex1_qG_s1yn_rlkw","3":200,"4":200},"3":{"1":"LEGO Education","2":"https://education.lego.com/en-us/lessons/wedo-2-science/frogs-metamorphosis","3":"Frog's Metamorphosis - WeDo 2.0 Science - Lesson Plans - LEGO ...","4":"Frog's Metamorphosis - WeDo 2.0 Science - Lesson Plans - LEGO Education","10":"LuCYFWOHovAfWs"},"5":{"1":"QYqyhfrbLHIDSaU"}},{"1":{"1":"https://www.amnh.org/var/ezflow_site/storage/images/media/amnh/images/frog/311113-1-eng-US/frog_dynamic_lead_slide.jpg","3":700,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtD1jRBEihnL1c2uHLMsDTPHLbxaXgm2VniPs7rmxYCGSChO7n","3":200,"4":100},"3":{"1":"American Museum of Natural History","2":"https://www.amnh.org/exhibitions/frogs-a-chorus-of-colors","3":"Frogs: A Chorus of Colors","4":"frog","10":"BHmJIRtnQIHBsx"},"5":{"1":"llGYGsDHxxtOAgh"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2018/05/ohanlon3HR/lead_720_405.jpg?mod=1533691465","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSocW1F9hcYfvbUB2jHJEzREuIzDsbL6E-_20kEv-YMUbA8_A6l9Q","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/science/archive/2018/05/frog-fungus-death/560078/","3":"The Origins of the Fungus Killing Frogs - The Atlantic","4":"A green and black frog with a red belly","10":"MEYPTxrgIFQDIY"},"5":{"1":"rlXkQPSDqhqLUYJ"}},{"1":{"1":"https://pmdvod.nationalgeographic.com/NG_Video/952/231/smpost_1507049364751.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNoa4awiR95D5rAClkS7gFSV4JJXD08hAIb8LxjU_1M2i8eqqIcQ","3":200,"4":112},"3":{"1":"National Geographic","2":"https://video.nationalgeographic.com/video/untamed/red-eyed-tree-frogs","3":"Why Does the Red-Eyed Tree Frog Have Three Eyelids?","4":"","10":"EodtsMOmwkmvxy"},"5":{"1":"TRhMSfpPGpbAhfi"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/29/n2/p029n2vj.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTLGsWeKSeL3n9sUPGD7Mi-WZF50vWpD_UiYo1vxF9P_V3LchLefQ","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20141029-rare-frog-breeds-inside-bamboo","3":"BBC - Earth - Rare bush frog breeds inside bamboo","4":"","10":"tblmAYrHcdmEcx"},"5":{"1":"qnVLROrMlgjmrAr"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/csz/news/800/2017/whyfrogsneed.jpg","3":700,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRAV6FLTscPNap-dxagGyyY5jA47enViUiFeyWiEpb6vS4xvxtl","3":200,"4":128},"3":{"1":"Phys.org","2":"https://phys.org/news/2017-05-frogs.html","3":"Why frogs need saving","4":"","10":"UBtkEBvnckXXVh"},"5":{"1":"wUKJyAlAUsxvETX"}},{"1":{"1":"https://3z2dsg30wpre3s82ui42uwfo-wpengine.netdna-ssl.com/wp-content/uploads/2013/02/dumpy-tree-frog.jpg","3":1000,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTuPr02JgQNW-5wZUoiCNTBlMkS6hGq_Gk5-uHx2CxvXZ6JdbkBg","3":200,"4":200},"3":{"1":"Underground Reptiles","2":"https://undergroundreptiles.com/product-category/animals/amphibians/tree-frogs/","3":"Tree Frogs Archives - Underground Reptiles","4":"","10":"NFYryMgPrFWjLY"},"5":{"1":"mxKEhURnKTFDgmp"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/11/frog-photography-tantoYensen-2-5836fb5fa3383__880.jpg","3":880,"4":646},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSD54DmGda4ORwNsiNxnRytlkNBFe4POeCfwnGP6A5dsndQ35EN","3":200,"4":146},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/frog-photography-tantoyensen/","3":"This Photographer Photographs Frogs Like You've Never Seen ...","4":"Cute Frog Photography","10":"GpxCpXhhYRfLQV"},"5":{"1":"kBgYakehSGARbAa"}},{"1":{"1":"https://www.sciencedaily.com/images/2017/09/170913193106_1_540x360.jpg","3":540,"4":359},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYc8jroyQFXBEWjaWBa0XtZCJWB1eh4Q8mphleOwt_rVftk872","3":200,"4":133},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2017/09/170913193106.htm","3":"Evolution of 'true frogs' defies long-held expectations of ...","4":"Ranidae family are most diverse frog ...","10":"SgOrWSoNkQjkXN"},"5":{"1":"NEnjrAUuUAJVPYY"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/4v/6s/p04v6sqx.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfX2luQyVZ-zbrRFoz93CaY80yyDgBXgWTG6C-Ql7GlQbLg11M","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20170227-there-are-frogs-that-breed-high-up-in-trees","3":"BBC - Earth - There are frogs that breed high up in trees","4":"There are frogs that breed high up in trees","10":"tnfNeHaMnRjESm"},"5":{"1":"llxhwWaFRlrDOEE"}},{"1":{"1":"https://www.thelocal.fr/userdata/images/article/307e9b4f101734d3f1ed2c7ee4094e692ea7b179dbef0203206ee24ad0d7e233.jpg","3":768,"4":511},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTE8In6K644ktyYDfWI8HJsDnvZw0vFcE5nTcpa9qYL-hqFTCpQ","3":200,"4":133},"3":{"1":"The Local France","2":"https://www.thelocal.fr/20180416/why-are-dordognes-noisy-frogs-at-the-centre-of-a-bizarre-legal-battle","3":"Why are Dordogne's noisy frogs embroiled in a bizarre legal ...","4":"Why are Dordogne's noisy frogs embroiled in a bizarre legal battle?","10":"IpgQyHiQgmancc"},"5":{"1":"kJPYqQFixrMKmJp"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/D8qEZnYE_JIK1U9_V6Q1igPGnhk=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/3b/6c/3b6c8ed1-90ae-4dad-a44d-8250be782a40/rayna_bell_-_litoria_revelata-040.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9MkD2sC0lqyeGsSZ_QfsvpkuFlXPF_ld0S1IecqgoECQMajtIcA","3":200,"4":149},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/smithsonian-institution/color-changing-marvel-tree-frogs-looking-love-180964976/","3":"The Color-Changing Marvel of Tree Frogs Looking for Love | At ...","4":"A new study sheds light on the wild world of “dynamically dichromatic”  amphibians","10":"pEaiVEpDYmLlaL"},"5":{"1":"BDEGPeAgkqWTiSV"}},{"1":{"1":"http://www.savethefrogs.com/d/amphibians/images/ghana/Leptopeles-hyloides-Ankasa-bamboo-cathedral-1-a-328.jpg","3":328,"4":246},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQP4o62qPQpPjo_pwdks06whhF_Uz4pVbxCut95cUpidmvSgxvDDg","3":200,"4":149},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/countries/ghana/frogs.html","3":"Frogs & Toads of Ghana","4":"Ghana Frogs","10":"lIquJinHveRXLW"},"5":{"1":"vylFbObXVrHbFhs"}},{"1":{"1":"https://cdn.britannica.com/s:700x450/73/100273-004-341B9A8E.jpg","3":550,"4":372},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9bFMIckxreAHguJKrulYJi39C4ZkLez2JhxY-E7JvGstqHe5uLQ","3":200,"4":135},"3":{"1":"Encyclopedia Britannica","2":"https://www.britannica.com/animal/frog","3":"Frog | amphibian | Britannica.com","4":"Blue arrow-poison frogs (Dendrobates azureus).","10":"PNVCAfaSvvWxRY"},"5":{"1":"aUlpffuPEYYpKFT"}},{"1":{"1":"https://media.wired.com/photos/59273130af95806129f51e1b/master/pass/353A-Ranitomeya-reticulata_Luke-Verburgt.jpg","3":1920,"4":1388},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPrE-yAWvR2XWEizAmM2pY3K0Av9f17-c5QA-OwgjUSezsmMfGmw","3":200,"4":144},"3":{"1":"Wired","2":"https://www.wired.com/2016/02/frogs-are-really-cool-too-bad-humans-are-killing-them-all/","3":"Frogs Are Really Cool. Too Bad Humans Are Killing Them All ...","4":"Frogs Are Really Cool. Too Bad Humans Are Killing Them All | WIRED","10":"tSjajvqkTHwDPN"},"5":{"1":"NqjLVMLdPkGSOsB"}},{"1":{"1":"https://www.sciencenews.org/sites/default/files/2017/03/main/articles/033017_sm_glass-frog_main_free.jpg","3":860,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQHa3--9uCPkM0iiBenOnNDj2vO_kmQjEa3HbDBy26T7_BEwlG-Q","3":200,"4":106},"3":{"1":"Science News","2":"https://www.sciencenews.org/article/glass-frogs-moms-matter-after-all","3":"For glass frogs, moms matter after all | Science News","4":"Cochranella granulosa glass frog","10":"IcObVOyrqXnwvC"},"5":{"1":"ulDbeqrODGiydVM"}},{"1":{"1":"https://amp.businessinsider.com/images/5980f384b50ab181238b5252-750-563.jpg","3":750,"4":563},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT70yS_9h8ZASXTDmysouJ_pLldMTMXxX3roO92SCgsO0QSnlFg2g","3":200,"4":149},"3":{"1":"Business Insider","2":"https://www.businessinsider.com/xenopus-frogs-pregnancy-test-2017-8","3":"Pregnancy tests used to be African clawed frogs - Business ...","4":"frogs national xenopus laevis resource marine biological laboratory dave  mosher 0","10":"gCpaiJGcuchnym"},"5":{"1":"UTouCGNEmGWJBJi"}},{"1":{"1":"https://media.mnn.com/assets/images/2016/04/frog-head-tilted.jpg.620x0_q80_crop-smart_upscale-true.jpg","3":620,"4":414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNpAL5idNr74cEBBf75cRuQi7oFFcVXOAoDUB8jVGmqLdf3BdW","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/earth-matters/animals/quiz/how-much-do-you-know-about-frogs","3":"How much do you know about frogs? | MNN - Mother Nature Network","4":"frog with head tilted","10":"mjkGEObGkpygTr"},"5":{"1":"WGNgwQbnnUmmsUU"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2014/157-researchersd.jpg","3":2778,"4":1974},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS383ka-_gDmTcl5dHI4lnxq4HU69cU8zUA-NjtbYN5GUkfB6xuow","3":200,"4":142},"3":{"1":"Phys.org","2":"https://phys.org/news/2014-10-rare-bush-frog-bamboo.html","3":"Researchers discover for the first time that a rare bush frog ...","4":"Researchers discover for the first time that a rare bush frog breeds in  bamboo","10":"wMHSHquWwPWuIG"},"5":{"1":"BqpyHxyDjNlDOSR"}},{"1":{"1":"https://www.floridamuseum.ufl.edu/science/wp-content/uploads/2016/11/gree-treefrog-krysko-1frog.jpg","3":975,"4":649},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV4hWTYfPeCxXNxv2vP0MLRuOrwGPF1dK-PXiR3GjapGlE_3w","3":200,"4":133},"3":{"1":"Florida Museum of Natural History","2":"https://www.floridamuseum.ufl.edu/science/florida-frog-calls/","3":"Florida Frog Calls – #FloridaMuseumScience","4":"","10":"RgOOcSgRawmGTr"},"5":{"1":"VAoaOdRoPyYymPe"}},{"1":{"1":"https://s.hswstatic.com/gif/hallucinogenic-frog-1.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT811qRcXqq1PKIwHn9ctU6NOfMcp7OfHJrhniRNyrq9e6Q9LsJsg","3":200,"4":133},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/amphibians/hallucinogenic-frog.htm","3":"Are there really hallucinogenic frogs? | HowStuffWorks","4":"Ribbett. Australia wants to give cane toads the boot. See more amphibian  pictures.","10":"NNRXlXtRjYMXKr"},"5":{"1":"irnuUmaNbBDwXsa"}},{"1":{"1":"http://wildlife.org/wp-content/uploads/2015/08/SM-Salty-frogs-1-Greg-Schechter.jpg","3":3072,"4":1307},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDperTWUFzqrHIxQvZoMnbg-SzfPleA99g2_Gd60dv4YyNkc0L","3":200,"4":84},"3":{"1":"The Wildlife Society","2":"http://wildlife.org/how-frogs-cope-with-road-salt-and-brackish-water/","3":"How Frogs Cope With Road Salt and Brackish Water | THE ...","4":"An ...","10":"RRpuUmLEdTvNps"},"5":{"1":"ErJdfKSPnleMFRc"}},{"1":{"1":"https://cdn.the-scientist.com/assets/articleNo/32185/iImg/5427/1c333be1-1cd8-45a4-8840-aad851ea8123-640treefrog.jpg","3":638,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuJIm3zsoZMJwIQI-kFWptxRxddJGx5bGJkqs-0S2xYUL0F4DtCg","3":200,"4":113},"3":{"1":"The Scientist Magazine","2":"https://www.the-scientist.com/daily-news/how-traffic-noise-affects-tree-frogs-32185","3":"How Traffic Noise Affects Tree Frogs | The Scientist Magazine®","4":"Hyla arboreaCOURTESY OF THIERRY ...","10":"jaITNMFTLHjCDB"},"5":{"1":"rDVROHvmnyPnAQf"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Anoures.jpg/220px-Anoures.jpg","3":220,"4":319},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSB5OFn6zL-xT4LUPF21-aA9iwNV-a6ZpxbW0DL6Tr5U5pnIfFJ","3":137,"4":200},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Frog","3":"Frog - Wikipedia","4":"Various types of frogs.","10":"TDygJSxFsEHNNb"},"5":{"1":"XeraFUqFJNRCGIG"}},{"1":{"1":"http://www.savethefrogs.com/d/amphibians/images/Litoria-Fallax-Eastern-Sedge-Frog-ds-a.jpg","3":328,"4":254},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWVy0kfPnm_-zROsm1XFnA7EKepvf0lSJ9iTh1LJyU8P_vkTj6","3":200,"4":154},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/threats/index.html","3":"Threats to Frogs","4":"Litoria fallax - Eastern Sedge Frog","10":"vGsIryEramLpBD"},"5":{"1":"odudiYsEAYmertr"}},{"1":{"1":"https://www.pca.state.mn.us/sites/default/files/greenfrog-rclamilg.jpg","3":250,"4":192},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS_jrIVEN0NHjruuGWXQYtwz-mIZryI5Ohu5liTYZeGwick0yoetA","3":200,"4":153},"3":{"1":"Minnesota Pollution Control Agency","2":"https://www.pca.state.mn.us/living-green/frogs-minnesota","3":"Frogs of Minnesota | Minnesota Pollution Control Agency","4":"Green frog (Rana clamitans) Listen to the call","10":"DtexviIWEYAioL"},"5":{"1":"iymrjxsAarRNyqK"}},{"1":{"1":"https://static01.nyt.com/images/2018/04/03/science/30Zimmer-1/30Zimmer-1-articleLarge.jpg?quality=75&auto=webp&disable=upscale","3":600,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRg48ytBu6zAYEm6Vak59KHCkczIts4UjZpDIXON8Xz04WiIy8P","3":200,"4":149},"3":{"1":"The New York Times","2":"https://www.nytimes.com/2018/03/29/science/frog-species-panama-fungus-rebound.html","3":"A Few Species of Frogs That Vanished May Be on the Rebound ...","4":"Image","10":"WFnybfuMiBvtbq"},"5":{"1":"iVFcPipApAbDUnM"}},{"1":{"1":"https://www.sciencedaily.com/images/2015/01/150120084545_1_540x360.jpg","3":359,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS1u35g96pNmfdVInRYeSr1hxsC0JW_xWRn8nL1BFP69W_nA8fP4Q","3":199,"4":200},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2015/01/150120084545.htm","3":"The seeing power of frogs: Frogs can detect single photons of ...","4":"Red-eye frog ...","10":"DwLdSrCqGJPnQn"},"5":{"1":"avpQCfRTQPjQuRb"}},{"1":{"1":"https://www.popsci.com/sites/popsci.com/files/styles/1000_1x_/public/images/2017/09/rayna_bell_-_dscn3184_0.jpg?itok=uD3aH5n_&fc=50,50","3":1000,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRSg8gtykqCthu94tEl1-S2BXWKLDVVCEHHQ879Ct2iEOYFpIG0","3":200,"4":149},"3":{"1":"Popular Science","2":"https://www.popsci.com/frogs-change-color-orgies","3":"These frogs might change color to avoid confusion during ...","4":"A frog couple has sex. The male is yellow.","10":"bclaQHSsaIoFaW"},"5":{"1":"fkWsCbMSUeGMUvu"}},{"1":{"1":"https://wonderopolis.org/wp-content/uploads/2017/10/Frogs_and_Toadsdreamstime_xl_30843151.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbNlkw_129iVOBFK3N8-duInY1cCBeLYxvsmIn4usa1b99FGo","3":200,"4":133},"3":{"1":"Wonderopolis","2":"https://wonderopolis.org/wonder/are-frogs-and-toads-the-same","3":"Are Frogs and Toads the Same? | Wonderopolis","4":"Wonder Contributors","10":"eySSflmKbfKRMG"},"5":{"1":"uBpfcLuQxLKgIYx"}},{"1":{"1":"https://www.sciencenewsforstudents.org/sites/default/files/2016/06/main/articles/060116_leopardfrog_main_SNS.jpg","3":860,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxVLjF4xOVgAdqZcHIVYLF_0sPJaVH5N0AhcHI7or9jdNTDVYA","3":200,"4":106},"3":{"1":"Science News for Students","2":"https://www.sciencenewsforstudents.org/article/why-some-frogs-can-survive-killer-fungal-disease","3":"Why some frogs can survive killer fungal disease | Science ...","4":"Leopard frog","10":"tAPGLJWjpeNNgF"},"5":{"1":"gjqakrYgfmpSEWa"}},{"1":{"1":"http://www.torontozoo.com/adoptapond/guide_images/Green%20Frog.jpg","3":720,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSeqz9-u1RXG1QaZUZiCafyguHmln-WNtZhUu4kIx1ub3wlU-3uCg","3":200,"4":133},"3":{"1":"Toronto Zoo | Adopt A Pond | SGuides","2":"http://www.torontozoo.com/adoptapond/frogs.asp?fr=11","3":"Toronto Zoo | Adopt A Pond | SGuides","4":"Green Frog","10":"wgFqDwNcxpBuhX"},"5":{"1":"AvVIBNnUgajVBsE"}},{"1":{"1":"https://defenders.org/sites/default/files/styles/homepage-feature-2015/public/frogs_visser-ruurd.png?itok=gAa6MAqt","3":960,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTgMktAwGtDGr628lxn6umXvObH5FhK9gr74bSbP9WvTt7-_5ka","3":200,"4":100},"3":{"1":"Defenders of Wildlife","2":"https://defenders.org/frogs/basic-facts","3":"Frogs | Basic Facts About Frogs | Defenders of Wildlife","4":"Frogs","10":"lyJyYSIWtJWjMf"},"5":{"1":"wFayTaBYdFYafFh"}},{"1":{"1":"https://news.nationalgeographic.com/content/dam/news/2017/04/27/frog-gallery/01-frog-day-gallery.ngsversion.1493410969588.adapt.1900.1.jpg","3":1900,"4":1261},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTDEHb9huCNeicJ_22gT2yp5zapE5T0VTrh2N-Cvf1kRRpEzHyFfg","3":200,"4":132},"3":{"1":"Latest Stories - National Geographic","2":"https://news.nationalgeographic.com/2017/04/frog-photos-save-frog-day/","3":"13 Gorgeous Pictures Remind Us Why Frogs Need Our Help","4":"","10":"IjNOCPUPHhlhve"},"5":{"1":"bRNCLBJoeoEkhIm"}},{"1":{"1":"https://i.ytimg.com/vi/Fa_I68L_APY/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvaHJGb7GygNJu7t6mgtQ-IKRVRvpfHsGsObxrS2Cb_5YsBLzM","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=Fa_I68L_APY","3":"World's Most Famous Frog!","4":"","10":"bbcjDPvxYExfaL"},"5":{"1":"eTlMaEBGhKXNQsB"},"7":{"1":{"11":{"1":"World's Most Famous Frog!","2":"Please SUBSCRIBE - http://bit.ly/BWchannel Watch More -  http://bit.ly/BTpoisonfrog On this episode of Breaking Trail, Coyote tracks  down Costa Rica’s most ic...","3":"7:58","4":"2622194","5":"1484006400000","6":"Brave Wilderness","7":"56906","8":"5741"}}}},{"1":{"1":"https://www.rbg.ca/image/events/frogs/frogslide-mexicanleaf.jpg","3":980,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTi4ERHFfdC_UtsiGGg5on4mesPQfYLrVgvuSi5LjGGXvfWVcWR","3":200,"4":97},"3":{"1":"Royal Botanical Gardens","2":"https://www.rbg.ca/frogs","3":"Frogs - Royal Botanical Gardens","4":"Mexican Leaf Frog","10":"ePEhpmgjFyRaVL"},"5":{"1":"EQwwCqjQQqUeyUu"}},{"1":{"1":"https://cosmos-images2.imgix.net/file/spina/photo/11978/170925-Frog-Full.jpg?ixlib=rails-2.1.4&auto=format&ch=Width%2CDPR&fit=max&w=835","3":835,"4":555},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSk7YieHJL3q75pri3jgdNO0li65jlUTlHLBqeo_OnMd8CWkdYxJg","3":200,"4":133},"3":{"1":"Cosmos Magazine","2":"https://cosmosmagazine.com/biology/why-poisonous-frogs-don-t-croak","3":"Why poisonous frogs don't croak | Cosmos","4":"The little devil poison frog is immune to its own toxins.","10":"UeiEkghhVkMXKs"},"5":{"1":"WUoHoDDlhgfBtrO"}},{"1":{"1":"http://www.frogsofborneo.org/images/Header%20Frontpage.jpg","3":2000,"4":1145},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiMg-d9JBxdtDIF6MccrQmpv2DVFycXK7-vjF0S9Jcvqi_KTom","3":200,"4":114},"3":{"2":"http://www.frogsofborneo.org/","3":"Frogs of Borneo","4":"Bornean Families","10":"CRMKIDvekmMVLT"},"5":{"1":"rlfRjDeDKVSjJIx"}},{"1":{"1":"https://kids.nationalgeographic.com/content/dam/kids/photos/articles/Other%20Explore%20Photos/R-Z/Wacky%20Weekend/Frogs/ww-frogs-budgetts-tile.ngsversion.1461604295186.adapt.1900.1.jpg","3":1900,"4":1068},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhVTWE1uxmNxemqwwuhCBflDlg12w5EV8tcdnWZdU3ml1lLe2ixw","3":200,"4":112},"3":{"1":"National Geographic Kids","2":"https://kids.nationalgeographic.com/explore/wacky-weekend/frogs/","3":"Wacky Weekend: Frogs","4":"","10":"PpMNVnlqTuNRvy"},"5":{"1":"ygHfQinPsVhlRDU"}},{"1":{"1":"https://www.swarovski.com/medias/?context=bWFzdGVyfHJvb3R8NDkzMzh8aW1hZ2UvanBlZ3xoZTIvaDllLzg4NDg0NzA4MDI0NjIuanBnfGYzMGE4MTI1NjkxZTYzYjc2OTEyZmFiMjIzODM5OWU5NjhlZWI5ZTA3ZWViOTI2MzBkNWMwZWU3OGRjMWQyNmU","3":607,"4":607},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqBrs02ONOspqXB32cicZkYZB3Yp4IrYQxI3K_U8le5cuHrZYV","3":200,"4":200},"3":{"1":"Swarovski","2":"https://www.swarovski.com/en-AR/p-5136807/Frogs/","3":"Frogs by SWAROVSKI","4":"Frogs - Swarovski, 5136807","10":"PsQJRbaRKxpryy"},"5":{"1":"PAPVKUeteEYVjso"},"7":{"1":{"10":{"3":"Frogs by SWAROVSKI","4":"Swarovski","5":"Honoring the unique flora and fauna of the rainforest, this pair of  Swarovski frogs sparkles in a combination of vibrant crystal colors. The  frogs can ...","7":19900.0,"8":"ARS"}}}},{"1":{"1":"https://jr.brainpop.com/science/animals/frogs/screenshot_1.png","3":600,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0XWJGUpxOeC3j6b7az5dv7y0bWOgXV-29SwL2Hw-LIudZX5F0bA","3":200,"4":153},"3":{"1":"BrainPOP","2":"https://jr.brainpop.com/science/animals/frogs/","3":"Frogs - BrainPOP Jr.","4":"Whoops! Looks like we had a problem playing your video. Refresh the page to  try again.","10":"IFDBtpyVQMwWrO"},"5":{"1":"biORwvUFemtsbpV"}},{"1":{"1":"https://static01.nyt.com/images/2017/02/02/science/sciencetake-frogs-video/sciencetake-frogs-video-superJumbo.jpg","3":2048,"4":1365},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRpdhQxRxS3laHzJhYtcNQxezg_oIYGxbjPLI5SwmI5k5oWiJdUNQ","3":200,"4":133},"3":{"1":"The New York Times","2":"http://www.nytimes.com/topic/subject/frogs","3":"Frogs - The New York Times","4":"The Power of Frog Spit","10":"nFlfdHamKlFCET"},"5":{"1":"IgOMSaMcvdDJvfD"}},{"1":{"1":"https://www.rspb.org.uk/globalassets/images/birds-and-wildlife/non-bird-species-illustrations/common-frog_1200x675.jpg?preset=landscape_mobile","3":768,"4":432},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQneCrWRM20xTxTsyRjgncmLD4_d5dRnsVDFUzF7C5cE8Ul2_Uu","3":200,"4":112},"3":{"1":"RSPB","2":"https://www.rspb.org.uk/birds-and-wildlife/wildlife-guides/other-garden-wildlife/amphibians-and-reptiles/common-frog/","3":"Common Frog | What Do Frogs Eat & other Frog Facts - The RSPB","4":"Common frog","10":"hWliTCrvAjyrCm"},"5":{"1":"pfaqPXfSPlHMJWY"}},{"1":{"1":"https://i.kinja-img.com/gawker-media/image/upload/tgfdtzodvqb4egv9au6w","3":1152,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTv97ml3Gr9qxutD333q_xu2TyeqQHbRs07ex_A6ypKtsTvEefD","3":200,"4":124},"3":{"1":"ClickVentures - ClickHole","2":"https://clickventures.clickhole.com/acquire-frogs-1825124396","3":"Acquire Frogs","4":"","10":"MFsYykfcUNjRcn"},"5":{"1":"sRHvGnXMaNcuJNS"}},{"1":{"1":"https://news.utexas.edu/sites/default/files/styles/news_article_main_image/public/photos/epipedobates-anthonyi_872_830.jpg?itok=oW0C6k-o","3":1660,"4":996},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcStpr6bG1jDp0RgcXcV4_ysG8p8S64TGZ5-2XDk9wz-Vlwzo0s0kg","3":200,"4":120},"3":{"1":"UT News - The University of Texas at Austin","2":"https://news.utexas.edu/2017/09/21/why-poison-frogs-don-t-poison-themselves","3":"Why Poison Frogs Don't Poison Themselves | UT News | The ...","4":"Phantasmal Poison Frog (Epipedobates anthonyi)","10":"xSqSEpkCdmrHPP"},"5":{"1":"ieaUIKHjtRyVtQS"}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Ftimedotcom.files.wordpress.com%2F2017%2F05%2Ffrog2.jpg&w=1600&q=70","3":1512,"4":1265},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkJWTXmEQHgBuRrjqaVc6B3ylbTfQY1Pt6XV0OI-f4TOfeb-FE","3":200,"4":167},"3":{"1":"Time","2":"http://time.com/4798314/transparent-frog-new-species-amazon/","3":"Transparent Frog: Scientists Discover New Species in Amazon ...","4":"Have a look: The transparent Hyalinobatrachium yaku frog","10":"dgiUNFlNKNOccA"},"5":{"1":"XXwbLBnCIlGQyvr"}},{"1":{"1":"https://cdn.the-scientist.com/assets/articleNo/30156/iImg/1051/frogs.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_hM5VsgXC_2i3qjylFXbM7To9vXuHsrIdrF8ToPAVfj1ddXD4AQ","3":200,"4":112},"3":{"1":"The Scientist Magazine","2":"https://www.the-scientist.com/features/frog-skin-yields-potent-painkillers-but-none-clinic-ready-30156","3":"Frog Skin Yields Potent Painkillers, but None Clinic Ready ...","4":"Frog Skin Yields Potent Painkillers, but None Clinic Ready | The Scientist  Magazine®","10":"ynCfIlcKdHkixo"},"5":{"1":"bhsADIhKmrvyuci"}},{"1":{"1":"https://www.sciencemag.org/sites/default/files/styles/inline__450w__no_aspect/public/frog_16x9.jpg?itok=KqXPFU6-","3":450,"4":253},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaSIlATqbnPq12oVBUV-FewL_jEHPUauSUvsYvya4JuM1LPxyjFg","3":200,"4":112},"3":{"1":"Science","2":"http://www.sciencemag.org/news/2017/07/can-you-tell-whether-frog-excited-just-listening-its-voice","3":"Can you tell whether this frog is excited just by listening ...","4":"Can you tell whether this frog is excited just by listening to its voice?","10":"RoUBvJcSfsQsEp"},"5":{"1":"wCdnAIPTKcdsehy"}},{"1":{"1":"http://www.backyardbuddies.org.au/_assets/images/buddy-hero-images/Green-Tree-Frog-Emily-Sephton.jpg","3":1600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQBpqkRi_p8cw0r1zriKqubKg7I4407IYbBPCRcNAyLCzqCDiVo","3":200,"4":74},"3":{"1":"Backyard Buddies","2":"http://www.backyardbuddies.org.au/fact-sheets/frogs-1","3":"Frogs","4":"","10":"tCDKWOcIIqIleH"},"5":{"1":"kDcRCsbVfhmkpTF"}},{"1":{"1":"https://assets.bwbx.io/images/users/iqjWHBFdfxIU/imbdOzKpGFA8/v0/800x-1.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkuYRypL8YpOM3Vafl6mD1qeYIlPtdEuClardhV-0iqZR4_O3F","3":200,"4":112},"3":{"1":"Bloomberg","2":"https://www.bloomberg.com/news/articles/2018-09-12/biohacker-makes-diy-mutant-frogs-and-hopes-they-don-t-croak","3":"The Biohacker Who Experimented on Himself Is Making DIY ...","4":"Illustration: Alvin Fai","10":"RXSyqHDTadRjtW"},"5":{"1":"vkPBNnHYwsnVFvv"}},{"1":{"1":"http://www.pbs.org/wnet/nature/files/2014/05/08_46MB-1000x469.jpg","3":1000,"4":469},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTmCB9eU3X3ExdbLwzLwhHxKgbu1nng-4QoHh-JT-CzBKJggJTm","3":200,"4":93},"3":{"1":"PBS","2":"http://www.pbs.org/wnet/nature/group/amphibians-reptiles/frog/","3":"Frogs | Nature | PBS","4":"Frogs are a diverse and largely carnivorous group of short-bodied, tailless  amphibians composing the ...","10":"vuYFGyiAAfkGBk"},"5":{"1":"FrKpgBDXBgIYHNt"}},{"1":{"1":"https://kids.sandiegozoo.org/sites/default/files/2017-07/animal-hero-fantasticfrogs_0.jpg","3":1020,"4":580},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBi_RE4pZgVrzGi0oOsFQ1upFnjroThpWTvvYtbIOg4WcsI1aY","3":200,"4":113},"3":{"1":"San Diego Zoo Kids","2":"https://kids.sandiegozoo.org/stories/fantastic-frogs","3":"Fantastic frogs | San Diego Zoo Kids","4":"Mossy frog","10":"WwCjiVEiYOYMUy"},"5":{"1":"CuWfmiUxmLvOvYN"}},{"1":{"1":"https://image.pennlive.com/home/penn-media/width620/img/wildaboutpa/photo/bullfrogjpg-e6472ceba9e0d463.jpg","3":504,"4":339},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRb48Qyf5Pyu7vj-WvC1637fW4gfxTu9Mj2MR-nWvHjxHHu-ZO3","3":200,"4":134},"3":{"1":"PennLive.com","2":"https://www.pennlive.com/wildaboutpa/2017/07/frogs_and_toads_of_pennsylvani.html","3":"Frogs and toads of Pennsylvania: Are there really 17 species ...","4":"bullfrog.jpg","10":"MsAdcYkHVqdUns"},"5":{"1":"avrqpgGUaxwIuwK"}},{"1":{"1":"https://www.enasco.com/medias/xenopus-frogs-categoryvideo-4.jpg?context=bWFzdGVyfGltYWdlc3w0MzgxMHxpbWFnZS9qcGVnfGltYWdlcy9oMDUvaGJkLzg3OTYyNDM0MjczNTguanBnfGUxZDEwODZhM2Y3MmE2NmU2YjQwM2FjOGE0OTMyNjEzMTZjNGZkZGYzYzI4NDI4NzQ0MDIxM2MzNzJkNWE1NjA","3":795,"4":384},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT5zCC-PVFgf7Qv21BIeSlYBvRJqkCg8ZTg9AwbDz7b4rmEClZk","3":200,"4":96},"3":{"1":"Nasco","2":"https://www.enasco.com/c/Education-Supplies/Xenopus-Frogs","3":"Xenopus Frogs | Education Supplies | Nasco","4":"Xenopus Tropicalis","10":"IaQBBwidFDPrCW"},"5":{"1":"wLjTrSuCIAbSvok"}},{"1":{"1":"https://cdn.britannica.com/s:700x450/57/22457-049-8F80A555.jpg","3":320,"4":240},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRC2g7gY5I0hlcR6Z4QhvO3In2kVjfG7bRe9zPNTsgEpAHjHMv","3":200,"4":149},"3":{"1":"Encyclopedia Britannica","2":"https://www.britannica.com/animal/frog","3":"Frog | amphibian | Britannica.com","4":"tree frog","10":"NMHkeHYhlmacxd"},"5":{"1":"yrkGEFyXWiJttwW"}},{"1":{"1":"https://cdn-images-1.medium.com/max/595/0*F57sByVPzim7oA4w.jpg","3":595,"4":335},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvKl7iN6SsOCeJ8Fll0Z02OxnR_x035trZiPcOOx5wZ-i_dhPofg","3":200,"4":112},"3":{"1":"The Economist - Medium","2":"https://medium.economist.com/hunting-for-frogs-in-the-western-ghats-270768e5bc7d","3":"Hunting for frogs in the Western Ghats – The Economist","4":"","10":"EVTOruFlqfrwql"},"5":{"1":"dCTcNXqnebIqpOA"}},{"1":{"1":"https://media.mnn.com/assets/images/2016/12/jaymi-heimbuch-_JH_1705-01.jpg","3":1500,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqEEUZzO9SD97G3OK33jGBdkLiCVlRV8EhUH8uJ3SXncnQF0v0Jw","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/earth-matters/animals/blogs/This-why-red-eyed-tree-frogs-have-red-eyes","3":"This is why red-eyed tree frogs have red eyes | MNN - Mother ...","4":"red-eyed tree frog","10":"tXEDrMjTLTVffk"},"5":{"1":"WHNDEeEFejqccyh"}},{"1":{"1":"https://www.wettropics.gov.au/site/user-assets/mcms_cb_resized/miketrenerryyellowgianttreefroglitoriainfrafrenata-1.jpg","3":428,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJ79-75lr0_bJHHMIlrua9-5VXZf65pz8z9hZcHW0QNDTHbN1c","3":200,"4":131},"3":{"1":"Wet Tropics Management Authority","2":"http://www.wettropics.gov.au/frogs","3":"Frogs | Wet Tropics Management Authority","4":"Frogs","10":"uRyKVOHxdXSsmk"},"5":{"1":"QbFEoXpYyrEGjJM"}},{"1":{"1":"https://www.davincisciencecenter.org/wp-content/uploads/2018/05/leaf-frogs-900x600.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRraAutITBAvNnDVw-ZMxGOdt13vfXj1aWWTi_dElmIkO0Vv4oUjg","3":200,"4":133},"3":{"1":"Da Vinci Science Center","2":"https://www.davincisciencecenter.org/frogs-and-friends/","3":"Frogs and Friends - Da Vinci Science Center - Da Vinci ...","4":"The Solomon Island leaf frog has a loud call and eats crickets. Its body  shape","10":"poKVJCxYdnKqqv"},"5":{"1":"ihBTVRWKYwlwLQD"}},{"1":{"1":"https://blog.nationalgeographic.org/wp-content/uploads/2013/11/poison-dart-frog-pumilio-defenses-s2048x1372-p.jpg","3":2048,"4":1372},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHohSag9Y5M5cLULNwpN9CIuK3v1cXX63_cVi1lMUvMM4G8wMv","3":200,"4":134},"3":{"1":"National Geographic Blog - National Geographic Society","2":"https://blog.nationalgeographic.org/2013/11/21/poison-frogs-make-their-babies-toxic-too/","3":"Poison Frogs Make Their Babies Toxic, Too – National ...","4":"Photo of a strawberry poison dart frog in Costa Rica.","10":"JbVtKgCKdSCDpF"},"5":{"1":"HVtlNFOTShVHwPH"}},{"1":{"1":"https://australianmuseum.net.au/Uploads/Images/35550/P2060249_smll_big.jpg","3":526,"4":396},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqu0UClFqLeww4-3Kl3DtKP4QOb0I93zzpekB4vzd9VJXvAt3j","3":200,"4":150},"3":{"1":"Australian Museum","2":"https://australianmuseum.net.au/blogpost/why-do-frogs-call","3":"Why do frogs call? - Australian Museum","4":"Graceful Tree Frog","10":"SKbgJUFUnTXUSG"},"5":{"1":"UgSWbgQLclfCCww"}},{"1":{"1":"https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/06/14/12/frog-pond.jpg?w968h681","3":968,"4":681},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRcsVTOChE6B-9A6nmhsXu9rSwvz4PEy8nkrcC_8qfIHZWCypwJgw","3":200,"4":140},"3":{"1":"The Independent","2":"https://www.independent.co.uk/environment/frog-pesticides-female-fertility-chemicals-linuron-endangered-species-extinction-a8399401.html","3":"Pesticides could wipe out frogs by turning them female, study ...","4":"Amphibians such as this common frog could have their fertility impacted by  the widespread use of","10":"iyIAOSSBEjwOOh"},"5":{"1":"rxmnwHOufvxpBRu"}},{"1":{"1":"https://www.mashpilodge.com/wp-content/uploads/mashpi-frogs-hyloscirtus-mashpi.jpg","3":1600,"4":1067},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQQfZJvwaZ3EojQn1-eO7Mj-fLyaLONuP3lBJC3gJ_ale1CY09m3Q","3":200,"4":133},"3":{"1":"Mashpi Lodge","2":"https://www.mashpilodge.com/the-amphibians-of-mashpi-type-of-toads-and-frogs/","3":"The amphibians of Mashpi – types of toads and frogs - Mashpi ...","4":"This frog is associated with rivers and bodies water, where it can be  observed during night walks.","10":"yBLkOyCxDEKoae"},"5":{"1":"VLxvFyvAyDyKxBh"}},{"1":{"1":"http://cdn.sci-news.com/images/enlarge3/image_4673e-Red-Eyed-Tree-Frog.jpg","3":1920,"4":1407},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV45DKX-3v_5slq83_DhC8HnJezhTby-xu984ywDIMeriPI2wj","3":200,"4":146},"3":{"1":"Sci-News.com","2":"http://www.sci-news.com/biology/frogs-see-color-extreme-darkness-04673.html","3":"Frogs Have Unique Ability to See Color in Extreme Darkness ...","4":"According to Yovanovich et al, frogs can see color in extreme darkness,  down to","10":"DGLLcwTUHTSEBJ"},"5":{"1":"YPDAQqibncYwdyG"}},{"1":{"1":"https://asset-manager.bbcchannels.com/i/2fdrc1c20e61000","3":1730,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRcnwCzJIetuwttMZoCBzhPYpWA3Y5U8LUiYfZbdBBZBPgPK_t8Q","3":200,"4":58},"3":{"1":"BBC Earth","2":"https://www.bbcearth.com/blog/?article=how-a-pregnancy-test-caused-a-catastrophe-for-frogs","3":"How a pregnancy test caused a catastrophe for frogs | BBC Earth","4":"","10":"qdgocElyxSTqkY"},"5":{"1":"yNbKaltLjiGApAU"}},{"1":{"1":"https://i.ytimg.com/vi/nyBZqRgbds4/maxresdefault.jpg","3":1688,"4":950},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvgZ_rnKmy-LUO_bgqV09Xo7VtxrFklvrk_FR7zBsh2UaBdDX3","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=nyBZqRgbds4","3":"Deadly Poison Dart Frog?","4":"","10":"ywtsACBNNDlKbh"},"5":{"1":"hWLcNTvNTqEOHBg"},"7":{"1":{"11":{"1":"Deadly Poison Dart Frog?","2":"Please SUBSCRIBE NOW! http://bit.ly/BWchannel Watch More -  http://bit.ly/BTvinegaroon On this episode of Breaking Trail, Coyote  ventures deep into the rainfo...","3":"7:19","4":"5023010","5":"1465257600000","6":"Brave Wilderness","7":"53218","8":"6142"}}}},{"1":{"1":"https://www.popsci.com/sites/popsci.com/files/styles/1000_1x_/public/images/2017/09/beelzebufo_bw.jpg?itok=Bsceo4Tm&fc=50,50","3":1000,"4":749},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ53aSAARzQhZhCs3dXMzRax6IrlFQDBVtcUKkiwiOZGw2HwKj3PQ","3":200,"4":149},"3":{"1":"Popular Science","2":"https://www.popsci.com/beelzebufo-devil-frog-bite-force-dinosaur","3":"Giant ancient frogs might have snacked on baby dinosaurs ...","4":"beelzebufo illustration","10":"bAsGfhyeefhjIT"},"5":{"1":"hJEuyvjjMTpcYyh"}},{"1":{"1":"https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5NS81MjEvb3JpZ2luYWwvZnJvZy13aXRoLWJpdGUtMDEuanBn","3":660,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRqapZ9iWr9W9Oe_YbibjwU6erpILlkUc6WnnRWMMKLCA0fYUH66A","3":200,"4":124},"3":{"1":"Live Science","2":"https://www.livescience.com/60474-frog-with-powerful-bite.html","3":"Extinct Big-Mouthed Frogs May Have Dined on Dinos","4":"","10":"XaVkXuxBOQtOYM"},"5":{"1":"tGrvIFxeXtnParj"}},{"1":{"1":"http://www.cellphonetaskforce.org/wp-content/uploads/2012/01/frog-left.jpg","3":400,"4":349},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2wSIPot_nLb4yZwcoRXUiaxf0IZIiUnyQL_w21k0GOS7FvX4h6A","3":200,"4":175},"3":{"1":"Cellular Phone Task Force","2":"https://www.cellphonetaskforce.org/frogs/","3":"FROGS • Cellular Phone Task Force","4":"ALL ARTICLES BY ALFONSO BALMORI · Frog","10":"LBmFoLPUBwrHWV"},"5":{"1":"UTIlnIJacMSxMmw"}},{"1":{"1":"https://www.irishtimes.com/polopoly_fs/1.2197035.1430491144!/image/image.jpg_gen/derivatives/box_620_330/image.jpg","3":620,"4":330},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSlpk8viG1gD-hI0-Ibjct-tGd0wZwqyl_AHnL8kLDa0O1gFh0F","3":200,"4":106},"3":{"1":"The Irish Times","2":"https://www.irishtimes.com/news/science/toxic-frogs-how-do-they-make-their-poison-1.2197039","3":"Toxic frogs: how do they make their poison?","4":"A Sira poison frog (Ranitomeya sirensis)","10":"uuLugouUGykRXY"},"5":{"1":"enbGNsfFaLrpfDV"}},{"1":{"1":"https://www.environment.nsw.gov.au/-/media/OEH/Corporate-Site/Topics/Animals-and-plants/Native-animals/eastern-dwarf-tree-frog-litoria-fallax-109029.jpg","3":690,"4":580},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS8eSPAd8tNxrrC1QIH_M16-iew--LDC-62tRpFqYwRCM1gFFpdoA","3":200,"4":168},"3":{"1":"Office of Environment and Heritage - NSW Government","2":"https://www.environment.nsw.gov.au/topics/water/wetlands/plants-and-animals-in-wetlands/frogs","3":"Frogs in wetlands | NSW Environment & Heritage","4":"","10":"xgkwsnPjHadhee"},"5":{"1":"YloQyjvnXVxIxkp"}},{"1":{"1":"https://media.treehugger.com/assets/images/2018/05/golden_poison_dart_frog_photo.jpg.1200x0_q70_crop-smart.jpg","3":1200,"4":805},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSVzxce_y_9aBwPULkVsS581ldwa8toZ9uCPttXL-0Jhma2NKRm","3":200,"4":134},"3":{"1":"TreeHugger","2":"https://www.treehugger.com/slideshows/natural-sciences/16-beautiful-deadly-frogs/","3":"16 beautiful but deadly frogs | TreeHugger","4":"golden poison dart frog photo","10":"uwGepFKTYKyqLa"},"5":{"1":"SbDWopSVpGkxKFO"}},{"1":{"1":"https://www.mashpilodge.com/wp-content/uploads/mashpi-frogs-hyalinobatrachium-aureoguttatum.jpg","3":1600,"4":1273},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfXZMfK9HGzYMUdGrrqmycQmI19-C_Dfsf_oYEkLSqx60K3UAG","3":200,"4":158},"3":{"1":"Mashpi Lodge","2":"https://www.mashpilodge.com/the-amphibians-of-mashpi-type-of-toads-and-frogs/","3":"The amphibians of Mashpi – types of toads and frogs - Mashpi ...","4":"Tree frogs (Hylidae)","10":"RmpLINVYskvAOi"},"5":{"1":"cUedHTGKOviDEvO"}},{"1":{"1":"https://www.crees-manu.org/wp-content/uploads/2017/05/cochranella-nola-glass-frog-eilidh-munro-peruvian-amazon-crees-foundation-research-sustainability5.jpg","3":1200,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2Ox9uBF6dmqIdJl96WhYixhJ4euA2Kdm15kqKSyDMQ1QU1BhG2A","3":200,"4":133},"3":{"1":"Crees Manu","2":"https://www.crees-manu.org/why-are-glass-frogs-transparent-cochranella-nola/","3":"Glass frogs: their weapon and weakness","4":"A glass frog with round, sticky toe pads blends into a leaf | Image ©  Eilidh Munro","10":"DnmtNUAAWptehN"},"5":{"1":"vwoBwiimxGbHhQq"}},{"1":{"1":"http://www.savethefrogs.com/d/day/images/icon-STF-Day-Last-Saturday-328.jpg","3":328,"4":246},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRoZ47SU0mt_tmoty9q6RwrdNkUHet4AofB4IM97KD1p1ORBuNC","3":200,"4":149},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/day/index.html","3":"Save The Frogs Day - April 29, 2017","4":"","10":"VQgobmBEaiwSSY"},"5":{"1":"sCWgepsdcGGKheQ"}},{"1":{"1":"https://smhttp-ssl-52271.nexcesscdn.net/media/catalog/product/w/h/white_s_tree_frogs_7.jpg","3":1797,"4":1789},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3eXxwGn2yYty-WrFBnJF6Dfd4PBj9ykuWY5SgTthzATQ6PFZKgg","3":200,"4":199},"3":{"1":"Josh's Frogs","2":"http://www.joshsfrogs.com/white-s-tree-frog-captive-bred.html","3":"Blue Phase White's Tree Frog - Litoria caerulea (CBP)- $34.99 Only 5 left  Quantity Available: 5","4":"Blue Phase White's Tree Frog - Litoria caerulea (CBP) | Josh's Frogs","10":"rtPYdQKSKLIcIU"},"5":{"1":"AQxFvMDWWwwKMPL"},"7":{"1":{"10":{"3":"Blue Phase White's Tree Frog - Litoria caerulea (CBP)- $34.99 Only 5 left  Quantity Available: 5","5":"White's Tree Frog (Captive Bred) - Litoria caerulea","6":true,"7":34.9900016784668,"8":"USD"}}}},{"1":{"1":"https://www.futurity.org/wp/wp-content/uploads/2016/07/mating_frogs2_1600-770x440.jpg","3":770,"4":440},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBtcy-7M_1t5dx5nDND5tHuc2f1Bzv7Xxx020ax10cOtifp1hK","3":200,"4":114},"3":{"1":"Futurity.org","2":"https://www.futurity.org/frogs-mating-land-1212492-2/","3":"Some frogs mate on land to avoid a 'breeding frenzy' - Futurity","4":"","10":"FsAorQNLSeMLwS"},"5":{"1":"YbmpWttSsocNiVp"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/froghed.png?itok=Bi4CHog0&resize=1100x1100","3":1100,"4":739},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmY0H3CbzQT8mOLU0YUllEo-UFmUxxcAFPYm6vjsT_4dQOyymJ","3":200,"4":134},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/71568/hawaiis-big-island-overrun-loud-frogs-puerto-rico","3":"Hawaii's Big Island Is Overrun With Loud Frogs From Puerto ...","4":"Hawaii's Big Island Is Overrun With Loud Frogs From Puerto Rico","10":"xseKINCUlyrvvk"},"5":{"1":"EETLpMYcyuUJiNf"}},{"1":{"1":"https://defenders.org/sites/default/files/frog-kevin-clark-dpc.jpg","3":498,"4":272},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdlp5WACg_U6DCIeigBfLXDLqop9Q9zgib8dM8phjv7P9jc4xywA","3":200,"4":109},"3":{"1":"Defenders of Wildlife","2":"https://defenders.org/frogs/basic-facts","3":"Frogs | Basic Facts About Frogs | Defenders of Wildlife","4":"","10":"sbpFxFBQDgGtnc"},"5":{"1":"skuSpTbIYMWIUMF"}},{"1":{"1":"https://pmdvod.nationalgeographic.com/NG_Video/66/327/170127-news-finding-frogs-original-edit-vin_640x360_866906691953.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS5q2Gz_zZ4yGCE03P3_UwddQwRNY49y2CuKKlDvMG4j08DQvAqQw","3":200,"4":112},"3":{"1":"National Geographic","2":"https://video.nationalgeographic.com/video/news/170127-news-finding-frogs-original-edit-vin","3":"Tracking Frogs In the Amazon Rain Forest","4":"","10":"FuwxHswpnLfGeI"},"5":{"1":"uKfhwUXcIhoogNT"}},{"1":{"1":"http://www.aquariumofpacific.org/images/made/images/slideshow/frogs_slideshow_banner_940x260_940_260_85shar-70-.5-5.jpg","3":940,"4":260},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvWwjH2RxiLhhzaYnK9ou-2d84Hx90uK4SvYfOQ5eMCF8cCcEK8g","3":200,"4":55},"3":{"1":"Aquarium of the Pacific","2":"http://www.aquariumofpacific.org/exhibits/frogs","3":"Aquarium of the Pacific | Frogs: Dazzling & Disappearing ...","4":"FROGS: Dazzling and Disappearing","10":"pkqLeJeLmKVNPF"},"5":{"1":"HTqRRDiwKRWWKBN"}},{"1":{"1":"https://media.npr.org/assets/img/2017/01/31/frog-promo-1d3cdbeae91022c34fc659ad35ec677db5fb477f-s800-c85.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrh_0JT1Hmrrmk3TG2UQOs4tvHlayNaoSV_F6kCzWorG_Az374","3":200,"4":149},"3":{"1":"NPR","2":"https://www.npr.org/sections/thetwo-way/2017/01/31/512622260/to-catch-prey-frogs-turn-to-sticky-spit","3":"To Catch Prey, Frogs Turn To Sticky Spit : The Two-Way : NPR","4":"Enlarge this image","10":"pdqSoGRTEjggYa"},"5":{"1":"VsMstoapUTjNyhP"}},{"1":{"1":"https://www.thesprucepets.com/thmb/mBbnO3P3iy42LYw40qiqHrw7y6M=/450x0/filters:no_upscale():max_bytes(150000):strip_icc()/GettyImages-175174320-581251b65f9b58564ccaffe2.jpg","3":450,"4":338},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgO-9VaUig5kL576jezP40Xe6p85j65n3RCkuY6y3Wzu7P7pBw","3":200,"4":149},"3":{"1":"The Spruce Pets","2":"https://www.thesprucepets.com/whites-tree-frog-1236816","3":"A Guide to Caring for Pet White's Tree Frogs","4":"White's Tree Frogs' Behavior and Temperament","10":"JMVRbqkbIIvjsk"},"5":{"1":"CouNEYfSeOArmVa"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/2d/z3/p02dz3cy.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0-DmARCSCVbR2JmafaUUp2xKyuJbYqxkvUi5BYaCiCQ6Y3gBa","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20141210-gorgeous-new-frogs-found-in-india","3":"BBC - Earth - Nine beautiful new frogs found in India's ...","4":"Nine beautiful new frogs found in India's Western Ghats","10":"olXkoxuJEnONJo"},"5":{"1":"XwtKwbtqWryTOGk"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/2018/woodfrogsno1.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQaXimX_N6UETTMd8m_L0fNt23keTeateEaRjOtZ5Jf4UyOTKxS","3":200,"4":149},"3":{"1":"Phys.org","2":"https://phys.org/news/2018-05-wood-frogs-option-pee-winter.html","3":"Wood frogs' No. 1 option: Hold in pee all winter to survive","4":"","10":"CEqxlvQHXVHXVa"},"5":{"1":"bVFQHcQuFFJXjXe"}},{"1":{"1":"https://www.radionz.co.nz/assets/news_crops/51939/eight_col_Green_and_golden_bell_frog_-_Paul_Schilov__DOC.jpg?1518755893","3":720,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRArRLV-ZPjCLU1LlLyxwL2Qg_gq32A_qk1H6q2qZfHwyFFkCVoBw","3":200,"4":124},"3":{"1":"Radio NZ","2":"https://www.radionz.co.nz/news/national/350590/screeching-frogs-no-music-to-papamoa-s-ears","3":"Screeching frogs no music to Papamoa's ears | RNZ News","4":"Green and gold bell frogs: delightful to some; less so to others","10":"lmMkugWXrTFWkI"},"5":{"1":"vCKvENJeDtssMYw"}},{"1":{"1":"https://static1.squarespace.com/static/56648ab9e4b08333d1fdda0d/t/59d2de38a803bbf1d1a6c600/1506992166743/green_and_mink_CES.jpg?format=750w","3":750,"4":322},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRTDg-7IY9-O3b-eFzg5_UFgYlhu9ZZVGJk09Hbyjv9B2y3TffT","3":200,"4":85},"3":{"1":"Field Ecology","2":"https://www.fieldecology.com/blog/a-case-of-two-confusing-frogs","3":"Head to Head: A Case of Two Confusing Frogs — Field Ecology","4":"Left: Green frog ( Lithobates clamitans ). Right: Mink Frog ( Lithobates  septentrionalis","10":"pUVUOdaTRwOyjh"},"5":{"1":"yHjTdyQroDgCWdN"}},{"1":{"1":"http://www.ipcc.ie/wp/wp-content/uploads/2012/11/bogfrog1.jpg","3":432,"4":324},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTdh7xGlfYKIZZoIX39opV4q6g3zMhcrxSKXDxXKhJM8mdHukTvYw","3":200,"4":149},"3":{"1":"Irish Peatland Conservation Council","2":"http://www.ipcc.ie/a-to-z-peatlands/frogs/","3":"Frog Factsheet - Irish Peatland Conservation Council ...","4":"Common Frog (Rana temporaria) in Lodge Bog, Co. Kildare","10":"raWUPnKvHoPLse"},"5":{"1":"wcXpPtnYsGdoKJF"}},{"1":{"1":"https://www.sciencedaily.com/images/2017/11/171129090421_1_540x360.jpg","3":536,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvlee0GkpwWYEUJKQoGPFpk2EG5FhGdkJFgd2H-zeYSNERweOS9A","3":200,"4":134},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2017/11/171129090421.htm","3":"Invasive frogs give invasive birds a boost in Hawaii ...","4":"Coquis ...","10":"KqBADfyUpcYQqH"},"5":{"1":"rBVhEPdGgtpfabn"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/_zguUogCQ0DkXMlu0ktSFESkTJI=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/66/45/6645520f-0f24-4eb7-a788-4ca9ec2f61ed/14-fun-facts-about-frogs-550-419.jpg","3":550,"4":419},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQX1FgR9O8odOodFbUAzW-aIA9CrePB8C3WUy472Xlyta32Z5VN","3":200,"4":152},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/14-fun-facts-about-frogs-180947089/","3":"14 Fun Facts About Frogs | Science | Smithsonian","4":"#4: When Darwin's frog tadpoles hatch, a male frog swallows the tadpoles","10":"RjFrolyMuvCBYP"},"5":{"1":"wEciuiYICEKAObu"}},{"1":{"1":"https://www.savethefrogs.com/images/events/day/2018/icon-save-the-frogs-day-2018-official-550.jpg","3":550,"4":413},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRibUOmBWEy-Cr0uMqu0tZT6s9ORQC2xzbGIgMASssmk7I_5QfV","3":200,"4":149},"3":{"2":"https://www.savethefrogs.com/","3":"SAVE THE FROGS! - Home","4":"icon save the frogs day 2018 official 550","10":"tYUCavGVyiNQiH"},"5":{"1":"UpPaLeYDytuQxjc"}},{"1":{"1":"https://www.environment.nsw.gov.au/-/media/OEH/Corporate-Site/Topics/Water/Wetlands/alpine-tree-frog-litoria-verreauxii-alpina-109924.jpg?h=585&w=810&hash=89D07E2F6959476D1F9FA0F15848FBC38932D6B4","3":810,"4":585},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRl84qjRzDxuAWE5CW28jJmJHKst8vnd-WBF8jZhP-xrNLaj3FV","3":200,"4":144},"3":{"1":"Office of Environment and Heritage - NSW Government","2":"https://www.environment.nsw.gov.au/topics/water/wetlands/plants-and-animals-in-wetlands/frogs","3":"Frogs in wetlands | NSW Environment & Heritage","4":"Alpine tree frog (Litoria verreauxii alpina) Photo: / Dr Dave Hunter","10":"NjrkvJayacyTXP"},"5":{"1":"BQliixBjqTljksX"}},{"1":{"1":"https://advancedtissue.com/wp-content/uploads/wound-healing-with-frog-skin.jpg","3":357,"4":242},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLyhCAwXxFitHayeYypMi2h03p7e0uAyUt7qVkb7HFXnjrVHnm","3":200,"4":135},"3":{"1":"Advanced Tissue","2":"https://advancedtissue.com/2015/07/frogs-and-wound-healing-whats-the-connection/","3":"Frogs and Wound Healing: What's the Connection?","4":"","10":"eQwjeANbJEgnpN"},"5":{"1":"JRXTEKjTTNmhMWe"}},{"1":{"1":"https://www.earthrangers.com/content/wildwire/green_frog_in_lake.jpg","3":640,"4":427},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSJKWWjU37-8POn1JDoz-F-YfCeTdS1K6CPB9XEzia2N3a9zt3O","3":200,"4":133},"3":{"1":"Earth Rangers","2":"https://www.earthrangers.com/wildwire/omg_animals/whats-so-great-about-frogs/","3":"What's So Great About Frogs? | Earth Rangers Wild Wire Blog","4":"What's So Great About Frogs?","10":"wLPhaSrclSwRIR"},"5":{"1":"fmuLWTTSNMbcpig"}},{"1":{"1":"http://www.pbs.org/wnet/nature/files/2014/06/frog-interactive.jpg","3":935,"4":526},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRcA8Iblt3ZgEQXiWQnGBqtiKMf8hZFf9CBYZQZSlztYk9-76bscA","3":200,"4":112},"3":{"1":"PBS","2":"http://www.pbs.org/wnet/nature/fabulous-frogs/8904/","3":"Fabulous Frogs | About | Nature | PBS","4":"Attenborough's Family of Fabulous Frogs","10":"BeRwlXHEGexsjP"},"5":{"1":"rIBinmesmIPwajF"}},{"1":{"1":"https://images.pexels.com/photos/104827/cat-pet-animal-domestic-104827.jpeg?auto=compress&cs=tinysrgb&h=350","3":527,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTw8Du8Ux7DmwbCFXbOkl-jyZ31neHXZPFLFNmLwThLTfd52sRK7g","3":200,"4":132},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Grey and White Short Fur Cat","10":"TREAroYWuwFPbe"},"5":{"1":"kUtiOrdImbWFUov"}},{"1":{"1":"https://images.pexels.com/photos/617278/pexels-photo-617278.jpeg?auto=compress&cs=tinysrgb&h=350","3":528,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyvCOVHlpY5k9zMZYVgTZ3UrMBZcwRgkOFnmUuo80Ik7epQb7OgQ","3":200,"4":132},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"","10":"TsqdXdqOmrGDFt"},"5":{"1":"xStLTJfYSAJEtuf"}},{"1":{"1":"http://www.catster.com/wp-content/uploads/2017/08/A-fluffy-cat-looking-funny-surprised-or-concerned.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYQo_3zC1FpgMmtbD0IDEVKiCMZ8H3SfbtBTOn42O8_fIj4fe8xQ","3":200,"4":133},"3":{"1":"Catster","2":"https://www.catster.com/cat-behavior/what-is-cat-flehmen-response","3":"What is a Cat Flehmen Response? - Catster","4":"","10":"PqnOEAEekXfkks"},"5":{"1":"KHGxdUcqYOSnNFb"}},{"1":{"1":"https://images.pexels.com/photos/20787/pexels-photo.jpg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvSeOYRVExl062WjSramBG1P_LA-KUmQNFBD7s-Kqagn1XvJZn","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Free stock photo of animal, pet, cat, adorable","10":"NNeOBwdWCVthYB"},"5":{"1":"kigYrKahGHXFYqm"}},{"1":{"1":"https://www.cats.org.uk/uploads/images/featurebox_sidebar_kids/grief-and-loss.jpg","3":582,"4":328},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkadsYJoVDlWZ6IbaBDHQBCr8xqf9tghiiGd1kUosjQfa87EwDxA","3":200,"4":112},"3":{"2":"https://www.cats.org.uk/","3":"Cats Protection - UK's Largest Feline Welfare Charity","4":"Ginger cat","10":"JTPLwlndmEDniN"},"5":{"1":"FNDtweTpuRKfAaw"}},{"1":{"1":"https://www.readersdigest.ca/wp-content/uploads/sites/14/2011/01/4-ways-cheer-up-depressed-cat.jpg","3":1000,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzydEUK5PkeCEMWd5_FBN6rPwGUZE5NpniXIJvFolxCxP0k_Ya","3":200,"4":140},"3":{"1":"Reader's Digest Canada","2":"https://www.readersdigest.ca/home-garden/pets/4-ways-cheer-depressed-cat/","3":"How to Cheer Up a Depressed Cat","4":"4 Ways to Cheer Up a Depressed Cat","10":"ANUMBTkkqibRAD"},"5":{"1":"dOqNJVdHiXMiRAx"}},{"1":{"1":"https://s.hswstatic.com/gif/whiskers-sam.jpg","3":400,"4":272},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTQkLe7r0U3Tw6QYb4r4nDvtysFrTFA6kfkByQ-NMk64VqgPqrE","3":200,"4":136},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/pets/question592.htm","3":"Why do cats have whiskers? | HowStuffWorks","4":"A cat's whiskers are so sensitive that they can detect the slightest  directional change in a","10":"lsrjwuKAaujOte"},"5":{"1":"HhtIvaifBWqrnAo"}},{"1":{"1":"https://i.ytimg.com/vi/I7jgu-8scIA/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQEq5El8D9lupke-0HjTPkPdfpS-KP8r4ic4Hutkz0lU-9VyX1Dcw","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=I7jgu-8scIA","3":"Animal Funny Cat Images, Pics, Videos","4":"Animal Funny Cat Images, Pics, Videos","10":"GFeWDFVjovWHnS"},"5":{"1":"RnAdHAIxVJeRIkj"},"7":{"1":{"11":{"1":"Animal Funny Cat Images, Pics, Videos","2":"A Funny Cat Videos Compilation, Cats Pictures, Images & Photos, cat photos  free download, cat photos wallpaper, cat photos free, Cat Photos hd  wallpapers fre...","3":"1:31","4":"102595","5":"1468454400000","6":"Real Video","7":"195","8":"1"}}}},{"1":{"1":"https://pbs.twimg.com/profile_images/378800000532546226/dbe5f0727b69487016ffd67a6689e75a_400x400.jpeg","3":400,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbviSJcx2a4U01BRinV9aTIrdxUBzy9ZCHs2WdNG49aanJilZG","3":200,"4":200},"3":{"1":"Twitter","2":"https://twitter.com/cats","3":"Cats (@Cats) | Twitter","4":"Cats","10":"NdifjEknWFWSjU"},"5":{"1":"aTqngNpkitmabKn"}},{"1":{"1":"http://r.ddmcdn.com/s_f/o_1/cx_462/cy_245/cw_1349/ch_1349/w_720/APL/uploads/2015/06/caturday-shutterstock_149320799.jpg","3":720,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQS1O0mrtqT01GaiopVuQ6xn9yxiBGX8Vq4GZgq1bTcAbddeDAP","3":200,"4":200},"3":{"1":"Animal Planet","2":"http://www.animalplanet.com/pets/cats/","3":"Cats | Animal Planet","4":"Enter Your Cat In the #SaturdayCaturday Photo Contest","10":"emYEBtlYQpiAbm"},"5":{"1":"ivgquuqMrsiRMqY"}},{"1":{"1":"http://catsatthestudios.com/wp-content/uploads/2017/12/12920541_1345368955489850_5587934409579916708_n-2-960x410.jpg","3":960,"4":410},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2CCdsr45LaljC1fM0vx0IwzNWhFO4t6AlEmZlhsjrhmjbknh-","3":200,"4":85},"3":{"2":"http://catsatthestudios.com/","3":"Cats At The Studios","4":"","10":"CfMfbnycBdJMNW"},"5":{"1":"XxgiTeyyBktDYgI"}},{"1":{"1":"https://images.pexels.com/photos/326875/pexels-photo-326875.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAeaY5lovSy3u9wAf2A-evp1YJow4XxrBY2N49sitZikCt3odshg","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Cat Outdoors","10":"gDtGgtJFNRBnKs"},"5":{"1":"fqQxxvMBbmHnoGf"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/101438745-cat-conjunctivitis-causes.jpg","3":2673,"4":1797},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-RyKa-DFc31yM6YnVxmbpH-Wh-TGhvGs-EbC9mIBiOSk2i3fIyw","3":200,"4":134},"3":{"1":"Petfinder","2":"https://www.petfinder.com/animal-shelters-and-rescues/fostering-cats/eight-reasons-you-can-foster-a-pet/","3":"Eight Reasons You Can Foster a Pet -- Even If You Think You ...","4":"Photo Credit: Thinkstock","10":"oVsrTAfMjhstNX"},"5":{"1":"RjxVkBxrJfxAkFb"}},{"1":{"1":"https://ichef.bbci.co.uk/images/ic/720x405/p0517py6.jpg","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTpvUB49_6VsNZeqiVuryzEbAgFrEFF-rz3xLc7KOtIA3rdtWmDzw","3":200,"4":112},"3":{"1":"BBC.com","2":"https://www.bbc.com/news/uk-scotland-39717634","3":"Should designer cats be banned?","4":"","10":"EVfyYqRfoeydmH"},"5":{"1":"tAjxscAqhLXqVDW"},"7":{"1":{"11":{"1":"Should designer cats be banned?","2":"The British Veterinary Association says irresponsible breeding of Scottish  Fold cats should be banned.","3":"0:51","5":"1493251200000"}}}},{"1":{"1":"https://www.rd.com/wp-content/uploads/2016/04/01-cat-wants-to-tell-you-laptop.jpg","3":2400,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTg6mKUF2r_U-_Nz10Wnk4TB5NLniqvO3oUHJW3at3cJp5UzffsMg","3":200,"4":133},"3":{"1":"Reader's Digest","2":"https://www.rd.com/advice/pets/how-to-decode-your-cats-behavior/","3":"Cat Behavior: Things Your Cat Wants to Tell You | Reader's Digest","4":"Please do not disturb my nap on your laptop or keyboard","10":"hPwqXxbtgVUEng"},"5":{"1":"ogVpkBcTvnUHKQg"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/adorable-cat.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTKr6YlGNsqgJzvgBBkq1648_HsuDizVn_ZXC6iQp9kjXFzLvs1BA","3":200,"4":112},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"Lovely ...","10":"VWyqcdIifiPAsd"},"5":{"1":"yEBvoqdpBJAADwy"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg","3":1200,"4":1199},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZCGyzQCpBWIboSErgUWkpGjp6NnHDRHNukRLST7JZ484gOrrN","3":200,"4":199},"3":{"1":"Wiktionary","2":"https://en.wiktionary.org/wiki/cat","3":"cat - Wiktionary","4":"","10":"qesKDTYqjNDBQr"},"5":{"1":"nFrmKJJBTxIDCyJ"}},{"1":{"1":"http://www.catster.com/wp-content/uploads/2017/10/A-kitten-meowing-with-his-mouth-open.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSe8Jz9HWznGSe5UmiA7aTpyr4h0ZbU6kMaNVtLoe1bzXJePHXG","3":200,"4":133},"3":{"1":"Catster","2":"https://www.catster.com/lifestyle/cat-wont-stop-meowing-reasons-for-cat-meowing","3":"Cat Won't Stop Meowing? 7 Reasons For All That Cat Meowing ...","4":"Cat Won't Stop Meowing? 7 Reasons For All That Cat Meowing - Catster","10":"rOLKXbEemWMNIf"},"5":{"1":"HwATpmJvGCtpMFg"}},{"1":{"1":"https://cdn-images-1.medium.com/max/1600/1*mONNI1lG9VuiqovpnYqicA.jpeg","3":1600,"4":911},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBSLktez1akzZE9ow_QqBWlJ0tKmIEwPdNcsa6b-e3smz0Y5z9","3":200,"4":113},"3":{"1":"Hacker Noon","2":"https://hackernoon.com/a-guide-to-giving-your-cats-their-annual-performance-review-fbf14610305","3":"A guide to giving your cats their annual performance review","4":"","10":"awJBeEDkWAhkkj"},"5":{"1":"kTEHqrRYxvSjFcs"}},{"1":{"1":"https://www.aspca.org/sites/default/files/cat-care_urine-marking_main-image.jpg","3":1040,"4":500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjlvHgqz9zSaliBXKKJRhynljd48S70CA-gQoVifLjXfFzXTex","3":200,"4":96},"3":{"1":"aspca","2":"https://www.aspca.org/pet-care/cat-care/common-cat-behavior-issues/urine-marking-cats","3":"Urine Marking in Cats | ASPCA","4":"Urine Marking in Cats","10":"BlkviGkEnuVojJ"},"5":{"1":"ecTTqLuGxKVUcJP"}},{"1":{"1":"https://media.istockphoto.com/photos/feline-picture-id512202044?k=6&m=512202044&s=612x612&w=0&h=VhTTUGX--kLckiNLgoEELarEJUgemigqLHkjo9-VVYE=","3":612,"4":408},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRZemwo9_Ur3LX9ZP9rk-ZskbIHKDD4nniZAymFOC1F6ot0HYQnA","3":200,"4":133},"3":{"1":"iStock","2":"https://www.istockphoto.com/sg/photos/cats","3":"Royalty Free Cats Pictures, Images and Stock Photos - iStock","4":"Feline stock photo","10":"iMthlYTpJYgtdI"},"5":{"1":"vuXdIGjRcfjLJAO"}},{"1":{"1":"https://www.bluecross.org.uk/sites/default/files/assets/images/cat%20tick.jpg","3":3200,"4":2595},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlq8UxNpI3sv4Ld-h2o83xxncY9URNPXVbWTL4ECfxmuG0th4Rag","3":200,"4":162},"3":{"1":"Blue Cross","2":"https://www.bluecross.org.uk/pet-advice/cats-and-ticks","3":"Cats and ticks | How to spot and remove ticks from cats ...","4":"Cats and ticks | How to spot and remove ticks from cats | Blue Cross","10":"ghAtIlveaDuvKG"},"5":{"1":"PWaSYHMWopSrgKf"}},{"1":{"1":"https://www.shelterluv.com/sites/default/files/animal_pics/464/2016/11/25/22/20161125220040.png","3":1024,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlaceNooMylVTLcMPyXpgPqt033qbXFseV3BQnOdwoOF4yWL02","3":200,"4":200},"3":{"1":"Austin Pets Alive!","2":"https://www.austinpetsalive.org/adopt/cats/","3":"Austin Pets Alive! Available Cats - Austin Pets Alive!","4":"Winnie","10":"mbCVTqDjXUGOqI"},"5":{"1":"RPbuTitwcJrARju"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/cute-kittens.jpg","3":460,"4":276},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR7gRqfGF8AOysFCbPj7FQEkvPD7EJxficJ3hG3jAnKHqk7OSnDww","3":200,"4":120},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"A healthy young cat sitting","10":"DJCvRXDEMFHWFC"},"5":{"1":"JSCCVENnJxkeJkS"}},{"1":{"1":"https://news.nationalgeographic.com/content/dam/news/2018/05/17/you-can-train-your-cat/02-cat-training-NationalGeographic_1484324.ngsversion.1526587209178.adapt.1900.1.jpg","3":1900,"4":1266},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiuxf2WZEzJwoVCSC87LI4g-KBxBnmld-Y9t7YuRLo9-H8ifC-Vw","3":200,"4":133},"3":{"1":"Latest Stories - National Geographic","2":"https://news.nationalgeographic.com/2018/05/animals-cats-training-pets/","3":"Why You're Probably Training Your Cat All Wrong","4":"","10":"VigYrdlMvakobR"},"5":{"1":"eiQWTqEIvjVgrgE"}},{"1":{"1":"https://www.argospetinsurance.co.uk/assets/uploads/2017/10/pexels-photo-416160.jpeg","3":3888,"4":2592},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPCS-aaaF7r3ypNGiFTi29miHqRFGgC7bnqTs7pw-71L0a-Mwnzw","3":200,"4":133},"3":{"1":"Argos® Pet Insurance","2":"https://www.argospetinsurance.co.uk/we-talk-pet/10-things-cats-do-to-show-they-love-you/","3":"10 Things Cats Do To Show They Love You | Argos Pet Insurance","4":"10 Things Cats Do To Show They Love You","10":"rYgIMLoQkrocaW"},"5":{"1":"kodUSpMtIyjumXF"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/112809642-fostering-cats-kittens-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFJ4TjzMvQCcqtVW8DjfRlgZRNhW0icO1WhlVJfaqr2jwjybd8","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/animal-shelters-and-rescues/fostering-cats/fostering-cats-kittens/","3":"How to Be the Best Cat Foster Parent | Petfinder","4":"How to be the Best Cat Foster Parent","10":"RpYktfNNgFFUdM"},"5":{"1":"hVlXPYvfICAxvrP"}},{"1":{"1":"https://www.msah.com/sites/default/files/play-cats.jpg","3":632,"4":353},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtcDTBvP4A08AMSJl0Tk0_gLs_BjEnJ5-b1_2lvE3fSl_b0Yau","3":200,"4":111},"3":{"1":"Metairie Small Animal Hospital","2":"https://www.msah.com/services/cats/blog/playing-your-cats-%E2%80%93-every-day","3":"Playing with Your Cats – Every Day | MSAH - Metairie Small ...","4":"Playing with Your Cats – Every Day","10":"tsqryOecsuMihO"},"5":{"1":"BgVXTRcSCvUAcCp"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/munchkinhed.png?itok=oeH4evcQ&resize=1100x1100","3":1100,"4":739},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQbjgFUFnqKqflsXhxpCLxR3RP5jl8OT0OVTCmr4zXIMpJEJ64","3":200,"4":134},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/80011/7-short-facts-about-munchkin-cats","3":"7 Short Facts About Munchkin Cats | Mental Floss","4":"iStock","10":"oYOoVrtVhpULsR"},"5":{"1":"BwXdgvLEqHVuGgC"}},{"1":{"1":"https://cdn.pixabay.com/photo/2014/03/29/09/17/cat-300572_960_720.jpg","3":858,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiXhgkC523CD5DIdvfwFl3G_S1Hc3oHzh8NUTXPeRSfYv1i8rA","3":200,"4":168},"3":{"1":"Pixabay","2":"https://pixabay.com/en/cat-animal-pet-cats-close-up-300572/","3":"Cat Animal Pet · Free photo on Pixabay","4":"cat animal pet cats close up","10":"OHrigtPprUbqIt"},"5":{"1":"UVwBxWqQQJpELdq"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/152964589-welcome-home-new-cat-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1Ryrw8RcKm866nT-TcscKEKQUMvsrnhdNLT3y06nvxb-FhfDt","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/bringing-a-cat-home/welcome-home-new-cat/","3":"9 Ways to Welcome Home your New Cat | Petfinder","4":"9 Ways to Welcome Home your New Cat","10":"RbACJocuSEhqRa"},"5":{"1":"nJnuySiDYQJflde"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/istock_000072600763_small.jpg?itok=LGQn4NSZ&resize=1100x1100","3":1100,"4":732},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR58HJCXknbahGz6Dc710zOivlLK6YAeGPkOsNWDo_k4RibzPJo","3":200,"4":133},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/75833/celebrate-japans-cat-day-these-7-japanese-instagram-cats","3":"Celebrate Japan's Cat Day with These 7 Japanese Instagram ...","4":"iStock","10":"YUCVnPpvTavfJV"},"5":{"1":"qqAjxskMBsjupEQ"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/3asSf7LmvyrY5m0-ggxJjrnd_DI=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/58/04/5804c840-3073-4ecf-a1d2-37808419fe93/gdahh5-wr.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgwhDHRTam8t_vntCH3lU3vZ3A697TxZwdbMZwvMNuLSQ3TakM","3":200,"4":149},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/theres-no-such-thing-hypoallergenic-cat-180968819/","3":"There's No Such Thing as a Hypoallergenic Cat | Science ...","4":"These unusual cats may have some advantages for allergic owners, but to  call them hypoallergenic ...","10":"dmLuuTyYAvgAOD"},"5":{"1":"UwxXbIqINHIIvuh"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/91615172-find-a-lump-on-cats-skin-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuxqqFdfLl9xgGpx0T4ErYHW7JQjhh2U5JDnTIm6lQQKuWlchb","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/","3":"Cats: Adoption, Bringing A Cat Home and Care","4":"","10":"uJOSoggYshTaUI"},"5":{"1":"waQpBnMWGyMBaQg"}},{"1":{"1":"https://ravishly-9ac9.kxcdn.com/cdn/farfuture/edYzCuowlJVcDos1RjXSa8_1o5tGDQBE4ebEFE6R1OE/mtime:1479930604/sites/default/files/maxresdefault_2.jpg","3":1600,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTOD7uc1bCe8jGOehxNSdsB3RewoVlWU-4EON8EXBLTIupS4YQS","3":200,"4":149},"3":{"1":"Ravishly","2":"https://ravishly.com/ravs-radar/your-cat-making-you-horny-what","3":"Is Your Cat Making You Horny? (What?) | Ravishly | Media Company","4":"Is Your Cat Making You Horny? (What?)","10":"rbYhAXkbgtNkAY"},"5":{"1":"SLwJxCswOkjIuxT"}},{"1":{"1":"http://www.animaltransportationassociation.org/Resources/Pictures/cat2.jpg","3":2560,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRawXsBlHjuyVHNLuP5KWss9CfyB_LyXdOhy0lD1_aFl7w9fRO8","3":200,"4":124},"3":{"1":"Animal Transportation Association","2":"http://www.animaltransportationassociation.org/19Mar15_atawebcast","3":"Animal Transportation Association - Carrying Cats ...","4":"Carrying Cats: Considerations for Felines During Transit","10":"XhJwPxfLULYfXJ"},"5":{"1":"TbdLHqgvygvuRPl"}},{"1":{"1":"https://r.hswstatic.com/w_907/gif/tesla-cat.jpg","3":907,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXjhYG2c5myi8y_vziQOoCg_4WvcIHkAFKr9PpsJCUZSTKZtDD","3":200,"4":112},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/pets/teslas-cat-and-other-feline-fascinations.htm","3":"Nikola Tesla's Cat and Other Feline Fascinations | HowStuffWorks","4":"","10":"YPnSORjUREfjUP"},"5":{"1":"oUMXyuhFJqlfjTK"}},{"1":{"1":"https://i.ytimg.com/vi/zGcYabz3hYg/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTn95ROGrOOGyx5B8KPjaooWMaGSzy0o-UGgPWSMhbyj438qZcRYA","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=zGcYabz3hYg","3":"Sushi for Cats","4":"Sushi for Cats","10":"YDCvnorpNepngG"},"5":{"1":"bdssmGwdEiDSYRu"},"7":{"1":{"11":{"1":"Sushi for Cats","2":"►Patreon: https://www.patreon.com/JunsKitchen ►EQUIPMENT I use on my  channel that you can buy online (Amazon affiliates links) ―Knife― Chef  Knife: Sekimagoro...","3":"4:04","4":"10220867","5":"1500854400000","6":"JunsKitchen","7":"246890","8":"17056"}}}},{"1":{"1":"https://imgix.bustle.com/rehost/2017/5/30/f9fc3698-7ca6-40e5-975b-a63878357657.jpg","3":4288,"4":3216},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQs07PEKjsUcCKXIEeLpIYG_um9W8Z_tAUym4laTeMEQqxrnu2e_g","3":200,"4":149},"3":{"1":"Bustle","2":"https://www.bustle.com/articles/144945-6-reasons-cats-are-not-just-like-women-because-the-stereotypes-have-got-to-go","3":"6 Reasons Cats Are Not \"Just Like\" Women, Because The ...","4":"6 Reasons Cats Are Not \"Just Like\" Women, Because The Stereotypes Have Got  To Go","10":"wUAIaceDiYwbQS"},"5":{"1":"bmGlSRwqgVAblRg"}},{"1":{"1":"https://www.shelterluv.com/sites/default/files/animal_pics/464/2016/11/25/21/20161125215406.png","3":1024,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdoH6fd7-mpAM9EcN7wj2dmhgKcUBNrjPdLqruK--36bvJ6qr1xA","3":200,"4":200},"3":{"1":"Austin Pets Alive!","2":"https://www.austinpetsalive.org/adopt/cats/","3":"Austin Pets Alive! Available Cats - Austin Pets Alive!","4":"Ellsworth 5","10":"cjoDglsXHWwNUE"},"5":{"1":"yQFhabreXuYuacm"}},{"1":{"1":"http://r.ddmcdn.com/w_830/s_f/o_1/cx_0/cy_66/cw_288/ch_162/APL/uploads/2014/10/cat_5-1.jpg","3":830,"4":466},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQZr_w2kP8Wg9ESCJmgUCcsHj8zDgLM2cvpQbUTZt9LIdfHr0jF","3":200,"4":112},"3":{"1":"Animal Planet","2":"http://www.animalplanet.com/pets/cats/","3":"Cats | Animal Planet","4":"General Cat Care Tips","10":"DiVYMoamtOsUgN"},"5":{"1":"enxIppusXeDqqOC"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/arpyrvhwaJWduhI6QhMe9Fo3858=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/20110913074012glowing_cat_web.jpg","3":470,"4":251},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSbVN3ZxmtUTLNkABAQstR_IcVm3nGK9FBZxwfhOWU5mjGjn0DN","3":200,"4":106},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/the-glow-in-the-dark-kitty-77372763/","3":"The Glow-In-The-Dark Kitty | Science | Smithsonian","4":"A fluorescent green cat could help in the fight against AIDS","10":"uIAMvvVbSXvIUH"},"5":{"1":"yBiLdBepktKCObP"}},{"1":{"1":"https://icatcare.org/sites/default/files/kcfinder/images/images/aggressive-red-cat.jpg","3":490,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRH8x6rsyQTeKuDhI4Y3q_xjU5PYPQljhfvxy_1BjkvQKGBp4PT","3":200,"4":133},"3":{"1":"International Cat Care","2":"https://icatcare.org/advice/problem-behaviour/aggression-between-cats","3":"Aggression between cats | International Cat Care","4":"Aggression between cats","10":"usEbeWdynUvWJO"},"5":{"1":"lGvbsGkSBdmGRuJ"}},{"1":{"1":"http://cdn0.wideopenpets.com/wp-content/uploads/2018/02/AdobeStock_181671521.jpeg","3":4272,"4":2848},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT2c7pm89h2GgdUOys6nBz1omEtspO1aguhl7DPUj5gR_aImYFm","3":200,"4":133},"3":{"1":"Wide Open Pets","2":"https://www.wideopenpets.com/8-affectionate-cat-breeds-that-actually-love-to-cuddle/","3":"9 Affectionate Cat Breeds That Actually Love to Cuddle","4":"Girl holds in his hands a beautiful Siamese cat","10":"MhRqTMHQiSQTSq"},"5":{"1":"oxLmbcibtEAPGRO"}},{"1":{"1":"https://www.thesprucepets.com/thmb/7kVrWdBf13osb9nYJ-4D2yPAwfQ=/425x326/filters:no_upscale():max_bytes(150000):strip_icc()/GettyImages-466792657-59cef0d6c412440010be728c.jpg","3":425,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9-jeA_VEFnUUwJzRS9dTC2FRcAiNZboqIhgAGCPI_Gd_G6b8e","3":200,"4":153},"3":{"1":"The Spruce Pets","2":"https://www.thesprucepets.com/cats-4162124","3":"How to Be a Responsible Cat Owner","4":"Cats","10":"rTaXFKEVvQoCxn"},"5":{"1":"UjCFlVxhlVPNwjF"}},{"1":{"1":"https://ichef.bbci.co.uk/news/624/cpsprodpb/305D/production/_103218321_gettyimages-134815902.jpg","3":624,"4":351},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSOL8rHQ04-vwxJqVlRqN-H0hK4kUwnmckDMP0zTvKXJy1iG3Nc","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/world-asia-45347136","3":"Why a village in New Zealand is trying to ban all cats - BBC News","4":"Stock image of a cat outside in flower bed","10":"NrUvUBQTcTCSiL"},"5":{"1":"YHAqNrBWfXaEMVb"}},{"1":{"1":"https://atlantahumane.org/wp-content/uploads/2012/08/adopt-a-cat-1200x630.png","3":1200,"4":630},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5TH43KjTPkOGsCqmw8hjBcrHO-erQelSZ0FWlA29r0zOoJW92hg","3":200,"4":105},"3":{"1":"Atlanta Humane Society","2":"https://atlantahumane.org/adopt/cats/","3":"Adopt a Cat or Kitten","4":"Adopt a Cat","10":"knAaYJckcivLmR"},"5":{"1":"TsjhVmbdmbVoHoD"}},{"1":{"1":"http://www.dreams.metroeve.com/wp-content/uploads/2017/04/dreams.metroeve_cats-dreams-meaning.jpg","3":592,"4":304},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTNet_foDzEqA51kZf7y8R5kOWFEUKK9F9ICsbZYr4bOTLhMeZ5","3":200,"4":102},"3":{"1":"Dream Dictionary","2":"http://www.dreams.metroeve.com/cats/","3":"Cats dreams meaning - Interpretation and Meaning","4":"Cats dreams meaning","10":"pYiiOfEsHvASoL"},"5":{"1":"yitDHIAaQOOdaRT"}},{"1":{"1":"https://www.petful.com/wp-content/uploads/2011/10/cats-cuddling-funny-850x539.jpg","3":850,"4":539},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQOMIoyg_pWYw3k1LS2ryBqbL8tjvfoqv9-OTFEXTplBM5yJx7l","3":200,"4":126},"3":{"1":"Petful","2":"https://www.petful.com/behaviors/how-do-cats-communicate-with-each-other/","3":"How Do Cats Communicate With Each Other? - Petful","4":"3 Ways of Communication Between Cats","10":"LQaqSqLhLnBUfW"},"5":{"1":"bUTftQCTbDFlsdb"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/cat.jpg","3":400,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2WhOti17crdhQ5YaH0tWnaPwy-EL7rVEWpyH_VABFAmjfA8mZKA","3":133,"4":200},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"A Cat lover's delight","10":"MIeOauNTFxruUL"},"5":{"1":"ynywhMRTGlWxicb"}},{"1":{"1":"http://sciencenordic.com/sites/default/files/imagecache/620x/kat_astma_videnskab.jpg","3":620,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTKXdoXAT7VqIMXRBmjSFJDcgeP1cDrLo3O_bGAGSgSJ79PcRRo","3":200,"4":132},"3":{"1":"ScienceNordic","2":"http://sciencenordic.com/cats-protect-newborns-against-asthma","3":"Cats protect newborns against asthma | ScienceNordic","4":"","10":"ebtAfFAJkMedhO"},"5":{"1":"TbgPbTfAlYCrRsQ"}},{"1":{"1":"http://www.catcareofvinings.com/blog/wp-content/uploads/2017/05/CCV_iStock-619079366-2000x1331.jpg","3":2000,"4":1331},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9KUm5nLqQKG0OAzhoQxzDccFO7C0MmTanEFr-DHp3mHqaQQpmow","3":200,"4":133},"3":{"1":"Cat Care of Vinings","2":"http://www.catcareofvinings.com/blog/cat-thinking/","3":"Deep Thoughts: What is Your Cat Thinking Throughout the Day ...","4":"cat care","10":"qQBClwCNpdCxEj"},"5":{"1":"lQNOMbAUqgcyqYD"}},{"1":{"1":"https://images.immediate.co.uk/volatile/sites/4/2018/08/iStock_000044061370_Medium-fa5f8aa.jpg?quality=45&crop=5px,17px,929px,400px&resize=960,413","3":960,"4":413},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgIMohz552yuAneZIasvHIn5KJKN4L5IK7jc6rSluz48MIov2BvQ","3":200,"4":85},"3":{"1":"BBC Focus Magazine","2":"https://www.sciencefocus.com/nature/is-it-true-that-most-ginger-cats-are-male/","3":"Is it true that most ginger cats are male? - Science Focus ...","4":"Is it true that most ginger cats are male? © iStock","10":"IsSWOkewoBVoyN"},"5":{"1":"rvWVNrAfIXvtwcE"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2017/06/shutterstock_319985324/lead_720_405.jpg?mod=1533691890","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYRaFuQDancwY5rr0g1FR48S7rbXhI1cPh0UHMtjTNKpGRoH7WSw","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/science/archive/2017/06/cat-domination/530685/","3":"How Cats Used Humans to Conquer the World - The Atlantic","4":"Cat jumps in air","10":"vUEGUDKayXFWYs"},"5":{"1":"ROWDGLyjMsbVgwt"}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Fpeopledotcom.files.wordpress.com%2F2018%2F08%2F34982856_913748398827212_5249963337373974528_n.jpg%3Fw%3D1800&w=700&c=sc&poi=face&q=85","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTsKnyOc-9bYJXBDCVmG6xK9sBNmbi2myY2zFL8u8FaDkmajd8BAQ","3":200,"4":200},"3":{"1":"People Magazine","2":"https://people.com/pets/iambronsoncat-33-pound-cat-weight-loss-journey/","3":"iambronsoncat: Fat Cat on Instagram Losing Weight | PEOPLE.com","4":"Bronson the cat/Instagram","10":"uYuIUYkriwkfEs"},"5":{"1":"bcluKuWcQjWgSGD"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2017/07/funny-tiny-face-cats-photoshop-battle-11-596db6bf66c5b__605.jpg","3":605,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5eo0CbpzMdi0QofgC2v0k6G089ljeSEqjlTBdjVQ8AXas3dANIQ","3":200,"4":134},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/funny-tiny-face-cats-photoshop-battle/","3":"People Are 'Breeding' Cats With Tiny Faces, And We Can't ...","4":"Cats With Tiny Faces","10":"KhasNKHCjkpiOK"},"5":{"1":"BRXGRcorLPkYToy"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2013/09/cat-black-superstitious-fcs-cat-myths-162286659.jpg","3":632,"4":353},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRoAclhVC7gbhlRQOYDDcxQpjCH0_0aI0BIftb1X0JixabN0-KuSg","3":200,"4":111},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/","3":"Cats: Adoption, Bringing A Cat Home and Care","4":"black cat","10":"jgvbapwuhVjMDF"},"5":{"1":"LIPTYfsRLcsdxef"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Cat_eating_a_rabbit.jpeg/220px-Cat_eating_a_rabbit.jpeg","3":220,"4":187},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTM2lD05jXtOZSV7AuO3hvNvDWkObMlWiC97BQtxlT0RGL_LH4zjQ","3":200,"4":170},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Cat","3":"Cat - Wikipedia","4":"Impact on prey species","10":"MvcDWiVddakwSO"},"5":{"1":"DdiScMFQsSrAqKm"}},{"1":{"1":"https://assets3.thrillist.com/v1/image/2696152/size/tmg-article_tall;jpeg_quality=20.jpg","3":640,"4":853},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRuPeTpZbE5BZKB-5-exd6Ecv4fY1BlGVHZ1leqZN2Zu0vHdPhigw","3":149,"4":200},"3":{"1":"The Dodo","2":"https://www.thedodo.com/close-to-home/what-to-do-stray-cat","3":"What To Do If You Find A Stray Cat - The Dodo","4":"Share on Facebook ...","10":"gQcCvghMoTEaHn"},"5":{"1":"xHsHCsPpDjcLGUm"}},{"1":{"1":"https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/video/wibbitz/wbz-when-cats-sneeze.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoBO_x3BJPFuVLwm8fyi2dbu0KIAmw32oWZn8hyckaIzj4Ain9","3":200,"4":112},"3":{"1":"Pet WebMD","2":"https://pets.webmd.com/cats/why-cats-sneeze","3":"Why Cats Sneeze","4":"","10":"lIiLWrpodGqLbE"},"5":{"1":"tcsvWDVrmXKLuXN"},"7":{"1":{"11":{"1":"Why Cats Sneeze","2":"WebMD explains why cats sneeze.","3":"0:49"}}}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Fimages.hellogiggles.com%2Fuploads%2F2015%2F12%2F11083247%2Fcat.jpg&w=700&c=sc&poi=face&q=85","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTyqlbEiXO_ve-xH0IupMWF_e06JxgJ1zW99lvaKeClbZopfbLt","3":200,"4":133},"3":{"1":"HelloGiggles","2":"https://hellogiggles.com/news/10-cat-puns-will-ever-need/","3":"The only 10 cat puns you will ever need - HelloGiggles","4":"","10":"FKYqmXrURSmLOp"},"5":{"1":"octogHMDQOutVmB"}},{"1":{"1":"https://lh3.googleusercontent.com/aR34MxRBretppyADbJcfqIZp-LraO1ELhk00lTZw0Q7MF1ebUKZeggeQkjBuZCCmYRSYNzr8=w640-h400-e365","3":640,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ6uXSCu96cLwMFotwgSKSr5TWi3PGa-RoBaNJLp6CXb4UzJw-f","3":200,"4":124},"3":{"1":"Chrome - Google","2":"https://chrome.google.com/webstore/detail/tabby-cat/mefhakmgclhhfbdadeojlkbllmecialg","3":"Tabby Cat - Chrome Web Store","4":"","10":"oMpQUFDpPDlshm"},"5":{"1":"otuueNvgwlPdxEJ"}},{"1":{"1":"https://cdn.cnn.com/cnnnext/dam/assets/150324154028-16-internet-cats-restricted-super-169.jpg","3":1100,"4":619},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqyAVnpTM5-KWPFFMnxMBPcmj-D8uuBwiY8TXf2odz72qQPGpx","3":200,"4":112},"3":{"1":"CNN.com","2":"https://www.cnn.com/2015/09/08/health/what-your-cat-is-trying-to-say/index.html","3":"This is what your cat is really trying to say - CNN","4":"<a href=\"https://www.facebook.com","10":"dLjonTcctpsPqG"},"5":{"1":"NsRfhrFRIgtGQCA"}},{"1":{"1":"http://media1.santabanta.com/full1/Animals/Cats/cats-149a.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS6Br_9c6YcOob_VRgBd0e3pRU4TIenPqGfy3_Mthi3Hrk2s0cO","3":200,"4":149},"3":{"1":"SantaBanta","2":"http://www.santabanta.com/photos/cats/2121149.htm","3":"Cats Wallpaper #150","4":"Cats","10":"ekdheuirMEGftK"},"5":{"1":"VRnuCjBVsnlKWgP"}},{"1":{"1":"https://ichef.bbci.co.uk/news/624/cpsprodpb/CC9D/production/_103218325_gettyimages-469927070.jpg","3":624,"4":351},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRRLfK-jVNOChSkHJdIkdsHaO8dXY03z2yxcvMKhmG7a1OQ35x","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/world-asia-45347136","3":"Why a village in New Zealand is trying to ban all cats - BBC News","4":"Stock image of a brown cat outfoors","10":"eRGrhfWPhjjycQ"},"5":{"1":"oWRQBUPOabUscQd"}},{"1":{"1":"https://i.ytimg.com/vi/bcENL_Vdoqw/maxresdefault.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcROK723ru1FrNl8bV6pZuVJq4V5evxglOVkxHVyYFTElbSgm9Pw","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=bcENL_Vdoqw","3":"Cats vs Zombies","4":"","10":"VAdjUbmUiCJCFM"},"5":{"1":"VxjIxHRkQbIyfrJ"},"7":{"1":{"11":{"1":"Cats vs Zombies","2":"Cats declare war on Zombies to save the survivor kitten! SUBSCRIBE for more  videos ► http://bit.ly/IWantMORE In Syfy’s Z Nation, a group of survivors  must cr...","3":"2:19","4":"59834392","5":"1441843200000","6":"Mr.TVCow","7":"312398","8":"14803"}}}},{"1":{"1":"https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=1496110487353938","3":548,"4":548},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzNjlUiXWA4sUaNvaTQ6HGkbJ4NpvPE5V8oSqxD_8fusAlmHRk","3":200,"4":200},"3":{"1":"Facebook","2":"https://www.facebook.com/CatsLoveCatnip/","3":"Cats on Catnip - Home | Facebook","4":"Post Your Cats","10":"hLuQEqDsfjIgrX"},"5":{"1":"jEkQhJpAOoRmYHg"}},{"1":{"1":"https://purrfectlove.net/wp-content/uploads/2015/06/catfamily.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRA4hP9AZHDtW5ZnT3H21a7ma7gBf47CweoEjKthR4HQyvfRIG7","3":200,"4":112},"3":{"1":"Purrfect Love","2":"https://purrfectlove.net/cat-law-how-many-cats-is-too-many/","3":"How Many Cats Is Too Many? - Purrfect Love","4":"How Many Cats Is Too Many?","10":"ivxnqDKXbuUwSG"},"5":{"1":"OCYtoUuNlwggjDy"}},{"1":{"1":"https://www.popsci.com/sites/popsci.com/files/styles/1000_1x_/public/import/2014/5827857531_8962f29333_o.jpg?itok=b0be33M8","3":1000,"4":932},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRyoHtobTnEVMoaBL6pEjD3ZI8JBi0TUYaWWxJwiuzg3tVHMFap","3":200,"4":186},"3":{"1":"Popular Science","2":"https://www.popsci.com/article/science/sorry-cat-haters-science-isnt-your-side","3":"Sorry, Cat Haters, Science Isn't On Your Side | Popular Science","4":"\"Unfeeling\" Cats. \"","10":"GohBftUAojRsam"},"5":{"1":"QiShqprShJXePFT"}},{"1":{"1":"https://cdn.cliqueinc.com/cache/posts/256509/cutest-cat-breeds-256509-1525454554042-main.700x0c.jpg","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQoweT_7x_-6xw2jD1svn8S5JIP7xaWzmQDp2x7d21Wo7CHlXv5","3":200,"4":133},"3":{"1":"MyDomaine","2":"https://www.mydomaine.com/cutest-cat-breeds","3":"Time to Procrastinate—Here Are the 9 Cutest Cat Breeds ...","4":"Norwegian Forest Cat","10":"DxlXHrbvPbRhRM"},"5":{"1":"WTgXnhEmHrmntVB"}},{"1":{"1":"https://www.factslides.com/imgs/black-cat.jpg","3":500,"4":644},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTY5ABlFn6BCa3HbeR35lZob_mc_PNIcqInrkKLsOQMCI68mH8qqA","3":155,"4":200},"3":{"1":"Factslides","2":"https://www.factslides.com/s-Cats","3":"Cat Facts: 67 Facts about Cats ←FACTSlides→","4":"Black cats are considered to bring good luck in Japan.","10":"yQaaLWLeScxINi"},"5":{"1":"alLwPdgtUAOpfaT"}},{"1":{"1":"https://steemitimages.com/DQmZ9QBgKETeQpVdvYF5jjG7YpNMvjTN9pSNTvZK3JfgjAx/This%20picture%20of%20a%20chubby%20ginger%20cat%20sat%20on%20his%20bum%20is%20one%20of%20the%20hilarious.jpg","3":660,"4":880},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuAgPVocqHRVosZVfOxm_KWOrHcHGaRbU03lWxQnShpG1f9UDj","3":149,"4":200},"3":{"1":"Steemit","2":"https://steemit.com/photography/@kamrankami/how-was-it-cat-you-good-is-not-what-you-also-cats-to-hobby-is-this-cat","3":"How was it cat you good is not what you also cats to hobby is ...","4":"... This picture of a chubby ginger cat sat on his bum is one of the  hilarious","10":"bViAqgFCwwrfcj"},"5":{"1":"hXylHubafKgcrrO"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/10/worlds-most-beautiful-cats-44-57fc8f4e023ca__700.jpg","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQZCF3NPqMlA7u4mEVY3v8hpfMGvL5p0PaOZO9o0aUUhe7ZxMSI","3":200,"4":200},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/worlds-most-beautiful-cats/","3":"10+ Of The Most Beautiful Cats In The World | Bored Panda","4":"#7 Venus The Chimera Cat","10":"aSdHCwrUghWycR"},"5":{"1":"vjPxBDUANFhClKA"}},{"1":{"1":"https://www.pspca.org/sites/default/files/styles/pspca_banner/public/2018-01/38795646774_9d83bbaaab_o_0.jpg?h=2cfee321&itok=_Llsh3dA","3":1400,"4":580},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBGw3oS82bfnV5sV7-Uku1Ypnab84IKm1kcKmY6wzdtVMleayZqw","3":200,"4":82},"3":{"1":"pspca","2":"https://www.pspca.org/adoptcats","3":"Find Adoptable Cats | Pennsylvania Society for the Prevention ...","4":"Tabby cat","10":"JrmThTANNxNJUo"},"5":{"1":"SPSOOiyAYWREAol"}},{"1":{"1":"https://static01.nyt.com/images/2018/08/31/world/31nz-cats-print/31nz-cats-1-facebookJumbo.jpg","3":1050,"4":550},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVkepqVFEZUGC6MZsm3oP6jZ9QTqoHm1veIfbXVOOy-G4-bYJU5w","3":200,"4":104},"3":{"1":"The New York Times","2":"https://www.nytimes.com/2018/08/30/world/australia/new-zealand-cat-ban-birds.html","3":"New Zealand Town May Ban Cats to Protect Other Species - The ...","4":"New Zealand Town May Ban Cats to Protect Other Species - The New York Times","10":"uAXMylHRqniqpp"},"5":{"1":"qRjVlYTlLnuMaJn"}},{"1":{"1":"https://images.pexels.com/photos/45201/kitty-cat-kitten-pet-45201.jpeg?auto=compress&cs=tinysrgb&h=350","3":335,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8E2tu2o8JBkbyQfvl6nQ7NifLnv_QyRCXJCw9t5GjUl99ODUF","3":192,"4":200},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Free stock photo of animal, pet, cute, kitten","10":"ndmNLdYnvbrOas"},"5":{"1":"HgrJlEORaXxLNIF"}},{"1":{"1":"https://ichef.bbci.co.uk/news/660/cpsprodpb/AECE/production/_99805744_gettyimages-625757214.jpg","3":660,"4":371},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT5HpqXD4cwzpfY_ncvOjnVTUuOKgEP1KhtZek2UBmt-r3mn87L","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/uk-42871851","3":"Black cats shunned for purr-fect selfies - BBC News","4":"black cat looking at phone camera","10":"DSUwnvAAdiVpUf"},"5":{"1":"urBDFTTGLWcefFD"}},{"1":{"1":"https://cf.ltkcdn.net/cats/images/std/219726-675x450-kittehshnuggles.jpg","3":675,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSrFGgZpa-BeJ65O8X70lA6zVn1vFMWMvNBzy8NhYH7hJzCbG3v","3":200,"4":133},"3":{"1":"Cats - LoveToKnow","2":"https://cats.lovetoknow.com/Cats_Mating","3":"Stop Cats Mating","4":"According to the Cats ...","10":"sUCTegpsVdFOop"},"5":{"1":"xjnhKdXhpwlUgYM"}},{"1":{"1":"http://www.orphankittenrescue.com/~ASSETS/img/upload/Cauliflower.JPG","3":1280,"4":1278},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTa6M7jf9-TJ43GpiBfJZ1peF_8uGDJNyxg-OGpdyo4DE8eqPWEKw","3":200,"4":199},"3":{"2":"http://www.orphankittenrescue.com/","3":"Home - Vancouver Orphan Kitten Rescue Association (VOKRA)","4":"For ...","10":"uYtTmBTjjvMpvq"},"5":{"1":"iXDxdNRxEAIoOFn"}},{"1":{"1":"http://www.petmd.com/sites/default/files/multiple-cats-need-multiple-litter-boxes.jpg","3":590,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSbJpN8IE4jcuTJqFlRmaodVEW2_Yw8GEEUdJoPwskX6kGI-tri","3":200,"4":144},"3":{"1":"PetMD","2":"https://www.petmd.com/cat/centers/litter/evr_why_multi_cat_households_need_multiple_litter_boxes","3":"Why Multiple Cats Need Multiple Litter Boxes | petMD","4":"Purrfect and Tigress have adapted to sharing things and people in their  multi-cat household.","10":"xsIhunJNqlbxyW"},"5":{"1":"NoDkCFOkmfIlErY"}},{"1":{"1":"https://res.cloudinary.com/jpress/image/fetch/w_700,f_auto,ar_3:2,q_auto:low,c_fill/if_h_lte_200,c_mfit,h_201/https://www.lep.co.uk/webimage/1.9366362.1537968620!/image/image.jpg","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQI8VbyK01jJozDTLPjCxKv7J4uqHCJzU_E1IlEQrD7CSFoH3t1ng","3":200,"4":133},"3":{"1":"Lancashire Evening Post","2":"https://www.lep.co.uk/news/watch-woman-with-terminal-cancer-s-urgent-plea-to-rehome-40-cats-1-9366366","3":"WATCH: Woman with terminal cancer's urgent plea to rehome 40 ...","4":"One of Marlene's cats to rehome","10":"HgVYXYnQeEWNFQ"},"5":{"1":"OECaxpuUVkUSGKa"}},{"1":{"1":"https://s3.amazonaws.com/geniusvets/gv-cta/sidebar/cta-cat-lab-tests-sidebar.png","3":320,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS3qZL1yS7DkEibVCeAFpS3IeTkWn5nUeZjF6jRclHe9DQItJYf","3":200,"4":187},"3":{"1":"Bakerstown Animal Hospital","2":"http://www.bakerstownah.com/services/cats/blood-tests-for-cats","3":"What Blood Tests Can Tell You About Your Cat's Health","4":"CTA - Cat Laboratory","10":"WYGLoSFkQkkOlU"},"5":{"1":"QIpENFLTqwFExTI"}},{"1":{"1":"https://imgix.bustle.com/uploads/image/2018/2/12/8a1cc530-2b29-436f-b780-70c5c7e8322e-fotolia_157293628_subscription_monthly_m.jpg?w=970&h=582&fit=crop&crop=faces&auto=format&q=70","3":970,"4":582},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTHQzWOL9X_qCnsDHYja_J1EJSQQI5awRS9GEIlqi4sOtozcXyrLw","3":200,"4":120},"3":{"1":"Bustle","2":"https://www.bustle.com/articles/124691-why-are-cats-afraid-of-cucumbers-it-may-seem-funny-but-heres-why-you-shouldnt-pull","3":"Why Are Cats Afraid Of Cucumbers? It May Seem Funny, But ...","4":"Why Are Cats Afraid Of Cucumbers? It May Seem Funny, But Here's Why You  Shouldn't Pull This Viral ...","10":"vXmiRmjooFgCsj"},"5":{"1":"KJdGBlHcfKCtPiq"}},{"1":{"1":"https://www.nationalgeographic.com/content/dam/animals/thumbs/rights-exempt/mammals/d/domestic-cat_thumb.ngsversion.1472140774957.adapt.1900.1.jpg","3":1900,"4":1900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS4UX9nw98T3rBMvfzkMFJE9h2S6lpppox9iqvgHiM9t3jrEX5u","3":200,"4":200},"3":{"1":"National Geographic","2":"https://www.nationalgeographic.com/animals/mammals/d/domestic-cat/","3":"Cat | National Geographic","4":"","10":"FHvtOxoVXKKBNG"},"5":{"1":"IwmWDqshKHyErfm"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/A_completely_deaf%2C_pure_white_blue-eyed_cat.jpg/220px-A_completely_deaf%2C_pure_white_blue-eyed_cat.jpg","3":220,"4":330},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSfePLQh_QXB06o8zZm2w6RlMOK0_4z-Q9LqU3OWziuf7IlJ9Op","3":133,"4":200},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Congenital_sensorineural_deafness_in_cats","3":"Congenital sensorineural deafness in cats - Wikipedia","4":"Congenital sensorineural deafness in cats","10":"kmgduSfYJOmlpK"},"5":{"1":"CVrmsAPQhtudphd"}},{"1":{"1":"https://d32xvgr96w2oxp.cloudfront.net/2013/07/cats-16140154-1920-1080.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSelnL0s3W9PXwG0lPGhgM1xmvwhVHpX_m2eEM3jmYF0YpgVOiY","3":200,"4":112},"3":{"1":"Yummypets","2":"https://www.yummypets.com/mag/2013/08/02/11279/a-few-fun-facts-about-cats","3":"A few fun facts about cats! - Yummypets","4":"A few fun facts about cats!","10":"abfnJMfahgkwRm"},"5":{"1":"LgiWDdvJnjKfhEb"}},{"1":{"1":"https://static.independent.co.uk/s3fs-public/thumbnails/image/2016/02/25/13/cat-getty_0.jpg?w968h681","3":968,"4":681},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQsey-RjxxJtFRzTkCUUQp4em18r93OWP0tvIGf-W9jkq1R9-zd","3":200,"4":140},"3":{"1":"The Independent","2":"https://www.independent.co.uk/news/science/cat-experts-reveal-the-meaning-behind-different-meows-a6895251.html","3":"Cat experts reveal the meaning behind different meows | The ...","4":"Cat's typical meow sounds can be friend or – shocker – demanding","10":"jgcQCeHiOQIDbM"},"5":{"1":"MjXqsEobUlMmfLt"}},{"1":{"1":"https://66.media.tumblr.com/53f218922ce36eb3957c8b959056f1a9/tumblr_n93t8amQUU1s8za4to1_1280.jpg","3":1067,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQDmhgMW6xaIDtGTqv6VCQgdKIs04I70koEXRO-C2V-PkUU2I2y","3":133,"4":200},"3":{"1":"Tumblr","2":"http://dailycatistanbul.tumblr.com/","3":"Daily Cat Istanbul","4":"Dear followers, we got some great news. We decided to start a new cat","10":"IvDLbjNNOryhbS"},"5":{"1":"rYckeHyARYEbbeR"}},{"1":{"1":"https://www.abc.net.au/news/image/8633778-3x2-700x467.jpg","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKTb2ah9He3-Xo9Hme0yacwxLRQaF2NEypbBITEWVqLWjBCjxO","3":200,"4":133},"3":{"1":"ABC","2":"https://www.abc.net.au/news/2018-08-09/toxoplasmosis-killing-tasmanian-wildlife/10093038","3":"Cats blamed for spread of native wildlife-killing ...","4":"A close up of a feral cat snarling at the camera.","10":"KXxoHJqlfICMDU"},"5":{"1":"gUDcoTovICjNepP"}},{"1":{"1":"https://www.bluecross.org.uk/sites/default/files/assets/images/112970lpr.jpg","3":2000,"4":1331},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdk_hAs_ErbyX2hIej7d8tFygdcqiFk-dhSqzDHLhs4dxCfQ3q8w","3":200,"4":133},"3":{"1":"Blue Cross","2":"https://www.bluecross.org.uk/pet-advice/cat-flu","3":"Cat Flu | Symptoms, Causes, and Treatment | Blue Cross","4":"","10":"tvreuIdeESOHnF"},"5":{"1":"RnLSXADdWcyXYpP"}},{"1":{"1":"https://i.guim.co.uk/img/media/0b974a22ecd3807e87b92a90f9f0aa43d61bb6a2/0_223_3425_2056/master/3425.jpg?width=300&quality=85&auto=format&fit=max&s=d198019642f0a69970aeabd0f3f1cca9","3":300,"4":180},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVXkjXSAyfe6sOqBzO3Hs89SRE_HPo7Kzkz4OBrDyJm53_9u9B","3":200,"4":120},"3":{"1":"The Guardian","2":"https://www.theguardian.com/science/2018/jul/24/pets-at-home-do-cats-and-dogs-really-fight-like-cats-and-dogs","3":"Pets at home: do cats and dogs really fight like cats and ...","4":"Cat and dog sleeping together.","10":"esrjymQlNJECVQ"},"5":{"1":"rvPqIPGkumxGfAy"}},{"1":{"1":"http://bdfjade.com/data/out/81/5865451-images-of-cats.jpg","3":960,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ6WnsQqx0e_YvExPhGnIJ7jDYjfHYPczkXfq7EVBnGFGDy1aRG0g","3":200,"4":133},"3":{"1":"BDFjade","2":"http://bdfjade.com/images-of-cats.html","3":"Images Of Cats - BDFjade","4":"Great HD Backgrounds Collection of Cats : 960x640 px, 31 March 2018","10":"sJVYDputioFjCH"},"5":{"1":"ALTNohaJtwEMeMU"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/549585-istock-909106260.jpg?itok=ds7LqH1N&resize=1100x1100","3":1100,"4":619},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRNivVznOF2iMAOTxkbkGFlENUk0T3PupKcmuqnMHvr6ASROiXF3w","3":200,"4":112},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/549585/science-backed-tips-for-getting-a-cat-to-like-you","3":"10 Science-Backed Tips for Getting a Cat to Like You | Mental ...","4":"iStock","10":"yMAcOJDdqOGiPX"},"5":{"1":"RgbiAhAWIGlcxot"}},{"1":{"1":"https://cf.ltkcdn.net/cats/images/std/214162-672x450-sickcat2.jpg","3":672,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQArG5eajQAFbAnEW89M-JKMxvnWKGwvfkk3C6G7s_aEr4lSd_z0g","3":200,"4":134},"3":{"1":"Cats - LoveToKnow","2":"https://cats.lovetoknow.com/Symptoms_of_a_Dying_Cat","3":"6 Symptoms of a Dying Cat","4":"sick cat","10":"xhCRTUnAklObRo"},"5":{"1":"PaPmYFaioiXrPId"}},{"1":{"1":"https://www.telegraph.co.uk/content/dam/women/2018/01/30/TELEMMGLPICT000152840203_trans_NvBQzQNjv4BqqVzuuqpFlyLIwiB6NTmJwViJj1eTvcjzL4JkNP_PJEs.jpeg?imwidth=450","3":480,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTIDDev27kU_mpiZieiFS2GLloZrjUJ9u4UIwN1VT-kgYng1rmi","3":200,"4":124},"3":{"1":"The Telegraph","2":"https://www.telegraph.co.uk/women/life/black-cats-life-not-just-selfies/","3":"Black cats are for life - not just for selfies","4":"Black cat","10":"gkOewILuUIvjXT"},"5":{"1":"lJurAURRDqWVCbg"}},{"1":{"1":"https://d3i6fh83elv35t.cloudfront.net/static/2018/04/cats-and-dogs_AdobeStock_84016419-1200x798.jpeg","3":1200,"4":798},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTifShE2NmndOYRU4Rx1EqTaW6s6Wil1HDjAD6zGxYB0Rw0MW3X","3":200,"4":133},"3":{"1":"PBS","2":"https://www.pbs.org/newshour/science/which-are-smarter-cats-or-dogs-we-asked-a-scientist","3":"Which are smarter, cats or dogs? We asked a scientist | PBS ...","4":"Which are smarter, cats or dogs? We asked a scientist | PBS NewsHour","10":"qegkjvsTYSvuHn"},"5":{"1":"rmSDrQGBgNmRutj"}},{"1":{"1":"https://cnet4.cbsistatic.com/img/Qqn2oPvTkSKUkTWImHSLYglPYSw=/970x0/2014/01/12/b3815b11-8533-11e3-bc97-14feb5ca9861/cats9.png","3":970,"4":495},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQOrnbAPdbxfR92s6_fhv2L7-iPdF1fp-hGDJ3EVAE0WiURylwYiQ","3":200,"4":101},"3":{"1":"CNet","2":"https://www.cnet.com/news/scientist-cats-think-you-are-just-a-big-stupid-cat/","3":"Scientist: Cats think you are just a big, stupid cat - CNET","4":"He thinks we're stupid. compilarizTVi/YouTube Screenshot by Chris  Matyszczyk/CNET","10":"AqoknMTexdNcKA"},"5":{"1":"BqwNiVVuhSkDFNc"}},{"1":{"1":"https://petplaceimages-embracepetinsura1.netdna-ssl.com/wp-content/uploads/2017/10/nano_nastasia-324812-1024x678.jpg?x35507","3":1024,"4":678},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnjNGXLc5f9Gxz-kOa1rfnfThxvD24WE2IG3SN3ZeTTHnzjE9q","3":200,"4":132},"3":{"1":"PetPlace","2":"https://www.petplace.com/article/cats/pet-behavior-training/how-mother-cats-take-care-of-kittens/","3":"How Mother Cats Take Care of Kittens - PetPlace","4":"how mother cats take care of kittens","10":"fstbGCbnKklCWs"},"5":{"1":"YGRvshjgiPcnHfD"}},{"1":{"1":"https://news.nationalgeographic.com/content/dam/news/photos/000/755/75552.ngsversion.1422285553360.adapt.1900.1.jpg","3":1900,"4":1266},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTz_Sh7LYVHgP9ET4wwXoFSjYv-5A4P80-8ffTTluC4c3FnOVmj","3":200,"4":133},"3":{"1":"Latest Stories - National Geographic","2":"https://news.nationalgeographic.com/news/2014/01/140127-cats-pets-animals-nation-dogs-people-science/","3":"What Do Cats Think About Us? You May Be Surprised","4":"","10":"VphispWPumbBiE"},"5":{"1":"TVkNslFGDNKKIRM"}},{"1":{"1":"https://s.abcnews.com/images/Lifestyle/AL_scared_cat_jt_151225_16x9_1600.jpg","3":1600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdu_tIfOlHoq3_A60curgxLzwIkcOWyK8uLa4R0rBwbDNfvkyFzQ","3":200,"4":112},"3":{"1":"ABC News - Go.com","2":"https://abcnews.go.com/Lifestyle/scaredy-cats-absolutely-terrified-cucumbers/story?id=35953032","3":"Why These Scaredy Cats Are Absolutely Terrified of Cucumbers ...","4":"Why These Scaredy Cats Are Absolutely Terrified of Cucumbers - ABC News","10":"cBroNeBtkONFKK"},"5":{"1":"qSJAkXaVsSBWYpO"}},{"1":{"1":"https://images-gmi-pmc.edge-generalmills.com/fe558022-4544-458f-aaa0-eda0de1bcf99.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTQHlociyYPIGxVhWpLE6zq1Bpec1Db96iFfIx69a_3gR4NA43D","3":200,"4":112},"3":{"1":"Betty Crocker","2":"https://www.bettycrocker.com/recipes/chocolate-mousse/25446b27-770f-4d48-babd-5315521b0e7b","3":"Chocolate Mousse","4":"Chocolate Mousse","10":"ybuCFRCjuKtQQs"},"5":{"1":"xLDKoBGBGbKjeYL"},"7":{"1":{"9":{"1":4.5,"2":70,"3":"Chocolate Mousse","4":["4 large egg yolks Save $","1/4 cup sugar Save $","2 1/2 cups whipping (heavy) cream Save $","8 oz semisweet baking chocolate, chopped Save $"],"5":"Don’t be intimidated by the fancy French name. If you’ve ever heated milk  on the stove for hot ...","6":"2 hr 20 min","7":"8"}}}},{"1":{"1":"https://img.taste.com.au/I3x-cteh/taste/2010/01/chocolate_mousse_in_minutes_1980x1320-117905-1.jpg","3":1980,"4":1320},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjxU2jUDK8GVZgZM5rAnnMvSYf_sYBLqtPMq5vjF9-euHoSC6qhA","3":200,"4":133},"3":{"1":"Taste","2":"https://www.taste.com.au/recipes/chocolate-mousse-minutes/e5b571f4-3a16-4f5d-ad95-89479e3763c1","3":"Chocolate mousse in minutes","4":"","10":"pbcxpwBJAJMHYv"},"5":{"1":"NNkYCBkxSTXdNnP"},"7":{"1":{"9":{"1":4.699999809265137,"2":190,"3":"Chocolate mousse in minutes","4":["300g good-quality dark chocolate, roughly chopped","3 eggs, at room temperature","1/4 cup (55g) CSR Caster Sugar","1 tablespoon good-quality cocoa powder, sifted","300ml thickened cream, plus extra whipped cream to serve"],"5":"The middle of the week is a very good time to try out this tasty treat.  It's the perfect pick-me-up, ...","6":"1 hr 35 min","7":"6"}}}},{"1":{"1":"https://bellyfull.net/wp-content/uploads/2018/02/Chocolate-blog-2.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSJ7XuEBk6X58uxaghaiTqKBZgX7mE7ZfIeF5lKk-4KOICx7wZJNw","3":133,"4":200},"3":{"1":"Belly Full","2":"https://bellyfull.net/2018/02/03/simple-chocolate-mousse/","3":"Simple Chocolate Mousse","4":"","10":"LfmiAQAfQXpXHC"},"5":{"1":"QFxRiEmhawOSIxG"},"7":{"1":{"9":{"3":"Simple Chocolate Mousse","4":["1/2 cup ((4 ounces) Signature Kitchens semi-sweet chocolate chips)","1/8 teaspoon salt","1/4 teaspoon espresso powder ((optional))","1/2 cup Lucerne© whole milk","1 cup chilled Lucerne© heavy whipping cream"],"5":"This Simple Chocolate Mousse only requires 6 ingredients and 10 minutes of  prep. It’s so easy and ...","6":"3 hr 10 min","7":"4"}}}},{"1":{"1":"https://www.abeautifulplate.com/wp-content/uploads/2018/02/easy-chocolate-mousse-5-600x900.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ2dAsuDHYcQac9pwFNVAwn-_f1s2mqBWR5t4Yw-H4eeG_9Rj0V2Q","3":133,"4":200},"3":{"1":"A Beautiful Plate","2":"https://www.abeautifulplate.com/easy-chocolate-mousse/","3":"Easy Chocolate Mousse","4":"Easy Chocolate Mousse","10":"BiTHkoAwtsNrVr"},"5":{"1":"cKgNDtTbgMtFbJt"},"7":{"1":{"9":{"3":"Easy Chocolate Mousse","4":["1 cup (125 grams) semisweet chocolate chips, divided*","1 cup (240 mL) heavy whipping cream","1/2 cup (70 grams) roasted salted almonds","1/2 teaspoon ground cinnamon","2 large egg whites"],"5":"This EASY Chocolate Mousse recipe is made with two ingredients (heavy cream  and chocolate chips) and ...","6":"1 hr 30 min","7":"4-6 Servings"}}}},{"1":{"1":"https://bromabakery.com/wp-content/uploads/2017/04/Secretly-Healthier-Chocolate-Mousse-2.jpg","3":1143,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcStM5KBU-JE3CFkjJ3v5pIdc1M-AxyOphnMK-5JGmBrPG27g-f-Iw","3":142,"4":200},"3":{"1":"Broma Bakery","2":"https://bromabakery.com/2017/04/secretly-healthier-chocolate-mousse.html","3":"Secretly Healthier Chocolate Mousse - Broma Bakery","4":"A rich chocolate mousse made healthier with a secret ingredient! Best part?  You can","10":"BHymqaDWivlkyx"},"5":{"1":"fLxHmOAaRyapPXw"}},{"1":{"1":"https://assets.marthastewart.com/styles/video-preview-1280x720-highdpi/d32/ST0022%20-%20Chocolate%20Mousse%20vTHUMB/ST0022%20-%20Chocolate%20Mousse%20vTHUMB.jpg?itok=cbp5Ehuk","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvtgWrMXfj6BxSzuFQ93R7-1uytxwtVzRHPzSlH4KhVMcnWAtC","3":200,"4":112},"3":{"1":"Martha Stewart","2":"https://www.marthastewart.com/336783/chocolate-mousse","3":"Chocolate Mousse","4":"ST0022 - Chocolate Mousse vTHUMB.jpg?itok=cbp5Ehuk","10":"NutFHbrFCImUim"},"5":{"1":"bycFEyvjoTPumhG"},"7":{"1":{"9":{"1":3.6500000953674316,"2":397,"3":"Chocolate Mousse","4":["4 large egg yolks","4 tablespoons sugar","2 cups heavy cream","8 ounces bittersweet chocolate, melted","1 teaspoon vanilla extract"],"5":"Because bittersweet chocolate is high in pure chocolate (at least 35  percent cocoa solids), it's ...","6":"1 hr","7":"6 servings"}}}},{"1":{"1":"https://s3.amazonaws.com/finecooking.s3.tauntonclud.com/app/uploads/2017/04/18133529/051097025-01-chocolate-mousse-main.jpg","3":600,"4":500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZDxQWfTZxel5L8IGA5kmuEhUf0at1gSY3mYa95nfuZsPu1GzpQA","3":200,"4":166},"3":{"1":"Fine Cooking","2":"https://www.finecooking.com/recipe/real-chocolate-mousse","3":"Real Chocolate Mousse","4":"Scott Phillips","10":"SuOsgrwyRsQCsU"},"5":{"1":"SGIexlfsTALIWVA"},"7":{"1":{"9":{"1":4.199999809265137,"2":17,"3":"Real Chocolate Mousse","4":["6 oz. semisweet or bittersweet chocolate, preferably 60% to 62% cacao,  chopped","2 Tbs. unsalted butter, cut into 8 pieces","3 large egg whites","Pinch of table salt","3 Tbs. granulated sugar"],"7":"four. servings"}}}},{"1":{"1":"https://www.tasteaholics.com/wp-content/uploads/2017/09/double-chocolate-mousse-cover-1.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQh1ImOygeqktM6K35eQYxWZbRg6_uaLc_VriqCi1hgS5BLEdq6","3":133,"4":200},"3":{"1":"Tasteaholics","2":"https://www.tasteaholics.com/recipes/desserts/5-ingredient-double-chocolate-mousse/","3":"5 Ingredient Double Chocolate Mousse","4":"","10":"EPEhuvnfjwVDhN"},"5":{"1":"UXrmrAwWqlkymUy"},"7":{"1":{"9":{"1":5.0,"2":62,"3":"5 Ingredient Double Chocolate Mousse","4":["1 oz. Lily's Chocolate Chips","1 cup heavy cream","4 oz. cream cheese","1/4 cup powdered erythritol","2 tbsp cocoa powder"],"5":"Macros per serving:, • 469 Calories, • 45g of Fat, • 7g of Protein, • 5g of  Net Carbs","6":"25 min","7":"2"}}}},{"1":{"1":"https://ichef.bbci.co.uk/food/ic/food_16x9_832/recipes/basicchocolatemousse_93648_16x9.jpg","3":832,"4":468},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRKrk3KulomPwWQnKu6t9MnylAF_DLFHmVrrBJf0IBsrW629-GLA","3":200,"4":112},"3":{"1":"BBC.com","2":"https://www.bbc.com/food/recipes/basicchocolatemousse_93648","3":"Raymond Blanc's chocolate mousse","4":"Raymond Blanc's chocolate mousse","10":"yxUNLYxInwbjDF"},"5":{"1":"OLQFjjusGwNwcOL"},"7":{"1":{"9":{"3":"Raymond Blanc's chocolate mousse","4":["170g/6oz good-quality dark chocolate, minimum 60 per cent cocoa solids,  roughly chopped (dairy free, if necessary)","7 free-range egg whites (use pasteurised egg white in a carton if you have  any concerns about raw egg)","¼ tsp lemon juice","40g/1½oz caster sugar"],"5":"Raymond Blanc shows you how to make an easy, 4-ingredient chocolate mousse  with his classic recipe.","6":"2 hr 10 min","7":"Serves 4"}}}},{"1":{"1":"https://hungryhappenings.com/wp-content/uploads/2018/02/best-chocolate-mousse-recipe-2.jpg","3":680,"4":680},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtvhxHmITq5xO-0RTBo7hG4x-F_EomgloDEDqJBFN9IiliLhTj","3":200,"4":200},"3":{"1":"Hungry Happenings","2":"https://hungryhappenings.com/best-chocolate-mousse-recipe/","3":"The BEST Chocolate Mousse Recipe","4":"Best Chocolate Mousse Recipe","10":"LIjeWQhQdqrgNx"},"5":{"1":"cbkeWAaBITGNFCV"},"7":{"1":{"9":{"1":5.0,"2":3,"3":"The BEST Chocolate Mousse Recipe","4":["3 tablespoons water","3 tablespoons sugar","3 large egg yolks","1/2 cup heavy whipping cream","12 ounces melted semi-sweet chocolate"],"5":"The most luxuriously creamy and smooth chocolate mousse recipe you'll ever  try.","6":"25 min","7":"8"}}}},{"1":{"1":"https://d39ziaow49lrgk.cloudfront.net/wp-content/uploads/2016/10/Chocolate-Mousse-final-1.jpg","3":744,"4":631},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTgRx52xBN3wpTcEVufSuHKp3Hb8LGrbLBYIl6eXUJKYVhxQha4_g","3":200,"4":169},"3":{"1":"PaleoHacks","2":"https://blog.paleohacks.com/chocolate-mousse-recipe/","3":"Healthy Dark Chocolate Mousse Recipe","4":"Chocolate-Mousse-final-1.jpg","10":"bVpNOeqinghWQH"},"5":{"1":"DKAQSLoCFRxkRcR"},"7":{"1":{"9":{"3":"Healthy Dark Chocolate Mousse Recipe","4":["7 oz dark chocolate, roughly chopped","1 1/2 cans coconut milk, refrigerated overnight","1/4 cup raw honey","1/4 cup cocoa powder","Seeds from one fresh vanilla pod"],"5":"Meet the creamiest, richest mousse you’ve ever tasted. Dairy-free and  packed with antioxidant dark ...","6":"8 min"}}}},{"1":{"1":"https://www.seriouseats.com/recipes/images/2017/11/20171023-chocolate-mousse-vicky-wasik-20-1500x1125.jpg","3":1500,"4":1125},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTC5kDBJ5vNlrzibyZARnUvcjTkadfd3-LpLwnccHpgZv_kc3L7","3":200,"4":149},"3":{"1":"Serious Eats","2":"https://www.seriouseats.com/recipes/2017/12/eggless-chocolate-mousse.html","3":"Eggless Chocolate Mousse Recipe","4":"","10":"dmuXXylWkryNKF"},"5":{"1":"AugXlPfvEvKuJqI"},"7":{"1":{"9":{"3":"Eggless Chocolate Mousse Recipe","4":["For the Base:","7 ounces plain or toasted sugar (1 cup; 195g)","2 ounces Dutch cocoa powder, such as Cacao Barry Extra Brute (about 2/3  cup, spooned; 55g)","1/4 teaspoon (1g) Diamond Crystal kosher salt; for table salt, use about  half as much by volume or the same weight","32 ounces milk, any percentage will do (4 cups; 910g)"],"5":"The creamy toffee notes of homemade condensed milk set this recipe apart  from the custardy, ...","6":"2 hr 30 min","7":"Six 5 1/2 ounce portions"}}}},{"1":{"1":"https://www.wellplated.com/wp-content/uploads/2016/02/Avocado-Chocolate-Mousse-Vegan-and-Low-Carb.jpg","3":1200,"4":1461},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT93V5GbHolHUlNX-AGoHrgjlvdmij2uRImMX4kCAVZowUoJaFVqw","3":163,"4":200},"3":{"1":"Well Plated","2":"https://www.wellplated.com/avocado-chocolate-mousse/","3":"Avocado Chocolate Mousse","4":"2 Weck jars of Avocado Chocolate Mousse topped with whipped coconut cream  and a fresh raspberry","10":"RcTUITfLyekOnS"},"5":{"1":"QQNfVEMRTtCOPAN"},"7":{"1":{"9":{"1":4.5,"2":17,"3":"Avocado Chocolate Mousse","4":["4 ounces chopped semisweet chocolate or chocolate chips (at least 60%  dark), about 1/2 cup plus 2 tablespoons","2 large, ripe avocados (about 8 ounces each)","3 tablespoons unsweetened cocoa powder","1/4 cup Almond Breeze Unsweetened Almondmilk Cashewmilk Blend","1 teaspoon pure vanilla extract"],"5":"Creamy, rich healthy Avocado Chocolate Mousse made with avocado, dark  chocolate, and maple syrup. ...","6":"10 min","7":"4 generous servings"}}}},{"1":{"1":"https://lovingitvegan.com/wp-content/uploads/2015/09/Peppermint-Chocolate-Mousse-6.jpg","3":1500,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSIpRns-4PxKMwUy38BgcoFYma84kl5pV6EFgZGjHNdVhc1MmZrYA","3":200,"4":133},"3":{"1":"Loving It Vegan","2":"https://lovingitvegan.com/vegan-peppermint-chocolate-mousse/","3":"Vegan Peppermint Chocolate Mousse","4":"Vegan Peppermint Chocolate Mousse","10":"jGDHgBoyseXFeG"},"5":{"1":"jlPfQqTOlSGGXmw"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Vegan Peppermint Chocolate Mousse","4":["Liquid from 1 15oz (425g) can of Chickpeas","1/4 tsp Cream of Tartar","2 Tbsp Powdered Sugar","1/4 tsp Peppermint Extract","7 oz (200g) Vegan Dark Chocolate"],"5":"Amazing vegan peppermint chocolate mousse, the best texture vegan mousse  you've ever had! In just 5 ...","6":"20 min","7":"4"}}}},{"1":{"1":"http://media.foodnetwork.ca/recipetracker/dmm/C/L/Classic_Dark_Chocolate_Mousse_001.jpg","3":460,"4":230},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTn1P0lnbsEmbX1A87YDXQEf10PRs26K_llOYmlnhRvQcpKxHT0","3":200,"4":100},"3":{"1":"Food Network Canada","2":"http://www.foodnetwork.ca/recipe/classic-dark-chocolate-mousse/12736/","3":"Classic Dark Chocolate Mousse","4":"Classic Dark Chocolate Mousse","10":"SWSaYBdApXLyHI"},"5":{"1":"HIVxACCKxQLVDyJ"},"7":{"1":{"9":{"1":2.882352828979492,"2":357,"3":"Classic Dark Chocolate Mousse","4":["7 oz bittersweet chocolate, chopped","2 Tbsp unsalted butter","1 cup whipping cream","¼ cup brewed espresso, cooled","3 Tbsp brandy"],"5":"One taste and you won't be able to stop! Smooth, creamy chocolate mousse  topped with a garnish of ...","6":"1 min","7":"serves 6-8"}}}},{"1":{"1":"https://img.buzzfeed.com/thumbnailer-prod-us-east-1/f36600ff3f7b4c97aaf6760902758ca1/BFV16661_ShrimpAlfredoDinnerForTwoFINAL.jpg?output-quality=60&resize=1000:*","3":1000,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRc8Zp_qw2_0V3Tmlle37pBzezvwfl2f6IQdSkOldl9CUZs_sKNMg","3":200,"4":200},"3":{"1":"Tasty","2":"https://tasty.co/recipe/chocolate-mousse","3":"Chocolate Mousse Recipe by Tasty","4":"Chocolate Mousse","10":"BQWyXvChckhxEJ"},"5":{"1":"eLWfCmNpDypSbiE"},"7":{"1":{"9":{"1":92.0,"2":70,"3":"Chocolate Mousse Recipe by Tasty","4":["1 cup heavy cream","3 tablespoons sugar","2 ounces chocolate, broken into small pieces","¼ cup heavy cream, hot","6 raspberries, to garnish"],"5":"Here's what you need: heavy cream, sugar, chocolate, heavy cream,  raspberry, mint, tube cookie","7":"2 servings"}}}},{"1":{"1":"https://www.saveur.com/sites/saveur.com/files/styles/1000_1x_/public/import/2014/images/2012-09/7-SAV150-78.ChocolateMousse-750x750.jpg?itok=sdcDoBXA","3":1000,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_WevA8nG-msc6riM-VMa_DFWbV0xcW7YIlAnNygK0ARRDLTke","3":200,"4":200},"3":{"1":"Saveur","2":"https://www.saveur.com/article/Recipes/Classic-Chocolate-Mousse","3":"Chocolate Mousse","4":"Chocolate Mousse","10":"kocxNNJLHKeOuC"},"5":{"1":"RvhyvBBheYBakAO"},"7":{"1":{"9":{"3":"Chocolate Mousse","4":["1 2⁄3 cups heavy cream","2 tsp. vanilla extract","1⁄2 tsp. kosher salt","4 egg whites","1⁄2 cup sugar"],"5":"Chocolate mousse, with its light texture and intense chocolate flavor, is a  totally crave-worthy ...","7":"serves 4"}}}},{"1":{"1":"https://food.fnr.sndimg.com/content/dam/images/food/fullset/2006/8/4/0/gl0605_mousse1.jpg.rend.hgtvcom.616.462.suffix/1382538446454.jpeg","3":616,"4":462},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfsroJofYyl5Y5GlP4M2ODenY8wugz2hFK9RQtgPE1yTG9u3ny","3":200,"4":149},"3":{"1":"Food Network","2":"https://www.foodnetwork.com/recipes/bobby-flay/dark-chocolate-mousse-recipe-1917102","3":"Dark Chocolate Mousse","4":"Dark Chocolate Mousse","10":"ymDXqtyDHGnKex"},"5":{"1":"pPtCrYdSleBYsWu"},"7":{"1":{"9":{"1":4.5,"2":108,"3":"Dark Chocolate Mousse","4":["5 1/4 ounces bittersweet chocolate, coarsely chopped","14 ounces cold heavy cream","3 large egg whites","1-ounce sugar","Sweetened whipped cream, for garnish, optional"],"5":"Get Dark Chocolate Mousse Recipe from Food Network","6":"1 hr 20 min","7":"4 to 6 servings"}}}},{"1":{"1":"https://img.taste.com.au/3WAjhWtK/w720-h480-cfill-q80/taste/2016/11/chocolate-mousse-94477-1.jpeg","3":615,"4":410},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhr-ebNpH6DCz8ruTFyPewWRhFb48vs-caSp4PcIIlU2I7RNxZ","3":200,"4":133},"3":{"1":"Taste","2":"https://www.taste.com.au/recipes/chocolate-mousse-3/94e5c801-c5dc-49cd-9448-c7fc8b342ea6","3":"Chocolate mousse","4":"","10":"EadWIdbGSiBvvy"},"5":{"1":"YXdVQXdgvHEROtk"},"7":{"1":{"9":{"1":4.800000190734863,"2":11,"3":"Chocolate mousse","4":["200g milk chocolate, or dark chocolate, broken","4 eggs, separated","1 tablespoon Kahlua, or other liqueur of choice","300ml carton thickened cream","Whipped cream, extra, to serve"],"5":"It's hard to beat the classics so keep it traditional with this decadent  chocolate mousse treat.","6":"15 min"}}}},{"1":{"1":"https://thetoughcookie.com/wp-content/uploads/2016/06/Salted-Caramel-Chocolate-Mousse-Featured.jpg","3":680,"4":680},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTWRfOMxBP868Tf8ElksLubFwkKxO72o6jGOvW2SfgAJb0oJ1pl","3":200,"4":200},"3":{"1":"The Tough Cookie","2":"https://thetoughcookie.com/2016/06/04/salted-caramel-chocolate-mousse/","3":"Salted Caramel Chocolate Mousse","4":"","10":"CeLWFekJwycRDm"},"5":{"1":"JPMQWbsGqBiKvtG"},"7":{"1":{"9":{"3":"Salted Caramel Chocolate Mousse","4":["100g (or ½ cup) granulated sugar","2 tablespoons of water","80g (or ⅓ cup + 1 teaspoon) unsalted butter, cubed","180ml (or ¾ cup) heavy cream","a pinch of table salt"],"5":"A thick layer of golden salted caramel topped with a delicious dark  chocolate mousse. The best!","6":"30 min","7":"6-8"}}}},{"1":{"1":"https://d3cizcpymoenau.cloudfront.net/images/26341/SFS_triple_chocolate_mousse_cake-15.jpg","3":2090,"4":2090},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRxByiQWbCWjcmc-JbrQ9VYr8CtY4ZkshQSg6F91sogjKeKhbkq6g","3":200,"4":200},"3":{"1":"Cook's Illustrated","2":"https://www.cooksillustrated.com/recipes/4958-triple-chocolate-mousse-cake","3":"Triple-Chocolate Mousse Cake","4":"","10":"vtSNnAVjUHgliG"},"5":{"1":"hqlCpdUtkiMSnxi"},"7":{"1":{"9":{"3":"Triple-Chocolate Mousse Cake","5":"To rate a perfect 10, this triple-decker confection would need to lighten  up and lose its one-note ...","7":"Serves 12 to 16"}}}},{"1":{"1":"https://www.thecookierookie.com/wp-content/uploads/2014/12/white-chocolate-mousse-8.jpeg","3":680,"4":859},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS96fuqccB37YN9XDwYbTYVoh5y9kKhq6WU2rfERutMWCKY14uI","3":158,"4":200},"3":{"1":"The Cookie Rookie","2":"https://www.thecookierookie.com/easy-white-chocolate-mousse/","3":"Super Easy White Chocolate Mousse","4":"White Chocolate Mousse layered into small glass jars","10":"cTpbSarnLdFYPE"},"5":{"1":"DInTFakOHyPQldd"},"7":{"1":{"9":{"1":4.599999904632568,"2":5,"3":"Super Easy White Chocolate Mousse","4":["12 ounces White Chocolate (chopped (you can also use dark or milk  chocolate))","1 1/2 cups heavy cream (divided)","Mini chocolate chips (optional (you can also use chopped fruit or other  garnishes you might like))"],"5":"White Chocolate Mousse is just so rich and creamy! There's nothing better  than a SUPER Easy White ...","6":"15 min","7":"6"}}}},{"1":{"1":"https://assets.epicurious.com/photos/54c94a9b1f13bb9b2edf4c3c/master/pass/51230220_olive-oil-dark-chocolate-mousse_6x4.jpg","3":1625,"4":1084},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRcMVVdshojOMfYOX7lMBM4GovM28xqkyyj2Gy0l5W5uLQgZdqR","3":200,"4":133},"3":{"1":"Epicurious","2":"https://www.epicurious.com/recipes/food/views/olive-oil-dark-chocolate-mousse-51230220","3":"Olive Oil Dark Chocolate Mousse","4":"","10":"dwOlpracQRKTAG"},"5":{"1":"XhpxHwGmQQlsOhN"},"7":{"1":{"9":{"1":4.0,"2":9,"3":"Olive Oil Dark Chocolate Mousse","4":["10 ounces high-quality 72% cacao bittersweet chocolate, finely chopped, or  chocolate chips","8 large eggs, separated, at room temperature","3/4 cup granulated sugar","1/2 cup extra virgin olive oil","1 teaspoon instant coffee granules dissolved in 2 tablespoons boiling water"],"5":"Kosher Status: Pareve I first learned about using fruity, high-quality  olive oil in ...","7":"6 servings"}}}},{"1":{"1":"http://www.ndtv.com/cooks/images/chocolate.mousse.jpg","3":620,"4":330},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpzzGQYH5M9gmwVRkNDjGERaJyhUjLmxmCFuZYcMePG_97vyMD","3":200,"4":106},"3":{"1":"NDTV Food","2":"https://food.ndtv.com/recipe-eggless-chocolate-mousse-219658","3":"Eggless Chocolate Mousse Recipe","4":"Eggless Chocolate Mousse","10":"RRNhbBNmtNxLSg"},"5":{"1":"yBXDaMTanHBfkrA"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Eggless Chocolate Mousse Recipe","4":["2 cups hot milk","1 cup sugar","100 gm plain milk chocolate","1 cup cream-chilled","1 Tbsp gelatine"],"5":"Whip up a light and creamy chocolate mousse without eggs.","6":"1 hr 15 min","7":"4"}}}},{"1":{"1":"https://assets.marthastewart.com/styles/wmax-1500/d31/chocolate-mousse-0106-mla101821/chocolate-mousse-0106-mla101821_sq.jpg?itok=6_pcUxej","3":1500,"4":1500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTK8e6IYmJkxBVn7akLOD6mI3T1r3uThbRu5rU7aBND0gh9N9AP6A","3":200,"4":200},"3":{"1":"Martha Stewart","2":"https://www.marthastewart.com/315307/individual-chocolate-mousse","3":"Individual Chocolate Mousse","4":"","10":"AGdFyQHJPdNaCy"},"5":{"1":"EeCnVxqGEXBvcYu"},"7":{"1":{"9":{"1":3.450000047683716,"2":95,"3":"Individual Chocolate Mousse","4":["3 1/3 cups heavy cream","8 large egg yolks, room temperature","1/2 cup sugar","1/4 cup light corn syrup","7 ounces bittersweet chocolate, melted"],"5":"This recipe makes two kinds of mousse: bittersweet chocolate and milk  chocolate.","6":"0 min","7":"Makes enough for 8 cakes"}}}},{"1":{"1":"https://cook.fnr.sndimg.com/content/dam/images/cook/fullset/2012/2/10/0/ek0109_mouse4.jpg.rend.hgtvcom.616.462.suffix/1391099484102.jpeg","3":616,"4":462},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkHF2cBoiaNktwB_hF1d6oFUzz_FvmcICCsx3nI9rfyPEeH2KU","3":200,"4":149},"3":{"1":"Cooking Channel","2":"https://www.cookingchanneltv.com/recipes/ellie-krieger/dark-chocolate-mousse-1945893","3":"Dark Chocolate Mousse","4":"Dark Chocolate Mousse","10":"LJqbDRJGwUPsht"},"5":{"1":"kHhNwbUGEsncjCS"},"7":{"1":{"9":{"3":"Dark Chocolate Mousse","4":["1 (12.3-ounce) package silken tofu, drained","3 ounces high quality bittersweet chocolate, finely chopped","1/4 cup unsweetened cocoa powder, preferably Dutch-processed","1/4 cup water","1 tablespoon brandy"],"5":"Cooking Channel serves up this Dark Chocolate Mousse recipe from Ellie  Krieger plus many other ...","6":"1 hr 20 min","7":"5 servings"}}}},{"1":{"1":"https://www.deliaonline.com/sites/default/files/quick_media/chocolate-a-very-chocolatey-mousse.jpg","3":1348,"4":1542},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTEx0oq8mkc2n2EtHhIRzN5rAYJlhsSftegHcaRrZ0Rup8dn_xJSQ","3":175,"4":200},"3":{"1":"Delia Online","2":"https://www.deliaonline.com/recipes/international/european/french/a-very-chocolatey-mousse","3":"A Very Chocolatey Mousse","4":"","10":"UgfjqXPRIGcnJs"},"5":{"1":"QmtOOeQtnaucgGr"},"7":{"1":{"9":{"3":"A Very Chocolatey Mousse","4":["7 oz (200 g) dark chocolate (75 per cent cocoa solids), broken into pieces","4fl oz (120ml) warm water","3 large eggs, separated","1½ oz (40 g) golden caster sugar","a little whipped cream (optional)"],"5":"This was the chocolate recipe of the 1960s, but it has now, sadly, been  eclipsed by other eras and ...","7":"Serves 6"}}}},{"1":{"1":"https://www.healthymummy.com/wp-content/uploads/2016/07/Mousse.jpg","3":960,"4":705},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0eNWtlljCNY2Rz1V3tYBFpmv-cAH6t1DRbl4gCyNU7zAxCLBm","3":200,"4":146},"3":{"1":"The Healthy Mummy","2":"https://www.healthymummy.com/recipe/coconut-chocolate-mousse/","3":"Coconut and Chocolate Mousse","4":"Chocolate Mousse","10":"sOLpVJIlJNwjMs"},"5":{"1":"rpCMjBTUjAxYQgM"},"7":{"1":{"9":{"3":"Coconut and Chocolate Mousse","4":["400 ml can of coconut cream","5 tbsp good quality cocoa or cacao","4 tbsp honey or rice malt syrup","1 tsp vanilla bean paste or vanilla essence","1 tsp cinnamon"],"5":"Read our delicious recipe for Healthy One Bowl Coconut and Chocolate  Mousse, a recipe from The ...","7":"6 people"}}}},{"1":{"1":"https://platedcravings.com/wp-content/uploads/2018/02/Easy-Chocolate-Mousse-Recipe-Plated-Cravings-8-500x375.jpg","3":500,"4":375},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS4cS4DoviXJBXThmsL3j4w_I27aYWW_tYU7-DaFeCCsvF1B4VUug","3":200,"4":149},"3":{"1":"Plated Cravings","2":"https://platedcravings.com/easy-chocolate-mousse-recipe/","3":"Easy Chocolate Mousse Recipe","4":"","10":"expJObPwmlJAkU"},"5":{"1":"TBHCrHANrOnGqPH"},"7":{"1":{"9":{"1":5.0,"2":3,"3":"Easy Chocolate Mousse Recipe","4":["8 oz. semisweet chocolate (chopped)","1 tsp vanilla extract","1 pinch salt","3 cups heavy cream (divided)","1/4 cup powdered sugar"],"5":"This easy Chocolate Mousse recipe is super simple to make from scratch and  deliciously light and ...","6":"16 min","7":"8"}}}},{"1":{"1":"https://assets.epicurious.com/photos/583f3202e5ba7cdd0eb88201/master/pass/chocolate-mousse-pie.jpg","3":1000,"4":664},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS7MZyR4OdCuZhRTKrQxwfPhYFXwNRNP2PTBsGDiPykDzyVG2EH","3":200,"4":132},"3":{"1":"Epicurious","2":"https://www.epicurious.com/recipes/food/views/chocolate-mousse-pie-2687","3":"Chocolate Mousse Pie","4":"","10":"luvhIBOrsyqWKK"},"5":{"1":"XXfxypeCTaISdwC"},"7":{"1":{"9":{"1":4.0,"2":204,"3":"Chocolate Mousse Pie","4":["21 chocolate sandwich cookies (such as Oreos)","1/4 cup (1/2 stick) unsalted butter, cut into pieces, room temperature","12 ounces semisweet chocolate, finely chopped","1 teaspoon vanilla extract","Pinch of salt"],"5":"A quick and easy Chocolate Mousse Pie recipe","7":"Serves 8"}}}},{"1":{"1":"https://tipbuzz.com/wp-content/uploads/Raspberry-and-Chocolate-Mousse.jpg","3":735,"4":1102},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAAlQj6exF8tP1gKJk7jSkcXfK08AK3kpmGjXdEjN7NMa3ykS9","3":133,"4":200},"3":{"1":"TipBuzz","2":"https://tipbuzz.com/raspberry-chocolate-mousse/","3":"Easy Raspberry And Chocolate Mousse (with Video)","4":"Raspberry And Chocolate Mousse – looks so elegant with two layers and  tastes so delicious that","10":"dclspGcVrDXGBd"},"5":{"1":"dYwBNIssOSlaJEA"},"7":{"1":{"9":{"1":3.799999952316284,"2":94,"3":"Easy Raspberry And Chocolate Mousse (with Video)","4":["3 oz raspberry jello powder (1 small box)","1 cup boiling water","1/2 cup cold water","2 cups whipped cream (see note) (or Cool Whip)","1/2 cup half and half milk"],"5":"This Raspberry Chocolate Mousse is a delicious dessert with a stunning  presentation in stemless wine ...","6":"2 hr 35 min","7":"6 servings"}}}},{"1":{"1":"https://tastesbetterfromscratch.com/wp-content/uploads/2014/05/Chocolate-Cake-Chocolate-Mousse-8.jpg","3":683,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTUJwrzOlkPXRGMw2MPkh8T6-iHmD_CO4FmbmCYpnCVAxbrHzAV","3":133,"4":200},"3":{"1":"Tastes Better from Scratch","2":"https://tastesbetterfromscratch.com/chocolate-cake-with-chocolate-mousse/","3":"Chocolate Cake with Chocolate Mousse Filling","4":"A slice of homemade chocolate cake with layers of chocolate mousse filling,  on a white","10":"lWreJgKIYKdycU"},"5":{"1":"iIctMJsvSGSSOTp"},"7":{"1":{"9":{"1":4.630000114440918,"2":27,"3":"Chocolate Cake with Chocolate Mousse Filling","4":["2 cup granulated sugar","1 3/4 cup all-purpose flour","3/4 cup unsweetened cocoa powder","1 1/2 teaspoon baking powder","1 1/2 teaspoon baking soda"],"5":"A delicious, moist chocolate cake with layers of dark chocolate mousse  filling and a warm chocolate ...","6":"2 hr 5 min","7":"15"}}}},{"1":{"1":"http://kitchenconfidante.com/wp-content/uploads/2012/02/Triple-Chocolate-Mousse-Kitchen-Confidante1.jpg","3":520,"4":781},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSC3nD5-E47uUf93VYRZrJ-nBGqR6OVd8O1U1dtArebfVLEgfTEjQ","3":133,"4":200},"3":{"1":"Kitchen Confidante","2":"https://kitchenconfidante.com/triple-chocolate-mousse-recipe","3":"Triple Chocolate Mousse","4":"Triple Chocolate Mousse","10":"bKqDNOFFguSowI"},"5":{"1":"iMaNKBNgKYsQQTB"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse","5":"Now you know me, I don’t need a holiday as an excuse to make anything  chocolate-y. But of course, ...","7":"4 (generous) servings."}}}},{"1":{"1":"https://img.taste.com.au/nGjAovK2/taste/2016/11/layered-chocolate-mousse-cakes-101268-1.jpeg","3":3000,"4":2000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAYC-6BAF1KIL71PDZATnMc8c5P07p7iII3sWPh6JNggu98YW8","3":200,"4":133},"3":{"1":"Taste","2":"https://www.taste.com.au/recipes/layered-chocolate-mousse-cakes/9be6bd0a-fcf6-42ba-8410-a6ba5603d4e8","3":"Layered chocolate mousse cakes","4":"","10":"mFvYouYCpgjdMs"},"5":{"1":"WhnonbUhsFfKCPL"},"7":{"1":{"9":{"1":2.700000047683716,"2":3,"3":"Layered chocolate mousse cakes","4":["200g dark chocolate, chopped","200g butter, chopped","1 1/4 cups (275g) brown sugar","3 Coles Brand Australian Free Range Eggs, lightly whisked","3/4 cup (110g) plain flour"],"5":"A brownie base, chocolate mousse filling and dark chocolate sauce on top.  Can you think of any ...","6":"2 hr 5 min"}}}},{"1":{"1":"https://www.amymyersmd.com/wp-content/uploads/2018/02/Coconut-Cream-Chocolate-Mousse2.jpg","3":1200,"4":630},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2TAHGhBmzxrybZf7rljmVqeay8DwB5BIny97lcZL46tUoPBme","3":200,"4":105},"3":{"1":"Amy Myers MD","2":"https://www.amymyersmd.com/2018/02/coconut-cream-chocolate-mousse/","3":"Coconut Cream Chocolate Mousse","4":"Coconut Cream Chocolate Mousse","10":"CkKFxrlXnhUuhe"},"5":{"1":"lReGEEBDYtdWrEV"},"7":{"1":{"9":{"3":"Coconut Cream Chocolate Mousse","4":["1 can full fat coconut milk","1 Tbsp unsweetened cocoa powder","1/2 tsp vanilla extract","5-10 drops stevia","1 pinch cinnamon"],"5":"Looking for a sweet to enjoy without derailing your protocol? Try this  delicious homemade Coconut ...","7":"1"}}}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Fcdn-image.foodandwine.com%2Fsites%2Fdefault%2Ffiles%2F1532533774%2Fultimate-chocolate-mousse-XL-RECIPE0918.jpg&w=1000&q=70","3":1000,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS9YyVHT8dcRWtWpCH85bE8g-00TuL-X8f4BYunjFXEPxU7NadV0g","3":200,"4":200},"3":{"1":"Food & Wine Magazine","2":"https://www.foodandwine.com/recipes/ultimate-chocolate-mousse","3":"Ultimate Chocolate Mousse","4":"Ultimate Chocolate Mousse","10":"yiPtIRsyVupAaY"},"5":{"1":"XoMIQmyxIVUFNOM"},"7":{"1":{"9":{"3":"Ultimate Chocolate Mousse","4":["8 ounces semisweet dark chocolate, broken into 1/2-inch pieces","6 large eggs, separated","3 tablespoon water","1/4 cup sweet liqueur (such as Chartreuse, amaretto, mandarin, or Grand  Marnier)","2 cups heavy cream"],"5":"In 2018, Food & Wine named this recipe one of our 40 best: To celebrate  chocolate in its most ...","6":"4 hr 30 min","7":"Serves : 12"}}}},{"1":{"1":"https://www.cookingclassy.com/wp-content/uploads/2017/11/chocolate-mousse-pie-17.jpg","3":1080,"4":1620},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUEQeQarCpynWIXm6YbXUWVdiUQ4PVCc0VNxgyh44mEP5jmXPL","3":133,"4":200},"3":{"1":"Cooking Classy","2":"https://www.cookingclassy.com/easy-chocolate-mousse-pie/","3":"Easy Chocolate Mousse Pie","4":"Chocolate Mousse Pie","10":"JyvaMdqWbwqtNE"},"5":{"1":"uYqqOxFFEkbMExh"},"7":{"1":{"9":{"1":4.75,"2":16,"3":"Easy Chocolate Mousse Pie","4":["2 Tbsp salted butter, (diced into 4 pieces)","1 cup semi-sweet chocolate chips*","1/2 cup bittersweet chocolate chips ((or another 1/2 cup semi-sweet if you  don't want it quite as rich))","2 cups mini marshmallows","1/3 cup milk ((whole or 2%))"],"5":"This pie is purely irresistable! It's so chocolatey, so fluffy, so rich, so  creamy. It's absolutely ...","6":"4 hr 20 min","7":"10"}}}},{"1":{"1":"https://www.lifeloveandsugar.com/wp-content/uploads/2017/10/Chocolate-Mousse-Cake4.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQm8WGK0UxwFPDDa1t2qB9EQfMVAyBZsg6BYW2yPgOzIk2pKN60Ag","3":133,"4":200},"3":{"1":"Life Love and Sugar","2":"https://www.lifeloveandsugar.com/2017/10/23/chocolate-mousse-cake/","3":"Chocolate Mousse Cake","4":"Chocolate Mousse Cake","10":"LGoFCNeaeWpiwp"},"5":{"1":"qgBJJasKxSTLVEX"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Chocolate Mousse Cake","4":["1 3/4 cups (228g) all purpose flour","2 cups (414g) sugar","3/4 cup (85g) natural unsweetened cocoa powder","2 1/4 tsp baking soda","1/2 tsp baking powder"],"5":"This Chocolate Mousse Cake is a classic! With three layers of moist  chocolate cake and two layers of ...","7":"12-14 Slices"}}}},{"1":{"1":"https://www.sbs.com.au/food/sites/sbs.com.au.food/files/2_3.jpg","3":1872,"4":1248},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQQwUiKk9ItX8NHEVxSPWjDJPmn79D0Gc0osHxQakgcKZ4njP9Cpg","3":200,"4":133},"3":{"1":"SBS","2":"https://www.sbs.com.au/food/recipes/belgian-chocolate-mousse","3":"Belgian chocolate mousse","4":"Belgian chocolate mousse https://www.sbs.com.au/food/recipes/belgian- chocolate-mousse","10":"CckKwtPXnRyCRI"},"5":{"1":"BiMeABecAAqrNOy"},"7":{"1":{"9":{"1":3.695310115814209,"2":256,"3":"Belgian chocolate mousse","5":"You can't get more decadent that this delicious Belgian chocolate dessert  recipe. It's best to make ...","6":"30 min","7":"6"}}}},{"1":{"1":"https://www.willcookforsmiles.com/wp-content/uploads/2014/11/Chocolate-Mousse-3-from-willcookforsmiles.com_.jpg","3":905,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS1IOQlPBqG1_SDmh7qX95Moe5GQ_B_ebSYTQ9IVIxW-s4JBG9R","3":200,"4":132},"3":{"1":"Will Cook For Smiles","2":"https://www.willcookforsmiles.com/chocolate-mousse/","3":"Chocolate Mousse","4":"Chocolate Mousse | from willcookforsmiles.com","10":"tldKqDuSAbXtnQ"},"5":{"1":"EiFGSBRDtQyLvYF"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Chocolate Mousse","4":["8 oz bittersweet baking chocolate","1/2 cup of water (split in two)","2 Tbsp unsalted butter","1 tsp vanilla extract","3 egg yolks"],"5":"Delicate yet rich dessert that goes perfectly for any celebration. This  Chocolate Mousse is made ...","6":"30 min","7":"6 servings"}}}},{"1":{"1":"https://img.taste.com.au/GAoU8PP5/w720-h480-cfill-q80/taste/2012/07/classic-chocolate-mousse-136368-1.jpg","3":720,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKSHeb2idq49Hy3ZO1mL17JpQqNgpwZyskllnY8RbCCwQP6rTW8g","3":200,"4":133},"3":{"1":"Taste","2":"https://www.taste.com.au/recipes/classic-chocolate-mousse-2/9acca574-0e7b-4db9-8e75-9e36b02053ee","3":"Classic chocolate mousse","4":"","10":"QPOHNOVliBSibQ"},"5":{"1":"yqCdusrJeBAjAie"},"7":{"1":{"9":{"1":4.5,"2":29,"3":"Classic chocolate mousse","4":["200g dark cooking chocolate, finely chopped","25g butter","3 eggs, separated, at room temperature","1 teaspoon vanilla extract","250ml (1 cup) thickened cream"],"5":"Whip up perfectly smooth mousse in no time with this simple six-step recipe.","6":"25 min","7":"6"}}}},{"1":{"1":"http://www.bite.co.nz/images/recipes/three-ingredient-chocolate-mousse-recipe.jpg?width=1200&height=800","3":1200,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQW7hnqPuX8_hcn-EPyE8OtghyTdfsltkgs-coaNZDgi_Uy7k8SlA","3":200,"4":133},"3":{"1":"Bite","2":"http://www.bite.co.nz/recipe/15181/Three-ingredient-chocolate-mousse/","3":"Three ingredient chocolate mousse ( SERVES 2 )","4":"","10":"PqUbHOJMJlYeno"},"5":{"1":"nIilfAbGTehhyXU"},"7":{"1":{"9":{"3":"Three ingredient chocolate mousse ( SERVES 2 )","4":["Dark chocolate, ideally at least 70% cocoa solids, coarsely chopped","Cream","Marshmallows, chopped"],"5":"This delicious silken chocolate mousse is very rich, so you'll need only a  small glass or bowl each. ..."}}}},{"1":{"1":"http://assets.kraftfoods.com/recipe_images/opendeploy/53395_640x428.jpg","3":642,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-keC9N7eStfilSNUrZU_fPxAJiaFSSro567cUOx0o2Tw1eBjTDw","3":200,"4":133},"3":{"1":"Kraft Recipes","2":"http://www.kraftrecipes.com/recipes/double-chocolate-mousse-recipe-53395.aspx","3":"Double-Chocolate Mousse Recipe","4":"Double-Chocolate Mousse Recipe","10":"OhJFCWUSWhdIlb"},"5":{"1":"yQnWRSTdtypKJiV"},"7":{"1":{"9":{"3":"Double-Chocolate Mousse Recipe","4":["2 oz. BAKER'S Semi-Sweet Chocolate","1-1/2 cups fat-free milk, divided","1 pkg. (1.4 oz.) JELL-O Chocolate Flavor Sugar Free Fat Free Instant Pudding","2 cups thawed COOL WHIP FREE Whipped Topping, divided","1/2 cup fresh raspberries"],"5":"Enjoy this Double-Chocolate Mousse Recipe. It's hard to believe this  luscious Double-Chocolate ...","6":"35 min","7":"6 servings"}}}},{"1":{"1":"https://img.delicious.com.au/sWSoXu5b/h506-w759-cfill/del/2018/05/double-chocolate-mousse-cake-79402-2.jpg","3":759,"4":506},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdYzkyO8y9vDLut-n0pEa0cbZYOP1tgWTNWqhmmzrz65i6ZltNqg","3":200,"4":133},"3":{"1":"Delicious","2":"https://www.delicious.com.au/recipes/chocolate-mousse-fudge-brownie-cake/ju5kgajg","3":"Chocolate mousse fudge brownie cake","4":"Double-chocolate mousse cake","10":"chqrdknqidKMKM"},"5":{"1":"JMsAPWumpNlEiWY"},"7":{"1":{"9":{"3":"Chocolate mousse fudge brownie cake","4":["500g chocolate fudge brownie packet mix","400g dark (70%) chocolate, chopped","400g milk chocolate, chopped","6 eggs, separated","1 titanium-strength gelatine leaf"],"5":"Double the chocolate, double the deliciousness.","6":"50 min","7":"10"}}}},{"1":{"1":"https://www.creationsbykara.com/wp-content/uploads/2017/10/Easy-Chocolate-Mousse-011-2.jpg","3":800,"4":1055},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQeY3ZLajJbKFus6n9z7MzFf-iGkRXm_sqLwF2zRBlq4u1QBuY","3":151,"4":200},"3":{"1":"Creations by Kara","2":"https://www.creationsbykara.com/easy-chocolate-mousse-3-ingredient/","3":"Easy Chocolate Mousse (3 Ingredient)","4":"Easy 3 ingredient chocolate mousse. A simple but decadent dessert recipe.","10":"yBErsOSUwLpCdn"},"5":{"1":"RydapwVUymANmsv"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Easy Chocolate Mousse (3 Ingredient)","4":["1 cup good quality chocolate chips","1 cup whipping cream","1 tsp vanilla"],"5":"Rich and creamy chocolate mousse make with just three ingredients.","6":"15 min"}}}},{"1":{"1":"https://glutenfreeonashoestring.com/_main_site/wp-content/uploads/2016/06/closeup.jpg","3":685,"4":937},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ5bzseFXF-3kFO6yc6lE3tIgihZSuj2GBFTFmFG-4uExVZZ1c3ig","3":146,"4":200},"3":{"1":"Gluten Free on a Shoestring","2":"https://glutenfreeonashoestring.com/paleo-chocolate-mousse/","3":"Paleo Chocolate Mousse","4":"Paleo Chocolate Mousse","10":"IlxiFEKvKWUOLA"},"5":{"1":"QkhCQJjwCLeRvOV"},"7":{"1":{"9":{"3":"Paleo Chocolate Mousse","5":"Smooth and creamy Paleo chocolate mousse, made with chocolate, coconut  cream, cocoa powder, honey ...","6":"5 min","7":"4 servings"}}}},{"1":{"1":"https://cdn77-s3.lazycatkitchen.com/wp-content/uploads/2016/07/vegan-black-cherry-chocolate-mousse.jpg","3":1280,"4":1920},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQDdqbIpGTV48CT9YMCuxqbVnVOh_xd9oYffZFryk8Oli6E6OutXA","3":133,"4":200},"3":{"1":"Lazy Cat Kitchen","2":"https://www.lazycatkitchen.com/vegan-black-forest-chocolate-mousse/","3":"Vegan black forest chocolate mousse","4":"","10":"BqwvupophfNFSb"},"5":{"1":"aauwnpVSsGfHjwM"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Vegan black forest chocolate mousse","4":["170 g / 6 oz dark (70 % cacao) chocolate","135 ml / ½ cup + 1 tbsp gelatinous aquafaba* homemade or from a tin","135 ml / ½ cup + 1 tbsp coconut cream","2 tbsp caster sugar (optional)*","400 g / 14 oz sour or sweet cherries** halved and pitted"],"5":"... is a mean dessert! It's airy, effortlessly impressive and goes superbly  well with a strong ...","6":"30 min","7":"makes: 4"}}}},{"1":{"1":"https://www.annabel-langbein.com/images/blog/easter-made-easy/chocolate-mousse.jpg","3":1772,"4":1243},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8hDwRc0WBZ6mqvqUfZMJ_U5NXzl_OpWGbBiiDzdtZq83l8xxksw","3":200,"4":140},"3":{"1":"Annabel Langbein","2":"https://www.annabel-langbein.com/recipes/velvet-chocolate-mousse/188/","3":"Velvet Chocolate Mousse - Annabel Langbein – Recipes","4":"","10":"aRUYADVBRKwyvJ"},"5":{"1":"unhFXeGrDhdHrMd"}},{"1":{"1":"https://assets.marthastewart.com/styles/wmax-1500/d37/triple-chocolate-mousse-cakes-a101821/triple-chocolate-mousse-cakes-a101821_horiz.jpg?itok=qjl3Tyyu","3":1324,"4":743},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRB6ZucfnwjjD9CxJ17KOVs6CwkP-tXx-BXWXYM9gL0Rm-NBvWK","3":200,"4":112},"3":{"1":"Martha Stewart","2":"https://www.marthastewart.com/317890/triple-chocolate-mousse-cake","3":"Triple-Chocolate Mousse Cakes","4":"","10":"fmyIGBEBfkAXNw"},"5":{"1":"AhgPpPywjIRbTkO"},"7":{"1":{"9":{"1":3.5,"2":643,"3":"Triple-Chocolate Mousse Cakes","4":["Vegetable-oil cooking spray","2/3 cup all-purpose flour","1/3 cup unsweetened Dutch-process cocoa powder","2/3 cup sugar","3/4 teaspoon baking soda"],"5":"With three shades of chocolate, these cakes are as pleasing to the eye as  they are to the sweet ...","6":"0 min","7":"Makes 8"}}}},{"1":{"1":"https://www.chowstatic.com/assets/models/promotions/photos/28768/original/chowhound_white_chocolate_mousse_1.jpg","3":3000,"4":1999},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRo4DyXkcnY-RnA7ZCM-HNSv0YRsZF0b3TNOcXXTHOw2vPcmW7C1A","3":200,"4":133},"3":{"1":"Chowhound","2":"https://www.chowhound.com/recipes/white-chocolate-mousse-blackberry-compote-31821","3":"White Chocolate Mousse with Blackberry Compote","4":"","10":"dvVqXCxdxEmAFx"},"5":{"1":"BrNQDgJTTEJTrPB"},"7":{"1":{"9":{"3":"White Chocolate Mousse with Blackberry Compote","4":["8 ounces white chocolate bars (not morsels or chips)","1½ cup heavy cream","2 egg yolks","6 tablespoons sugar","1 teaspoon cornstarch"],"5":"mousse with blackberry compote","6":"1 hr","7":"4 to 5 servings"}}}},{"1":{"1":"https://tipbuzz.com/wp-content/uploads/Strawberry-Chocolate-Mousse-.jpg","3":1000,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTPDe13slz50EIMYV1nBU-r3y0uatneBh-r-0lXpx6KhZyPLfLq","3":200,"4":120},"3":{"1":"TipBuzz","2":"https://tipbuzz.com/strawberry-chocolate-mousse/","3":"Strawberry Chocolate Mousse (with Video)","4":"Strawberry Chocolate Mousse","10":"BKokgkfaoNPyVL"},"5":{"1":"pwVkVPbEXrTqUSm"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Strawberry Chocolate Mousse (with Video)","4":["3 oz strawberry jello powder (1 small box)","1 cup boiling water","2 cups cold water","10 fresh strawberries (chopped)","1/2 cup half and half milk"],"5":"Strawberry Chocolate Mousse is a stunning make-ahead dessert that's perfect  for Valentine's Day, ...","6":"2 hr 35 min","7":"6 servings"}}}},{"1":{"1":"https://www.gnom-gnom.com/wp-content/uploads/2018/08/Low-Carb-Paleo-Keto-Chocolate-Mousse-by-Gnom-Gnom-1.jpg","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS039cF8Xg2EhS8rKf_AX47EpRN8algumwFDSIiQf4Z5e6mmFZeCQ","3":200,"4":200},"3":{"1":"gnom-gnom","2":"https://www.gnom-gnom.com/paleo-keto-chocolate-mousse/","3":"Paleo, Low Carb & Keto Chocolate Mousse","4":"","10":"VINQGoLpoWYnoj"},"5":{"1":"JQQglyLIsPIgjmT"},"7":{"1":{"9":{"1":5.0,"2":6,"3":"Paleo, Low Carb & Keto Chocolate Mousse","4":["1/3 cup full fat coconut milk (*)","2-4 tablespoons xylitol (or sweetener of choice, to taste**)","1-3 tablespoons cocoa powder (use the smaller amount for milk chocolate and  the larger for dark (I use 3!))","pinch espresso powder (or instant coffee, optional)","pinch kosher salt (up to 1/8-1/4 tsp for a 'salted' version (my favorite!))"],"5":"Extra fluffy and easy-peasy to whip up, this paleo and keto chocolate  mousse is bound to satisfy any ...","6":"15 min","7":"2"}}}},{"1":{"1":"https://www.thatskinnychickcanbake.com/wp-content/uploads/2016/07/Chocolate-Peanut-Butter-Mousse-Cake-7-600x440.jpg","3":600,"4":440},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQyjKcnu0mQkTq_hu8vd5Gxynv8kOYlArQSamr6qKf2461QawQXpQ","3":200,"4":146},"3":{"1":"That Skinny Chick Can Bake","2":"https://www.thatskinnychickcanbake.com/peanut-butter-chocolate-mousse-cake/","3":"Peanut Butter Chocolate Mousse Cake","4":"Peanut Butter Chocolate Mousse Cake | A decadent brownie topped with  exquisite chocolate and peanut ...","10":"uSJFlwLvdiGbRS"},"5":{"1":"gxwuSQMtlsngXow"},"7":{"1":{"9":{"1":5.0,"2":5,"3":"Peanut Butter Chocolate Mousse Cake","4":["1 box brownie mix (I used my [url]One Bowl Fudgy  Brownies∞https://www.thatskinnychickcanbake.com/one-bowl-fudgy-brownies/[/url]  and baked for 35 minutes)","8 ounces Reese's minis (reserve extras from bag for garnishing)","1 1/8 teaspoon powdered gelatin","1 1/2 tablespoons water","9 ounces Reese's peanut butter chips"],"5":"A decadent chocolate and peanut butter dessert.","6":"1 hr 35 min","7":"16 servings"}}}},{"1":{"1":"https://images.food52.com/0vmCf5I5baS0CjzEASwEBP7FBYs=/753x502/2603cf44-4718-4ca5-ae35-6ccc9f208ab7--2018-0508_tricolor-chocolate-mousse_3x2_james-ransom-059.jpg","3":753,"4":502},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFgmeLJESN6R3P9rPa7li83kt-itrIIVRNvCmobELVEq6ligZF","3":200,"4":133},"3":{"1":"Food52","2":"https://food52.com/recipes/76975-tricolor-chocolate-mousse","3":"Tricolor Chocolate Mousse","4":"Tricolor Chocolate Mousse","10":"kHfidHgjoKtRfJ"},"5":{"1":"xfBTnkNSKRXArNW"},"7":{"1":{"9":{"1":4.5714287757873535,"2":7,"3":"Tricolor Chocolate Mousse","4":["Base<\\/em>:","1 ounce (30 grams) dark chocolate","Dark Chocolate Mousse<\\/em>:","10 ounces (280 grams) semisweet or bittersweet chocolate (not to exceed 62%  cacao), coarsely chopped","10 tablespoons (140 grams) unsalted butter"],"5":"Named “Dessert of the Year” by San Francisco Focusmagazine in 1987, this  dessert was all the ...","7":"Serves 10-12"}}}},{"1":{"1":"https://www.curiouscuisiniere.com/wp-content/uploads/2018/02/Mousse-Au-Chocolate-French-Chocolate-Mousse-Image-4974.21.jpg","3":500,"4":742},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3kiWXUN_7SlC9wX39ePh2JGlKgD2J2sS6ILh1ElE4qLVDmNPP","3":134,"4":200},"3":{"1":"Curious Cuisiniere","2":"https://www.curiouscuisiniere.com/french-chocolate-mousse/","3":"Mousse Au Chocolate (Easy French Chocolate Mousse)","4":"If you love creamy, rich, dark chocolate, then Mousse Au Chocolat is for","10":"FCADlrWhXEqKDa"},"5":{"1":"itIHFxSjrbREsRr"},"7":{"1":{"9":{"1":4.119999885559082,"2":17,"3":"Mousse Au Chocolate (Easy French Chocolate Mousse)","4":["6 oz bittersweet chocolate","4 eggs (divided, at room temp*)","1 Tbsp sugar","1 tsp pure vanilla extract","Pinch salt"],"5":"If you love creamy, rich, dark chocolate, then Mousse Au Chocolat is for  you. This classic French ...","6":"10 min","7":"4 people"}}}},{"1":{"1":"http://2.bp.blogspot.com/-s7Y4M28grcg/UeB2Uhr8PzI/AAAAAAAASu0/x_x4lNbGY_Y/s1600/Chocolate+Mousse+1.jpg","3":1600,"4":1359},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQDBfF5H0pz1oKGMbq4_M0oEilrat37uEQluSYVL8jHv-AFO67T","3":200,"4":169},"3":{"1":"Kitchen Simmer","2":"http://www.kitchensimmer.com/2013/07/2-ingredient-chocolate-mousse-made-with.html","3":"Kitchen Simmer: 2 Ingredient Chocolate Mousse made with with Tofu","4":"2 Ingredient Chocolate Mousse made with with Tofu","10":"nEQPNkHkyYrqOo"},"5":{"1":"RHQXOaTULmPkXPy"}},{"1":{"1":"https://images-gmi-pmc.edge-generalmills.com/a3dab23d-e8ba-4c6a-91e8-d665f435b7b9.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTL9fZkba8Rj5BLfKkLvNn-VH6nm_SAq_CZOc-ZqG0YSHECNxfh","3":200,"4":112},"3":{"1":"Betty Crocker","2":"https://www.bettycrocker.com/recipes/chocolate-mousse-torte/66b1d719-9130-466c-80e3-a43ba54957b3","3":"Chocolate Mousse Torte","4":"Chocolate Mousse Torte","10":"XXqhHhnhMHlkYc"},"5":{"1":"LjVOJVXvNqQnUMi"},"7":{"1":{"9":{"1":4.0,"2":122,"3":"Chocolate Mousse Torte","4":["1 pouch (10.25 oz) Betty Crocker™ fudge brownie mix Save $","1/4 cup vegetable oil Save $","1/4 cup water Save $","1 egg Save $","2 bags (11.5 oz each) semisweet chocolate chunks (3 1/2 cups) Save $"],"5":"You've gotta try this fudgy brownie with creamy mousse all wrapped up into  one deliciously decadent ...","6":"5 hr 10 min","7":"16"}}}},{"1":{"1":"https://www.recipetineats.com/wp-content/uploads/2018/09/Chocolate-Mousse_9.jpg","3":900,"4":1125},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSRTllyEUXSRStN0A_5HquR1O4e6RpolMgGA3vXMK2tzXjWIoWj","3":160,"4":200},"3":{"1":"RecipeTin Eats","2":"https://www.recipetineats.com/chocolate-mousse/","3":"Chocolate Mousse","4":"Chocolate Mousse in glasses topped with a dollop of cream and chocolate  shavings, ready to","10":"VbHnKQYaoxNJTA"},"5":{"1":"DCTUOiQAUcmrbAs"},"7":{"1":{"9":{"1":5.0,"2":18,"3":"Chocolate Mousse","4":["3 eggs ((~55g/2 oz each))","125 g / 4.5 oz dark chocolate (, bittersweet / 70% cocoa (Note 1))","10 g / 0.3 oz / 2 tsp unsalted butter","125 ml / 1/2 cup cream (, full fat (Note 2))","35 g / 3 tbsp caster sugar ((superfine white sugar))"],"5":"Recipe video above. Light and airy yet rich, the iconic Chocolate Mousse is  actually quite straight ...","6":"20 min","7":"4"}}}},{"1":{"1":"https://thebakermama.com/wp-content/uploads/2017/12/fullsizeoutput_b92f.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSBGlZFrrxhyoI7vVCRXpvPnSEFZd5QRtWLyVxO5gwhuVcmGNPY","3":133,"4":200},"3":{"1":"The BakerMama","2":"https://thebakermama.com/recipes/triple-chocolate-mousse-cheesecake/","3":"Triple Chocolate Mousse Cheesecake","4":"Triple Chocolate Mousse Cheesecake","10":"SnmceCuTRPAycF"},"5":{"1":"nKaKgkQmJyQDnYx"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cheesecake","4":["20 Oreo cookies","4 tablespoons (1/2 stick) unsalted butter, melted","2 (8-ounce) packages cream cheese, at room temperature","⅔ cup sugar","⅔ cup sour cream"],"5":"Get your chocolate fix with this Triple Chocolate Mousse Cheesecake that  will wow the crowd for any ...","6":"1 hr 30 min","7":"One 9-inch Cheesecake (12 slices)"}}}},{"1":{"1":"https://www.ihearteating.com/wp-content/uploads/2016/06/chocolate-mousse-1000-wm.jpg","3":1000,"4":1545},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTkg6HRrZv_PdRsTXh7mQ1-sIu5sdTrsD47NOoaLPJh06-TJ1HMDA","3":129,"4":200},"3":{"1":"I Heart Eating","2":"https://www.ihearteating.com/chocolate-mousse-recipe/","3":"Chocolate Mousse","4":"Chocolate Mousse Recipe","10":"AmryhXhIwGlTTu"},"5":{"1":"bhcysqtAhQCxRBI"},"7":{"1":{"9":{"1":5.0,"2":3,"3":"Chocolate Mousse","4":["4 ounces bittersweet baking chocolate (60% cacao, chopped)","4 ounces semisweet baking chocolate (chopped)","1 1/2 cups mini marshmallows","1/2 cup milk","2 1/2 cups heavy cream"],"5":"Light and creamy chocolate mousse","6":"10 min","7":"10 servings"}}}},{"1":{"1":"https://media4.s-nbcnews.com/j/newscms/2018_17/1334122/chocolate-mousse-today-180423-tease_6844913865e80416b7725903c4c7cc1d.today-inline-large.jpg","3":700,"4":394},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRflwrv45xsumf5B5_bw0R9XQlW-zazCnn9Mhwf1BGUKN5yd0O5","3":200,"4":112},"3":{"1":"Today Show","2":"https://www.today.com/recipes/nigella-lawson-s-chocolate-olive-oil-mousse-recipe-t127449","3":"Nigella Lawson's Chocolate Olive Oil Mousse","4":"TODAY","10":"gghNMUXymYQvqp"},"5":{"1":"pAkxRTmVUHIwFVx"},"7":{"1":{"9":{"1":3.71875,"2":32,"3":"Nigella Lawson's Chocolate Olive Oil Mousse","4":["6 ounces bittersweet chocolate, preferably 70% cocoa solids, roughly chopped","7 tablespoons extra virgin olive oil","4 large eggs, at room temperature, separated","1 pinch, plus 1/4 teaspoon sea salt flakes","1/4 cup superfine sugar"],"5":"You don't need to turn on the oven to make this sweet, easy and deeply  chocolatey treat."}}}},{"1":{"1":"http://www.notenoughcinnamon.com/wp-content/uploads/2018/02/A-rich-and-silky-healthy-chocolate-mousse-made-with-a-22secret22-ingredient-%E2%80%93-avocado.-Super-easy-to-make-and-perfect-for-Valentines-Day-Vegan-refined-sugar-free-1.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFF0p8GA87czK48anmffnMfkYWuaSnmkBIQGV2JANtC-Xol7V2fw","3":133,"4":200},"3":{"1":"Not Enough Cinnamon","2":"https://www.notenoughcinnamon.com/healthy-avocado-chocolate-mousse/","3":"Healthy Avocado Chocolate Mousse","4":"A rich and silky healthy chocolate mousse made with a secret ingredient –  avocado. Super","10":"ytDhNkolXKLxrT"},"5":{"1":"VyGFADafQvGeeOG"},"7":{"1":{"9":{"1":5.0,"2":6,"3":"Healthy Avocado Chocolate Mousse","4":["4 oz - 120 g dark or semisweet chocolate, roughly chopped (you can also use  dark chocolate chips)","2 large ripe avocados (about 8 oz - 225 g each), halved and pitted.","3 tbsp unsweetened cocoa powder","1/4 cup almond milk (or your favorite milk)","1 tsp pure vanilla extract"],"5":"A rich and silky healthy chocolate mousse made with a \"secret\" ingredient –  avocado. Super easy to ...","6":"2 hr","7":"4"}}}},{"1":{"1":"https://www.browneyedbaker.com/wp-content/uploads/2013/04/chocolate-mousse-34-600.jpg","3":600,"4":889},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSaWSLB9Ts2EbM91_3zSx8pgPzf_x9OL6kFP5X_ca3Ugt5vcBAy5A","3":134,"4":200},"3":{"1":"Brown Eyed Baker","2":"https://www.browneyedbaker.com/chocolate-mousse-recipe/","3":"Dark Chocolate Mousse","4":"Dark Chocolate Mousse Recipe","10":"nmptWAfCYnJDno"},"5":{"1":"JAntLcGdsxJmiqL"},"7":{"1":{"9":{"3":"Dark Chocolate Mousse","4":["8 ounces bittersweet chocolate (60% cacao), finely chopped","5 tablespoons water","2 tablespoons Dutch-process cocoa powder","1 tablespoon brandy","1 teaspoon instant espresso powder"],"5":"A fabulous recipe for classic chocolate mousse.","6":"3 hr 30 min","7":"6 to 8 servings"}}}},{"1":{"1":"https://www.runningtothekitchen.com/wp-content/uploads/2016/02/Paleo-Chocolate-Mousse-1.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSfqPMOL-Lac3lKJI5YjgsS_DVLZOKqzQlKloR4VKClGPRjSqSu","3":133,"4":200},"3":{"1":"Running to the Kitchen","2":"https://www.runningtothekitchen.com/paleo-chocolate-mousse/","3":"Paleo Chocolate Mousse - Running to the Kitchen®","4":"This paleo chocolate mousse is decadent and creamy. It's topped with a  quick strawberry chia","10":"YeEQQIjcNBiSHI"},"5":{"1":"mAqvnPwpUuebaSd"}},{"1":{"1":"https://www.delscookingtwist.com/wp-content/uploads/2018/04/Dark-Chocolate-Mousse_1043b.jpg","3":1600,"4":2320},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRXp--t9ud0joIn-mnU8DeajJP8eCHiDEUpRhzho6wnM0vRXwyGHQ","3":137,"4":200},"3":{"1":"Del's cooking twist","2":"https://www.delscookingtwist.com/2018/04/17/dark-chocolate-mousse-the-one-and-only/","3":"Dark Chocolate Mousse (the one and only)","4":"Dark Chocolate Mousse","10":"CKhvAHDMsduJRj"},"5":{"1":"uEAVsXuOFtKbynA"},"7":{"1":{"9":{"3":"Dark Chocolate Mousse (the one and only)","4":["7 oz (200g) dark chocolate, at 60% cocoa","1 large Tablespoon (20g) salted butter","6 large eggs, whites and yolks apart","1 pinch of salt"],"5":"The one and only chocolate mousse I ever make. Just three ingredients, no  added sugar, and it's ...","6":"12 min","7":"4-6 servings"}}}},{"1":{"1":"https://hips.hearstapps.com/del.h-cdn.co/assets/18/10/1520286740-delish-strawberry-chocolate-mousse-cake-pinterest-still003.jpg?crop=0.999546485260771xw:1xh;center,top&resize=480:*","3":480,"4":719},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqbPMc0kFlmM1Jt1exaJlR4xyXlorUszqLCRMNswhO500O8fHIrg","3":133,"4":200},"3":{"1":"Delish.com","2":"https://www.delish.com/cooking/recipe-ideas/recipes/a58500/strawberry-chocolate-mousse-cake-recipe/","3":"Strawberry Chocolate Mousse Cake","4":"Strawberry Chocolate Mousse Cake","10":"KvrLMxhNhLTjNu"},"5":{"1":"ptRLDVduVvnFFlW"},"7":{"1":{"9":{"3":"Strawberry Chocolate Mousse Cake","4":["Cooking spray, for pan","24 Oreos, crushed","6 tbsp. butter, melted","Pinch kosher salt","2 tsp. gelatin"],"5":"Impress everyone with this Strawberry Chocolate Mousse Cake from Delish.com.","6":"6 hr 30 min","7":"8-10"}}}},{"1":{"1":"https://www.simplyrecipes.com/wp-content/uploads/2005/10/chocolate-mousse-horiz-a-1800.jpg","3":1800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQltJG3psfbGppJn0PErmPZohv2G8yav3UpThzPmjPpOzqBMuK0rQ","3":200,"4":133},"3":{"1":"Simply Recipes","2":"https://www.simplyrecipes.com/recipes/chocolate_mousse/","3":"Classic Chocolate Mousse","4":"Chocolate Mousse","10":"LNouTHKdMOycCp"},"5":{"1":"LRpylOyFmkAQMVv"},"7":{"1":{"9":{"1":5.0,"2":70,"3":"Classic Chocolate Mousse","4":["4 1/2 ounces bittersweet chocolate, finely chopped","2 Tbsp (1 ounce) unsalted butter, cubed","2 Tbsp espresso or very strong coffee (I used decaf espresso from a local  Starbucks)","1 cup cold heavy whipping cream","3 large eggs, separated*"],"5":"Chocolate mousse is a great dessert for entertaining because 1) it looks  pretty, 2) everyone gets ...","6":"8 hr 35 min","7":"Serves 5 to 8"}}}},{"1":{"1":"https://du7ybees82p4m.cloudfront.net/5954ce66d1cd02.64778504.jpg?width=910&height=512","3":910,"4":512},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWCfvpEyu6fgnZVdGPOOL70Tuxoa8xk7b9yN5LO_QElmJOMJYc7Q","3":200,"4":112},"3":{"1":"Sorted Food","2":"https://sortedfood.com/recipe/chocolatemoussecakerecipe","3":"Triple Chocolate Mousse Cake","4":"","10":"myAAryDxieDtBP"},"5":{"1":"LNJudVEEKMwjVIR"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cake","4":["100 ml water","1 tsp vanilla extract","70 g caster sugar","150 g unsalted butter","70 g soft brown sugar"],"5":"What's better than a chocolate mousse cake? A triple chocolate mousse cake!  Try this delicious ..."}}}},{"1":{"1":"https://www.barbarabakes.com/wp-content/uploads/2015/10/Chocolate-Mousse-Cups-Barbara-Bakes.jpg","3":640,"4":427},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPJ0YD0gdjbG_RI-4XBf_oYs2nor4rOr6Nl1nCf0W2d-Xh2GXtiw","3":200,"4":133},"3":{"1":"Barbara Bakes","2":"https://www.barbarabakes.com/chocolate-mousse-cups-and-ubud-bali/","3":"Chocolate Mousse Cups and Ubud","4":"A pretty, ruffled chocolate cup filled with a rich, creamy milk chocolate  mousse topped","10":"cgoLLugSFUfoRv"},"5":{"1":"TNTlYSgeuvompMV"},"7":{"1":{"9":{"3":"Chocolate Mousse Cups and Ubud","5":"A pretty, ruffled chocolate cup filled with a rich, creamy milk chocolate  mousse topped with a sweet ...","7":"8 servings"}}}},{"1":{"1":"https://i1.wp.com/cafedelites.com/wp-content/uploads/2018/01/Low-Carb-Double-Chocoloate-Mousse-Coconut-IMAGE-22.jpg?resize=980%2C1470&ssl=1","3":980,"4":1470},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4uZa1UWLSlYEd0JPPgBQP_h0SdFU65SzmdWufd1XpQrpqxz7zHQ","3":133,"4":200},"3":{"1":"Cafe Delites","2":"https://cafedelites.com/3-ingredient-double-chocolate-mousse-low-carb/","3":"3-Ingredient Double Chocolate Mousse (Low Carb) + VIDEO ...","4":"3-Ingredient Double Chocolate Mousse (Low Carb and Dairy Free) | http:","10":"iENUfhBLxcKFBT"},"5":{"1":"rvfaeHHmMinDFQn"}},{"1":{"1":"https://i1.wp.com/myvibrantkitchen.com/wp-content/uploads/2017/12/vegan-aquafaba-easy-fluffy-chocolate-mousse-1-1.jpg?resize=900%2C1350","3":900,"4":1350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTQM6xf7BEk6-koJKGbwy9NFbgwbAVWQ0dyn6dSy7ngOoaNh_XAvQ","3":133,"4":200},"3":{"1":"My Vibrant Kitchen","2":"http://myvibrantkitchen.com/easy-vegan-aquafaba-chocolate-mousse/","3":"Easy Vegan Aquafaba Chocolate Mousse","4":"Easy Vegan Aquafaba Chocolate Mousse","10":"GQjqdpLHCxFfan"},"5":{"1":"BYOHYQHTrMWrfGK"},"7":{"1":{"9":{"1":4.5,"2":2,"3":"Easy Vegan Aquafaba Chocolate Mousse","4":["70 ml soy milk or coconut milk","185 g dairy-free dark chocolate","240 ml chickpea water (aka aquafaba)","½ tsp lemon juice (optional)","1 Tbsp white caster sugar"],"5":"This post has been along time coming… I’ve lost count of all the times I’ve…","6":"25 min","7":"4-5"}}}},{"1":{"1":"https://cdn.cpnscdn.com/static.coupons.com/ext/kitchme/images/recipes/800x1200/no-bake-death-by-chocolate-mousse-pie_44591.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQog0BDyBHjvza7PY32qBbhNfsldmZoM4m6VBfWVmuuJV2jToJKHw","3":133,"4":200},"3":{"1":"KitchMe","2":"http://www.kitchme.com/recipes/no-bake-death-by-chocolate-mousse-pie","3":"No Bake Death by Chocolate Mousse Pie","4":"","10":"UmAfDvWwIqwEuv"},"5":{"1":"UHplnYftdTJtbmk"},"7":{"1":{"9":{"3":"No Bake Death by Chocolate Mousse Pie","4":["21 cream filled chocolate sandwich cookies, such as Oreo","1⁄4 cup butter, melted","1 cup heavy cream,","1 package (12 oz) semi-sweet chocolate chips,","1 tsp vanilla extract,"],"5":"Recipe including course(s): Dessert; and ingredients: butter, chocolate  sandwich cookies, heavy ...","6":"30 min","7":"Serves 8"}}}},{"1":{"1":"https://www.daringgourmet.com/wp-content/uploads/2017/12/White-Chocolate-Mousse-6-cropped.jpg","3":1024,"4":736},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSaOIXpH0XPJzc22BR6NEoEcb8IS8-akAT4nPmoODOgGpBtl5VTQ","3":200,"4":143},"3":{"1":"The Daring Gourmet","2":"https://www.daringgourmet.com/easy-white-chocolate-mousse/","3":"Easy White Chocolate Mousse","4":"... festive or special occasion, give this Easy White Chocolate Mousse a  try!","10":"xcyoPPhgKVJyHy"},"5":{"1":"xrhvLuXEKqVrkeM"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Easy White Chocolate Mousse","4":["2 cups heavy whipping cream","12 ounces white chocolate chips or bar broken into chunks","3 tablespoons powdered (confectioner's) sugar","Edible Glitter, optional ((for sprinkling))"],"5":"Easy, quick and classy, this deliciously rich and creamy White Chocolate  Mousse makes an elegant ...","7":"8 servings"}}}},{"1":{"1":"https://i1.wp.com/www.feastingonfruit.com/wp-content/uploads/2017/02/Chocolate-Mousse-Cake-8.jpg?resize=980%2C1470&ssl=1","3":980,"4":1470},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMf6veD5XuruR71A-tJ3ySKIB1Cs10emN7IB42qDYz_MDwaGNM","3":133,"4":200},"3":{"1":"Feasting on Fruit","2":"https://www.feastingonfruit.com/chocolate-mousse-cake/","3":"Chocolate Mousse Cake","4":"Low-Fat Chocolate Mousse CakeSkip to Recipe","10":"lmMUDWOwAnEMvJ"},"5":{"1":"SnlTUklXjjOGHkx"},"7":{"1":{"9":{"1":4.800000190734863,"2":12,"3":"Chocolate Mousse Cake","4":["2 cups almonds","2 tbsp maple syrup","1 tbsp water (if needed)","1 cup baked and mashed sweet potato","1 cup Medjool dates"],"5":"This insanely decadent Chocolate Mousse Cake may taste like fudge frosting  but is made from just a ...","6":"1 hr 5 min","7":"6 \" round cake"}}}},{"1":{"1":"https://static01.nyt.com/images/2015/10/26/dining/26COOKING-FLOURLESSCHOCCAKE1/26COOKING-FLOURLESSCHOCCAKE1-articleLarge.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQjBhgcxDj21rYQRKLe9Gg5evkd5jQOixJMy-VwlyHSj8KGa_KI","3":200,"4":133},"3":{"1":"NYT Cooking - The New York Times","2":"https://cooking.nytimes.com/recipes/11001-intense-chocolate-mousse-cake","3":"Intense Chocolate Mousse Cake","4":"Intense Chocolate Mousse Cake","10":"EbcrrHfipRSWqR"},"5":{"1":"fBQbuMkMKyLnDGP"},"7":{"1":{"9":{"1":5.0,"2":813,"3":"Intense Chocolate Mousse Cake","4":["10 ounces bittersweet chocolate","9 tablespoons unsalted butter","6 large eggs, room temperature and separated","Pinch of salt","¾ cup sugar"],"5":"There is very little that needs to be said about a chocolate mousse cake.  This one lives up to its ...","6":"1 hr 5 min","7":"One 9-inch cake"}}}},{"1":{"1":"https://www.tasteofhome.com/wp-content/uploads/2018/01/Triple-Chocolate-Mousse-Torte_EXPS_SDAM18_212092_C11_29_2b-696x696.jpg","3":696,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcShzAmAXBRyn_Ha_oUg9dAvQ2mLbk6wdDAaOXA1AYdu8m_f3CeM","3":200,"4":200},"3":{"1":"Taste of Home","2":"https://www.tasteofhome.com/recipes/triple-chocolate-mousse-torte/","3":"Triple Chocolate Mousse Torte","4":"Triple Chocolate Mousse Torte","10":"lpqFjVlbVwUsmQ"},"5":{"1":"FXeXclSsYAkJYGJ"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Torte","4":["18 Oreo cookies","1/3 cup butter, melted","6 teaspoons unflavored gelatin, divided","3 tablespoons cold water, divided","5 ounces bittersweet chocolate, chopped"],"5":"When it's too hot to bake something sweet, but you're craving chocolate, my  triple chocolate mousse ...","6":"1 hr 55 min","7":"16 servings."}}}},{"1":{"1":"https://thelemonbowl.com/wp-content/uploads/2017/02/Vegan-Chocolate-Mousse-a-healthy-dessert-recipe.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFzpfvIEbn_mhVOAm9OjBWPF_H9NTJ1-vKJdUO3My1ZFFGbLhmAQ","3":133,"4":200},"3":{"1":"The Lemon Bowl","2":"https://thelemonbowl.com/vegan-chocolate-mousse/","3":"Vegan Chocolate Mousse","4":"Vegan Chocolate Mousse","10":"nexwCurfkLKRIu"},"5":{"1":"jlqYrUVtWGuHNgT"},"7":{"1":{"9":{"1":4.0,"2":3,"3":"Vegan Chocolate Mousse","4":["4 ounces bittersweet chocolate chips (60-70%) (or vegan chocolate chips)","3 ripe avocados (pitted)","1/2 cup full-fat coconut milk (or milk of choice)","1/4 cup cocoa powder","1 teaspoon vanilla"],"5":"This rich and creamy vegan chocolate mousse recipe is made with avocado and  topped with whipped ...","6":"10 min","7":"4"}}}},{"1":{"1":"https://4ebr313dmbeg4df5hm1uys8p-wpengine.netdna-ssl.com/wp-content/uploads/2014/03/chocolatemousse.jpg","3":570,"4":858},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvzjlCDnc5wQiWcReLod0HYyWIHmZptf0xUR9G_d_kTHgBG59U","3":132,"4":200},"3":{"1":"Cookies & Cups","2":"https://cookiesandcups.com/easy-chocolate-mousse/","3":"Easy Chocolate Mousse","4":"Easy Chocolate Mousse in a jar","10":"phRcSUkOtBoamm"},"5":{"1":"YgYntDuGWruYycG"},"7":{"1":{"9":{"1":4.599999904632568,"2":19,"3":"Easy Chocolate Mousse","4":["2 eggs","1/4 cups granulated sugar","2 1/2 cups cold heavy whipping cream, divided","6 oz semi-sweet chocolate (about 1 cup semi-sweet chips)"],"5":"makes 8 servings","7":"serves 8"}}}},{"1":{"1":"https://www.chatelaine.com/wp-content/uploads/2017/12/chocolate-mousse-1.jpg","3":800,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRN_vKJ6e5dD_T6QWbgKK9WcVGjmc90HcH-AQ5S4C_JGR9BRcTc","3":200,"4":200},"3":{"1":"Chatelaine","2":"https://www.chatelaine.com/recipe/desserts/chocolate-mousse-with-whipped-cream/","3":"Chocolate mousse with whipped cream","4":"IngredientsInstructionsNutrition","10":"nBaqtfTuCRvgTP"},"5":{"1":"auraBvchaAqAolJ"},"7":{"1":{"9":{"3":"Chocolate mousse with whipped cream","4":["100 g bittersweet chocolate, chopped (2/3 cup)","60 g semi-sweet chocolate, chopped (1/3 cup)","3 tbsp unsalted butter, cubed","1 tsp vanilla","1/4 tsp salt"],"6":"15 min","7":"8"}}}},{"1":{"1":"https://www.lifeloveandsugar.com/wp-content/uploads/2017/10/Baileys-Chocolate-Mousse-Brownie-Cake4.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTosET9j-NPzteHftDDcr0sVQhS_bgH3tdUh1YK5UFwrV5OyGKT","3":133,"4":200},"3":{"1":"Life Love and Sugar","2":"https://www.lifeloveandsugar.com/2017/10/16/baileys-chocolate-mousse-brownie-cake/","3":"Baileys Chocolate Mousse Brownie Cake","4":"Baileys Chocolate Mousse Brownie Cake - a dense chocolate brownie topped  with Baileys chocolate ...","10":"MSYtxTYyAERGjI"},"5":{"1":"QdMTifpDBByVkpn"},"7":{"1":{"9":{"3":"Baileys Chocolate Mousse Brownie Cake","4":["1 1/2 cups (336g) unsalted butter, melted","2 cups (414g) sugar","2 tsp vanilla extract","6 tbsp Baileys Irish Cream","4 eggs"],"5":"This Baileys Chocolate Mousse Brownie Cake is our chocolate and Baileys  cake dreams come true! With ...","7":"12-15 Slices"}}}},{"1":{"1":"https://cookinglsl.com/wp-content/uploads/2017/02/baileys-mousse-1-1-660x925.jpg","3":660,"4":925},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeV4NgUDvRBtYdRb_9EA5KjR95bQ2qg4osoxeDWhCBFMG-75h8","3":142,"4":200},"3":{"1":"Cooking LSL","2":"https://cookinglsl.com/easy-baileys-chocolate-mousse-recipe/","3":"Easy Baileys Chocolate Mousse Recipe","4":"Easy Baileys Chocolate Mousse Recipe","10":"epIkUtAcFpsbue"},"5":{"1":"iYUCCKccmaXMhHE"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy Baileys Chocolate Mousse Recipe","4":["3/4 cup Baileys (, divided)","2 cups heavy whipping cream (, divided)","200 grams / 1 1/4 cup semi-sweet chocolate ((or chocolate chips))","1 tbsp gelatin","1/4 cup cold water"],"5":"... - a boozy dessert for chocolate lovers. Made with Baileys Irish Cream.  Just in time for St ...","6":"25 min","7":"6"}}}},{"1":{"1":"https://beyondfrosting.com/wp-content/uploads/2017/03/Oreo-Chocolate-Mousse-Pie-029.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2IfvrAtLKO1wTECgB7eLcodLShil4OxELsIF0b8nW-KNji7AX","3":133,"4":200},"3":{"1":"Beyond Frosting","2":"https://beyondfrosting.com/2017/03/13/no-bake-oreo-chocolate-mousse-pie/","3":"No-Bake Oreo Chocolate Mousse Pie","4":"It's all about the layers with this No-Bake Oreo Chocolate Mousse Pie. The","10":"hDIMNfEVVEdIwl"},"5":{"1":"yKnwKkQbGCKVlfB"},"7":{"1":{"9":{"3":"No-Bake Oreo Chocolate Mousse Pie","4":["For the crust","2 pkgs Oreo Cookies (14.03 oz), divided","8 tablespoons unsalted butter","For the chocolate layer","1 tablespoons cold water"],"5":"It’s all about the layers with this No-Bake Oreo Chocolate Mousse Pie. The  thick Oreo crust is ...","6":"4 hr 30 min"}}}},{"1":{"1":"https://www.bbcgoodfood.com/sites/default/files/styles/recipe/public/recipe/recipe-image/2017/12/chocolate-mousse.jpg?itok=v4PsEZ95","3":500,"4":454},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjqfdHQs0pRv0EAdRPIXtKXZSVydYrTaoC7sjoOlZxcrClTA60Ng","3":200,"4":181},"3":{"1":"BBC Good Food","2":"https://www.bbcgoodfood.com/recipes/easy-chocolate-mousse-","3":"Easy chocolate mousse","4":"Easy chocolate mousse","10":"tAvSFgdIXcWSdD"},"5":{"1":"RFFfGOUBWehRIwM"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy chocolate mousse","4":["150g 70% dark chocolate, plus extra to serve","6 egg whites","2 tbsp golden caster sugar","4 tbsp crème fraîcheand grated chocolate, to serve"],"5":"Make this classic chocolate dessert in minutes with just a few ingredients  – light yet delicious. ...","6":"7 min","7":"Serves 4"}}}},{"1":{"1":"https://static01.nyt.com/images/2018/05/08/dining/08COOKING-NOBAKEMOUSSE1/08COOKING-NOBAKEMOUSSE1-articleLarge-v2.jpg","3":600,"4":414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3_8y3xenuC37UJsbcl7eFzp4oNhvBM7n6pWeNH3FXCkmoKLVo","3":200,"4":137},"3":{"1":"NYT Cooking - The New York Times","2":"https://cooking.nytimes.com/recipes/1019316-no-bake-chocolate-mousse-bars","3":"No-Bake Chocolate Mousse Bars","4":"No-Bake Chocolate Mousse Bars","10":"jMfULOMAKMKyvc"},"5":{"1":"APAWdyGGVoPVGdK"},"7":{"1":{"9":{"1":4.0,"2":660,"3":"No-Bake Chocolate Mousse Bars","4":["18 whole graham crackers (about 9 1/2 ounces/269 grams)","8 tablespoons/113 grams unsalted butter (1 stick), melted","2 tablespoons granulated sugar","¼ teaspoon kosher salt","1 pound/454 grams semisweet chocolate, finely chopped"],"5":"Ethereal and ready to melt in your mouth, chocolate mousse bars are easy to  make and even easier to ...","6":"30 min","7":"24 servings"}}}},{"1":{"1":"https://www.simplystacie.net/wp-content/uploads/2015/09/Chocoholics-Chocolate-Mousse-Cake-wide.jpg","3":736,"4":552},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTc8X8ax7pAeyj8cUviUNQ0tGs1EHoM4ssApf6FCvCGZBb1VqdF","3":200,"4":149},"3":{"1":"Simply Stacie","2":"https://www.simplystacie.net/2015/11/chocoholics-chocolate-mousse-cake/","3":"Chocoholics Chocolate Mousse Cake","4":"Chocoholics Chocolate Mousse Cake - Luscious and rich, this dessert recipe  will satisfy your sweet","10":"qXNFdcwHLgSQcR"},"5":{"1":"PmBvFwnmYUMsLKV"},"7":{"1":{"9":{"3":"Chocoholics Chocolate Mousse Cake","5":"Luscious and rich, this Chocoholics Chocolate Mousse Cake will satisfy your  sweet tooth!","6":"45 min","7":"6"}}}},{"1":{"1":"https://food-images.files.bbci.co.uk/food/recipes/celebration_chocolate_26103_16x9.jpg","3":5760,"4":3240},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQEOqt14rbAy7SyDf5C8iZrqZu6nI8rYgUvQyI68tsGKb4nionf0Q","3":200,"4":112},"3":{"1":"BBC.com","2":"https://www.bbc.com/food/recipes/celebration_chocolate_26103","3":"Celebration chocolate mousse cake","4":"","10":"CWatRJQqmSvgYE"},"5":{"1":"kHcSSinPLWLfHpR"},"7":{"1":{"9":{"3":"Celebration chocolate mousse cake","4":["25g/1oz cocoa powder, plus extra for dusting","3 tbsp boiling water","100g/3½oz caster sugar","100g/3½oz self-raising flour","1 level tsp baking powder"],"5":"Mary Berry's rich, indulgent dessert is fit for a celebration and makes a  stunning centrepiece., ...","6":"12 hr 30 min","7":"Serves 8-10"}}}},{"1":{"1":"https://www.afarmgirlsdabbles.com/wp-content/uploads/2015/07/Dark-Chocolate-Mousse-Cups_AFarmgirlsDabbles_AFD-600x900.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRgdqtv_Cj2AhDxF7cB2gOi1aEGwJWkFPraLwVhF0scdQbBZ32T","3":133,"4":200},"3":{"1":"A Farmgirl's Dabbles","2":"https://www.afarmgirlsdabbles.com/chocolate-mousse-cups-recipe/","3":"Chocolate Mousse Cups","4":"Chocolate Mousse Cups","10":"iEjeNoadQdnDKP"},"5":{"1":"MIMiGtNACwSGsPC"},"7":{"1":{"9":{"3":"Chocolate Mousse Cups","4":["1/2 c. cold heavy cream","1 tsp. pure vanilla extract","4 large egg yolks","1 T. butter, at room temperature","1/4 c. espresso or strong coffee, at room temperature"],"5":"With this recipe, anyone and everyone is able to make delicious,  savor-every-spoonful Chocolate ...","7":"6 servings"}}}},{"1":{"1":"https://www.spendwithpennies.com/wp-content/uploads/2013/01/Easy-Chocolate-Mousse-spendwithpennies-23.jpg","3":700,"4":1050},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR_CLPJ2xigxExPYAcr08k9EOf5vx_tpNB30RyhhqihMIHV_iQ5","3":133,"4":200},"3":{"1":"Spend with Pennies","2":"https://www.spendwithpennies.com/chocolate-mousse-in-1-minute/","3":"Easy Chocolate Mousse","4":"dessert cups filled with chocolate mousse, whipped cream and a raspberry on  top","10":"QTcuoXeToOLeBp"},"5":{"1":"sQhduDgpkeIFqJR"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy Chocolate Mousse","4":["1 box instant chocolate pudding mix (4 serving size)","2 tablespoons unsweetened cocoa powder","2 1/2 cups heavy cream (30-35% mf)","1 cup whipped topping (optional)"],"5":"A rich creamy chocolate dessert that takes just a couple of minutes to  prepare!","6":"2 min","7":"4 servings"}}}},{"1":{"1":"https://www.kunersfoods.com/wp-content/uploads/2017/10/ChocMousse2_720x478_72_RGB-515x342.jpg","3":515,"4":342},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-y8NR-2I7fwSVMC0mQyM7dCTTK0H0JaxXTY_SXXneDd8AticffA","3":200,"4":132},"3":{"1":"Kuner's Foods","2":"https://www.kunersfoods.com/recipe/black-bean-chocolate-mousse/","3":"Black Bean Chocolate Mousse","4":"Black Bean Chocolate Mousse Servings: 5 (about 4oz each) Prep Time: 10  minutes Total Time: 1 hour 10 ...","10":"uKGicOGawSIaHx"},"5":{"1":"RQrBYmSDpOiEOnh"},"7":{"1":{"9":{"1":4.199999809265137,"2":5,"3":"Black Bean Chocolate Mousse","7":"5 (about 4oz each)"}}}},{"1":{"1":"https://www.halfbakedharvest.com/wp-content/uploads/2017/01/Chocolate-Lovers-Greek-Yogurt-Chocolate-Mousse-Cake-4.jpg","3":1200,"4":1800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTVc47mXlT63i5lHx1nQ_OBA9aRTF7ITemEejQPK215gMzdI_xB","3":133,"4":200},"3":{"1":"Half Baked Harvest","2":"https://www.halfbakedharvest.com/chocolate-lovers-greek-yogurt-chocolate-mousse-cake/","3":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake.","4":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake | halfbakedharvest.com  @hbharvest","10":"iWycSGhrbDsnet"},"5":{"1":"oGRyjdfvlWJPpKW"},"7":{"1":{"9":{"1":3.7799999713897705,"2":18,"3":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake.","4":["1 cup raw walnuts","1/2 cup raw (unsweetened coconut flakes)","1 1/2 cups pitted (packed dates (about 10 ounces))","1/2 cup cacao powder or unsweetened cocoa powder","pinch of flaky sea salt"],"5":"Chocolate lovers...this one is for you.","6":"1 hr 43 min","7":"8 Servings"}}}},{"1":{"1":"https://images.food52.com/YFlDbJw8F8GFolGJepl1XXj5Un8=/753x502/eb5300fa-1862-4ec7-8e73-5da38c2a1638--IMG_8848_web.jpg","3":753,"4":502},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTMzy0H1PjQ7_6fYzOUPcVKIzwW4yc0ET3SzcF1pYH_0jZu7TaBmg","3":200,"4":133},"3":{"1":"Food52","2":"https://food52.com/recipes/73238-eggless-chocolate-mousse-cake","3":"Eggless chocolate mousse cake","4":"Eggless chocolate mousse cake","10":"OuRVdvQyJNFjIu"},"5":{"1":"FyvDAuHOSkXHVxg"},"7":{"1":{"9":{"3":"Eggless chocolate mousse cake","4":["CHOCOLATE CAKE","1 cup granulated sugar","3/4 cup all purpose flour","2 tablespoons all purpose flour","1/4 cup unsweetened cocoa powder"],"7":"Makes 6 mini cakes"}}}},{"1":{"1":"https://hungryhappenings.com/wp-content/uploads/2018/01/chocolate-mousse-cup-hearts-recipe-1.jpg","3":680,"4":680},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQjD9OHvXLwUnN6Za9mGKLPTU8D0vUPIlNv5JcaU1XNIcw8ovRDw","3":200,"4":200},"3":{"1":"Hungry Happenings","2":"https://hungryhappenings.com/chocolate-mousse-cup-hearts/","3":"Chocolate Mousse Cup Hearts","4":"Chocolate Mousse Cup Hearts","10":"CTTGmjORhBeLnB"},"5":{"1":"CnaIBrYDIVYnYBP"},"7":{"1":{"9":{"3":"Chocolate Mousse Cup Hearts","4":["24 ounces melted and tempered pure dark chocolate or melted confectionery  coating/candy melts","3 tablespoons water","3 tablespoons sugar","3 large egg yolks","1/2 cup heavy whipping cream"],"5":"Chocolate heart shaped bowls filled with luxuriously smooth chocolate  mousse.","6":"35 min","7":"12"}}}},{"1":{"1":"https://flockler.com/thumbs/sites/192/jo_easy5_hero_cherries_chocolate_mousse_538_landscape_s600x600_c3467x2025_l0x190.jpg","3":600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQA3S7YmPon_WNoASN_w3uVMr10QQjo_TAcYldF-5941POWlNXFag","3":200,"4":200},"3":{"1":"The Happy Foodie","2":"https://thehappyfoodie.co.uk/recipes/cherry-chocolate-mousse","3":"Cherry Chocolate Mousse","4":"Cherry Chocolate Mousse","10":"jXYXPYAtvXUoDt"},"5":{"1":"GHiNCjnUlImEjQr"},"7":{"1":{"9":{"3":"Cherry Chocolate Mousse","4":["200g dark chocolate (70%)","1 x 400g tin of black pitted cherries in syrup","200ml double cream","4 large eggs","2 tbsp golden caster sugar"],"5":"Jamie Oliver's recipe for Cherry Chocolate Mousse, from the book of his  Channel 4 series, Jamie's ...","6":"30 min"}}}},{"1":{"1":"https://www.cookingclassy.com/wp-content/uploads/2015/06/easy-chocolate-mousse9-srgb..jpg","3":575,"4":857},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaxSGuYQTWN0IdkLiCm5bbCgB8yC-YSJBOgwmYrCWUl3lGV6II-A","3":134,"4":200},"3":{"1":"Cooking Classy","2":"https://www.cookingclassy.com/easy-chocolate-mousse/","3":"Easy Chocolate Mousse","4":"... Easy Chocolate Mousse | Cooking Classy ...","10":"cRfmXtkoQaNPij"},"5":{"1":"HKuHLnhAgfeTxUT"},"7":{"1":{"9":{"3":"Easy Chocolate Mousse","4":["3 1/2 cups mini marshmallows","1/4 cup salted butter (, diced into 1 tbsp pieces)","9 oz good quality semi-sweet chocolate (, chopped into small pieces)","1/4 cup hot water","1 cup heavy cream"],"5":"Yield: 6 servings","6":"50 min"}}}},{"1":{"1":"https://omgchocolatedesserts.com/wp-content/uploads/2017/07/Triple-Chocolate-Mouse-Cake-Minis-1.jpg","3":800,"4":1138},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT6kthHuIBjSaP2JLUjxI1Z1vlnK2P0g1RBkwwfY7DQetSR_YAE","3":140,"4":200},"3":{"1":"OMG Chocolate Desserts","2":"https://omgchocolatedesserts.com/triple-chocolate-mousse-cake-minis/","3":"Triple Chocolate Mousse Cake Minis","4":"Triple Chocolate Mousse Cake Minis are rich and decadent layered dessert  with brownie bottom, dark, ...","10":"OHvXlsLUnBRFyW"},"5":{"1":"gupsGQNOgSdbvFu"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cake Minis","4":["1/2 cup unsalted butter","7 oz. quality semi-sweet chocolate-chopped","¾ cup granulated sugar","2 large eggs","1 teaspoon vanilla"],"5":"Chocolate lovers dream come true!!!Triple Chocolate Mousse Cake Minis are  rich and decadent layered ..."}}}},{"1":{"1":"https://truffle-assets.imgix.net/pxqrocxwsjcc_1ExNApZWGsM6EgqwoySYou_eggless-chocolate-mousse_landscapeThumbnail_en.jpeg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS5peaglYDX3baXp9UgU9SLARAbGBl_qHWcj1Ez_In2WrZ7l16erw","3":200,"4":112},"3":{"1":"Tastemade","2":"https://www.tastemade.com/videos/eggless-chocolate-mousse","3":"Eggless Chocolate Mousse","4":"","10":"aHQpAUdxysLqDE"},"5":{"1":"SFepbKWHigjGXwP"},"7":{"1":{"9":{"3":"Eggless Chocolate Mousse","4":["3 ounces dark chocolate (over 65 percent cacao content)","7 fluid ounces heavy cream, very cold","For plating:","Little Mason jars","One can coconut milk, frozen so cream separates to the top, for garnish"],"5":"Satisfy your chocolate addiction with this ridiculously easy mousse."}}}},{"1":{"1":"https://homecookingadventure.com/images/recipes/triple_chocolate_mousse_cake_main.jpg","3":635,"4":423},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8sE2etmZ0WERxbuYUZmisFmy_QG5iPuDSSDL8HrzYWaJ549Jb","3":200,"4":133},"3":{"1":"Home Cooking Adventure","2":"https://www.homecookingadventure.com/recipes/no-bake-triple-chocolate-mousse-cake","3":"No-Bake Triple Chocolate Mousse Cake","4":"No-Bake Triple Chocolate Mousse Cake","10":"KbEUPKybruvwgj"},"5":{"1":"OvBJSbpjEucCXqd"},"7":{"1":{"9":{"3":"No-Bake Triple Chocolate Mousse Cake","4":["7 oz (200g) oreo cookies","4 tbsp (60g) butter, melted","5 oz (150g) semi-sweet chocolate","1/2 cup (120g) whipping cream","2/3 cup (160g) whipping cream (35% fat), chilled"]}}}},{"1":{"1":"https://cdn.apartmenttherapy.info/image/fetch/f_auto,q_45,w_600,h_750,c_fit,fl_strip_profile/https://s3.amazonaws.com/pixtruder/original_images/4292f1cd22e7a55c5c4b34e83dc164d78c62503d","3":500,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiy5TAVbUDNxzQZqFJcdSN3ni5mMS4PCN1Cm6UtXACsvKGtfaROA","3":133,"4":200},"3":{"1":"The Kitchn","2":"https://www.thekitchn.com/chrissy-teigen-chocolate-mousse-recipe-review-261645","3":"Chrissy Teigen's Three-Ingredient Chocolate Mousse with Salty Rice  Krispies–Hazelnut Crackle","4":"","10":"xTcuUtyOnbIiVX"},"5":{"1":"WgjVRQiSQDUBoJq"},"7":{"1":{"9":{"1":4.5,"2":17,"3":"Chrissy Teigen's Three-Ingredient Chocolate Mousse with Salty Rice  Krispies–Hazelnut Crackle","4":["1 cup good-quality chocolate chips or coarsely chopped chocolate (6 ounces)","1/3 cup whole milk","3/4 cup cold heavy cream","Oil, for the pan","2/3 cup granulated sugar"],"5":"You'll want to make this every night.","6":"15 min","7":"Serves 4"}}}},{"1":{"1":"https://www.tasteofhome.com/wp-content/uploads/2018/01/Orange-Chocolate-Mousse-Mirror-Cake_EXPS_THCOM17_210212_D09_12_2b-1-696x696.jpg","3":696,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR6CYbfzoObEcoBYObETRy19c6O_FuZlIfT-eNs_vD8s-OqymCC7w","3":200,"4":200},"3":{"1":"Taste of Home","2":"https://www.tasteofhome.com/recipes/orange-chocolate-mousse-mirror-cake/","3":"Orange Chocolate Mousse Mirror Cake","4":"Orange Chocolate Mousse Mirror Cake","10":"bccutWebwVRlAR"},"5":{"1":"jHtuHqOpytcagyC"},"7":{"1":{"9":{"1":4.0,"2":1,"3":"Orange Chocolate Mousse Mirror Cake","4":["2 cups crushed Oreo cookies (about 20 cookies)","1 teaspoon grated orange zest","1/4 cup butter, melted","FILLING:","1 envelope unflavored gelatin"],"5":"A shiny, mirror-like orange glaze covers a chocolate mousse cake to create  a delicious show-stopping ...","6":"45 min","7":"16 servings."}}}},{"1":{"1":"https://thethingswellmake.com/wp-content/uploads/2013/07/15-two-ingredient-easy-chocolate-mousse-recipe-4.jpg","3":720,"4":1079},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTixzsisXR_ct7wced_BTTByvghActd5JzbabwBT6WETpC3wIrF","3":133,"4":200},"3":{"1":"Oh, The Things We'll Make!","2":"https://thethingswellmake.com/how-to-make-chocolate-mousse-two-types/","3":"Two Ingredient, Easy Chocolate Mousse Recipe","4":"This two ingredient, easy chocolate mousse can be whipped up in a matter of  minutes","10":"FdBXMwoEnGACQJ"},"5":{"1":"flsvDnvpdIFUYxE"},"7":{"1":{"9":{"1":3.75,"2":8,"3":"Two Ingredient, Easy Chocolate Mousse Recipe","4":["4 eggs","100 g chocolate"],"5":"This two ingredient, easy chocolate mousse can be whipped up in a matter of  minutes, and it's rich, ...","6":"25 min","7":"8 small servings"}}}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/radioactive-uranium-ore-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlVDrWUi1LscguCB1Yj3yyVI_a1njoRRYb3IJ1DV7gP5cvS68Uow","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/radioactive-uranium-ore/","3":"Radioactive Uranium Ore","4":"","10":"tgCkyEelnhAMUx"},"5":{"1":"CGYCQOxeAVvJDdU"}},{"1":{"1":"https://i.ytimg.com/vi/3_7645Ep4Dg/maxresdefault.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQA9FM_kk9sVeBrK649YPlhvBwnK-Tn5IHXrzJi_pUYsRQBqPpWpQ","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=3_7645Ep4Dg","3":"Radioactive Uranium ore, Rum jungle Northern Territory ...","4":"Radioactive Uranium ore, Rum jungle Northern Territory, Australia","10":"FuqIblHgNhtGnh"},"5":{"1":"hUMaBUtsTrmInKc"},"7":{"1":{"11":{"1":"Radioactive Uranium ore, Rum jungle Northern Territory, Australia","2":"Uranium ore specimen from Rum jungle country, Northern Territory. Tested  with a 3007a Dosimeter and Labgear fast Dekatron counter.","3":"2:42","4":"1374","5":"1420416000000","6":"rustymotor","7":"14","8":"7"}}}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/fluorescent-uranium-ore-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKbqgNyMbbiki1a-c1dPOKvdBhH_M1GlbLZHjSAZcQKSgm3ALT","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/fluorescent-uranium-ore/","3":"Fluorescent Uranium Ore","4":"","10":"vDobLHxiyuxUJm"},"5":{"1":"ilUYbeQvEMSaiGq"}},{"1":{"1":"http://www.ansnuclearcafe.org/wp-content/uploads/2012/05/uranium-ore.png","3":374,"4":226},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRmU9YwfbSb3HA5fb6wEDVwLL4g7tFlg4kXkoSVmItr16PIDn45","3":200,"4":120},"3":{"1":"ANS Nuclear Cafe","2":"http://ansnuclearcafe.org/2012/05/19/105th-carnival-of-nuclear-energy-bloggers/uranium-ore-2/","3":"uranium ore | ANS Nuclear Cafe","4":"Uranium ore","10":"ucBMicCUggRoEY"},"5":{"1":"BdFrkpRGSIkHXya"}},{"1":{"1":"http://uraha.de/de/wp-content/uploads/2016/02/Uran_1_1_uraniumcircit.jpg","3":484,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYXbv-9XOvU7Be3K5-4KcMJbb_jWX88YgECOeR6kgbY1XUo1AlWA","3":200,"4":144},"3":{"1":"URAHA Foundation Germany eV","2":"http://uraha.de/de/?p=409&lang=en","3":"Uranium ore deposits – URAHA Foundation Germany e.V.","4":"Uraniumcircit (Photo: Lang)","10":"BSJPqVSgvBEbrQ"},"5":{"1":"MVxLPqbHMubLNSr"}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/uranium-ore1-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR1sJSAdreV-tpcQGvCDqxuJTzh9XYNRbqXtQsIyC-l4aBfyKHC","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/fluorescent-uranium-ore/","3":"Fluorescent Uranium Ore","4":"","10":"dqJIUarueXyCWj"},"5":{"1":"WVggkadJTcMCXgn"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Torbernite_-_Cuneo%2C_Italia_01.jpg/220px-Torbernite_-_Cuneo%2C_Italia_01.jpg","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTgxEh0wD7ohE1CVBSCVwbHqFrCuGXpZYfaVNWaS_C6su6PoxEFA","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Torbernite, an important secondary uranium mineral","10":"iWOIIHWFYNlcfq"},"5":{"1":"vYhTmBdaSUrGAkL"}},{"1":{"1":"http://unitednuclear.com/images/oregenerica.jpg","3":500,"4":424},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfr9T5f37v30ppVmlZD8YQozfb5WBC1GA5gHlrCkNxi24GgBlA","3":200,"4":169},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=460","3":"Generic Uranium Ore, range 'A ' 1,000 to 3,000 CPM : United ...","4":"Generic Uranium Ore, range 'A ' 1,000 to 3,000 CPM","10":"AqIrNMrWQlnvWt"},"5":{"1":"VqdNlIqLFBgvaJP"}},{"1":{"1":"https://cna.ca/wp-content/uploads/2014/06/Uranium-ore-2.jpg","3":1444,"4":916},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSoGKwXryzTIu5CLl-0KJgiJ-mJRBPTKNOJ_C6h12QuDPrATgOjQ","3":200,"4":126},"3":{"1":"Canadian Nuclear Association","2":"https://cna.ca/technology/energy/uranium-mining/","3":"Uranium mining - Canadian Nuclear Association","4":"Uranium ore","10":"IxNjLhyxSUqpUD"},"5":{"1":"mGuODpmVFesTMfq"}},{"1":{"1":"https://i.pinimg.com/originals/da/e7/31/dae731639771cc01af9baf342af42e5b.jpg","3":400,"4":315},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJXZB6Uoa72FIyOu687kMmo8CBlk32eFN1ywlmN03VJrTrqtl10Q","3":200,"4":157},"3":{"1":"Pinterest","2":"https://www.pinterest.com/pin/397935317044389548/","3":"Uranium ore! | christmas list | Pinterest | Mushroom fungi","4":"Uranium ore!","10":"YClYGRtfYuKJak"},"5":{"1":"dSyPSaEeHVWDqfI"}},{"1":{"1":"http://www.sott.net/image/s13/269853/full/Uraniumore.jpg","3":640,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSGNSiJrU5IjB9SD-lavkngAd7vYEVpFm7umnqTqQPkObwJ-2C0","3":200,"4":127},"3":{"1":"Sott","2":"https://www.sott.net/article/302699-Truck-carrying-uranium-ore-catches-fire-near-Illinois-nuclear-plant","3":"Truck carrying uranium ore catches fire near Illinois nuclear ...","4":"uranium ore","10":"WlVtKUAhLJNfhk"},"5":{"1":"QOEQBiRDmPrVWBF"}},{"1":{"1":"http://unitednuclear.com/images/oregenericc.jpg","3":500,"4":374},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQreIUjsDelu90Hrb-2tdtoxvNQoBd3xdADZ1b_ybbmFX547dTX","3":200,"4":149},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=462","3":"Generic Uranium Ore, range 'C' 5,500 to 7,000 CPM : United ...","4":"Generic Uranium Ore, range 'C' 5,500 to 7,000 CPM","10":"njnvvBUVetEuQS"},"5":{"1":"bDBBAxsHfTAYina"}},{"1":{"1":"https://www.sciencelearn.org.nz/system/images/images/000/001/928/full/A-lump-of-uranium-ore20160913-2996-18tz440.jpg?1522304554","3":350,"4":233},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQxCEaTAsqIuSl67rkGv4MI8Ju45c73JGkOHJbQXTt-3AncL-JrVg","3":200,"4":133},"3":{"1":"Science Learning Hub","2":"https://www.sciencelearn.org.nz/images/1928-a-lump-of-uranium-ore","3":"A lump of uranium ore — Science Learning Hub","4":"A lump of uranium ore","10":"EiNQYOwJthGmeV"},"5":{"1":"bELJSUXdwPDGErp"}},{"1":{"1":"https://www.atomicheritage.org/sites/default/files/Shinkolobwe%20Uranophane.jpg","3":600,"4":542},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnRaRstptBcxVfjvPstHfsAlobXzGAgOWHmKRy85UYnRw7h1CDzw","3":200,"4":180},"3":{"1":"Atomic Heritage Foundation","2":"http://www.atomicheritage.org/history/combined-development-trust","3":"Combined Development Trust | Atomic Heritage Foundation","4":"... was an effort spearheaded by General Leslie Groves to control the world  market of uranium ore.","10":"GXposUWyOYUjOA"},"5":{"1":"MLrJwcEqglWkjHP"}},{"1":{"1":"https://www.researchgate.net/profile/Harald_Dill/publication/225633139/figure/fig1/AS:302565414719493@1449148624739/Yellow-uranium-ore-minerals-a-Aggregates-of-slender-prisms-of-brown-b-uranophane.png","3":733,"4":547},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSEKjfsWqMGl4hFqfGy-lzXKWwBoYh6wOaNO3N0cRNBgr6QZUe4","3":200,"4":149},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Yellow-uranium-ore-minerals-a-Aggregates-of-slender-prisms-of-brown-b-uranophane_fig1_225633139","3":"Fig. 5 Yellow uranium ore minerals. a Aggregates of slender ...","4":"5 Yellow uranium ore minerals. a Aggregates of slender prisms of brown β  -uranophane.","10":"rmDEmetocgXAKg"},"5":{"1":"dvPqyYaaipTTMAV"}},{"1":{"1":"https://images-na.ssl-images-amazon.com/images/I/51LrKbS8ajL._SX342_.jpg","3":342,"4":323},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3RP2p3i33znUvJ6fbjNFc9-qYwYGO1tu1wu0CSeqQVabLJG6ZiA","3":200,"4":188},"3":{"1":"Amazon.com","2":"https://www.amazon.com/Images-SI-Uranium-Ore/dp/B000796XXM","3":"Amazon.com: Uranium Ore: Industrial & Scientific","4":"Uranium Ore","10":"bhYHaPCiSXkTvX"},"5":{"1":"onKaEPQLbBfVatM"},"7":{"1":{"10":{"1":3.5,"2":1293,"3":"Uranium Ore","4":"Images SI","5":"Radioactive sample of uranium ore. The ore sample material is Naturally  Occurring Radioactive Materials (NORM). Counts Per Minute (CPM) activity  rate ...","6":true,"7":39.95000076293945,"8":"USD"}}}},{"1":{"1":"https://c8.alamy.com/comp/BKJ16C/uranium-ore-rocks-west-cornwall-BKJ16C.jpg","3":1300,"4":956},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRYlZK2UaapmUqrLpDu70rVzqTT6NA61fAeyCo317iFFtPshmHW","3":200,"4":146},"3":{"1":"Alamy","2":"https://www.alamy.com/stock-photo-uranium-ore-rocks-west-cornwall-29284932.html","3":"Uranium ore; rocks; west Cornwall Stock Photo: 29284932 - Alamy","4":"Uranium ore; rocks; west Cornwall","10":"lJAXaGnSHpRfoU"},"5":{"1":"JBRendfBGTuTvxW"}},{"1":{"1":"https://i.ytimg.com/vi/DBXrr7N9kKs/maxresdefault.jpg","3":1304,"4":1032},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQBXs9nco7zuFLKLk-tNGc9ZuMLjsra9buptZfLoNGXNW113UEW","3":200,"4":158},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=DBXrr7N9kKs","3":"HOW IT WORKS: Uranium Deposits - YouTube","4":"","10":"iBejAnpsixRNpa"},"5":{"1":"EIPCUcvIBEVlmhd"},"7":{"1":{"11":{"1":"HOW IT WORKS: Uranium Deposits","2":"The formation of uranium deposits in the earth is explained and where to  find them.","3":"24:01","4":"145842","5":"1404864000000","6":"DOCUMENTARY TUBE","7":"337","8":"96"}}}},{"1":{"1":"https://antinuclearinfo.files.wordpress.com/2013/05/uranium-ore.gif?w=300&h=229","3":300,"4":229},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8T_qLbyYQkzuowvWo8HBjwL-HAwWXhc6Lloi8ubq7NxSAJPn9","3":200,"4":152},"3":{"1":"Nuclear-News.net","2":"https://nuclear-news.net/2015/07/10/investigation-at-last-into-radioactive-pollution-of-johannesburg-from-uranium-mining/","3":"Investigation at last into radioactive pollution of ...","4":"Investigation at last into radioactive pollution of Johannesburg, from uranium  mining","10":"HnrxEBILvQkpOy"},"5":{"1":"nRucRoeKfJXqFxP"}},{"1":{"1":"http://www.cca.org/blog/images/uranium-ore.jpg","3":1000,"4":665},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS_uexaGHzyyA8K0Qm2td_dIcrgvTmcOFPyLDcphsR4gpJoxeI-","3":200,"4":133},"3":{"1":"Dave Fischer Weblog","2":"http://www.cca.org/blog/20120305-Uranium-Ore.shtml","3":"Dave Fischer Weblog","4":"Uranium Ore.","10":"RkChWglXYuHiCm"},"5":{"1":"LforPPQgUJdQwtW"}},{"1":{"1":"https://www.miningafrica.net/wp-content/uploads/2016/08/Gummite-Uraninite-Zircon-62299.jpg","3":600,"4":493},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8Em1d_798dXwXjgbatsQuQ56eeOmcKHmXeCu1cDObKXlJgwIqWA","3":200,"4":163},"3":{"1":"Mining Africa","2":"https://www.miningafrica.net/natural-resources-africa/mining-uranium-in-africa/","3":"Mining Uranium in Africa","4":"It only became known that Uranium is radioactive in the 1890s. The French  physicist Antoine Henri ...","10":"BEtTejSuTPBcBv"},"5":{"1":"fwMhNLexWVpLyHL"}},{"1":{"1":"http://uraha.de/de/wp-content/uploads/2016/02/Uran_1_1_torbernite.jpg","3":476,"4":331},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS079SrqlTpBo1n1dmw30F4aV154GvSSPPjm0f4lx2-ODMaw_lQ","3":199,"4":139},"3":{"1":"URAHA Foundation Germany eV","2":"http://uraha.de/de/?p=409&lang=en","3":"Uranium ore deposits – URAHA Foundation Germany e.V.","4":"Torbernite, an important secondary uranium mineral (Photo: Aangelo)","10":"QKcgvUhHbwCTrJ"},"5":{"1":"oxDhPBfwnEUdPAq"}},{"1":{"1":"http://unitednuclear.com/images/oregenericb.jpg","3":500,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRouW9zQOLSAsQ7gTV6GskfzJRe0YE3xwtSmHRrNdORK7pSUNVi","3":200,"4":165},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=461","3":"Generic Uranium Ore, range 'B' 3,500 to 5,000 CPM : United ...","4":"Generic Uranium Ore, range 'B' 3,500 to 5,000 CPM","10":"wngjWxwrNFdpfY"},"5":{"1":"suepfIIYjVLClCr"}},{"1":{"1":"http://nevada-outback-gems.com/mineral_information/carnotite02.jpg","3":481,"4":385},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLm3Pc7sHZ97mDx8dVQeW0IO-_R5J75qt5ddm2zgQrTpaRox9r6w","3":200,"4":160},"3":{"1":"Nevada Outback Gems","2":"http://nevada-outback-gems.com/Base_ores/Vanadium_ore.htm","3":"Photos of Natural Vanadium Ore, Vanadium minerals and specimens","4":"","10":"hJwcXLvYUKeohc"},"5":{"1":"fXvuWbanhBKavSa"}},{"1":{"1":"https://image.slidesharecdn.com/topic5-uraniumoredeposits-151123233751-lva1-app6891/95/uranium-ore-deposits-1-638.jpg?cb=1515416471","3":638,"4":479},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRp9WyI3pu5dWpY7YwW-Ye9kSrE3ekVEytb6SAXpjwHhbX1ODrKFw","3":200,"4":149},"3":{"1":"SlideShare","2":"https://www.slideshare.net/hzharraz/uranium-ore-deposits","3":"Uranium Ore Deposits","4":"Topic 5: Uranium Ore Deposits Hassan Z. Harraz hharraz2006@yahoo.com 2012  ...","10":"sRmdBVvmonxEpy"},"5":{"1":"rIlPJsVLKNgkDAX"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Pitchblende_schlema-alberoda.JPG/220px-Pitchblende_schlema-alberoda.JPG","3":220,"4":164},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS7EEEtGcfbvzMoNY8dn5zY5aO6HmrB12mbY8LuQI8Kd_VmgmTfMg","3":200,"4":149},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Uranium minerals[edit]","10":"RSiPQByYGTChQJ"},"5":{"1":"BLCmBsMpofnWKno"}},{"1":{"1":"http://www.ioffer.com/img/item/643/193/629/uraninite-pitchblende-uranium-ore-410-309e.jpg","3":580,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScBLPgjcic6PoDFMVuNxcGz6fXcJfTYTnoia2NbqeLz2l-fUcfgQ","3":200,"4":112},"3":{"1":"iOffer","2":"http://www.ioffer.com/i/uraninite-pitchblende-uranium-ore-410-643193629","3":"URANINITE PITCHBLENDE URANIUM ORE 410 for sale","4":"URANINITE PITCHBLENDE URANIUM ORE 410. «","10":"fCAEhnojVGLbXe"},"5":{"1":"UopSkuqGDGHgqYI"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE PITCHBLENDE URANIUM ORE 410","5":"botryoidal uraninite , from Shaft 4 /Pribram , Czech Rep. , 410 µsv/h with  SBM-20@ 1cm , in 6x4cm box, paypal or skrill only, , Shipping Included!!!!  ...","6":false,"7":69.0,"8":"USD"}}}},{"1":{"1":"https://wiki.factorio.com/images/Electric_mining_drill-Uranium_ore.png","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQFhukFSWQx7eHxhvZcQdOUT7H5iozgUhW1LXULfNXMNy_0TSpINw","3":200,"4":200},"3":{"1":"Official Factorio Wiki - Factorio","2":"https://wiki.factorio.com/Uranium_ore","3":"Uranium ore - Factorio Wiki","4":"Electric mining drill placed on uranium ore, pipe input/output visible.","10":"rpsNWfGUeFhSFH"},"5":{"1":"xSbqhsPwkeNJJwj"}},{"1":{"1":"https://d32ogoqmya1dw8.cloudfront.net/images/research_education/nativelands/Navajo_mine.jpg","3":1536,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTrK3Fn7KNQLi-7ex_egj4jahjSGX8MDMSr9jV6fJk8qnKWiRO7","3":200,"4":133},"3":{"1":"SERC - Carleton","2":"https://serc.carleton.edu/research_education/nativelands/navajo/uraniumdeposits.html","3":"Uranium Deposits","4":"","10":"OPpSedewOjOjFm"},"5":{"1":"IwasypKdPbbkdbm"}},{"1":{"1":"https://vignette.wikia.nocookie.net/feed-the-beast/images/3/3f/Uranium_Ore_Block.png/revision/latest?cb=20130214161003","3":256,"4":256},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ0h1LlRX57eB5Seh1DZ7kRPEZBjmdO6Oi2L2vET1ZuAi2LTsyV","3":200,"4":200},"3":{"1":"Feed The Beast Wiki - Fandom","2":"http://feed-the-beast.wikia.com/wiki/Uranium_Ore_(Block)","3":"Uranium Ore (Block) | Feed The Beast Wiki | FANDOM powered by ...","4":"Uranium Ore","10":"cjtOgJKjdrbTlM"},"5":{"1":"FHxEnUGGXWIXGvM"}},{"1":{"1":"http://www.abc.net.au/news/image/189970-3x2-940x627.jpg","3":940,"4":627},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR26n4Kg9hDPNpZZfP9sKNtDgObRqfssUpAuqj2V-48xc0HJhK0KQ","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/news/2017-07-18/a-haul-truck-carries-uranium-ore/8718504","3":"A haul truck carries uranium ore - ABC News (Australian ...","4":"A haul truck carries uranium ore","10":"mxShrEfddOaeoO"},"5":{"1":"RBmTMcuVHqUjext"}},{"1":{"1":"https://carlwillis.files.wordpress.com/2008/05/lv_forsale.jpg","3":1000,"4":608},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT-6KvJESWkqhrOnLp92rsyDglAWSo25nQ6XgS7Pz8vLbYangT07w","3":200,"4":121},"3":{"1":"Special Nuclear Material - WordPress.com","2":"https://carlwillis.wordpress.com/2008/05/05/for-sale-uranium-ore/","3":"For Sale: Uranium Ore | Special Nuclear Material","4":"","10":"emOhCdmtvWuqxy"},"5":{"1":"KaHBJwWvAnWHxWU"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2015/1-scientistsse.jpg","3":3654,"4":1998},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSPtwII-3qnD47udpLTwGERykilZ63nZpdyFngPEX_NSu8XB2ONZQ","3":200,"4":109},"3":{"1":"Phys.org","2":"https://phys.org/news/2015-01-scientists-ways-uranium-ore-legacy.html","3":"Scientists search for new ways to deal with US uranium ore ...","4":"Scientists search for new ways to deal with US uranium ore processing legacy","10":"fxhnuqMXKASHgD"},"5":{"1":"NXKnOHjeFeBlMhU"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Pitchblende371.JPG/220px-Pitchblende371.JPG","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR55Fad8E_lL6V6bCKaBdTczoSYdZVbCDBHajNr0O65HLmBr5GV","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Uranium ore (pitchblende in dolomite) from the vein-type deposit  Niederschlema-Alberoda","10":"DRckVycLowVDNu"},"5":{"1":"VDlQeLSNRXHBbsC"}},{"1":{"1":"http://www.republicoflakotah.com/wp-content/uploads/2010/03/ISL-Diagram2.gif","3":420,"4":293},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQxBQbzOxWVYByDlrNOJS2meHl-effFoxlYbokZmSyCQlqKINUXLw","3":199,"4":139},"3":{"1":"TU Freiberg","2":"https://tu-freiberg.de/umh-vii-2014","3":"Uranium Mining and Hydrogeology 2014 International Conference ...","4":"Session I: Uranium mining","10":"PQiLQrvMaQoOHn"},"5":{"1":"YUuAOodADCEBjAi"}},{"1":{"1":"https://images-na.ssl-images-amazon.com/images/I/51sOTDswZ0L._SX425_.jpg","3":425,"4":319},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSi0-trSU79rMckw3x4ZOwC1lQpTQNTqnyrRrDeKd8-3CL4VlYZzQ","3":200,"4":149},"3":{"1":"Amazon.com","2":"https://www.amazon.com/uranium-unrefined-uraninite-radiation-detector/dp/B00CQ9LLR4","3":"Rare earth uranium oxide, high grade unrefined uranium ore ...","4":"Rare earth uranium oxide, high grade unrefined uranium ore uraninite, for  Geiger counter &","10":"fpeVKHGKMYkVvG"},"5":{"1":"hMJKYgbarWYolsf"},"7":{"1":{"10":{"1":4.0,"2":69,"3":"Rare earth uranium oxide, high grade unrefined uranium ore uraninite, for  Geiger counter & radiation detector test source!","4":"LifeTech","5":"The rare earth uranium oxide, naturally high grade uranium ore contains  high concentration of uraninite which can be used to test your Geiger  counter, ...","6":true,"7":79.9000015258789,"8":"USD"}}}},{"1":{"1":"https://thumbs.dreamstime.com/b/uranium-ore-7968842.jpg","3":800,"4":642},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfDCPo3aFV1FsQ-Co0GUw8rjQwkrlKTnVsmmbSqJLKC-OuYzMfKw","3":200,"4":160},"3":{"1":"Dreamstime.com","2":"https://www.dreamstime.com/stock-photography-uranium-ore-image7968842","3":"Uranium ore stock photo. Image of rock, industry, activity ...","4":"Uranium ore - isolated object on white background","10":"lFgPMffOrsdglO"},"5":{"1":"GAGCRvPsInlrCVp"}},{"1":{"1":"https://www.dnddice.com/media/catalog/product/cache/1/image/650x/613132e0f270af58849e99a6dbb00be2/m/a/marbled_nick_yellow.jpg","3":650,"4":655},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTWFIWTzKbGt_-X5vW437tZv8qB2KM0WIPIonWHMox4yfraI85s","3":199,"4":200},"3":{"1":"DnD Dice","2":"https://www.dnddice.com/sets-of-dice/uranium-ore-dice-set-opaque.html","3":"Uranium Ore Dice Set (Marbled) - Sets of Dice","4":"Uranium Ore Dice Set (Marbled)","10":"lDtobcULsHuDEs"},"5":{"1":"CUfvqkkkYhexTmG"}},{"1":{"1":"https://i.ebayimg.com/images/g/ZUAAAOSw8jVapWYd/s-l300.jpg","3":300,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLL-gQGDHliqAAkwizhTCbydcVOftQGPQw3rRqIgN7635H4oSc","3":200,"4":187},"3":{"1":"eBay","2":"https://www.ebay.com/itm/URANIUM-ORE-ELEMENT-92-COLLECTORS-SAMPLE-IN-JAR-5-0-to-6-0-GM-/153034952406","3":"URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to ...","4":"Image is loading URANIUM-ORE-ELEMENT-92-COLLECTOR-039-S-SAMPLE-","10":"mNpopJVFxQrnya"},"5":{"1":"iVvPpnldBUCGNXi"},"7":{"1":{"10":{"3":"Details about URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to  6.0 GM +","5":"URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to 6.0 GM + |  Collectibles, Rocks, Fossils & Minerals, Crystals & Mineral Specimens |  eBay!","7":6.5,"8":"USD"}}}},{"1":{"1":"https://blogs.sap.com/wp-content/uploads/2013/08/uranium_ore_256462.jpg","3":274,"4":184},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT-B4iVhhSn-aSVkwhaNBxj-EVvYpXqAot_xaFQl8zFaqpdtvwENA","3":200,"4":134},"3":{"1":"SAP Blogs","2":"https://blogs.sap.com/2013/08/03/uranium-mining/","3":"Uranium Mining | SAP Blogs","4":"About Uranium Uranium Ore.jpg","10":"FMUDYvtjGcwkkY"},"5":{"1":"tKaSxPOctyupeuH"}},{"1":{"1":"https://greentumble.com/wp-content/uploads/2016/11/Environmental-impacts-of-uranium-mining.jpg","3":800,"4":500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTaNnLOEdRMnLDqAb99SNc7wfxtk58huSsUi4vinIsNrf7-PHw4gg","3":200,"4":124},"3":{"1":"Greentumble","2":"https://greentumble.com/environmental-impacts-of-uranium-mining/","3":"Environmental Impacts of Uranium Mining | Greentumble","4":"Environmental impacts of uranium mining","10":"mrFxmtNXvpHlNt"},"5":{"1":"KuerxbEKttWuPLV"}},{"1":{"1":"https://c1.staticflickr.com/3/2566/4058064866_ce4a2b2c53_b.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvky2ZpyEH6n11HPYAXDRzG6dV1ljdU5jr9CL6vJSF_T_6kwa02g","3":200,"4":149},"3":{"1":"Flickr","2":"https://www.flickr.com/photos/bionerd/4058064866/in/pool-10372360@N00/","3":"pitchblende uranium ore blisters | very beautiful, big black ...","4":"... pitchblende uranium ore blisters | by bionerd23 ☢","10":"VTmkPJKhTRRdsW"},"5":{"1":"KTPrWoVlIutiblb"}},{"1":{"1":"http://energyeducation.ca/wiki/images/thumb/8/82/Openpit.jpg/300px-Openpit.jpg","3":300,"4":200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQv2IpxKcOVjZRoPvYLl2RPSCYdJYo23xr4QQvY2HKf7VT7HoRj","3":200,"4":133},"3":{"1":"Energy Education","2":"http://energyeducation.ca/encyclopedia/Uranium_mining","3":"Uranium mining - Energy Education","4":"Uranium mining","10":"PSSeQtHLcKjsyy"},"5":{"1":"pdbvTOCwHmiiCNm"}},{"1":{"1":"https://www.wnti.co.uk/media/3990/1.jpeg","3":750,"4":562},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQiA78QEyJ33i6F2Yj3KXy_JaaEnAAcAXcB42oNpYA1CYwlQ3E6","3":200,"4":149},"3":{"1":"World Nuclear Transport Institute","2":"https://www.wnti.co.uk/media-centre/nuclear-fuel-cycle/uranium-mining-and-refining.aspx","3":"Uranium Mining and Refining | World Nuclear Transport Institute","4":"Uranium Ore Concentrate, Courtesy of the Nuclear Decommissioning Authority 3","10":"IWjAlvHXuPBbmR"},"5":{"1":"XAxhsMHqiMGnxOO"}},{"1":{"1":"https://geoinfo.nmt.edu/resources/uranium/images/upitmine.jpg","3":363,"4":236},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4H1t_VZ9t1VuHddmc7crKQypetQIwqrCigzUVmE1HzZHvxAYZ","3":200,"4":129},"3":{"1":"New Mexico Bureau of Geology & Mineral Resources","2":"https://geoinfo.nmt.edu/resources/uranium/mining.html","3":"Uranium: How is it Mined?","4":"Rabbit Lake Mine","10":"jiWduexAsVAXgW"},"5":{"1":"CLeQJcVQBoFIagE"}},{"1":{"1":"https://wiki.factorio.com/images/thumb/Glow.png/300px-Glow.png","3":300,"4":288},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT1MSj1u7c97J9C2EtjqGIWe2EKHJ8rJ5EdAw6SQ4fxe4FjgMyNtQ","3":200,"4":192},"3":{"1":"Official Factorio Wiki - Factorio","2":"https://wiki.factorio.com/Uranium_ore","3":"Uranium ore - Factorio Wiki","4":"Uranium ore","10":"PcQGCwoVlQSrIY"},"5":{"1":"FPqpErYdeYDiUGO"}},{"1":{"1":"https://ground-force-training.s3.amazonaws.com/upload/user/image/M&M-Commodities-Uranium20170924192443101.jpg","3":920,"4":520},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPz1yX-sSLLaN3o0YdR68gr_YkcMccvWjMoumhmTL04h9zTjND","3":200,"4":113},"3":{"1":"Ausenco","2":"http://www.ausenco.com/en/commodity-uranium","3":"Uranium Ore Mining, Processing, Production; Ausenco","4":"Uranium","10":"hlctXrnNGrVTPx"},"5":{"1":"ARHLSTwSQUCvDVa"}},{"1":{"1":"https://d32ogoqmya1dw8.cloudfront.net/images/research_education/nativelands/UraniumDeposits.jpg","3":1069,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqi77ywwiUP56AbW7lpI-ephJN9JpUDZRwLXjeeFtcr0DMKFkA","3":200,"4":130},"3":{"1":"SERC - Carleton","2":"https://serc.carleton.edu/research_education/nativelands/navajo/uraniumdeposits.html","3":"UraniumDeposits.jpg","4":"Uranium Deposits on the Navajo Nation","10":"RqykeJkdrEJoox"},"5":{"1":"qyToUXsGyIkStsP"}},{"1":{"1":"https://i.ytimg.com/vi/bCYiBXolKLg/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRr6MOvrW_Z_bzPWGrYowSudjGz8BBDA48LVqROH57ksR6dQBef","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=bCYiBXolKLg","3":"Uraninite hunting - finding Uranium ore at shaft 4 - YouTube","4":"","10":"DfjhwMoDvFmhjw"},"5":{"1":"xSLsTRSSAwJXOeU"},"7":{"1":{"11":{"1":"Uraninite hunting - finding Uranium ore at shaft 4","2":"this is at the shaft #4 dump near Pribram /Czech Rep., Tube is SI-15BG,  Geiger counter is Mygeiger V2.0 with SBM-20 from rhelectronics.net *new  video*: https...","3":"10:24","4":"7888","5":"1431648000000","6":"weirdmeister inc.","7":"86","8":"17"}}}},{"1":{"1":"http://www.mining.com/wp-content/uploads/2016/09/namibias-new-uranium-mine-to-triple-countrys-output-by-2017.jpg","3":900,"4":505},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFG-Dff9s5BHT2F1F6K6UjYae_OLK-y2vLBIDOSmIJit7IAWnOYg","3":200,"4":112},"3":{"1":"MINING.com","2":"http://www.mining.com/namibias-new-uranium-mine-triple-countrys-output-2017/","3":"Namibia's new uranium mine to triple country's output by 2017 ...","4":"Namibia's new uranium mine to triple country's output by 2017","10":"jxnEOGqQAmQeID"},"5":{"1":"IOpOLAIRwJAWxKU"}},{"1":{"1":"https://www3.epa.gov/radtown/images/uranium-ore-small.jpg","3":209,"4":188},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTg_rtmpXq9c9BUYEXHb9Y7V0kw6B_xV0735UXESJhESvyiYHO5","3":200,"4":179},"3":{"1":"EPA","2":"https://www3.epa.gov/radtown/uranium-mines-mills.html","3":"Uranium Mines and Mills | RadTown USA | US EPA","4":"Uranium ore.","10":"EnbXhrObjPNjlK"},"5":{"1":"MlWPlauEsaDgTqc"}},{"1":{"1":"http://www.walletwrecker.com/wp-content/uploads/2017/02/uranium-ore-paperweight.jpg","3":780,"4":690},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDwWe9IuEuH7JtF6l36LPGt84oX1M30KMIR3Rtb3XW-JMd0b4L","3":200,"4":176},"3":{"1":"Cool Stuff","2":"http://www.walletwrecker.com/uranium-ore-paperweight/","3":"Uranium Ore Paperweight - WalletWrecker","4":"Uranium Ore Paperweight","10":"VTykOlfiIMxIEj"},"5":{"1":"ChvBQDrmkJAWaoA"}},{"1":{"1":"https://bloximages.chicago2.vip.townnews.com/azdailysun.com/content/tncms/assets/v3/editorial/8/ae/8aedbad9-4c22-51f9-a5a4-c3ea8515d944/59e2c68821afb.image.jpg","3":228,"4":341},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRnVE4UYV0Qs53XdLGrePAjB6TbFkXI_d2AgiaZ-I7AW70d2U7O","3":133,"4":200},"3":{"1":"Arizona Daily Sun","2":"http://azdailysun.com/news/local/new-uranium-mines-no-simple-answers/article_20522e2c-98ed-58c4-a6cf-93ee27da9aa2.html","3":"New uranium mines: no simple answers | Local | azdailysun.com","4":"Pinenut Mine underground","10":"qkNfYeDKPPEKYU"},"5":{"1":"IutbavLAJOjFHen"}},{"1":{"1":"https://c8.alamy.com/comp/M14C80/fort-davis-texas-uranium-ore-in-the-chihuahuan-desert-mining-heritage-M14C80.jpg","3":1300,"4":956},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcST-CQ0gKpU0YteBEcSBmB8Ev-LBuw-HuMgXJXxD80hNJ-HlGLFHw","3":200,"4":146},"3":{"1":"Alamy","2":"https://www.alamy.com/stock-photo-fort-davis-texas-uranium-ore-in-the-chihuahuan-desert-mining-heritage-172815776.html","3":"Fort Davis, Texas - Uranium ore in the Chihuahuan Desert ...","4":"Fort Davis, Texas - Uranium ore in the Chihuahuan Desert Mining Heritage  Exhibit at the Chihuahuan ...","10":"UBxpddAFAwRjgw"},"5":{"1":"AGIGVWDfGiJCbtH"}},{"1":{"1":"https://image.slidesharecdn.com/uraniumoredepositsinegypt-161030181530/95/uranium-ore-deposits-in-egypt-5-638.jpg?cb=1515416002","3":638,"4":479},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTnp6u3T7uXrv_Yibxe3DR1agjgkXYg_EGhM1yPJ8ZIV0MI-8zS","3":200,"4":149},"3":{"1":"SlideShare","2":"https://www.slideshare.net/hzharraz/uranium-ore-deposits-in-egypt","3":"URANIUM ORE DEPOSITS IN EGYPT","4":"","10":"WEgTtqKJfVTjNc"},"5":{"1":"LenKYmayTuHJGvq"}},{"1":{"1":"https://vignette.wikia.nocookie.net/starboundgame/images/f/f3/Uranium-0.png/revision/latest?cb=20150430191627","3":278,"4":274},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRd0RMVJF-9eJ2p2QKYGwneLGVCf7koVrhrdMP3F0fTmwynjLH","3":200,"4":197},"3":{"1":"Starbound Wiki - Fandom","2":"http://starbound.wikia.com/wiki/Uranium_Ore","3":"Uranium Ore | Starbound Wiki | FANDOM powered by Wikia","4":"Uranium-0","10":"NAUrpgvWASmJnt"},"5":{"1":"JWELSnTbteHvAJV"}},{"1":{"1":"https://file.ejatlas.org/docs/Rossing-uranium-mine-near-008.jpg","3":460,"4":276},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTZgMEJmhy8irJjPAZWmgbkoURXeAImcsUXN-W-SnWU0rz5Zlxmhg","3":199,"4":119},"3":{"1":"EJAtlas","2":"https://ejatlas.org/conflict/rio-tintos-rossing-uranium-mine-namibia","3":"Rio Tinto's Rössing Uranium Mine, Namibia | EJAtlas","4":"Rio Tinto's Rössing Uranium Mine, Namibia","10":"OhVbJHbOaxpJTm"},"5":{"1":"yhFGyEGORtvxyiT"}},{"1":{"1":"https://thumbs3.ebaystatic.com/d/l225/m/mKiNHUomL_2vUOfQwaPTtAQ.jpg","3":225,"4":169},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKRhLsXJdCdro31Ub7eNF_LhDdM1jfMcJqF35fpIOLtvUrBQiL","3":200,"4":150},"3":{"1":"eBay","2":"https://www.ebay.com/bhp/uranium-ore","3":"Uranium Ore: Crystals & Mineral Specimens | eBay","4":"RARE URANIUM Ore HAYNESITE type locale Repete Mine Blanding Utah LARGE!","10":"BmEyAvaFQTxYHs"},"5":{"1":"PRRWIHqYNnbEhku"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Uranium_production_world.PNG/300px-Uranium_production_world.PNG","3":300,"4":132},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWPwZFkWSmelETZtm3W8ytFo3f8MAkVQGVv9xR6g2poaYN6tebDQ","3":200,"4":88},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_mining","3":"Uranium mining - Wikipedia","4":"World Uranium production in 2005.","10":"lsykkyWvdhGkhI"},"5":{"1":"DiIqNhbruIGsROR"}},{"1":{"1":"https://www.researchgate.net/profile/Tyler_Spano/publication/320569651/figure/fig1/AS:560662205210624@1510683694153/Example-of-uranium-ore-samples-and-their-associated-alteration-rinds-Great-Bear-Lake-and.png","3":850,"4":232},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQGakvvuKcktkpJwUfcIEetuPkAFoyaFJamqY9nG8KwajgWL66cTA","3":200,"4":54},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Example-of-uranium-ore-samples-and-their-associated-alteration-rinds-Great-Bear-Lake-and_fig1_320569651","3":"Example of uranium ore samples and their associated ...","4":"Example of uranium ore samples and their associated alteration rinds (Great  Bear Lake and Jefferson","10":"PjnvTFesdEKBRe"},"5":{"1":"VSDXIHQtDjEYvMK"}},{"1":{"1":"https://www.grandcanyontrust.org/sites/default/files/e_uranium_ore.jpg","3":600,"4":660},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV2vkJir6j5M9GGj9Daws2_5mmfJLHHlMuYlvD-tFgFQq50LJa","3":182,"4":200},"3":{"1":"Grand Canyon Trust","2":"https://www.grandcanyontrust.org/colorado-plateau-uranium","3":"Uranium | Grand Canyon Trust","4":"Uranium - deposits","10":"tixmKKALwfPbAV"},"5":{"1":"gMjqkkdkgUNeyLy"}},{"1":{"1":"http://uranium.csis.org/wp-content/uploads/2014/09/uranium_mine.jpg","3":2318,"4":880},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSfTlqkUotU-2s86KZPoKTei68672JI0c3bTzX3Owc_I46nRApIUA","3":200,"4":75},"3":{"1":"Governing Uranium - Center for Strategic and International ...","2":"http://uranium.csis.org/production/","3":"1 - Governing Uranium","4":"01_minephoto_1of2","10":"rdtbvLcLoNbFWF"},"5":{"1":"LjeRklRSOmSTOBV"}},{"1":{"1":"https://vignette.wikia.nocookie.net/thetekkit/images/4/4e/Uranium_Ore_2.png/revision/latest?cb=20121011054332","3":1613,"4":1032},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-2NIuZvYepV4lvhDpyZxosb6pf5BbQ3yke9xkWMnknU3MSriD","3":200,"4":127},"3":{"1":"The Tekkit Classic Wiki - Fandom","2":"http://tekkitclassic.wikia.com/wiki/File:Uranium_Ore_2.png","3":"Image - Uranium Ore 2.png | The Tekkit Classic Wiki | FANDOM ...","4":"Uranium Ore 2.png","10":"fVoMdmhrsqQnoA"},"5":{"1":"DfOlohDTbnVvKyp"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Uraninite-usa32abg.jpg/220px-Uraninite-usa32abg.jpg","3":220,"4":217},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7Z_u2G5UCMhp9M5MEZVGO39z_Ek0FiZM7ffNguWI1YK56MtGshQ","3":200,"4":197},"3":{"1":"911 Metallurgist","2":"https://www.911metallurgist.com/blog/pitchblende-uraninite-ore","3":"Pitchblende Uranium Ore","4":"... in deposits of this type. pitchblende uraninite","10":"PxpNofJwxlbdey"},"5":{"1":"vmYLxMtxKDQFWxF"}},{"1":{"1":"https://vignette.wikia.nocookie.net/technicpack/images/8/88/Uranium_Ore.png/revision/latest?cb=20121230105240","3":1366,"4":706},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQkvZjnZRf1MTyPRxcA5_fUUC7v4ZfluKLN-NPuYBZTpqB_afEB","3":200,"4":103},"3":{"1":"Technic Pack Wiki - Fandom","2":"http://technicpack.wikia.com/wiki/File:Uranium_Ore.png","3":"Image - Uranium Ore.png | Technic Pack Wiki | FANDOM powered ...","4":"Uranium Ore.png","10":"eoRoWdBXHUsICT"},"5":{"1":"RGVYNJSonUGgGTn"}},{"1":{"1":"http://media.kenanaonline.com/photos/1238066/1238066871/large_1238066871.gif?1289334469","3":287,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTGTmdR9WCI6pYTw4vspENHpWOi7BVS-K1s4lp2uiVsJ-80XTY5uw","3":163,"4":200},"3":{"1":"بوابات كنانة أونلاين","2":"https://kenanaonline.com/users/absalman/posts/187419","3":"THE URANIUM ORE MINERALS - عبدالعاطي سالمان- مشروع العصر ...","4":"THE URANIUM ORE MINERALS","10":"mNHAuArniWXJRj"},"5":{"1":"CVNwppputpGlJil"}},{"1":{"1":"https://ae01.alicdn.com/kf/HTB1Yg6DIpXXXXalXFXXq6xXFXXXE/Phosphorus-tin-mine-uranium-ore-chalcopyrite-crystal-gem-stone-raw-ore-samples-mathematics-Tian-Yu-mineral.jpg_640x640.jpg","3":640,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgmUKhyf7JDiE73fHSE4_cq6M4OLT7bBWQofzuvUCRKK8-a9ws","3":200,"4":187},"3":{"1":"AliExpress.com","2":"https://www.aliexpress.com/item/Phosphorus-tin-mine-uranium-ore-chalcopyrite-crystal-gem-stone-raw-ore-samples-mathematics-Tian-Yu-mineral/32379491924.html","3":"Phosphorus tin mine uranium ore chalcopyrite crystal gem ...","4":"Phosphorus tin mine uranium ore chalcopyrite crystal gem stone raw ore  samples mathematics Tian Yu ...","10":"VROMXGJiTLfNcm"},"5":{"1":"fOtJguCFMFFiTGM"},"7":{"1":{"10":{"3":"Phosphorus tin mine uranium ore chalcopyrite crystal gem stone raw ore  samples mathematics Tian Yu mineral stones-in Aerators from Home  Improvement on ...","6":false,"7":2719.0,"8":"USD"}}}},{"1":{"1":"https://thehightechsociety.com/wp-content/uploads/2017/12/uraniumorefacts-1000x720.jpg","3":1000,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTzm_aIsh8drvWBOgUN-fCco8pfiWe6D9ZdCZYdZ0MeKuipCmJ","3":199,"4":143},"3":{"1":"The High Tech Society","2":"https://thehightechsociety.com/is-uranium-dangerous-facts-about-uranium-you-may-not-know/","3":"Is Uranium Dangerous - Facts About Uranium You May Not Know ...","4":"Is Uranium Dangerous – Facts About Uranium You May Not Know","10":"XGijdDsAQoSvIl"},"5":{"1":"amATHrpPAUxWKDa"}},{"1":{"1":"https://media.nature.com/m685/nature-assets/ngeo/journal/v5/n2/images/ngeo1386-f1.jpg","3":685,"4":432},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgjRj8o_JLV2wZN-swnguCcXuW9-Zx2AKuEELmIqiUa4VuULfudg","3":200,"4":125},"3":{"1":"Nature","2":"https://www.nature.com/articles/ngeo1386","3":"Uranium-ore giants | Nature Geoscience","4":"Richard et al. show that the giant high-grade uranium ore found in the  Athabasca Basin could have ...","10":"CKCkDIIYUrnDPb"},"5":{"1":"XbggxJvpqFKrTft"}},{"1":{"1":"http://www.abc.net.au/radionational/image/6593820-3x2-700x467.jpg","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQU2lHa-Tht79z6V7T3AUOMhUz2uPtB8TRSCXcsixKWMHTPp2hX","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/radionational/programs/rearvision/history-of-uranium-mining-in-australia/6607212","3":"The long and controversial history of uranium mining in ...","4":"Ranger uranium mine","10":"AYUiOOonsQcudS"},"5":{"1":"ysejMaDMnehJEVo"}},{"1":{"1":"http://www.ioffer.com/img/item/642/410/160/uraninite-pitchblende-uranium-ore-240-4ae7.jpg","3":580,"4":388},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS6ek08_PoH4HNHBj37nkhiLBztekkXmHHyVxxhfeXKLysCXL_lPg","3":200,"4":133},"3":{"1":"iOffer","2":"http://www.ioffer.com/i/uraninite-pitchblende-uranium-ore-240-642410160","3":"URANINITE PITCHBLENDE URANIUM ORE 240 for sale","4":"URANINITE PITCHBLENDE URANIUM ORE 240. «","10":"VsvtUbUcmgWOtd"},"5":{"1":"TaBEXnwLcVoSGRF"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE PITCHBLENDE URANIUM ORE 240","5":"rare negative botryoidal pitchblende, from Shaft 4 ,Pribram , Czech Rep. ,  240 µsv/h with SBM-20@ 1cm, 4 cm x 3 cm x 2.3 cm , paypal or skrill only,  ...","6":false,"7":44.0,"8":"USD"}}}},{"1":{"1":"https://antinuclear.files.wordpress.com/2012/07/mary-kathleen-uranium-mine.gif","3":504,"4":511},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRbQ8QiG595QEeGQbszjBqy3NSD10vD6HpMDRBbYl-uWgnz_14PEg","3":197,"4":200},"3":{"1":"Antinuclear","2":"https://antinuclear.net/2013/06/12/mary-kathleen-uranium-mine-still-toxic-decades-after-closure/","3":"Mary Kathleen uranium mine – still toxic decades after ...","4":"Mary-Kathleen-Uranium-mine-","10":"fLxfEgPYxMQMvS"},"5":{"1":"SGYSjGfHCKKNkgE"}},{"1":{"1":"https://stationeers-wiki.com/images/2/27/Uranium_ore_dropped.jpg","3":450,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLJH30zkMiPth0cKLDb2Qlk2SN5BiTM_w_4LlZYthhktUasVRK","3":200,"4":200},"3":{"1":"Unofficial Stationeers Wiki","2":"https://stationeers-wiki.com/Uranium_Ore/en","3":"Uranium Ore - Unofficial Stationeers Wiki","4":"Uranium Ore","10":"XvrtvsArUYHKUS"},"5":{"1":"vKpjKTxbqkQXpom"}},{"1":{"1":"http://teachnuclear.ca/wp-content/uploads/2013/05/McClean-Lake-open-pit.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4RMtnL-xV_tEftv9YPNCde6Vo9HV_ZPeWz5wQ7h7l_KC3rnc4","3":200,"4":112},"3":{"1":"Teach Nuclear","2":"http://teachnuclear.ca/all-things-nuclear/nuclear-energy/uranium-mining/","3":"Uranium Mining | Teach Nuclear","4":"Open-pit mine at the McClean Lake facility","10":"scBFjbTjRhqPbE"},"5":{"1":"MjaBBUKfsXDRiUd"}},{"1":{"1":"https://media.istockphoto.com/photos/closeup-of-uranium-ore-on-white-background-picture-id183637629","3":1024,"4":1007},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR6H-joeozc8MoqQeO-qeGFLBp4M_2aUtIRkixABJY6Jye_Zu5d","3":200,"4":197},"3":{"1":"iStock","2":"https://www.istockphoto.com/photo/close-up-of-uranium-ore-on-white-background-gm183637629-27561251","3":"Closeup Of Uranium Ore On White Background Stock Photo & More ...","4":"Close-up of Uranium ore on white background royalty-free stock photo","10":"JjKfCVANlcxWUc"},"5":{"1":"KuRMAoXyPQEJKmd"}},{"1":{"1":"http://www.nsfwallet.com/wp-content/uploads/2013/09/41KH6M0LWJL._SL500_AA300_1.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR00Ch9vyoO0x--dLLmB0io09RBtdpPBUn0rXF6_EEd4qwrnM6i","3":200,"4":200},"3":{"1":"Not Safe For Wallet","2":"http://www.nsfwallet.com/uranium-ore/","3":"Uranium Ore","4":"","10":"ROirCLHUnEFQbb"},"5":{"1":"bxMXuPXMbeiLMMR"}},{"1":{"1":"http://www.mirarr.net/media/W1siZiIsIjIwMTcvMDcvMDUvNWtocWNwZXp3eV9yYW5nZXIuanBnIl0sWyJwIiwidGh1bWIiLCIxMzIweDU4MSMiXV0/ranger.jpg","3":1320,"4":581},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_57SBkrYkxBS8nDl83hytJAgPncjLdd9EltlBrhZuy20i1NUl","3":199,"4":87},"3":{"1":"The Gundjeihmi Aboriginal Corporation","2":"http://www.mirarr.net/uranium-mining","3":"Uranium Mining – The Gundjeihmi Aboriginal Corporation","4":"Ranger. `","10":"lGQWpalAtncdQk"},"5":{"1":"wFBEtCKIsXalNQq"}},{"1":{"1":"http://1boidr1j8wt01itylm7cszo5r8.wpengine.netdna-cdn.com/wp-content/uploads/AUMmap.jpg","3":480,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtC0T56zTdoq3_XYpKrDW0Ssf1EroyWwXmXG8wASNsk2Yk1rCr","3":200,"4":149},"3":{"1":"The Colorado Independent","2":"http://www.coloradoindependent.com/147740/feds-open-door-to-more-uranium-mining-in-southwest-colorado","3":"Feds open door to more uranium mining in Southwest Colorado ...","4":"AUMmap","10":"TTnEbOQmDQMaKs"},"5":{"1":"GBNPxaatFaXEPnN"}},{"1":{"1":"http://eraengineers.com/wp-content/uploads/2016/03/uranium-yellowcake.jpg","3":620,"4":368},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ4pLb2LZOXRVSOtufN0gaWFlxWAtgQ_F-4Z9b1rmuhmd_SIT2xXQ","3":200,"4":118},"3":{"1":"Environmental Resource Associates","2":"http://eraengineers.com/portfolio-view/design-air-pollution-control-ventilation/","3":"Design of Air Pollution Controls and Local Ventilation for ...","4":"Design of Air Pollution Controls and Local Ventilation for Uranium Ore  Processing Plant. «","10":"KOKKEMynLHcTBb"},"5":{"1":"WPQaqJyajPCkeqv"}},{"1":{"1":"http://unitednuclear.com/images/boxorocks.jpg","3":500,"4":535},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkFRN9gmdSflSkBhW4q2lxTEq6qNFQnZ2hepJf0E7Xv1TcJFmrJA","3":187,"4":200},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=863","3":"Bulk Uranium Ore Assortment - 5 Pounds : United Nuclear ...","4":"Bulk Uranium Ore Assortment - 5 Pounds","10":"yQyqhXaFvEoueR"},"5":{"1":"CQwbSsHmGnpLwXy"}},{"1":{"1":"https://i.pinimg.com/736x/9b/74/fa/9b74fa1a6c617880f3c027713b8ed0f0--uranium-nerdy.jpg","3":300,"4":232},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgJUBQCVgGFCbVgsnD-uOQNuJ2lvpplHQYUQ7ce8lC54CiwVvJAg","3":200,"4":154},"3":{"1":"Pinterest","2":"https://www.pinterest.com/michaels0582/uranium-ore/","3":"31 best Uranium Ore images on Pinterest | Crystals, Petroleum ...","4":"Bulk Uranium Ore - 5 Pounds : United Nuclear , Scientific Equipment &  Supplies","10":"VmLBugwkJfYpdv"},"5":{"1":"bRwiTmKbMptmoFd"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Marienberg_ore.jpg/220px-Marienberg_ore.jpg","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTVSeTQx_j1CbsN7N3OlSt3Y_ze7MRNPycZj_A07Dn24YEuLRYf","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Polymetallic uranium ore, Marienberg, Erzgebirge Mts, Germany","10":"oBhUVtBxxpQMct"},"5":{"1":"oGENeuUvxqvGwhY"}},{"1":{"1":"https://www.researchgate.net/profile/Dr_Yamuna_Singh/publication/316716402/figure/fig4/AS:491343119163393@1494156736236/Megascopic-view-of-uranium-ore-sample-used-for-study-Note-a-relict-core-of-black-mineral.png","3":626,"4":538},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ0B9_kwbnm5JXAw-YOZPCMB9sfJyyO9ady26FX7tbJWS-pPZyJ","3":199,"4":171},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Megascopic-view-of-uranium-ore-sample-used-for-study-Note-a-relict-core-of-black-mineral_fig4_316716402","3":"Fig. 4. Megascopic view of uranium ore sample used for study ...","4":"Megascopic view of uranium ore sample used for study. Note a relict core of  black mineral (uraninite) ...","10":"duflncOKBLXPEx"},"5":{"1":"bwNLaAuVAWvOYxj"}},{"1":{"1":"http://cdn.iofferphoto.com/img3/item/640/729/747/uraninite-pyrite-pitchblende-uranium-ore-230-0ac1.jpg","3":580,"4":386},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTV9n1j2oibvPRX86LkJXrUwHuavrxaNZ41wi4gmV7jOEI-SGcbjg","3":200,"4":133},"3":{"1":"iOffer","2":"http://payments.ioffer.com/i/uraninite-pyrite-pitchblende-uranium-ore-230-640729747","3":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230 for sale","4":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230. «","10":"BXSwLQenDcTqYd"},"5":{"1":"llsvaTDqVOyMdSS"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230","5":"uraninite with pyrite (stable) on matrix from Dubenec, Pribram , Czech Rep.  , 230 µsv/h with SBM-20@ 1cm , 6.4 cm x 4.7 cm x 3.5 cm , boxed , 155g, ...","6":false,"7":65.0,"8":"USD"}}}},{"1":{"1":"https://thumbs.dreamstime.com/b/uranium-ore-9727818.jpg","3":800,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSmOQiJLTEC8IUbP-J8cA1Lk04kgZBnfCs03hjz8XxFcUnULkVg","3":200,"4":200},"3":{"1":"Dreamstime.com","2":"https://www.dreamstime.com/royalty-free-stock-photos-uranium-ore-image9727818","3":"Uranium ore stock photo. Image of radium, rays, environmental ...","4":"Download Uranium ore stock photo. Image of radium, rays, environmental -  9727818","10":"PpKDilVVidtdAh"},"5":{"1":"BCPoeqSVHwLqKpu"}},{"1":{"1":"https://www.sciencephoto.com/image/78646/530wm","3":530,"4":364},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzl6fxehVSwPTJDfNmmKM0e9GD6mKJ2TFvP-fhFUmE9G0xiGkJsA","3":200,"4":137},"3":{"1":"Science Photo Library","2":"https://www.sciencephoto.com/media/78646/view/-autunite-a-uranium-ore-","3":"Autunite, a Uranium Ore' - Stock Image C001/4244 - Science ...","4":"'Autunite, a Uranium Ore'","10":"EDmfQyiLaYeGiq"},"5":{"1":"cLFDrRSdxooTyfX"}},{"1":{"1":"https://i.kinja-img.com/gawker-media/image/upload/s--GJZHACFy--/c_scale,f_auto,fl_progressive,q_80,w_800/1444652809032333604.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS7eJp8DHn5uknUUaBQM8FX1ZbrP6BFLG5Hcxgl1QN5k7nFf2sm","3":200,"4":112},"3":{"1":"io9 - Gizmodo","2":"https://io9.gizmodo.com/what-happens-when-you-put-acid-on-uranium-ore-find-out-1732733166","3":"What Happens When You Put Acid on Uranium Ore? Find Out!","4":"","10":"ivMcBfdMUrSuTq"},"5":{"1":"NmYiuMoOFDeXWFB"}},{"1":{"1":"https://quatr.us/wp-content/uploads/2017/06/uranium.jpg","3":250,"4":268},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcShlD81v12IPVrUwlby7X_gfp_lPKFcgjAlbZ8sfTjRoBp9p6ekCg","3":187,"4":200},"3":{"1":"Quatr.us","2":"https://quatr.us/chemistry/uranium-atoms-elements-chemistry.htm","3":"What is uranium? Atoms, elements, chemistry | Quatr.us Study ...","4":"A piece of uranium ore","10":"LggyIdLfTHPoUE"},"5":{"1":"PDBjsuOVuDrmnRH"}},{"1":{"1":"http://www.radioactivethings.com/_Media/full-size-2.jpeg","3":1537,"4":1920},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ03YLxtAgZB6haLu1HOHiWCqtFIxFH-y27WA-xJN9B0Fi7B3X5","3":160,"4":200},"3":{"2":"http://www.radioactivethings.com/","3":"RadioactiveThings.com","4":"As Major General Nichols of the Manhattan project put it: \"Our best source,  the Shinkolobwe mine, ...","10":"kcddveXePECqkk"},"5":{"1":"FsqBhrfUURQcKHI"}},{"1":{"1":"http://talknuclear.ca/wp-content/uploads/2014/08/radiation-from-bananas.jpg","3":599,"4":641},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSlhqhU7yHlFVuI5YFnhnudkAOouIrYTetWsAPQ8OSwYbz8AFr1","3":187,"4":200},"3":{"1":"TalkNuclear","2":"http://talknuclear.ca/2014/08/just-how-radioactive-is-uranium-ore/","3":"Just How Radioactive is Uranium Ore? | TalkNuclear","4":"radiation from bananas","10":"JeIVstWCOVqrYN"},"5":{"1":"JbifUMcnhPfcvxU"}},{"1":{"1":"https://previews.123rf.com/images/merial1/merial11205/merial1120500076/13672876-uranium-ore-uraninite-from-pribram-czech-republic.jpg","3":1300,"4":1038},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQCyxlmproQBZz6Vw97Xu0No5l7N8s0BTt_HrvRm7HI4jL7fNmb","3":200,"4":160},"3":{"1":"123RF.com","2":"https://www.123rf.com/photo_13672876_uranium-ore-uraninite-from-pribram-czech-republic.html","3":"Uranium Ore (uraninite) From Pribram, Czech Republic Stock ...","4":"Uranium ore (uraninite) from Pribram, Czech republic Stock Photo - 13672876","10":"jGfydBHejDNsUv"},"5":{"1":"spMNHbdmpmkhhPI"}},{"1":{"1":"https://images.enca.com/encadrupal/styles/600_383/s3/WEB_PHOTO_KAROO_RYSTKUIL_05032016.jpg","3":600,"4":383},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9dFVWftqcZ4hgMriqLFGNOhcDPD9iiwWipfkxyFbYTgyG5N7u","3":200,"4":127},"3":{"1":"eNCA","2":"http://www.enca.com/south-africa/uranium-mining-karoo-south-africas-new-gold","3":"Uranium mining in the Karoo South Africa's new gold?","4":"The entrance to the Cameron shaft, an old uranium trial mine 40km from  Beaufort West.","10":"TuhPBLPjSHnFFr"},"5":{"1":"TfETPSaOJhXBxDu"}},{"1":{"1":"http://www.world-nuclear.org/getattachment/Nuclear-Basics/How-is-uranium-ore-made-into-nuclear-fuel/yellowcake-(Cameco).jpg.aspx?","3":709,"4":915},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQfCvtqHk8x539fQ_UFrgd5sKuAEKtHeVifrIrAnyqoLFfyijEKUQ","3":155,"4":200},"3":{"1":"World Nuclear Association","2":"http://www.world-nuclear.org/nuclear-basics/how-is-uranium-ore-made-into-nuclear-fuel.aspx","3":"How uranium ore is made into nuclear fuel - World Nuclear ...","4":"yellowcake-(Cameco).jpg","10":"EgOqgwGpPvWtNo"},"5":{"1":"deoFQVqsXRHBxDx"}},{"1":{"1":"https://media.gettyimages.com/photos/kilogram-of-uranium-ore-gives-merely-37-grams-of-yellow-cake-in-mine-picture-id844444270","3":1024,"4":683},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT8FrUCgyfEdOSaMt3n3diQQK_CofwQcGS85fOnJg07RMeM71ec","3":200,"4":133},"3":{"1":"Getty Images","2":"https://www.gettyimages.com/detail/news-photo/kilogram-of-uranium-ore-gives-merely-37-grams-of-yellow-news-photo/844444270","3":"Inside Indias secure uranium processing facility Pictures ...","4":"JADUGODA, JHARKAHND, INDIA - SEPTEMBER 03: A 100 kilogram of uranium ore  gives","10":"CBBCmdctDTjUYS"},"5":{"1":"wcimccDXRxrPPYo"}},{"1":{"1":"https://ae01.alicdn.com/kf/HTB1X_yaLpXXXXbtXXXXq6xXFXXXS/Domestic-rare-autunite-fluorescent-Mica-natural-uranium-ore-original-stone-mineral-specimens-H1024.jpg_640x640.jpg","3":639,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvFFjVksCk-mht4Bki6CGFuGeLDrzAn8RxL84tEauRoyuuuS1t","3":199,"4":200},"3":{"1":"AliExpress.com","2":"https://www.aliexpress.com/item/Domestic-rare-autunite-fluorescent-Mica-natural-uranium-ore-original-stone-mineral-specimens-H1024/32594437365.html","3":"Domestic rare autunite fluorescent Mica natural uranium ore ...","4":"Domestic rare autunite fluorescent Mica natural uranium ore original stone  mineral specimens H1024","10":"LGJotHvCumpisG"},"5":{"1":"PHYmmwVGNgxyWXQ"},"7":{"1":{"10":{"3":"Domestic rare autunite fluorescent Mica natural uranium ore original stone  mineral specimens H1024 on Aliexpress.com | Alibaba Group","6":false,"7":856.7999877929688,"8":"USD"}}}},{"1":{"1":"https://vignette.wikia.nocookie.net/thetekkit/images/8/88/Uranium_Ore.png/revision/latest?cb=20121011054131","3":256,"4":256},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhqcbjnHtAH4CZb_F1qk6JU_T4vSYyE8PnZduQj3Wc8nBV1OUw","3":200,"4":200},"3":{"1":"The Tekkit Classic Wiki - Fandom","2":"http://tekkitclassic.wikia.com/wiki/Uranium_Ore","3":"Uranium Ore | The Tekkit Classic Wiki | FANDOM powered by Wikia","4":"Uranium Ore","10":"fbHJlnOSnoAlXg"},"5":{"1":"LKECMxeYlJQYQvx"}},{"1":{"1":"http://pcbheaven.com/opendir/images/thumbs/od_1281_4_1340220138.png","3":500,"4":334},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfyHMiuy7oPGB1SaoPbdwAvG0u32Vc-nBmQX64YIqQvoP3vByYUg","3":200,"4":133},"3":{"1":"Hesed.info","2":"http://hesed.info/blog/yellowcake-uranium-ore.abp","3":"Yellowcake Uranium Ore","4":"","10":"bEvuSpOOWAaPlY"},"5":{"1":"CSCohElwJwuXNPc"}},{"1":{"1":"https://keanchancom.files.wordpress.com/2016/06/uranium-ore.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZjU6qvNMW95223xEEvNN3XYlPx8R12QV3dbjh1-5vTpHLkDmCHw","3":200,"4":149},"3":{"1":"Hitman Game","2":"http://the.hitmangame.info/jpg/fluorescent-uranium-ore.php","3":"Fluorescent Uranium Ore - Hitman Game","4":"Fluorescent Uranium Ore","10":"KwgdiKaesnYMur"},"5":{"1":"XirjwbBuBUlIjJX"}},{"1":{"1":"https://i.ytimg.com/vi/vNbV4whWHsQ/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRqKbVcx3LMW1wZ8aghfTW9JKDQPYXD0LqNrjPLPPwLE09ABedF9A","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=vNbV4whWHsQ","3":"Uranium Ores -The Better - YouTube","4":"Uranium Ores -The Better","10":"cmwKHdELShqVIL"},"5":{"1":"uLnJXqtjVcLJSBT"},"7":{"1":{"11":{"1":"Uranium Ores -The Better","2":"If you collect rocks, its a good idea to part the specimens in 3 groups:  good - better - best These specimens in the video are in my group \"better\"  The \"best...","3":"12:25","4":"737","5":"1484438400000","6":"weirdmeister inc.","7":"18","8":"15"}}}},{"1":{"1":"https://www.mining-technology.com/wp-content/uploads/sites/8/2017/10/1-image-Australia.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRDRzupy-lorOlAP0d-CEOFeHwOPm3o79KIYPpZ_yeQZvwIt3uB","3":200,"4":133},"3":{"1":"Mining Technology","2":"https://www.mining-technology.com/features/featureradioactive-riches-the-five-biggest-uranium-rich-countries-4274059/","3":"Radioactive riches – the five countries with the biggest ...","4":"Australia's Ranger mine is the world's third biggest uranium producing mine.","10":"YfKTBasdlWQntu"},"5":{"1":"DtGOUiEJFvqvbnO"}}],"2":3}
\ No newline at end of file
diff --git a/benchmarks/IsolateSpawn/dart/IsolateSpawn.dart b/benchmarks/IsolateSpawn/dart/IsolateSpawn.dart
index 070edd0..5742568 100644
--- a/benchmarks/IsolateSpawn/dart/IsolateSpawn.dart
+++ b/benchmarks/IsolateSpawn/dart/IsolateSpawn.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:isolate';
 import 'dart:math';
 
@@ -11,10 +10,10 @@
 
 import 'package:compiler/src/dart2js.dart' as dart2js_main;
 
-class SpawnLatencyAndMemory {
-  SpawnLatencyAndMemory(this.name);
+class SpawnLatency {
+  SpawnLatency(this.name);
 
-  Future<ResultMessageLatencyAndMemory> run() async {
+  Future<ResultMessageLatency> run() async {
     final completerResult = Completer();
     final receivePort = ReceivePort()..listen(completerResult.complete);
     final Completer<DateTime> isolateExitedCompleter = Completer<DateTime>();
@@ -24,14 +23,12 @@
       });
     final DateTime beforeSpawn = DateTime.now();
     await Isolate.spawn(
-        isolateCompiler,
-        StartMessageLatencyAndMemory(
-            receivePort.sendPort, beforeSpawn, ProcessInfo.currentRss),
+        isolateCompiler, StartMessageLatency(receivePort.sendPort, beforeSpawn),
         onExit: onExitReceivePort.sendPort,
         onError: onExitReceivePort.sendPort);
     final DateTime afterSpawn = DateTime.now();
 
-    final ResultMessageLatencyAndMemory result = await completerResult.future;
+    final ResultMessageLatency result = await completerResult.future;
     receivePort.close();
     final DateTime isolateExited = await isolateExitedCompleter.future;
     result.timeToExitUs = isolateExited.difference(beforeSpawn).inMicroseconds;
@@ -42,8 +39,7 @@
     return result;
   }
 
-  Future<AggregatedResultMessageLatencyAndMemory> measureFor(
-      int minimumMillis) async {
+  Future<AggregatedResultMessageLatency> measureFor(int minimumMillis) async {
     final minimumMicros = minimumMillis * 1000;
     final watch = Stopwatch()..start();
     final Metric toAfterIsolateSpawnUs = LatencyMetric("${name}ToAfterSpawn");
@@ -51,26 +47,24 @@
     final Metric toFinishRunningCodeUs =
         LatencyMetric("${name}ToFinishRunning");
     final Metric toExitUs = LatencyMetric("${name}ToExit");
-    final Metric deltaRss = MemoryMetric("${name}Delta");
     while (watch.elapsedMicroseconds < minimumMicros) {
-      final ResultMessageLatencyAndMemory result = await run();
+      final ResultMessageLatency result = await run();
       toAfterIsolateSpawnUs.add(result.timeToIsolateSpawnUs);
       toStartRunningCodeUs.add(result.timeToStartRunningCodeUs);
       toFinishRunningCodeUs.add(result.timeToFinishRunningCodeUs);
       toExitUs.add(result.timeToExitUs);
-      deltaRss.add(result.deltaRss);
     }
-    return AggregatedResultMessageLatencyAndMemory(toAfterIsolateSpawnUs,
-        toStartRunningCodeUs, toFinishRunningCodeUs, toExitUs, deltaRss);
+    return AggregatedResultMessageLatency(toAfterIsolateSpawnUs,
+        toStartRunningCodeUs, toFinishRunningCodeUs, toExitUs);
   }
 
-  Future<AggregatedResultMessageLatencyAndMemory> measure() async {
+  Future<AggregatedResultMessageLatency> measure() async {
     await measureFor(500); // warm-up
     return measureFor(4000); // actual measurement
   }
 
   Future<void> report() async {
-    final AggregatedResultMessageLatencyAndMemory result = await measure();
+    final AggregatedResultMessageLatency result = await measure();
     print(result);
   }
 
@@ -106,60 +100,50 @@
 }
 
 class LatencyMetric extends Metric {
-  LatencyMetric(String name) : super(prefix: "${name}(Latency", suffix: " us.");
+  LatencyMetric(String name) : super(prefix: "$name(Latency", suffix: " us.");
 }
 
-class MemoryMetric extends Metric {
-  MemoryMetric(String name) : super(prefix: "${name}Rss(MemoryUse", suffix: "");
-
-  toString() => "$prefix): ${_average()}$suffix\n";
-}
-
-class StartMessageLatencyAndMemory {
-  StartMessageLatencyAndMemory(this.sendPort, this.spawned, this.rss);
+class StartMessageLatency {
+  StartMessageLatency(this.sendPort, this.spawned);
 
   final SendPort sendPort;
   final DateTime spawned;
-  final int rss;
 }
 
-class ResultMessageLatencyAndMemory {
-  ResultMessageLatencyAndMemory(
+class ResultMessageLatency {
+  ResultMessageLatency(
       {this.timeToStartRunningCodeUs,
       this.timeToFinishRunningCodeUs,
-      this.deltaRss});
+      this.deltaHeap});
 
   final int timeToStartRunningCodeUs;
   final int timeToFinishRunningCodeUs;
-  final int deltaRss;
+  final int deltaHeap;
 
   int timeToIsolateSpawnUs;
   int timeToExitUs;
 }
 
-class AggregatedResultMessageLatencyAndMemory {
-  AggregatedResultMessageLatencyAndMemory(
+class AggregatedResultMessageLatency {
+  AggregatedResultMessageLatency(
     this.toAfterIsolateSpawnUs,
     this.toStartRunningCodeUs,
     this.toFinishRunningCodeUs,
     this.toExitUs,
-    this.deltaRss,
   );
 
   String toString() => """$toAfterIsolateSpawnUs
 $toStartRunningCodeUs
 $toFinishRunningCodeUs
-$toExitUs
-$deltaRss""";
+$toExitUs""";
 
   final Metric toAfterIsolateSpawnUs;
   final Metric toStartRunningCodeUs;
   final Metric toFinishRunningCodeUs;
   final Metric toExitUs;
-  final Metric deltaRss;
 }
 
-Future<void> isolateCompiler(StartMessageLatencyAndMemory start) async {
+Future<void> isolateCompiler(StartMessageLatency start) async {
   final DateTime timeRunningCodeUs = DateTime.now();
   await runZoned(
       () => dart2js_main.internalMain(<String>[
@@ -169,14 +153,13 @@
       zoneSpecification: ZoneSpecification(
           print: (Zone self, ZoneDelegate parent, Zone zone, String line) {}));
   final DateTime timeFinishRunningCodeUs = DateTime.now();
-  start.sendPort.send(ResultMessageLatencyAndMemory(
+  start.sendPort.send(ResultMessageLatency(
       timeToStartRunningCodeUs:
           timeRunningCodeUs.difference(start.spawned).inMicroseconds,
       timeToFinishRunningCodeUs:
-          timeFinishRunningCodeUs.difference(start.spawned).inMicroseconds,
-      deltaRss: ProcessInfo.currentRss - start.rss));
+          timeFinishRunningCodeUs.difference(start.spawned).inMicroseconds));
 }
 
 Future<void> main() async {
-  await SpawnLatencyAndMemory("IsolateSpawn.Dart2JS").report();
+  await SpawnLatency("IsolateSpawn.Dart2JS").report();
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
new file mode 100644
index 0000000..7969877
--- /dev/null
+++ b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:developer';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:compiler/src/dart2js.dart' as dart2js_main;
+import 'package:vm_service/vm_service.dart' as vm_service;
+import 'package:vm_service/vm_service_io.dart' as vm_service_io;
+
+class Result {
+  const Result(
+      this.rssOnStart, this.rssOnEnd, this.heapOnStart, this.heapOnEnd);
+
+  final int rssOnStart;
+  final int rssOnEnd;
+  final int heapOnStart;
+  final int heapOnEnd;
+}
+
+class StartMessage {
+  const StartMessage(this.wsUri, this.groupRefId, this.sendPort);
+
+  final String wsUri;
+  final String groupRefId;
+  final SendPort sendPort;
+}
+
+class SpawnMemory {
+  SpawnMemory(this.name, this.wsUri, this.groupRefId);
+
+  Future<void> report() async {
+    const numberOfRuns = 3;
+
+    int sumDeltaRssOnStart = 0;
+    int sumDeltaRssOnEnd = 0;
+    int sumDeltaHeapOnStart = 0;
+    int sumDeltaHeapOnEnd = 0;
+    for (int i = 0; i < numberOfRuns; i++) {
+      final receivePort = ReceivePort();
+      final beforeRss = ProcessInfo.currentRss;
+      final beforeHeap = await currentHeapUsage(wsUri, groupRefId);
+
+      final startMessage =
+          StartMessage(wsUri, groupRefId, receivePort.sendPort);
+      await Isolate.spawn(isolateCompiler, startMessage);
+
+      final Result result = await receivePort.first;
+      sumDeltaRssOnStart += result.rssOnStart - beforeRss;
+      sumDeltaRssOnEnd += result.rssOnEnd - beforeRss;
+      sumDeltaHeapOnStart += result.heapOnStart - beforeHeap;
+      sumDeltaHeapOnEnd += result.heapOnEnd - beforeHeap;
+    }
+    print(
+        "${name}RssOnStart(MemoryUse): ${sumDeltaRssOnStart ~/ numberOfRuns}");
+    print("${name}RssOnEnd(MemoryUse): ${sumDeltaRssOnEnd ~/ numberOfRuns}");
+    print(
+        "${name}HeapOnStart(MemoryUse): ${sumDeltaHeapOnStart ~/ numberOfRuns}");
+    print("${name}HeapOnEnd(MemoryUse): ${sumDeltaHeapOnEnd ~/ numberOfRuns}");
+  }
+
+  final String name;
+  final String wsUri;
+  final String groupRefId;
+  RawReceivePort receivePort;
+}
+
+Future<void> isolateCompiler(StartMessage startMessage) async {
+  final rssOnStart = ProcessInfo.currentRss;
+  final heapOnStart =
+      await currentHeapUsage(startMessage.wsUri, startMessage.groupRefId);
+  await runZoned(
+      () => dart2js_main.internalMain(<String>[
+            "benchmarks/IsolateSpawnMemory/dart/helloworld.dart",
+            '--libraries-spec=sdk/lib/libraries.json'
+          ]),
+      zoneSpecification: ZoneSpecification(
+          print: (Zone self, ZoneDelegate parent, Zone zone, String line) {}));
+  startMessage.sendPort.send(Result(
+      rssOnStart,
+      ProcessInfo.currentRss,
+      heapOnStart,
+      await currentHeapUsage(startMessage.wsUri, startMessage.groupRefId)));
+  ReceivePort(); // prevent isolate from exiting to ensure Rss monotonically grows
+}
+
+Future<int> currentHeapUsage(String wsUri, String groupRefId) async {
+  final vm_service.VmService vmService =
+      await vm_service_io.vmServiceConnectUri(wsUri);
+  final vm_service.MemoryUsage usage =
+      await vmService.getIsolateGroupMemoryUsage(groupRefId);
+  vmService.dispose();
+  return usage.heapUsage + usage.externalUsage;
+}
+
+Future<void> main() async {
+  final ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
+  final Uri observatoryUri = info.serverUri;
+  final String wsUri =
+      'ws://${observatoryUri.authority}${observatoryUri.path}ws';
+  final vm_service.VmService vmService =
+      await vm_service_io.vmServiceConnectUri(wsUri);
+  final String mainGroupRefId = await getMainGroupRefId(vmService);
+  vmService.dispose();
+
+  await SpawnMemory("IsolateSpawnMemory.Dart2JSDelta", wsUri, mainGroupRefId)
+      .report();
+}
+
+Future<String> getMainGroupRefId(vm_service.VmService vmService) async {
+  final vm = await vmService.getVM();
+  for (vm_service.IsolateGroupRef groupRef in vm.isolateGroups) {
+    final vm_service.IsolateGroup group =
+        await vmService.getIsolateGroup(groupRef.id);
+    for (vm_service.IsolateRef isolateRef in group.isolates) {
+      final isolateOrSentinel = await vmService.getIsolate(isolateRef.id);
+      if (isolateOrSentinel is vm_service.Isolate) {
+        final vm_service.Isolate isolate = isolateOrSentinel;
+        if (isolate.name == 'main') {
+          return groupRef.id;
+        }
+      }
+    }
+  }
+  throw "Could not find main isolate";
+}
diff --git a/benchmarks/IsolateSpawnMemory/dart/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
new file mode 100644
index 0000000..8977e0f
--- /dev/null
+++ b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
@@ -0,0 +1,3 @@
+main() {
+  print('Hello, world!');
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index ee4e500..3e51f3c 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1336,7 +1336,8 @@
     if (newType == null || typeOperations.isSameType(newType, previousType)) {
       return new ExpressionInfo<Variable, Type>(this, this, this);
     }
-    assert(typeOperations.isSubtypeOf(newType, previousType));
+    assert(typeOperations.isSubtypeOf(newType, previousType),
+        "Expected $newType to be a subtype of $previousType.");
     return _finishTypeTest(typeOperations, variable, info, newType);
   }
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index cc75d4f..29f32d1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1680,6 +1680,35 @@
 const Template<
     Message Function(
         String
+            name)> templateDeferredExtensionImport = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Extension '#name' cannot be imported through a deferred import.""",
+    tipTemplate: r"""Try adding the `hide #name` to the import.""",
+    withArguments: _withArgumentsDeferredExtensionImport);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDeferredExtensionImport =
+    const Code<Message Function(String name)>(
+  "DeferredExtensionImport",
+  templateDeferredExtensionImport,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDeferredExtensionImport(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeDeferredExtensionImport,
+      message:
+          """Extension '${name}' cannot be imported through a deferred import.""",
+      tip: """Try adding the `hide ${name}` to the import.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
             name)> templateDeferredPrefixDuplicated = const Template<
         Message Function(String name)>(
     messageTemplate:
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index e838b3c..cb751ab 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -2421,7 +2421,7 @@
     }
 
     Token token = typeInfo.parseType(beforeType, this);
-    assert(token.next == name);
+    assert(token.next == name || token.next.isEof);
 
     IdentifierContext context = kind == DeclarationKind.TopLevel
         ? IdentifierContext.topLevelVariableDeclaration
@@ -3402,6 +3402,9 @@
         // TODO(danrubel): report invalid constructor name
         // Currently multiple listeners report this error, but that logic should
         // be removed and the error reported here instead.
+        if (isOperator) {
+          isConstructor = false;
+        }
       }
       if (getOrSet != null) {
         // Recovery
@@ -4343,6 +4346,10 @@
         token = parseSend(next, IdentifierContext.expressionContinuation);
         next = token.next;
         listener.endBinaryExpression(period);
+      } else if (optional('!', next)) {
+        listener.handleNonNullAssertExpression(next);
+        token = next;
+        next = token.next;
       }
       TypeParamOrArgInfo typeArg = computeMethodTypeArguments(token);
       if (typeArg != noTypeParamOrArg) {
diff --git a/pkg/front_end/lib/src/fasta/quote.dart b/pkg/_fe_analyzer_shared/lib/src/parser/quote.dart
similarity index 89%
rename from pkg/front_end/lib/src/fasta/quote.dart
rename to pkg/_fe_analyzer_shared/lib/src/parser/quote.dart
index 71ace2d..6303272 100644
--- a/pkg/front_end/lib/src/fasta/quote.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/quote.dart
@@ -30,9 +30,7 @@
         hexDigitValue,
         isHexDigit;
 
-import 'problems.dart' show unhandled;
-
-import 'fasta_codes.dart' as fasta;
+import 'package:_fe_analyzer_shared/src/messages/codes.dart' as codes;
 
 enum Quote {
   Single,
@@ -54,7 +52,7 @@
   if (first.startsWith('r"')) return Quote.RawDouble;
   if (first.startsWith("'")) return Quote.Single;
   if (first.startsWith("r'")) return Quote.RawSingle;
-  return unhandled(first, "analyzeQuote", -1, null);
+  return throw UnsupportedError("'$first' in analyzeQuote");
 }
 
 // Note: based on [StringValidator.quotingFromString]
@@ -104,7 +102,7 @@
     case Quote.RawMultiLineDouble:
       return lengthOfOptionalWhitespacePrefix(first, 4);
   }
-  return unhandled("$quote", "firstQuoteLength", -1, null);
+  return throw UnsupportedError("'$quote' in  firstQuoteLength");
 }
 
 int lastQuoteLength(Quote quote) {
@@ -121,7 +119,7 @@
     case Quote.RawMultiLineDouble:
       return 3;
   }
-  return unhandled("$quote", "lastQuoteLength", -1, null);
+  return throw UnsupportedError("'$quote' in lastQuoteLength");
 }
 
 String unescapeFirstStringPart(String first, Quote quote, Object location,
@@ -174,7 +172,7 @@
           ? string
           : unescapeCodeUnits(string.codeUnits, true, location, listener);
   }
-  return unhandled("$quote", "unescape", -1, null);
+  return throw new UnsupportedError("'$quote' in unescape");
 }
 
 // Note: based on
@@ -195,7 +193,7 @@
     } else if (!isRaw && code == $BACKSLASH) {
       if (codeUnits.length == ++i) {
         listener.handleUnescapeError(
-            fasta.messageInvalidUnicodeEscape, location, i, 1);
+            codes.messageInvalidUnicodeEscape, location, i, 1);
         return new String.fromCharCodes(codeUnits);
       }
       code = codeUnits[i];
@@ -224,7 +222,7 @@
         // Expect exactly 2 hex digits.
         int begin = i;
         if (codeUnits.length <= i + 2) {
-          listener.handleUnescapeError(fasta.messageInvalidHexEscape, location,
+          listener.handleUnescapeError(codes.messageInvalidHexEscape, location,
               begin, codeUnits.length + 1 - begin);
           return new String.fromCharCodes(codeUnits);
         }
@@ -233,7 +231,7 @@
           int digit = codeUnits[++i];
           if (!isHexDigit(digit)) {
             listener.handleUnescapeError(
-                fasta.messageInvalidHexEscape, location, begin, i + 1 - begin);
+                codes.messageInvalidHexEscape, location, begin, i + 1 - begin);
             return new String.fromCharCodes(codeUnits);
           }
           code = (code << 4) + hexDigitValue(digit);
@@ -241,7 +239,7 @@
       } else if (code == $u) {
         int begin = i;
         if (codeUnits.length == i + 1) {
-          listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+          listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
               location, begin, codeUnits.length + 1 - begin);
           return new String.fromCharCodes(codeUnits);
         }
@@ -249,21 +247,21 @@
         if (code == $OPEN_CURLY_BRACKET) {
           // Expect 1-6 hex digits followed by '}'.
           if (codeUnits.length == ++i) {
-            listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+            listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
                 location, begin, i + 1 - begin);
             return new String.fromCharCodes(codeUnits);
           }
           code = 0;
           for (int j = 0; j < 7; j++) {
             if (codeUnits.length == ++i) {
-              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+              listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
                   location, begin, i + 1 - begin);
               return new String.fromCharCodes(codeUnits);
             }
             int digit = codeUnits[i];
             if (j != 0 && digit == $CLOSE_CURLY_BRACKET) break;
             if (!isHexDigit(digit)) {
-              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+              listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
                   location, begin, i + 2 - begin);
               return new String.fromCharCodes(codeUnits);
             }
@@ -272,7 +270,7 @@
         } else {
           // Expect exactly 4 hex digits.
           if (codeUnits.length <= i + 4) {
-            listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+            listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
                 location, begin, codeUnits.length + 1 - begin);
             return new String.fromCharCodes(codeUnits);
           }
@@ -280,7 +278,7 @@
           for (int j = 0; j < 4; j++) {
             int digit = codeUnits[++i];
             if (!isHexDigit(digit)) {
-              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+              listener.handleUnescapeError(codes.messageInvalidUnicodeEscape,
                   location, begin, i + 1 - begin);
               return new String.fromCharCodes(codeUnits);
             }
@@ -289,7 +287,7 @@
         }
         if (code > 0x10FFFF) {
           listener.handleUnescapeError(
-              fasta.messageInvalidCodePoint, location, begin, i + 1 - begin);
+              codes.messageInvalidCodePoint, location, begin, i + 1 - begin);
           return new String.fromCharCodes(codeUnits);
         }
       } else {
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
similarity index 86%
rename from pkg/front_end/lib/src/fasta/source/stack_listener.dart
rename to pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 89a515c..a9b9681 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -2,34 +2,27 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library fasta.stack_listener;
+library _fe_analyzer_shared.stack_listener;
 
-import 'package:_fe_analyzer_shared/src/parser/parser.dart'
-    show Listener, MemberKind, Parser, lengthOfSpan;
-
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart'
-    show IdentifierContext;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
-
-import 'package:kernel/ast.dart'
-    show AsyncMarker, Expression, FunctionNode, TreeNode;
-
-import '../fasta_codes.dart'
+import '../messages/codes.dart'
     show
         Code,
         LocatedMessage,
         Message,
         codeCatchSyntaxExtraParameters,
         codeNativeClauseShouldBeAnnotation,
-        templateInternalProblemStackNotEmpty;
+        templateInternalProblemStackNotEmpty,
+        templateInternalProblemUnhandled;
 
-import '../problems.dart'
-    show internalProblem, unhandled, unimplemented, unsupported;
+import '../scanner/scanner.dart' show Token;
 
-import '../quote.dart' show unescapeString;
+import 'identifier_context.dart' show IdentifierContext;
 
-import 'value_kinds.dart';
+import 'parser.dart' show Listener, MemberKind, lengthOfSpan;
+
+import 'quote.dart' show unescapeString;
+
+import 'value_kind.dart';
 
 enum NullValue {
   Arguments,
@@ -80,6 +73,9 @@
 abstract class StackListener extends Listener {
   final Stack stack = new Stack();
 
+  /// Used to report an internal error encountered in the stack listener.
+  dynamic internalProblem(Message message, int charOffset, Uri uri);
+
   /// Checks that [value] matches the expected [kind].
   ///
   /// Use this in assert statements like
@@ -214,37 +210,13 @@
     }
   }
 
-  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
-  // and ast_builder.dart.
-  void finishFunction(
-      covariant formals, AsyncMarker asyncModifier, covariant body) {
-    return unsupported("finishFunction", -1, uri);
-  }
-
-  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
-  // and ast_builder.dart.
-  dynamic finishFields() {
-    return unsupported("finishFields", -1, uri);
-  }
-
-  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
-  // and ast_builder.dart.
-  List<Expression> finishMetadata(TreeNode parent) {
-    return unsupported("finishMetadata", -1, uri);
-  }
-
-  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
-  // and ast_builder.dart.
-  void exitLocalScope() => unsupported("exitLocalScope", -1, uri);
-
-  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart.
-  dynamic parseSingleExpression(
-      Parser parser, Token token, FunctionNode parameters) {
-    return unsupported("finishSingleExpression", -1, uri);
-  }
-
   void push(Object node) {
-    if (node == null) unhandled("null", "push", -1, uri);
+    if (node == null) {
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments("null", "push"),
+          -1,
+          uri);
+    }
     stack.push(node);
   }
 
@@ -282,7 +254,10 @@
   @override
   void logEvent(String name) {
     printEvent(name);
-    unhandled(name, "$runtimeType", -1, uri);
+    internalProblem(
+        templateInternalProblemUnhandled.withArguments(name, "$runtimeType"),
+        -1,
+        uri);
   }
 
   @override
@@ -453,7 +428,11 @@
       Token token = pop();
       push(unescapeString(token.lexeme, token, this));
     } else {
-      unimplemented("string interpolation", endToken.charOffset, uri);
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments(
+              "string interpolation", "endLiteralString"),
+          endToken.charOffset,
+          uri);
     }
   }
 
@@ -490,8 +469,8 @@
       Message message, Token startToken, Token endToken) {
     debugEvent("Error: ${message.message}");
     if (isIgnoredError(message.code, startToken)) return;
-    addProblem(message, offsetForToken(startToken),
-        lengthOfSpan(startToken, endToken));
+    addProblem(
+        message, startToken.charOffset, lengthOfSpan(startToken, endToken));
   }
 
   bool isIgnoredError(Code<dynamic> code, Token token) {
@@ -627,9 +606,3 @@
 
   String toString() => "ParserRecovery(@$charOffset)";
 }
-
-/// A null-aware alternative to `token.offset`.  If [token] is `null`, returns
-/// `TreeNode.noOffset`.
-int offsetForToken(Token token) {
-  return token == null ? TreeNode.noOffset : token.offset;
-}
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/value_kind.dart b/pkg/_fe_analyzer_shared/lib/src/parser/value_kind.dart
new file mode 100644
index 0000000..92549f0
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/value_kind.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'stack_listener.dart' show NullValue;
+
+/// [ValueKind] is used in [StackListener.checkState] to document and check the
+/// expected values of the stack.
+///
+/// Add new value kinds as needed for documenting and checking the various stack
+/// listener implementations.
+abstract class ValueKind {
+  const ValueKind();
+
+  /// Checks the [value] an returns `true` if the value is of the expected kind.
+  bool check(Object value);
+}
+
+/// A [ValueKind] for a particular type [T], optionally with a recognized
+/// [NullValue].
+class SingleValueKind<T> implements ValueKind {
+  final NullValue nullValue;
+
+  const SingleValueKind([this.nullValue]);
+
+  @override
+  bool check(Object value) {
+    if (nullValue != null && value == nullValue) {
+      return true;
+    }
+    return value is T;
+  }
+
+  String toString() {
+    if (nullValue != null) {
+      return '$T or $nullValue';
+    }
+    return '$T';
+  }
+}
+
+/// A [ValueKind] for the union of a list of [ValueKind]s.
+class UnionValueKind implements ValueKind {
+  final List<ValueKind> kinds;
+
+  const UnionValueKind(this.kinds);
+
+  @override
+  bool check(Object value) {
+    for (ValueKind kind in kinds) {
+      if (kind.check(value)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    String or = '';
+    for (ValueKind kind in kinds) {
+      sb.write(or);
+      sb.write(kind);
+      or = ' or ';
+    }
+    return sb.toString();
+  }
+}
+
+/// Helper method for creating a list of [ValueKind]s of the given length
+/// [count].
+List<ValueKind> repeatedKinds(ValueKind kind, int count) {
+  return new List.generate(count, (_) => kind);
+}
+
+/// Helper method for creating a union of a list of [ValueKind]s.
+ValueKind unionOfKinds(List<ValueKind> kinds) {
+  return new UnionValueKind(kinds);
+}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment/data/assignment.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment/data/assignment.dart
index 39006b3..d76d643 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment/data/assignment.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment/data/assignment.dart
@@ -41,6 +41,6 @@
 questionEq_rhs_not_guaranteed_to_execute() {
   late int v;
   int? i;
-  i ??= (v = 0);
-  /*unassigned*/ v;
+  /*cfe.unassigned*/ i ??= (v = 0);
+  /*analyzer.unassigned*/ v;
 }
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart
new file mode 100644
index 0000000..9a0cf4f
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*cfe.library: nnbd=true*/
+
+import 'opt_out.dart';
+
+/*class: Class1:Class1,LegacyClass1,Object*/
+class Class1 extends LegacyClass1 {}
+
+/*class: Class2:Class2<T*>,LegacyClass2<T>,Object*/
+class Class2<T> extends LegacyClass2<T> {}
+
+/*class: Class3a:Class3a<T*>,GenericInterface<T*>,LegacyClass3<T>,Object*/
+class Class3a<T> extends LegacyClass3<T> {}
+
+/*class: Class3b:Class3b<T*>,GenericInterface<T*>,LegacyClass3<T>,Object*/
+class
+// TODO(johnniwinther): Avoid this error.
+/*error: AmbiguousSupertypes*/
+    Class3b<T> extends LegacyClass3<T> implements GenericInterface<T> {}
+
+/*class: Class4a:Class4a,GenericInterface<num*>,LegacyClass4,Object*/
+class Class4a extends LegacyClass4 {}
+
+/*class: Class4b:Class4b,GenericInterface<num!>,Object*/
+class Class4b implements GenericInterface<num> {}
+
+/*class: Class4c:Class4c,GenericInterface<num?>,Object*/
+class Class4c implements GenericInterface<num?> {}
+
+/*class: Class4d:Class4d,GenericInterface<num*>,LegacyClass4,Object*/
+class
+// TODO(johnniwinther): Avoid this error.
+/*error: AmbiguousSupertypes*/
+    Class4d extends LegacyClass4 implements GenericInterface<num> {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/opt_out.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/opt_out.dart
new file mode 100644
index 0000000..d35f46c
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/opt_out.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.5
+
+/*library: nnbd=false*/
+
+/*class: GenericInterface:GenericInterface<T*>,Object*/
+abstract class GenericInterface<T> {}
+
+/*class: LegacyClass1:LegacyClass1,Object*/
+class LegacyClass1 {}
+
+/*class: LegacyClass2:LegacyClass2<T*>,Object*/
+class LegacyClass2<T> {}
+
+/*class: LegacyClass3:GenericInterface<T*>,LegacyClass3<T*>,Object*/
+class LegacyClass3<T> implements GenericInterface<T> {}
+
+/*class: LegacyClass4:GenericInterface<num*>,LegacyClass4,Object*/
+class LegacyClass4 implements GenericInterface<num> {}
diff --git a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
index 85f6a7f..a5d402b 100644
--- a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
@@ -51,37 +51,25 @@
     }
     // int timeStamp = int.parse(fields[0], onError: (_) => -1);
     String opCode = fields[1];
-    if (opCode == InstrumentationService.TAG_NOTIFICATION) {
+    if (opCode == InstrumentationLogAdapter.TAG_NOTIFICATION) {
       return convertNotification(decodeJson(line, fields[2]));
     } else if (opCode == 'Read') {
       // 1434096943209:Read:/some/file/path:1434095535000:<file content>
       //String filePath = fields[2];
       readBuffer = new StringBuffer(fields.length > 4 ? fields[4] : '');
       return null;
-    } else if (opCode == InstrumentationService.TAG_REQUEST) {
+    } else if (opCode == InstrumentationLogAdapter.TAG_REQUEST) {
       return convertRequest(decodeJson(line, fields[2]));
-    } else if (opCode == InstrumentationService.TAG_RESPONSE) {
+    } else if (opCode == InstrumentationLogAdapter.TAG_RESPONSE) {
       // 1434096937454:Res:{"id"::"0","result"::{"version"::"1.7.0"}}
       return convertResponse(decodeJson(line, fields[2]));
-    } else if (opCode == InstrumentationService.TAG_ANALYSIS_TASK) {
-      // 1434096943208:Task:/Users/
-      return null;
-    } else if (opCode == InstrumentationService.TAG_LOG_ENTRY) {
+    } else if (opCode == InstrumentationLogAdapter.TAG_LOG_ENTRY) {
       // 1434096937454:Res:{"id"::"0","result"::{"version"::"1.7.0"}}
       return null;
-    } else if (opCode == InstrumentationService.TAG_PERFORMANCE) {
-      //1434096960092:Perf:analysis_full:16884:context_id=0
-      return null;
-    } else if (opCode == InstrumentationService.TAG_SUBPROCESS_START) {
-      // 1434096938634:SPStart:0:/Users/da
-      return null;
-    } else if (opCode == InstrumentationService.TAG_SUBPROCESS_RESULT) {
-      // 1434096939068:SPResult:0:0:"{\"packages\"::{\"rpi_lidar\"::\"/Users
-      return null;
-    } else if (opCode == InstrumentationService.TAG_VERSION) {
+    } else if (opCode == InstrumentationLogAdapter.TAG_VERSION) {
       // 1434096937358:Ver:1421765742287333878467:org.dartlang.dartplugin
       return null;
-    } else if (opCode == InstrumentationService.TAG_WATCH_EVENT) {
+    } else if (opCode == InstrumentationLogAdapter.TAG_WATCH_EVENT) {
       // 1434097460414:Watch:/some/file/path
       return null;
     }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index f00140f..1c6f2de 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -41,6 +41,7 @@
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
+import 'package:analysis_server/src/server/error_notifier.dart';
 import 'package:analysis_server/src/server/features.dart';
 import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
@@ -354,11 +355,9 @@
         channel.sendResponse(new Response.unknownRequest(request));
       });
     }, onError: (exception, stackTrace) {
-      sendServerErrorNotification(
-          'Failed to handle request: ${request.toJson()}',
-          exception,
-          stackTrace,
-          fatal: true);
+      AnalysisEngine.instance.instrumentationService.logException(
+          FatalException('Failed to handle request: ${request.toJson()}',
+              exception, stackTrace));
     });
   }
 
@@ -410,6 +409,7 @@
   }
 
   /// Sends a `server.error` notification.
+  @override
   void sendServerErrorNotification(
     String message,
     dynamic exception,
@@ -432,17 +432,6 @@
         new ServerErrorParams(fatal, message, buffer.toString())
             .toNotification());
 
-    // send to crash reporting
-    if (options.crashReportSender != null) {
-      options.crashReportSender
-          .sendReport(exception,
-              stackTrace: stackTrace is StackTrace ? stackTrace : null)
-          .catchError((_) {
-        // Catch and ignore any exceptions when reporting exceptions (network
-        // errors or other).
-      });
-    }
-
     // remember the last few exceptions
     if (exception is CaughtException) {
       stackTrace ??= exception.stackTrace;
@@ -895,8 +884,9 @@
       if (result.contextKey != null) {
         message += ' context: ${result.contextKey}';
       }
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.wrapInMessage(message, result.exception));
+          new SilentException.wrapInMessage(message, result.exception));
     });
     analysisServer.driverMap[folder] = analysisDriver;
     return analysisDriver;
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index d631698..018a4fd 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -282,7 +282,10 @@
 
     return driver
         .getResult(path, sendCachedToStream: sendCachedToStream)
-        .catchError((_) => null);
+        .catchError((e, st) {
+      AnalysisEngine.instance.instrumentationService.logException(e, st);
+      return null;
+    });
   }
 
   /// Notify the declarations tracker that the file with the given [path] was
@@ -292,6 +295,14 @@
     analysisDriverScheduler.notify(null);
   }
 
+  /// Sends an error notification to the user.
+  void sendServerErrorNotification(
+    String message,
+    dynamic exception,
+    /*StackTrace*/ stackTrace, {
+    bool fatal = false,
+  });
+
   void updateContextInDeclarationsTracker(nd.AnalysisDriver driver) {
     declarationsTracker?.discardContext(driver.analysisContext);
     declarationsTracker?.addContext(driver.analysisContext);
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 5d3c4f4..258e444 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -19,7 +19,9 @@
 import 'package:analysis_server/src/services/completion/token_details/token_detail_builder.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
@@ -254,10 +256,11 @@
       }
       return null;
     }, onError: (exception, stackTrace) {
-      server.sendServerErrorNotification(
-          'Failed to handle completion domain request: ${request.toJson()}',
-          exception,
-          stackTrace);
+      AnalysisEngine.instance.instrumentationService.logException(
+          CaughtException.withMessage(
+              'Failed to handle completion domain request: ${request.toJson()}',
+              exception,
+              stackTrace));
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index ee06820..9a7d05f 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 
 void addDartOccurrences(OccurrencesCollector collector, CompilationUnit unit) {
   _DartUnitOccurrencesComputerVisitor visitor =
@@ -55,9 +54,6 @@
     if (element is PropertyAccessorElement) {
       element = (element as PropertyAccessorElement).variable;
     }
-    if (element is Member) {
-      element = (element as Member).baseElement;
-    }
-    return element;
+    return element?.declaration;
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
index 1cfb93f..267a8c9 100644
--- a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
 import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
 import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:analysis_server/src/edit/preview/http_preview_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -46,8 +47,14 @@
   /// as if in a directory structure rooted at [includedRoot].
   final String includedRoot;
 
+  /// The absolute path of the directory to which preview pages are to be
+  /// written, or `null` if no preview pages should be written to disk.
   final String outputDir;
 
+  /// The port on which preview pages should be served, or `null` if no preview
+  /// server should be started.
+  final int port;
+
   InstrumentationListener instrumentationListener;
 
   NullabilityMigration migration;
@@ -57,12 +64,12 @@
   /// If this occurs, then don't update any code.
   bool _packageIsNNBD = true;
 
-  NonNullableFix(this.listener, this.outputDir,
+  NonNullableFix(this.listener, this.outputDir, this.port,
       {List<String> included = const []})
       : this.includedRoot =
             _getIncludedRoot(included, listener.server.resourceProvider) {
     instrumentationListener =
-        outputDir == null ? null : InstrumentationListener();
+        outputDir == null && port == null ? null : InstrumentationListener();
     migration = new NullabilityMigration(
         new NullabilityMigrationAdapter(listener),
         permissive: _usePermissiveMode,
@@ -75,7 +82,7 @@
   @override
   Future<void> finish() async {
     migration.finish();
-    if (outputDir != null) {
+    if (outputDir != null && port == null) {
       OverlayResourceProvider provider = listener.server.resourceProvider;
       Folder outputFolder = provider.getFolder(outputDir);
       if (!outputFolder.exists) {
@@ -83,6 +90,29 @@
       }
       await _generateOutput(provider, outputFolder);
     }
+    if (port != null) {
+      OverlayResourceProvider provider = listener.server.resourceProvider;
+      InfoBuilder infoBuilder =
+          InfoBuilder(instrumentationListener.data, listener);
+      Set<UnitInfo> unitInfos = await infoBuilder.explainMigration();
+      var pathContext = provider.pathContext;
+      MigrationInfo migrationInfo = MigrationInfo(
+          unitInfos, infoBuilder.unitMap, pathContext, includedRoot);
+      PathMapper pathMapper = PathMapper(provider, outputDir, includedRoot);
+      // TODO(brianwilkerson) Print a URL that users can paste into the browser.
+      //  The code below is close to right, but computes the wrong path. We
+      //  don't have enough information to pick a single library inside `lib`,
+      //  so we might want to consider alternatives, such as a directory listing
+      //  page or an empty file page.
+//      print(Uri(
+//          scheme: 'http',
+//          host: 'localhost',
+//          port: 10501,
+//          path: pathMapper.map('$includedRoot/lib/logging.dart')));
+      // TODO(brianwilkerson) Capture the server so that it can be closed
+      //  cleanly.
+      HttpPreviewServer(migrationInfo, pathMapper).serveHttp(port);
+    }
   }
 
   /// If the package contains an analysis_options.yaml file, then update the
@@ -224,8 +254,8 @@
         InfoBuilder(instrumentationListener.data, listener);
     Set<UnitInfo> unitInfos = await infoBuilder.explainMigration();
     var pathContext = provider.pathContext;
-    MigrationInfo migrationInfo =
-        MigrationInfo(unitInfos, pathContext, includedRoot);
+    MigrationInfo migrationInfo = MigrationInfo(
+        unitInfos, infoBuilder.unitMap, pathContext, includedRoot);
     PathMapper pathMapper = PathMapper(provider, folder.path, includedRoot);
 
     /// Produce output for the compilation unit represented by the [unitInfo].
@@ -267,7 +297,8 @@
 
   static void task(DartFixRegistrar registrar, DartFixListener listener,
       EditDartfixParams params) {
-    registrar.registerCodeTask(new NonNullableFix(listener, params.outputDir,
+    registrar.registerCodeTask(new NonNullableFix(
+        listener, params.outputDir, params.port,
         included: params.included));
   }
 
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index a13283c..c5592b5 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -43,12 +43,16 @@
   /// The listener used to gather the changes to be applied.
   final DartFixListener listener;
 
+  /// A flag indicating whether types that were not changed (because they should
+  /// be non-nullable) should be explained.
+  final bool explainNonNullableTypes;
+
   /// A map from the path of a compilation unit to the information about that
   /// unit.
   final Map<String, UnitInfo> unitMap = {};
 
   /// Initialize a newly created builder.
-  InfoBuilder(this.info, this.listener);
+  InfoBuilder(this.info, this.listener, {this.explainNonNullableTypes = false});
 
   /// The analysis server used to get information about libraries.
   AnalysisServer get server => listener.server;
@@ -178,18 +182,6 @@
     return capitalize("$nullableValue is assigned");
   }
 
-  /// Return detail text for a fix built from an edge with [node] as a
-  /// destination.
-  String _buildDescriptionForDestination(AstNode node) {
-    // Other found types:
-    // - ConstructorDeclaration
-    if (node.parent is FormalParameterList) {
-      return "A nullable value can't be passed as an argument";
-    } else {
-      return "A nullable value can't be used here";
-    }
-  }
-
   /// Return a description of the given [origin].
   String _buildDescriptionForOrigin(EdgeOriginInfo origin) {
     String description = _baseDescriptionForOrigin(origin);
@@ -253,8 +245,7 @@
         NullabilityNodeInfo destination = reason.destinationNode;
         var nodeInfo = info.nodeInfoFor(destination);
         if (nodeInfo != null) {
-          details.add(RegionDetail(
-              _buildDescriptionForDestination(nodeInfo.astNode),
+          details.add(RegionDetail(nodeInfo.descriptionForDestination,
               _targetForNode(nodeInfo.filePath, nodeInfo.astNode)));
         } else {
           details.add(RegionDetail('node with no info ($destination)', null));
@@ -330,6 +321,34 @@
     return details;
   }
 
+  /// Explain the type annotations that were not changed because they were
+  /// determined to be non-nullable.
+  void _explainNonNullableTypes(SourceInformation sourceInfo,
+      List<RegionInfo> regions, OffsetMapper mapper) {
+    Iterable<MapEntry<TypeAnnotation, NullabilityNodeInfo>> nonNullableTypes =
+        sourceInfo.explicitTypeNullability.entries
+            .where((entry) => !entry.value.isNullable);
+    for (MapEntry<TypeAnnotation, NullabilityNodeInfo> nonNullableType
+        in nonNullableTypes) {
+      Iterable<EdgeInfo> upstreamTriggeredEdgeInfos = info.edgeOrigin.keys
+          .where((e) =>
+              e.sourceNode == nonNullableType.value &&
+              e.isUpstreamTriggered &&
+              !e.destinationNode.isNullable);
+      if (upstreamTriggeredEdgeInfos.isNotEmpty) {
+        List<RegionDetail> details =
+            _computeUpstreamTriggeredDetails(upstreamTriggeredEdgeInfos);
+        TypeAnnotation node = nonNullableType.key;
+        regions.add(RegionInfo(
+            mapper.map(node.offset),
+            node.length,
+            "This type is not changed; it is determined to be non-nullable",
+            details,
+            RegionType.nonNullableType));
+      }
+    }
+  }
+
   /// Return the migration information for the unit associated with the
   /// [result].
   UnitInfo _explainUnit(SourceInformation sourceInfo, ResolvedUnitResult result,
@@ -366,27 +385,8 @@
             details, RegionType.fix));
       }
     }
-    Iterable<MapEntry<TypeAnnotation, NullabilityNodeInfo>> nonNullableTypes =
-        sourceInfo.explicitTypeNullability.entries
-            .where((entry) => !entry.value.isNullable);
-    for (MapEntry<TypeAnnotation, NullabilityNodeInfo> nonNullableType
-        in nonNullableTypes) {
-      Iterable<EdgeInfo> upstreamTriggeredEdgeInfos = info.edgeOrigin.keys
-          .where((e) =>
-              e.sourceNode == nonNullableType.value &&
-              e.isUpstreamTriggered &&
-              !e.destinationNode.isNullable);
-      if (upstreamTriggeredEdgeInfos.isNotEmpty) {
-        List<RegionDetail> details =
-            _computeUpstreamTriggeredDetails(upstreamTriggeredEdgeInfos);
-        TypeAnnotation node = nonNullableType.key;
-        regions.add(RegionInfo(
-            mapper.map(node.offset),
-            node.length,
-            "This type is not changed; it is determined to be non-nullable",
-            details,
-            RegionType.nonNullableType));
-      }
+    if (explainNonNullableTypes) {
+      _explainNonNullableTypes(sourceInfo, regions, mapper);
     }
     regions.sort((first, second) => first.offset.compareTo(second.offset));
     unitInfo.offsetMapper = mapper;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
index 60e7d38..6510931 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
@@ -13,10 +13,6 @@
   /// The node used for type sources that are always `null`.
   NullabilityNodeInfo always;
 
-  /// A map from elements outside of the code being migrated, to the nullability
-  /// nodes associated with the type of the element.
-  final Map<Element, DecoratedTypeInfo> externalDecoratedType = {};
-
   /// A map from the graph edges between nullability nodes, to information about
   /// the edge that was created and why it was created.
   final Map<EdgeInfo, EdgeOriginInfo> edgeOrigin = {};
@@ -24,6 +20,9 @@
   /// The node used for type sources that are never `null`.
   NullabilityNodeInfo never;
 
+  /// A map associating [NodeInformation] with [NullabilityNodeInfo] objects.
+  Map<NullabilityNodeInfo, NodeInformation> nodeInformation = {};
+
   /// A list of the steps in the propagation of nullability information through
   /// the nullability graph, to report details of the step that was performed
   /// and why it was performed.
@@ -37,40 +36,7 @@
 
   /// Return information about the given [node].
   NodeInformation nodeInfoFor(NullabilityNodeInfo node) {
-    for (MapEntry<Source, SourceInformation> sourceEntry
-        in sourceInformation.entries) {
-      SourceInformation sourceInfo = sourceEntry.value;
-      for (MapEntry<AstNode, DecoratedTypeInfo> entry
-          in sourceInfo.implicitReturnType.entries) {
-        if (entry.value.node == node) {
-          return NodeInformation(
-              sourceEntry.key.fullName, entry.key, entry.value);
-        }
-      }
-      for (MapEntry<AstNode, DecoratedTypeInfo> entry
-          in sourceInfo.implicitType.entries) {
-        if (entry.value.node == node) {
-          return NodeInformation(
-              sourceEntry.key.fullName, entry.key, entry.value);
-        }
-      }
-      for (MapEntry<AstNode, List<DecoratedTypeInfo>> entry
-          in sourceInfo.implicitTypeArguments.entries) {
-        for (var type in entry.value) {
-          if (type.node == node) {
-            return NodeInformation(sourceEntry.key.fullName, entry.key, type);
-          }
-        }
-      }
-    }
-    // The loop below doesn't help because we still don't have access to an AST
-    // node.
-//    for (MapEntry<Element, DecoratedTypeInfo> entry in externalDecoratedType.entries) {
-//      if (entry.value.node == node) {
-//        return NodeInformation(null, null, entry.value);
-//      }
-//    }
-    return null;
+    return nodeInformation[node];
   }
 
   /// Return the type annotation associated with the [node] or `null` if the
@@ -95,9 +61,20 @@
 
   final AstNode astNode;
 
-  final DecoratedTypeInfo decoratedType;
+  final Element element;
 
-  NodeInformation(this.filePath, this.astNode, this.decoratedType);
+  final String descriptionPrefix;
+
+  NodeInformation(
+      this.filePath, this.astNode, this.element, this.descriptionPrefix);
+
+  /// Return detail text for a fix built from an edge with this node as a
+  /// destination.
+  String get descriptionForDestination {
+    // TODO(paulberry): describe AST nodes
+    var description = (element ?? '???').toString();
+    return "A nullable value can't be used as $descriptionPrefix$description";
+  }
 }
 
 /// The instrumentation information gathered from the migration engine that is
@@ -105,43 +82,13 @@
 class SourceInformation {
   /// A map from the type annotations found in the source code, to the
   /// nullability nodes that are associated with that type.
+  ///
+  /// TODO(paulberry): we should probably get rid of this data structure.
   final Map<TypeAnnotation, NullabilityNodeInfo> explicitTypeNullability = {};
 
   /// A map from the fixes that were decided on to the reasons for the fix.
   final Map<SingleNullabilityFix, List<FixReasonInfo>> fixes = {};
 
-  /// A map from AST nodes that have an implicit return type to the nullability
-  /// node associated with the implicit return type of the AST node. The node
-  /// can be an
-  /// - executable declaration,
-  /// - function-typed formal parameter declaration,
-  /// - function type alias declaration,
-  /// - generic function type, or
-  /// - function expression.
-  final Map<AstNode, DecoratedTypeInfo> implicitReturnType = {};
-
-  /// A map from AST nodes that have an implicit type to the nullability node
-  /// associated with the implicit type of the AST node. The node can be a
-  /// - formal parameter,
-  /// - declared identifier, or
-  /// - variable in a variable declaration list.
-  final Map<AstNode, DecoratedTypeInfo> implicitType = {};
-
-  /// Called whenever the migration engine encounters an AST node with implicit
-  /// type arguments, to report the nullability nodes associated with the
-  /// implicit type arguments of the AST node.
-  ///
-  /// A map from AST nodes that have implicit type arguments to the nullability
-  /// nodes associated with the implicit type arguments of the AST node. The
-  /// node can be a
-  /// - constructor redirection,
-  /// - function expression invocation,
-  /// - method invocation,
-  /// - instance creation expression,
-  /// - list/map/set literal, or
-  /// - type annotation.
-  final Map<AstNode, List<DecoratedTypeInfo>> implicitTypeArguments = {};
-
   /// Initialize a newly created holder of instrumentation information that is
   /// specific to a single source.
   SourceInformation();
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart
index b51c370..0f977ed 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_information.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -21,12 +22,21 @@
   @override
   void explicitTypeNullability(
       Source source, TypeAnnotation typeAnnotation, NullabilityNodeInfo node) {
+    data.nodeInformation[node] = NodeInformation(
+        _filePathForSource(source), typeAnnotation, null, 'the explicit type ');
     _sourceInfo(source).explicitTypeNullability[typeAnnotation] = node;
   }
 
   @override
   void externalDecoratedType(Element element, DecoratedTypeInfo decoratedType) {
-    data.externalDecoratedType[element] = decoratedType;
+    _storeNodeInformation(decoratedType, element.source, null, element, '');
+  }
+
+  @override
+  void externalDecoratedTypeParameterBound(
+      TypeParameterElement typeParameter, DecoratedTypeInfo decoratedType) {
+    _storeNodeInformation(
+        decoratedType, typeParameter.source, null, typeParameter, 'bound of ');
   }
 
   @override
@@ -49,19 +59,25 @@
   @override
   void implicitReturnType(
       Source source, AstNode node, DecoratedTypeInfo decoratedReturnType) {
-    _sourceInfo(source).implicitReturnType[node] = decoratedReturnType;
+    _storeNodeInformation(
+        decoratedReturnType, source, node, null, 'return type of ');
   }
 
   @override
   void implicitType(
       Source source, AstNode node, DecoratedTypeInfo decoratedType) {
-    _sourceInfo(source).implicitType[node] = decoratedType;
+    _storeNodeInformation(decoratedType, source, node, null, 'type of ');
   }
 
   @override
   void implicitTypeArguments(
       Source source, AstNode node, Iterable<DecoratedTypeInfo> types) {
-    _sourceInfo(source).implicitTypeArguments[node] = types.toList();
+    int i = 0;
+    for (var type in types) {
+      _storeNodeInformation(
+          type, source, node, null, 'implicit type argument $i of ');
+      i++;
+    }
   }
 
   @override
@@ -69,8 +85,42 @@
     data.propagationSteps.add(info);
   }
 
+  String _filePathForSource(Source source) {
+    return source.fullName;
+  }
+
   /// Return the source information associated with the given [source], creating
   /// it if there has been no previous information for that source.
   SourceInformation _sourceInfo(Source source) =>
       data.sourceInformation.putIfAbsent(source, () => SourceInformation());
+
+  void _storeNodeInformation(DecoratedTypeInfo decoratedType, Source source,
+      AstNode astNode, Element element, String description) {
+    // Make sure source info exists for the given source.
+    _sourceInfo(source);
+    data.nodeInformation[decoratedType.node] = NodeInformation(
+        _filePathForSource(source), astNode, element, description);
+    var dartType = decoratedType.type;
+    if (dartType is InterfaceType) {
+      for (int i = 0; i < dartType.typeArguments.length; i++) {
+        _storeNodeInformation(decoratedType.typeArgument(i), source, astNode,
+            element, 'type argument $i of $description');
+      }
+    } else if (dartType is FunctionType) {
+      _storeNodeInformation(decoratedType.returnType, source, astNode, element,
+          'return type of $description');
+      int i = 0;
+      for (var parameter in dartType.parameters) {
+        if (parameter.isNamed) {
+          var name = parameter.name;
+          _storeNodeInformation(decoratedType.namedParameter(name), source,
+              astNode, element, 'named parameter $name of $description');
+        } else {
+          _storeNodeInformation(decoratedType.positionalParameter(i), source,
+              astNode, element, 'positional parameter $i of $description');
+          i++;
+        }
+      }
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
index f539107..cb4ae0c 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
@@ -185,7 +185,7 @@
   </head>
   <body>
     <h1>Non-nullable fix instrumentation report</h1>
-    <p><em>Well-written introduction to this report.</em></p>
+    <p>Migrated files:</p>
     <div class="navigation">
       {{# links }}
         {{# isLink }}<a href="{{ href }}">{{ name }}</a>{{/ isLink }}
@@ -265,34 +265,42 @@
     // Compute insertions for navigation targets.
     //
     for (NavigationTarget region in unitInfo.targets) {
-      int openOffset = mapper.map(region.offset);
-      String openInsertion = openInsertions[openOffset] ?? '';
-      openInsertion = '<a id="o${region.offset}">$openInsertion';
-      openInsertions[openOffset] = openInsertion;
+      int regionLength = region.length;
+      if (regionLength > 0) {
+        int openOffset = mapper.map(region.offset);
+        String openInsertion = openInsertions[openOffset] ?? '';
+        openInsertion = '<a id="o${region.offset}">$openInsertion';
+        openInsertions[openOffset] = openInsertion;
 
-      int closeOffset = openOffset + region.length;
-      String closeInsertion = closeInsertions[closeOffset] ?? '';
-      closeInsertion = '$closeInsertion</a>';
-      closeInsertions[closeOffset] = closeInsertion;
+        int closeOffset = openOffset + regionLength;
+        String closeInsertion = closeInsertions[closeOffset] ?? '';
+        closeInsertion = '$closeInsertion</a>';
+        closeInsertions[closeOffset] = closeInsertion;
+      }
     }
     //
     // Compute insertions for navigation sources, but skip the sources that
     // point at themselves.
     //
     for (NavigationSource region in unitInfo.sources ?? <NavigationSource>[]) {
-      int openOffset = mapper.map(region.offset);
-      NavigationTarget target = region.target;
-      if (target.filePath != unitInfo.path || region.offset != target.offset) {
-        String openInsertion = openInsertions[openOffset] ?? '';
-        String htmlPath = pathContext.relative(pathMapper.map(target.filePath),
-            from: unitDir);
-        openInsertion = '<a href="$htmlPath#o${target.offset}">$openInsertion';
-        openInsertions[openOffset] = openInsertion;
+      int regionLength = region.length;
+      if (regionLength > 0) {
+        int openOffset = mapper.map(region.offset);
+        NavigationTarget target = region.target;
+        if (target.filePath != unitInfo.path ||
+            region.offset != target.offset) {
+          String openInsertion = openInsertions[openOffset] ?? '';
+          String htmlPath = pathContext
+              .relative(pathMapper.map(target.filePath), from: unitDir);
+          openInsertion =
+              '<a href="$htmlPath#o${target.offset}">$openInsertion';
+          openInsertions[openOffset] = openInsertion;
 
-        int closeOffset = openOffset + region.length;
-        String closeInsertion = closeInsertions[closeOffset] ?? '';
-        closeInsertion = '$closeInsertion</a>';
-        closeInsertions[closeOffset] = closeInsertion;
+          int closeOffset = openOffset + regionLength;
+          String closeInsertion = closeInsertions[closeOffset] ?? '';
+          closeInsertion = '$closeInsertion</a>';
+          closeInsertions[closeOffset] = closeInsertion;
+        }
       }
     }
     //
@@ -415,13 +423,17 @@
   /// The information about the compilation units that are are migrated.
   final Set<UnitInfo> units;
 
+  /// A map from file paths to the unit infos created for those files. The units
+  /// in this map is a strict superset of the [units] that were migrated.
+  final Map<String, UnitInfo> unitMap;
+
   /// The resource provider's path context.
   final path.Context pathContext;
 
   /// The filesystem root used to create relative paths for each unit.
   final String includedRoot;
 
-  MigrationInfo(this.units, this.pathContext, this.includedRoot);
+  MigrationInfo(this.units, this.unitMap, this.pathContext, this.includedRoot);
 
   /// The path to the highlight.js script, relative to [unitInfo].
   String highlightJsPath(UnitInfo unitInfo) {
diff --git a/pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart b/pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart
new file mode 100644
index 0000000..84df2c7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:analysis_server/src/edit/preview/preview_page.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:meta/meta.dart';
+import 'package:path/src/context.dart';
+
+/// The page that is displayed when a preview of a valid Dart file is requested.
+class DartFilePage extends PreviewPage {
+  /// The information about the file being previewed.
+  final UnitInfo unitInfo;
+
+  /// Initialize a newly created Dart file page within the given [site]. The
+  /// [unitInfo] provides the information needed to render the page.
+  DartFilePage(PreviewSite site, this.unitInfo)
+      // TODO(brianwilkerson) The path needs to be converted to use '/' if that
+      //  isn't already done as part of building the unitInfo.
+      : super(site, unitInfo.path.substring(1));
+
+  @override
+  void generateBody(Map<String, String> params) {
+    throw UnsupportedError('generateBody');
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    InstrumentationRenderer renderer = InstrumentationRenderer(
+        unitInfo,
+        PreviewMigrationInfo(site.migrationInfo),
+        PreviewPathMapper(site.pathMapper));
+    buf.write(renderer.render());
+  }
+}
+
+/// A wrapper around a migration info that returns the expected paths to the
+/// JS and CSS files.
+class PreviewMigrationInfo implements MigrationInfo {
+  /// The wrapped migration info.
+  final MigrationInfo wrappedInfo;
+
+  /// Initialize a newly created migration info to wrap the [wrappedInfo].
+  PreviewMigrationInfo(this.wrappedInfo);
+
+  @override
+  String get includedRoot => wrappedInfo.includedRoot;
+
+  @override
+  Context get pathContext => wrappedInfo.pathContext;
+
+  @override
+  Map<String, UnitInfo> get unitMap => wrappedInfo.unitMap;
+
+  @override
+  Set<UnitInfo> get units => wrappedInfo.units;
+
+  @override
+  String highlightJsPath(UnitInfo unitInfo) {
+    return PreviewSite.highlightJSPagePath;
+  }
+
+  @override
+  String highlightStylePath(UnitInfo unitInfo) {
+    return PreviewSite.highlightCssPagePath;
+  }
+
+  @override
+  List<Map<String, Object>> unitLinks(UnitInfo thisUnit) {
+    return [
+      for (var unit in units)
+        {
+          'name': _computeName(unit),
+          'isLink': unit != thisUnit,
+          if (unit != thisUnit) 'href': _pathTo(target: unit, source: thisUnit)
+        }
+    ];
+  }
+
+  /// Return the path to [unit] from [includedRoot], to be used as a display
+  /// name for a library.
+  String _computeName(UnitInfo unit) =>
+      pathContext.relative(unit.path, from: includedRoot);
+
+  /// The path to [target], relative to [from].
+  String _pathTo({@required UnitInfo target, @required UnitInfo source}) {
+    String targetPath = target.path;
+    String sourceDir = pathContext.dirname(source.path);
+    return pathContext.relative(targetPath, from: sourceDir);
+  }
+}
+
+/// A wrapper around a path mapper that converts file paths to URIs.
+class PreviewPathMapper implements PathMapper {
+  /// The wrapped path mapper.
+  final PathMapper wrappedMapper;
+
+  /// Initialize a newly created path mapper to wrap the [wrappedMapper].
+  PreviewPathMapper(this.wrappedMapper);
+
+  @override
+  int get nextIndex => wrappedMapper.nextIndex;
+
+  @override
+  void set nextIndex(int nextIndex) {
+    wrappedMapper.nextIndex = nextIndex;
+  }
+
+  @override
+  String get outputFolder => throw UnsupportedError('outputFolder');
+
+  @override
+  String get packageRoot => wrappedMapper.packageRoot;
+
+  @override
+  Map<String, String> get pathMap => throw UnsupportedError('pathMap');
+
+  @override
+  ResourceProvider get provider => wrappedMapper.provider;
+
+  @override
+  void set provider(ResourceProvider provider) {
+    wrappedMapper.provider = provider;
+  }
+
+  @override
+  String map(String path) {
+    return Uri.file(path).path;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/exception_page.dart b/pkg/analysis_server/lib/src/edit/preview/exception_page.dart
new file mode 100644
index 0000000..ae7c30b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/exception_page.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:analysis_server/src/edit/preview/preview_page.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+
+/// The page that is displayed when an exception is encountered in the process
+/// of composing the content of a different page.
+class ExceptionPage extends PreviewPage {
+  /// The message from the exception that caused this page to be displayed.
+  final String message;
+
+  /// The stack trace of the exception that caused this page to be displayed.
+  final StackTrace stackTrace;
+
+  /// Initialize a newly created exception page within the given [site]. The
+  /// [message] and [stackTrace] are used to describe the exception to the user.
+  ExceptionPage(PreviewSite site, String path, this.message, this.stackTrace)
+      : super(site, path.substring(1));
+
+  @override
+  void generateBody(Map<String, String> params) {
+    buf.write('''
+<h1>500 Exception in preview</h1>
+<p>
+We're sorry, but you've encountered a bug in the preview tool. Please visit
+<a href='https://github.com/dart-lang/sdk/issues/new'></a> to report the issue
+and include the stack trace below.
+</p>
+<h2>$message</h2>
+<p style="white-space: pre">
+${htmlEscape.convert(stackTrace.toString())}
+</p>
+''');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart b/pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart
new file mode 100644
index 0000000..a3fe02a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/nnbd_migration/highlight_css.dart';
+import 'package:analysis_server/src/edit/preview/preview_page.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+
+/// The page that contains the CSS used to style the semantic highlighting
+/// within a Dart file.
+class HighlightCssPage extends PreviewPage {
+  /// The decoded content of the page. Use [pageContent] to access this field so
+  /// that it is initialized on first read.
+  static String _pageContent;
+
+  /// Initialize a newly created CSS page within the given [site].
+  HighlightCssPage(PreviewSite site)
+      : super(site, PreviewSite.highlightCssPagePath.substring(1));
+
+  @override
+  void generateBody(Map<String, String> params) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    buf.write(pageContent());
+  }
+
+  /// Return the content of the page, decoding it if it hasn't been decoded
+  /// before.
+  String pageContent() {
+    return _pageContent ??= decodeHighlightCss();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart b/pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart
new file mode 100644
index 0000000..c324158
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/nnbd_migration/highlight_js.dart';
+import 'package:analysis_server/src/edit/preview/preview_page.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+
+/// The page that contains the JavaScript used to apply semantic highlighting
+/// styles to a Dart file.
+class HighlightJSPage extends PreviewPage {
+  /// The decoded content of the page. Use [pageContent] to access this field so
+  /// that it is initialized on first read.
+  static String _pageContent;
+
+  /// Initialize a newly created JS page within the given [site].
+  HighlightJSPage(PreviewSite site)
+      : super(site, PreviewSite.highlightJSPagePath.substring(1));
+
+  @override
+  void generateBody(Map<String, String> params) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    buf.write(pageContent());
+  }
+
+  /// Return the content of the page, decoding it if it hasn't been decoded
+  /// before.
+  String pageContent() {
+    return _pageContent ??= decodeHighlightJs();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart b/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
new file mode 100644
index 0000000..1344678
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+
+/// Instances of the class [AbstractGetHandler] handle GET requests.
+abstract class AbstractGetHandler {
+  /// Handle a GET request received by the HTTP server.
+  Future<void> handleGetRequest(HttpRequest request);
+}
+
+/// Instances of the class [HttpPreviewServer] implement a simple HTTP server
+/// that serves up dartfix preview pages.
+class HttpPreviewServer {
+  /// The information about the migration that will be used to serve up pages.
+  final MigrationInfo migrationInfo;
+
+  /// The path mapper used to map paths from the unit infos to the paths being
+  /// served.
+  final PathMapper pathMapper;
+
+  /// An object that can handle GET requests.
+  AbstractGetHandler getHandler;
+
+  /// Future that is completed with the HTTP server once it is running.
+  Future<HttpServer> _serverFuture;
+
+  /// Initialize a newly created HTTP server.
+  HttpPreviewServer(this.migrationInfo, this.pathMapper);
+
+  /// Return the port this server is bound to.
+  Future<int> get boundPort async {
+    return (await _serverFuture)?.port;
+  }
+
+  void close() {
+    _serverFuture?.then((HttpServer server) {
+      server.close();
+    });
+  }
+
+  /// Begin serving HTTP requests over the given port.
+  Future<int> serveHttp([int initialPort]) async {
+    if (_serverFuture != null) {
+      return boundPort;
+    }
+
+    try {
+      _serverFuture =
+          HttpServer.bind(InternetAddress.loopbackIPv4, initialPort ?? 0);
+
+      HttpServer server = await _serverFuture;
+      _handleServer(server);
+      return server.port;
+    } catch (ignore) {
+      // If we can't bind to the specified port, don't remember the broken
+      // server.
+      _serverFuture = null;
+
+      return null;
+    }
+  }
+
+  /// Handle a GET request received by the HTTP server.
+  Future<void> _handleGetRequest(HttpRequest request) async {
+    getHandler ??= new PreviewSite(migrationInfo, pathMapper);
+    await getHandler.handleGetRequest(request);
+  }
+
+  /// Attach a listener to a newly created HTTP server.
+  void _handleServer(HttpServer httpServer) {
+    httpServer.listen((HttpRequest request) async {
+      List<String> updateValues = request.headers[HttpHeaders.upgradeHeader];
+      if (request.method == 'GET') {
+        await _handleGetRequest(request);
+      } else if (updateValues != null &&
+          updateValues.indexOf('websocket') >= 0) {
+        // We do not support serving analysis server communications over
+        // WebSocket connections.
+        HttpResponse response = request.response;
+        response.statusCode = HttpStatus.notFound;
+        response.headers.contentType = ContentType.text;
+        response.write(
+            'WebSocket connections not supported (${request.uri.path}).');
+        response.close();
+      } else {
+        _returnUnknownRequest(request);
+      }
+    });
+  }
+
+  /// Return an error in response to an unrecognized request received by the HTTP
+  /// server.
+  void _returnUnknownRequest(HttpRequest request) {
+    HttpResponse response = request.response;
+    response.statusCode = HttpStatus.notFound;
+    response.headers.contentType = ContentType.text;
+    response.write('Not found');
+    response.close();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/not_found_page.dart b/pkg/analysis_server/lib/src/edit/preview/not_found_page.dart
new file mode 100644
index 0000000..bafcbe7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/not_found_page.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/edit/preview/preview_page.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+
+/// The page that is displayed when an invalid URL is requested.
+class NotFoundPage extends PreviewPage {
+  /// Initialize a newly created file-not-found page within the given [site].
+  /// The [id] is the portion of the path to the page that follows the initial
+  /// slash ('/').
+  NotFoundPage(PreviewSite site, String id) : super(site, id);
+
+  @override
+  void generateBody(Map<String, String> params) {
+    buf.write('''
+<h1>404 Not found</h1>
+<p>
+'$path' not found.
+</p>
+''');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/preview_page.dart b/pkg/analysis_server/lib/src/edit/preview/preview_page.dart
new file mode 100644
index 0000000..f927d6a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/preview_page.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:analysis_server/src/status/pages.dart';
+
+/// A page displayed on the preview site.
+abstract class PreviewPage extends Page {
+  /// The site containing the page.
+  final PreviewSite site;
+
+  /// Initialize a newly created page within the given [site]. The [id] is the
+  /// portion of the path to the page that follows the initial slash ('/').
+  PreviewPage(this.site, String id) : super(id, '', description: '');
+
+  /// Generate the content of the body tag.
+  void generateBody(Map<String, String> params);
+
+  /// Generate the content of the head tag.
+  void generateHead() {
+    buf.writeln('<meta charset="utf-8">');
+    buf.writeln('<meta name="viewport" content="width=device-width, '
+        'initial-scale=1.0">');
+    buf.writeln('<title>${site.title}</title>');
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    buf.writeln('<!DOCTYPE html><html lang="en">');
+    buf.writeln('<head>');
+    buf.writeln('</head>');
+    generateHead();
+    buf.writeln('<body>');
+    generateBody(params);
+    buf.writeln('</body>');
+    buf.writeln('</html>');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/preview/preview_site.dart b/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
new file mode 100644
index 0000000..2f3f778
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:analysis_server/src/edit/preview/dart_file_page.dart';
+import 'package:analysis_server/src/edit/preview/exception_page.dart';
+import 'package:analysis_server/src/edit/preview/highlight_css_page.dart';
+import 'package:analysis_server/src/edit/preview/highlight_js_page.dart';
+import 'package:analysis_server/src/edit/preview/http_preview_server.dart';
+import 'package:analysis_server/src/edit/preview/not_found_page.dart';
+import 'package:analysis_server/src/status/pages.dart';
+import 'package:analyzer/file_system/file_system.dart';
+
+/// The site used to serve pages for the preview tool.
+class PreviewSite extends Site implements AbstractGetHandler {
+  /// The path of the CSS page used to style the semantic highlighting within a
+  /// Dart file.
+  static const highlightCssPagePath = '/css/androidstudio.css';
+
+  /// The path of the JS page used to associate highlighting within a Dart file.
+  static const highlightJSPagePath = '/js/highlight.pack.js';
+
+  /// The information about the migration that will be used to serve up pages.
+  final MigrationInfo migrationInfo;
+
+  /// The path mapper used to map paths from the unit infos to the paths being
+  /// served.
+  final PathMapper pathMapper;
+
+  /// A table mapping the paths of files to the information about the
+  /// compilation units at those paths.
+  final Map<String, UnitInfo> unitInfoMap = {};
+
+  /// Initialize a newly created site to serve a preview of the results of an
+  /// NNBD migration.
+  PreviewSite(this.migrationInfo, this.pathMapper)
+      : super('NNBD Migration Preview') {
+    Set<UnitInfo> unitInfos = migrationInfo.units;
+    ResourceProvider provider = pathMapper.provider;
+    for (UnitInfo unit in unitInfos) {
+      unitInfoMap[unit.path] = unit;
+    }
+    for (UnitInfo unit in migrationInfo.unitMap.values) {
+      if (!unitInfos.contains(unit)) {
+        if (unit.content == null) {
+          try {
+            unit.content = provider.getFile(unit.path).readAsStringSync();
+          } catch (_) {
+            // If we can't read the content of the file, then skip it.
+            continue;
+          }
+        }
+        unitInfoMap[unit.path] = unit;
+      }
+    }
+  }
+
+  @override
+  Page createExceptionPage(String message, StackTrace trace) {
+    // Use createExceptionPageWithPath instead.
+    throw UnimplementedError();
+  }
+
+  /// Return a page used to display an exception that occurred while attempting
+  /// to render another page. The [path] is the path to the page that was being
+  /// rendered when the exception was thrown. The [message] and [stackTrace] are
+  /// those from the exception.
+  Page createExceptionPageWithPath(
+      String path, String message, StackTrace stackTrace) {
+    return ExceptionPage(this, path, message, stackTrace);
+  }
+
+  @override
+  Page createUnknownPage(String unknownPath) {
+    return NotFoundPage(this, unknownPath.substring(1));
+  }
+
+  @override
+  Future<void> handleGetRequest(HttpRequest request) async {
+    String path = request.uri.path;
+    try {
+      if (path == highlightCssPagePath) {
+        return respond(request, HighlightCssPage(this));
+      } else if (path == highlightJSPagePath) {
+        return respond(request, HighlightJSPage(this));
+      }
+      UnitInfo unitInfo = unitInfoMap[path];
+      if (unitInfo != null) {
+        return respond(request, DartFilePage(this, unitInfo));
+      }
+      return respond(request, createUnknownPage(path), HttpStatus.notFound);
+    } catch (exception, stackTrace) {
+      try {
+        await respond(
+            request,
+            createExceptionPageWithPath(path, '$exception', stackTrace),
+            HttpStatus.internalServerError);
+      } catch (exception, stackTrace) {
+        HttpResponse response = request.response;
+        response.statusCode = HttpStatus.internalServerError;
+        response.headers.contentType = ContentType.text;
+        response.write('$exception\n\n$stackTrace');
+        response.close();
+      }
+    }
+  }
+
+  @override
+  Future<void> respond(HttpRequest request, Page page,
+      [int code = HttpStatus.ok]) async {
+    HttpResponse response = request.response;
+    response.statusCode = code;
+    if (page is HighlightCssPage) {
+      response.headers.contentType =
+          ContentType('text', 'css', charset: 'utf-8');
+    } else if (page is HighlightJSPage) {
+      response.headers.contentType =
+          ContentType('application', 'javascript', charset: 'utf-8');
+    } else {
+      response.headers.contentType = ContentType.html;
+    }
+    response.write(await page.generate(request.uri.queryParameters));
+    response.close();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
index b216613..0941eff 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
@@ -6,6 +6,8 @@
 import 'package:analysis_server/src/flutter/flutter_outline_computer.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/src/generated/engine.dart';
 
 void sendFlutterNotificationOutline(
     AnalysisServer server, ResolvedUnitResult resolvedUnit) {
@@ -29,8 +31,9 @@
     try {
       f();
     } catch (exception, stackTrace) {
-      server.sendServerErrorNotification(
-          'Failed to send notification', exception, stackTrace);
+      AnalysisEngine.instance.instrumentationService.logException(
+          CaughtException.withMessage(
+              'Failed to send notification', exception, stackTrace));
     }
   });
 }
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 535d6ae..f71c5b3 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -194,7 +194,7 @@
     contextManager.callbacks = contextManagerCallbacks;
     searchEngine = new SearchEngineImpl(driverMap.values);
 
-    channel.listen(handleMessage, onDone: done, onError: error);
+    channel.listen(handleMessage, onDone: done, onError: socketError);
   }
 
   /// The capabilities of the LSP client. Will be null prior to initialization.
@@ -222,14 +222,6 @@
    */
   void done() {}
 
-  /**
-   * There was an error related to the socket from which messages are being
-   * read.
-   */
-  void error(error, stack) {
-    sendServerErrorNotification('Server error', error, stack);
-  }
-
   /// Return the LineInfo for the file with the given [path]. The file is
   /// analyzed in one of the analysis drivers to which the file was added,
   /// otherwise in the first driver, otherwise `null` is returned.
@@ -328,7 +320,7 @@
           logException(errorMessage, error, stackTrace);
         }
       });
-    }, onError: error);
+    }, onError: socketError);
   }
 
   /// Logs the error on the client using window/logMessage.
@@ -455,7 +447,9 @@
     channel.sendResponse(response);
   }
 
-  void sendServerErrorNotification(String message, exception, stackTrace) {
+  @override
+  void sendServerErrorNotification(String message, exception, stackTrace,
+      {bool fatal = false}) {
     message = exception == null ? message : '$message: $exception';
 
     // Show message (without stack) to the user.
@@ -524,6 +518,15 @@
     return new Future.value();
   }
 
+  /**
+   * There was an error related to the socket from which messages are being
+   * read.
+   */
+  void socketError(error, stack) {
+    // Don't send to instrumentation service; not an internal error.
+    sendServerErrorNotification('Socket error', error, stack);
+  }
+
   void updateAnalysisRoots(List<String> addedPaths, List<String> removedPaths) {
     // TODO(dantup): This is currently case-sensitive!
     final newPaths =
@@ -625,8 +628,9 @@
       if (result.contextKey != null) {
         message += ' context: ${result.contextKey}';
       }
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.wrapInMessage(message, result.exception));
+          new SilentException.wrapInMessage(message, result.exception));
     });
     analysisServer.driverMap[folder] = analysisDriver;
     return analysisDriver;
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index f275ee9..ca211a1 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -17,6 +17,8 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 Future<void> scheduleImplementedNotification(
@@ -39,10 +41,11 @@
             file, computer.classes, computer.members);
         server.sendNotification(params.toNotification());
       } catch (exception, stackTrace) {
-        server.sendServerErrorNotification(
-            'Failed to send analysis.implemented notification.',
-            exception,
-            stackTrace);
+        AnalysisEngine.instance.instrumentationService.logException(
+            CaughtException.withMessage(
+                'Failed to send analysis.implemented notification.',
+                exception,
+                stackTrace));
       }
     }
   }
@@ -175,8 +178,9 @@
     try {
       f();
     } catch (exception, stackTrace) {
-      server.sendServerErrorNotification(
-          'Failed to send notification', exception, stackTrace);
+      AnalysisEngine.instance.instrumentationService.logException(
+          CaughtException.withMessage(
+              'Failed to send notification', exception, stackTrace));
     }
   });
 }
diff --git a/pkg/analysis_server/lib/src/server/crash_reporting.dart b/pkg/analysis_server/lib/src/server/crash_reporting.dart
new file mode 100644
index 0000000..498a45b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/crash_reporting.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/instrumentation/noop_service.dart';
+import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:telemetry/crash_reporting.dart';
+
+class CrashReportingInstrumentation extends NoopInstrumentationService {
+  final CrashReportSender reporter;
+
+  CrashReportingInstrumentation(this.reporter);
+
+  @override
+  void logException(dynamic exception, [StackTrace stackTrace]) {
+    reporter
+        .sendReport(exception, stackTrace: stackTrace ?? StackTrace.current)
+        .catchError((error) {
+      // We silently ignore errors sending crash reports (network issues, ...).
+    });
+  }
+
+  @override
+  void logPluginException(
+      PluginData plugin, dynamic exception, StackTrace stackTrace) {
+    // TODO(mfairhurst): send plugin information too.
+    reporter.sendReport(exception, stackTrace: stackTrace).catchError((error) {
+      // We silently ignore errors sending crash reports (network issues, ...).
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index b0baf27..4714d6e 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -10,11 +10,12 @@
 import 'package:analysis_server/protocol/protocol_constants.dart'
     show PROTOCOL_VERSION;
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/lsp_socket_server.dart';
+import 'package:analysis_server/src/server/crash_reporting.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/dev_server.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
+import 'package:analysis_server/src/server/error_notifier.dart';
 import 'package:analysis_server/src/server/features.dart';
 import 'package:analysis_server/src/server/http_server.dart';
 import 'package:analysis_server/src/server/lsp_stdio_server.dart';
@@ -25,6 +26,7 @@
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/src/utilities/request_statistics.dart';
 import 'package:analysis_server/starter.dart';
+import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/file_instrumentation.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -33,7 +35,6 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:args/args.dart';
-import 'package:front_end/src/fasta/compiler_context.dart';
 import 'package:linter/src/rules.dart' as linter;
 import 'package:path/path.dart' as path;
 import 'package:telemetry/crash_reporting.dart';
@@ -334,9 +335,9 @@
   static const String TRAIN_USING = "train-using";
 
   /**
-   * The instrumentation server that is to be used by the analysis server.
+   * The instrumentation service that is to be used by the analysis server.
    */
-  InstrumentationServer instrumentationServer;
+  InstrumentationService instrumentationService;
 
   /**
    * The file resolver provider used to override the way file URI's are
@@ -423,9 +424,13 @@
       analytics.setSessionValue('cd1', analysisServerOptions.clientVersion);
     }
 
-    // TODO(devoncarew): Replace with the real crash product ID.
-    analysisServerOptions.crashReportSender =
-        new CrashReportSender('Dart_analysis_server', analytics);
+    final shouldSendCallback = () {
+      // TODO(devoncarew): Replace with a real enablement check.
+      return false;
+    };
+
+    final crashReportSender =
+        new CrashReportSender('Dart_analysis_server', shouldSendCallback);
 
     if (telemetry.SHOW_ANALYTICS_UI) {
       if (results.wasParsed(ANALYTICS_FLAG)) {
@@ -466,17 +471,20 @@
     // Initialize the instrumentation service.
     //
     String logFilePath = results[INSTRUMENTATION_LOG_FILE];
+    List<InstrumentationService> allInstrumentationServices =
+        instrumentationService == null ? [] : [instrumentationService];
     if (logFilePath != null) {
       _rollLogFiles(logFilePath, 5);
-      FileInstrumentationServer fileBasedServer =
-          new FileInstrumentationServer(logFilePath);
-      instrumentationServer = instrumentationServer != null
-          ? new MulticastInstrumentationServer(
-              [instrumentationServer, fileBasedServer])
-          : fileBasedServer;
+      allInstrumentationServices.add(InstrumentationLogAdapter(
+          new FileInstrumentationLogger(logFilePath)));
     }
-    InstrumentationService instrumentationService =
-        new InstrumentationService(instrumentationServer);
+
+    ErrorNotifier errorNotifier = ErrorNotifier();
+    allInstrumentationServices
+        .add(CrashReportingInstrumentation(crashReportSender));
+    instrumentationService =
+        new MulticastInstrumentationService(allInstrumentationServices);
+
     instrumentationService.logVersion(
         results[TRAIN_USING] != null
             ? 'training-0'
@@ -500,22 +508,21 @@
       }
     }
 
-    CompilerContext.runWithDefaultOptions((_) async {
-      if (analysisServerOptions.useLanguageServerProtocol) {
-        startLspServer(results, analysisServerOptions, dartSdkManager,
-            instrumentationService, diagnosticServerPort);
-      } else {
-        startAnalysisServer(
-            results,
-            analysisServerOptions,
-            parser,
-            dartSdkManager,
-            instrumentationService,
-            RequestStatisticsHelper(),
-            analytics,
-            diagnosticServerPort);
-      }
-    });
+    if (analysisServerOptions.useLanguageServerProtocol) {
+      startLspServer(results, analysisServerOptions, dartSdkManager,
+          instrumentationService, diagnosticServerPort, errorNotifier);
+    } else {
+      startAnalysisServer(
+          results,
+          analysisServerOptions,
+          parser,
+          dartSdkManager,
+          instrumentationService,
+          RequestStatisticsHelper(),
+          analytics,
+          diagnosticServerPort,
+          errorNotifier);
+    }
   }
 
   void startAnalysisServer(
@@ -527,6 +534,7 @@
     RequestStatisticsHelper requestStatistics,
     telemetry.Analytics analytics,
     int diagnosticServerPort,
+    ErrorNotifier errorNotifier,
   ) {
     String trainDirectory = results[TRAIN_USING];
     if (trainDirectory != null) {
@@ -562,6 +570,8 @@
         detachableFileSystemManager);
     httpServer = new HttpAnalysisServer(socketServer);
 
+    errorNotifier.server = socketServer.analysisServer;
+
     diagnosticServer.httpServer = httpServer;
     if (serve_http) {
       diagnosticServer.startOnPort(diagnosticServerPort);
@@ -604,7 +614,7 @@
         exit(exitCode);
       }();
     } else {
-      _captureExceptions(socketServer, instrumentationService, () {
+      _captureExceptions(instrumentationService, () {
         StdioAnalysisServer stdioServer = new StdioAnalysisServer(socketServer);
         stdioServer.serveStdio().then((_) async {
           // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -643,17 +653,13 @@
     // server was configured to load a language model on disk.
     CompletionRanking.instance =
         CompletionRanking(analysisServerOptions.completionModelFolder);
-    CompletionRanking.instance.start().catchError((error) {
+    CompletionRanking.instance.start().catchError((error, stackTrace) {
       // Disable smart ranking if model startup fails.
       analysisServerOptions.completionModelFolder = null;
       CompletionRanking.instance = null;
-      if (socketServer != null) {
-        socketServer.analysisServer.sendServerErrorNotification(
-            'Failed to start ranking model isolate', error, error.stackTrace);
-      } else {
-        lspSocketServer.analysisServer.sendServerErrorNotification(
-            'Failed to start ranking model isolate', error, error.stackTrace);
-      }
+      AnalysisEngine.instance.instrumentationService.logException(
+          CaughtException.withMessage(
+              'Failed to start ranking model isolate', error, stackTrace));
     });
   }
 
@@ -663,6 +669,7 @@
     DartSdkManager dartSdkManager,
     InstrumentationService instrumentationService,
     int diagnosticServerPort,
+    ErrorNotifier errorNotifier,
   ) {
     final serve_http = diagnosticServerPort != null;
 
@@ -676,6 +683,7 @@
       dartSdkManager,
       instrumentationService,
     );
+    errorNotifier.server = socketServer.analysisServer;
 
     httpServer = new HttpAnalysisServer(socketServer);
 
@@ -684,7 +692,7 @@
       diagnosticServer.startOnPort(diagnosticServerPort);
     }
 
-    _captureLspExceptions(socketServer, instrumentationService, () {
+    _captureExceptions(instrumentationService, () {
       LspStdioAnalysisServer stdioServer =
           new LspStdioAnalysisServer(socketServer);
       stdioServer.serveStdio().then((_) async {
@@ -705,14 +713,11 @@
    * instrumentation [service]. If a [print] function is provided, then also
    * capture any data printed by the callback and redirect it to the function.
    */
-  dynamic _captureExceptions(SocketServer socketServer,
-      InstrumentationService service, dynamic callback(),
+  dynamic _captureExceptions(InstrumentationService service, dynamic callback(),
       {void print(String line)}) {
     void errorFunction(Zone self, ZoneDelegate parent, Zone zone,
         dynamic exception, StackTrace stackTrace) {
-      service.logPriorityException(exception, stackTrace);
-      socketServer.analysisServer.sendServerErrorNotification(
-          'Captured exception', exception, stackTrace);
+      service.logException(exception, stackTrace);
       throw exception;
     }
 
@@ -729,33 +734,6 @@
   }
 
   /**
-   * Execute the given [callback] within a zone that will capture any unhandled
-   * exceptions and both report them to the client and send them to the given
-   * instrumentation [service]. If a [print] function is provided, then also
-   * capture any data printed by the callback and redirect it to the function.
-   */
-  dynamic _captureLspExceptions(
-      // TODO(dantup): This is a copy/paste of the above with some minor changes.
-      // We should either factor these out, or if we end up with an LspDriver, put
-      // this there.
-      LspSocketServer socketServer,
-      InstrumentationService service,
-      dynamic callback()) {
-    void errorFunction(Zone self, ZoneDelegate parent, Zone zone,
-        dynamic exception, StackTrace stackTrace) {
-      service.logPriorityException(exception, stackTrace);
-      LspAnalysisServer analysisServer = socketServer.analysisServer;
-      analysisServer.sendServerErrorNotification(
-          'Captured exception', exception, stackTrace);
-      throw exception;
-    }
-
-    ZoneSpecification zoneSpecification =
-        new ZoneSpecification(handleUncaughtError: errorFunction);
-    return runZoned(callback, zoneSpecification: zoneSpecification);
-  }
-
-  /**
    * Create and return the parser used to parse the command-line arguments.
    */
   CommandLineParser _createArgParser() {
@@ -909,14 +887,14 @@
         }
       }
     } catch (exception, stackTrace) {
-      service.logPriorityException(exception, stackTrace);
+      service.logException(exception, stackTrace);
     }
     String uuid = _generateUuidString();
     try {
       uuidFile.parent.createSync(recursive: true);
       uuidFile.writeAsStringSync(uuid);
     } catch (exception, stackTrace) {
-      service.logPriorityException(exception, stackTrace);
+      service.logException(exception, stackTrace);
       // Slightly alter the uuid to indicate it was not persisted
       uuid = 'temp-$uuid';
     }
diff --git a/pkg/analysis_server/lib/src/server/error_notifier.dart b/pkg/analysis_server/lib/src/server/error_notifier.dart
new file mode 100644
index 0000000..57bd646
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/error_notifier.dart
@@ -0,0 +1,32 @@
+import 'package:analysis_server/src/analysis_server_abstract.dart';
+import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+
+/// An instrumentation service to show instrumentation errors as error
+/// notifications to the user.
+class ErrorNotifier extends NoopInstrumentationService {
+  AbstractAnalysisServer server;
+
+  @override
+  void logException(dynamic exception, [StackTrace stackTrace]) {
+    if (exception is SilentException) {
+      // Silent exceptions should not be reported to the user.
+      return;
+    }
+
+    var message = 'Internal error';
+    if (exception is CaughtException && exception.message != null) {
+      message = exception.message;
+    }
+
+    server.sendServerErrorNotification(message, exception, stackTrace,
+        fatal: exception is FatalException);
+  }
+}
+
+/// Server may throw a [FatalException] to send a fatal error response to the
+/// IDEs.
+class FatalException extends CaughtException {
+  FatalException(String message, Object exception, stackTrace)
+      : super.withMessage(message, exception, stackTrace);
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart
index 8213781..7a41cc9 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart
@@ -14,7 +14,7 @@
 import 'package:analyzer/dart/analysis/features.dart';
 
 /// Number of lookback tokens.
-const int _LOOKBACK = 50;
+const int _LOOKBACK = 100;
 
 /// Minimum probability to prioritize model-only suggestion.
 const double _MODEL_RELEVANCE_CUTOFF = 0.5;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index da04677..1f5f28c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -2092,10 +2092,10 @@
       // should be parameter of function type
       DartType parameterType = parameterElement.type;
       if (parameterType is InterfaceType && parameterType.isDartCoreFunction) {
-        parameterType = FunctionTypeImpl.synthetic(
-          typeProvider.dynamicType,
-          [],
-          [],
+        parameterType = FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: const [],
+          returnType: typeProvider.dynamicType,
           nullabilitySuffix: NullabilitySuffix.none,
         );
       }
@@ -4376,10 +4376,10 @@
     SdkConstraintExtractor extractor = new SdkConstraintExtractor(pubspecFile);
     String text = extractor.constraintText();
     int offset = extractor.constraintOffset();
-    int length = text.length;
     if (text == null || offset < 0) {
       return;
     }
+    int length = text.length;
     String newText;
     int spaceOffset = text.indexOf(' ');
     if (spaceOffset >= 0) {
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 46ef35f..938cb49 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -829,7 +829,7 @@
     pages.add(new ContextsPage(this));
     pages.add(new EnvironmentVariablesPage(this));
     pages.add(new ExceptionsPage(this));
-    pages.add(new InstrumentationPage(this));
+    //pages.add(new InstrumentationPage(this));
     pages.add(new ProfilePage(this));
 
     // Add server-specific pages. Ordering doesn't matter as the items are
@@ -1016,41 +1016,41 @@
   }
 }
 
-class InstrumentationPage extends DiagnosticPageWithNav {
-  InstrumentationPage(DiagnosticsSite site)
-      : super(site, 'instrumentation', 'Instrumentation',
-            description:
-                'Verbose instrumentation data from the analysis server.');
-
-  @override
-  Future generateContent(Map<String, String> params) async {
-    p(
-        'Instrumentation can be enabled by starting the analysis server with the '
-        '<code>--instrumentation-log-file=path/to/file</code> flag.',
-        raw: true);
-
-    if (!AnalysisEngine.instance.instrumentationService.isActive) {
-      blankslate('Instrumentation not active.');
-      return;
-    }
-
-    h3('Instrumentation');
-
-    p('Instrumentation active.');
-
-    InstrumentationServer instrumentation =
-        AnalysisEngine.instance.instrumentationService.instrumentationServer;
-    String description = instrumentation.describe;
-    HtmlEscape htmlEscape = new HtmlEscape(HtmlEscapeMode.element);
-    description = htmlEscape.convert(description);
-    // Convert http(s): references to hyperlinks.
-    final RegExp urlRegExp = new RegExp(r'[http|https]+:\/*(\S+)');
-    description = description.replaceAllMapped(urlRegExp, (Match match) {
-      return '<a href="${match.group(0)}">${match.group(1)}</a>';
-    });
-    p(description.replaceAll('\n', '<br>'), raw: true);
-  }
-}
+// class InstrumentationPage extends DiagnosticPageWithNav {
+//   InstrumentationPage(DiagnosticsSite site)
+//       : super(site, 'instrumentation', 'Instrumentation',
+//             description:
+//                 'Verbose instrumentation data from the analysis server.');
+//
+//   @override
+//   Future generateContent(Map<String, String> params) async {
+//     p(
+//         'Instrumentation can be enabled by starting the analysis server with the '
+//         '<code>--instrumentation-log-file=path/to/file</code> flag.',
+//         raw: true);
+//
+//     if (!AnalysisEngine.instance.instrumentationService.isActive) {
+//       blankslate('Instrumentation not active.');
+//       return;
+//     }
+//
+//     h3('Instrumentation');
+//
+//     p('Instrumentation active.');
+//
+//     InstrumentationServer instrumentation =
+//         AnalysisEngine.instance.instrumentationService.instrumentationServer;
+//     String description = instrumentation.describe;
+//     HtmlEscape htmlEscape = new HtmlEscape(HtmlEscapeMode.element);
+//     description = htmlEscape.convert(description);
+//     // Convert http(s): references to hyperlinks.
+//     final RegExp urlRegExp = new RegExp(r'[http|https]+:\/*(\S+)');
+//     description = description.replaceAllMapped(urlRegExp, (Match match) {
+//       return '<a href="${match.group(0)}">${match.group(1)}</a>';
+//     });
+//     p(description.replaceAll('\n', '<br>'), raw: true);
+//   }
+// }
 
 class LspCapabilitiesPage extends DiagnosticPageWithNav {
   @override
@@ -1410,8 +1410,8 @@
     buf.writeln('<div class="column one-half">');
     h3('Status');
     buf.writeln(writeOption('Server type', server.runtimeType));
-    buf.writeln(writeOption('Instrumentation enabled',
-        AnalysisEngine.instance.instrumentationService.isActive));
+    // buf.writeln(writeOption('Instrumentation enabled',
+    //     AnalysisEngine.instance.instrumentationService.isActive));
     buf.writeln(writeOption('Server process ID', pid));
     buf.writeln('</div>');
 
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index 170c4b8..884d17b7 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -33,9 +33,9 @@
   void set fileResolverProvider(ResolverProvider provider);
 
   /**
-   * Set the instrumentation [server] that is to be used by the analysis server.
+   * Set the instrumentation [service] that is to be used by the analysis server.
    */
-  void set instrumentationServer(InstrumentationServer server);
+  void set instrumentationService(InstrumentationService service);
 
   /**
    * Set the package resolver provider used to override the way package URI's
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index ed5bec3..e8ac58f 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -2511,8 +2511,8 @@
     driverMap[path] = currentDriver;
     currentDriver.exceptions.listen((ExceptionResult result) {
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.wrapInMessage(
-              'Analysis failed: ${result.path}', result.exception));
+          new CaughtException.withMessage('Analysis failed: ${result.path}',
+              result.exception.exception, result.exception.stackTrace));
     });
     return currentDriver;
   }
diff --git a/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart b/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
index b849d8b..e4e9f2d 100644
--- a/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
+++ b/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
@@ -26,7 +26,7 @@
     String packageRoot = resourceProvider.convertPath('/package');
     String outputDir = resourceProvider.convertPath('/output');
     MigrationInfo migrationInfo = MigrationInfo(
-        libraryInfo.units, resourceProvider.pathContext, packageRoot);
+        libraryInfo.units, {}, resourceProvider.pathContext, packageRoot);
     List<String> contents = [];
     for (UnitInfo unitInfo in libraryInfo.units) {
       contents.add(InstrumentationRenderer(unitInfo, migrationInfo,
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart
index f975eb1..a876f51 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart
@@ -20,7 +20,7 @@
     final tokens =
         tokenize('if (list == null) { return; } for (final i = 0; i < list.');
     final response = await ranking.makeRequest('predict', tokens);
-    expect(response['data']['length'], greaterThan(0.85));
+    expect(response['data']['length'], greaterThan(0.9));
   });
 }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/language_model_test.dart b/pkg/analysis_server/test/services/completion/dart/language_model_test.dart
index 3fab0ee..40cafbf 100644
--- a/pkg/analysis_server/test/services/completion/dart/language_model_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/language_model_test.dart
@@ -11,7 +11,7 @@
 
 final directory = path.join(File.fromUri(Platform.script).parent.path, '..',
     '..', '..', '..', 'language_model', 'lexeme');
-const expectedLookback = 50;
+const expectedLookback = 100;
 
 void main() {
   if (sizeOf<IntPtr>() == 4) {
@@ -46,7 +46,7 @@
     final suggestions = model.predictWithScores(tokens);
     final best = suggestions.entries.first;
     expect(best.key, 'length');
-    expect(best.value, greaterThan(0.85));
+    expect(best.value, greaterThan(0.9));
   });
 
   test('predict when no previous tokens', () {
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index f284a85..56119bb 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -8,8 +8,9 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/server/error_notifier.dart';
 import 'package:analysis_server/src/socket_server.dart';
-import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:test/test.dart';
 
@@ -29,10 +30,9 @@
 
 class SocketServerTest {
   static void createAnalysisServer_alreadyStarted() {
-    SocketServer server = _createSocketServer();
     MockServerChannel channel1 = new MockServerChannel();
     MockServerChannel channel2 = new MockServerChannel();
-    server.createAnalysisServer(channel1);
+    SocketServer server = _createSocketServer(channel1);
     expect(
         channel1.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
     server.createAnalysisServer(channel2);
@@ -54,9 +54,8 @@
   }
 
   static Future createAnalysisServer_successful() {
-    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
-    server.createAnalysisServer(channel);
+    SocketServer server = _createSocketServer(channel);
     channel.expectMsgCount(notificationCount: 1);
     expect(
         channel.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
@@ -70,9 +69,8 @@
   }
 
   static Future requestHandler_exception() {
-    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
-    server.createAnalysisServer(channel);
+    SocketServer server = _createSocketServer(channel);
     channel.expectMsgCount(notificationCount: 1);
     expect(
         channel.notificationsReceived[0].event, SERVER_NOTIFICATION_CONNECTED);
@@ -91,9 +89,8 @@
   }
 
   static Future requestHandler_futureException() async {
-    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
-    server.createAnalysisServer(channel);
+    SocketServer server = _createSocketServer(channel);
     _MockRequestHandler handler = new _MockRequestHandler(true);
     server.analysisServer.handlers = [handler];
     var request = new ServerGetVersionParams().toRequest('0');
@@ -104,16 +101,23 @@
     expect(channel.notificationsReceived[1].event, SERVER_NOTIFICATION_ERROR);
   }
 
-  static SocketServer _createSocketServer() {
-    return new SocketServer(
+  static SocketServer _createSocketServer(MockServerChannel channel) {
+    final errorNotifier = new ErrorNotifier();
+    final server = new SocketServer(
         new AnalysisServerOptions(),
         new DartSdkManager('', false),
-        InstrumentationService.NULL_SERVICE,
+        errorNotifier,
         null,
         null,
         null,
         null,
         null);
+
+    server.createAnalysisServer(channel);
+    errorNotifier.server = server.analysisServer;
+    AnalysisEngine.instance.instrumentationService = errorNotifier;
+
+    return server;
   }
 }
 
diff --git a/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart b/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
index a2b0dcc..49d96a5 100644
--- a/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
+++ b/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
@@ -76,58 +76,60 @@
 
   test_included_multipleRelativeDirectories() async {
     NonNullableFix fix =
-        NonNullableFix(listener, '.', included: ['lib', 'test']);
+        NonNullableFix(listener, '.', null, included: ['lib', 'test']);
     expect(fix.includedRoot, equals(convertPath('/project')));
   }
 
   test_included_multipleRelativeDirectories_nonCanonical() async {
-    NonNullableFix fix = NonNullableFix(listener, '.',
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
         included: ['../project2/lib', '../project2/lib/src']);
     expect(fix.includedRoot, equals(convertPath('/project2/lib')));
   }
 
   test_included_multipleRelativeDirectories_nonCanonical_atFilesystemRoot() async {
-    NonNullableFix fix = NonNullableFix(listener, '.',
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
         included: ['../project2/lib', '../project/lib']);
     expect(fix.includedRoot, equals(convertPath('/')));
   }
 
   test_included_multipleRelativeDirectories_subAndSuperDirectories() async {
-    NonNullableFix fix = NonNullableFix(listener, '.', included: ['lib', '.']);
+    NonNullableFix fix =
+        NonNullableFix(listener, '.', null, included: ['lib', '.']);
     expect(fix.includedRoot, equals(convertPath('/project')));
   }
 
   test_included_multipleRelativeFiles() async {
-    NonNullableFix fix = NonNullableFix(listener, '.',
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
         included: ['lib/lib1.dart', 'test/test.dart']);
     expect(fix.includedRoot, equals(convertPath('/project')));
   }
 
   test_included_multipleRelativeFiles_sameDirectory() async {
-    NonNullableFix fix = NonNullableFix(listener, '.',
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
         included: ['lib/lib1.dart', 'lib/lib2.dart']);
     expect(fix.includedRoot, equals(convertPath('/project/lib')));
   }
 
   test_included_multipleRelativeFilesAndDirectories() async {
-    NonNullableFix fix = NonNullableFix(listener, '.',
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
         included: ['lib/lib1.dart', 'lib/src', '../project/lib/src/lib3.dart']);
     expect(fix.includedRoot, equals(convertPath('/project/lib')));
   }
 
   test_included_singleAbsoluteDirectory() async {
-    NonNullableFix fix = NonNullableFix(listener, '.', included: ['/project']);
+    NonNullableFix fix =
+        NonNullableFix(listener, '.', null, included: ['/project']);
     expect(fix.includedRoot, equals(convertPath('/project')));
   }
 
   test_included_singleAbsoluteFile() async {
-    NonNullableFix fix =
-        NonNullableFix(listener, '.', included: ['/project/bin/bin.dart']);
+    NonNullableFix fix = NonNullableFix(listener, '.', null,
+        included: ['/project/bin/bin.dart']);
     expect(fix.includedRoot, equals(convertPath('/project/bin')));
   }
 
   test_included_singleRelativeDirectory() async {
-    NonNullableFix fix = NonNullableFix(listener, '.', included: ['.']);
+    NonNullableFix fix = NonNullableFix(listener, '.', null, included: ['.']);
     expect(fix.includedRoot, equals(convertPath('/project')));
   }
 
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index 3be8718..593a8fd 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -91,7 +91,8 @@
     migration.finish();
     // Build the migration info.
     InstrumentationInformation info = instrumentationListener.data;
-    InfoBuilder builder = InfoBuilder(info, listener);
+    InfoBuilder builder =
+        InfoBuilder(info, listener, explainNonNullableTypes: true);
     infos = (await builder.explainMigration()).toList();
   }
 
@@ -103,8 +104,12 @@
       {@required String migratedContent}) async {
     addTestFile(originalContent);
     await buildInfo();
-    expect(infos, hasLength(1));
-    UnitInfo unit = infos[0];
+    // Ignore info for dart:core
+    var filteredInfos = [
+      for (var info in infos) if (info.path.indexOf('core.dart') == -1) info
+    ];
+    expect(filteredInfos, hasLength(1));
+    UnitInfo unit = filteredInfos[0];
     expect(unit.path, testFile);
     expect(unit.content, migratedContent);
     return unit;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index ed3eee0..f7a88ed 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -167,8 +167,8 @@
     await resolveTestUnit('''
 class A {
   B b;
-  void f(Object p) {
-    p == b.test;
+  void f(dynamic context) {
+    context == b.test;
   }
 }
 class B {
@@ -177,8 +177,8 @@
     await assertHasFix('''
 class A {
   B b;
-  void f(Object p) {
-    p == b.test;
+  void f(dynamic context) {
+    context == b.test;
   }
 }
 class B {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index e324763..22b0b44 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -234,8 +234,8 @@
     await resolveTestUnit('''
 class A {
   B b;
-  void f(Object p) {
-    p == b.test;
+  void f(dynamic context) {
+    context == b.test;
   }
 }
 class B {
@@ -244,8 +244,8 @@
     await assertHasFix('''
 class A {
   B b;
-  void f(Object p) {
-    p == b.test;
+  void f(dynamic context) {
+    context == b.test;
   }
 }
 class B {
diff --git a/pkg/analysis_server/tool/instrumentation/log/log.dart b/pkg/analysis_server/tool/instrumentation/log/log.dart
index f575765..5e658c0 100644
--- a/pkg/analysis_server/tool/instrumentation/log/log.dart
+++ b/pkg/analysis_server/tool/instrumentation/log/log.dart
@@ -658,57 +658,48 @@
       }
       timeStamp = int.parse(component);
       String entryKind = components[1];
-      if (entryKind == InstrumentationService.TAG_ANALYSIS_TASK) {
-        return new TaskEntry(index, timeStamp, components[2], components[3]);
-      } else if (entryKind == InstrumentationService.TAG_ERROR) {
+      if (entryKind == InstrumentationLogAdapter.TAG_ERROR) {
         return new ErrorEntry(
             index, timeStamp, entryKind, components.sublist(2));
-      } else if (entryKind == InstrumentationService.TAG_EXCEPTION) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_EXCEPTION) {
         return new ExceptionEntry(
             index, timeStamp, entryKind, components.sublist(2));
-      } else if (entryKind == InstrumentationService.TAG_FILE_READ) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_LOG_ENTRY) {
         // Fall through
-      } else if (entryKind == InstrumentationService.TAG_LOG_ENTRY) {
-        // Fall through
-      } else if (entryKind == InstrumentationService.TAG_NOTIFICATION) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_NOTIFICATION) {
         Map requestData = json.decode(components[2]);
         return new NotificationEntry(index, timeStamp, requestData);
-      } else if (entryKind == InstrumentationService.TAG_PERFORMANCE) {
-        // Fall through
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_ERROR) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_ERROR) {
         return new PluginErrorEntry(index, timeStamp, entryKind,
             components.sublist(2, 4), components.sublist(4));
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_EXCEPTION) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_EXCEPTION) {
         return new PluginExceptionEntry(index, timeStamp, entryKind,
             components.sublist(2, 5), components.sublist(5));
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_NOTIFICATION) {
+      } else if (entryKind ==
+          InstrumentationLogAdapter.TAG_PLUGIN_NOTIFICATION) {
         Map requestData = json.decode(components[2]);
         return new PluginNotificationEntry(
             index, timeStamp, requestData, components.sublist(3));
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_REQUEST) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_REQUEST) {
         Map requestData = json.decode(components[2]);
         return new PluginRequestEntry(
             index, timeStamp, requestData, components.sublist(3));
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_RESPONSE) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_RESPONSE) {
         Map responseData = json.decode(components[2]);
         return new PluginResponseEntry(
             index, timeStamp, responseData, components.sublist(3));
-      } else if (entryKind == InstrumentationService.TAG_PLUGIN_TIMEOUT) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_TIMEOUT) {
         return new PluginErrorEntry(index, timeStamp, entryKind,
             components.sublist(2, 3), components.sublist(3));
-      } else if (entryKind == InstrumentationService.TAG_REQUEST) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_REQUEST) {
         Map requestData = json.decode(components[2]);
         return new RequestEntry(index, timeStamp, requestData);
-      } else if (entryKind == InstrumentationService.TAG_RESPONSE) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_RESPONSE) {
         Map responseData = json.decode(components[2]);
         return new ResponseEntry(index, timeStamp, responseData);
-      } else if (entryKind == InstrumentationService.TAG_SUBPROCESS_START) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_VERSION) {
         // Fall through
-      } else if (entryKind == InstrumentationService.TAG_SUBPROCESS_RESULT) {
-        // Fall through
-      } else if (entryKind == InstrumentationService.TAG_VERSION) {
-        // Fall through
-      } else if (entryKind == InstrumentationService.TAG_WATCH_EVENT) {
+      } else if (entryKind == InstrumentationLogAdapter.TAG_WATCH_EVENT) {
         // Fall through
       }
       return new GenericEntry(
diff --git a/pkg/analysis_server/tool/instrumentation/page/log_page.dart b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
index bb9b9c9..e3c7a5b 100644
--- a/pkg/analysis_server/tool/instrumentation/page/log_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
@@ -166,8 +166,7 @@
         var analysisStatus = entry.param('analysis');
         if (analysisStatus is Map) {
           if (analysisStatus['isAnalyzing']) {
-            description =
-                '$description <span class="gray">(analysis)</span> (<a href="${WebServer.taskPath}?analysisStart=${entry.index}">tasks</a>)';
+            description = '$description <span class="gray">(analyzing)</span>';
           } else {
             String duration = _getDuration(pairedEntry, entry);
             description =
diff --git a/pkg/analysis_server/tool/instrumentation/page/task_page.dart b/pkg/analysis_server/tool/instrumentation/page/task_page.dart
deleted file mode 100644
index e553eab..0000000
--- a/pkg/analysis_server/tool/instrumentation/page/task_page.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:math' as math;
-
-import '../log/log.dart';
-import '../server.dart';
-import 'page_writer.dart';
-
-/**
- * A class used to write a human-readable version of the tasks executed within a
- * single analysis step.
- */
-class TaskPage extends PageWriter {
-  /**
-   * The instrumentation log to be written.
-   */
-  final InstrumentationLog log;
-
-  /**
-   * The index of the entry representing the start of an analysis session.
-   */
-  int analysisStart = 0;
-
-  /**
-   * The index of the first task to be written.
-   */
-  int pageStart = 0;
-
-  /**
-   * The number of tasks to be written, or `null` if all of the tasks should
-   * be written.
-   */
-  int pageLength = null;
-
-  /**
-   * The number of digits in the event stamps that are the same for every task.
-   */
-  int prefixLength;
-
-  /**
-   * Initialize a newly created page writer to write a single page worth of
-   * tasks.
-   */
-  TaskPage(this.log);
-
-  @override
-  void writeBody(StringSink sink) {
-    writeMenu(sink);
-    writeTwoColumns(
-        sink, 'leftColumn', _writeLeftColumn, 'rightColumn', _writeRightColumn);
-  }
-
-  @override
-  void writeScripts(StringSink sink) {
-    super.writeScripts(sink);
-    sink.writeln(r'''
-function setDetails(detailsContent) {
-  var element = document.getElementById("details");
-  if (element != null) {
-    element.innerHTML = detailsContent;
-  }
-}
-''');
-  }
-
-  /**
-   * Write the content of the style sheet (without the 'script' tag) for the
-   * page to the given [sink].
-   */
-  void writeStyleSheet(StringSink sink) {
-    super.writeStyleSheet(sink);
-    writeTwoColumnStyles(sink, 'leftColumn', 'rightColumn');
-  }
-
-  /**
-   * Write the given log [entry] to the given [sink].
-   */
-  void _writeEntry(StringSink sink, TaskEntry entry) {
-    String clickHandler = 'setDetails(\'${escape(entry.details())}\')';
-    String timeStamp = entry.timeStamp.toString();
-    if (prefixLength > 0) {
-      timeStamp = timeStamp.substring(prefixLength);
-    }
-
-    sink.writeln('<tr onclick="$clickHandler">');
-    sink.writeln('<td>');
-    sink.writeln(timeStamp);
-    sink.writeln('</td>');
-    sink.writeln('<td>');
-    sink.writeln(entry.taskName);
-    sink.writeln('</td>');
-    sink.writeln('<td style="white-space:nowrap;">');
-    sink.writeln(entry.target);
-    sink.writeln('</td>');
-    sink.writeln('</tr>');
-  }
-
-  /**
-   * Write the entries in the instrumentation log to the given [sink].
-   */
-  void _writeLeftColumn(StringSink sink) {
-    List<TaskEntry> entries = log.taskEntriesFor(analysisStart);
-    prefixLength = computePrefixLength(entries);
-    int length = entries.length;
-    int pageEnd =
-        pageLength == null ? length : math.min(pageStart + pageLength, length);
-    //
-    // Write the header of the column.
-    //
-    sink.writeln('<div class="columnHeader">');
-    sink.writeln('<div style="float: left">');
-    sink.writeln('Tasks $pageStart - ${pageEnd - 1} of ${length - 1}');
-    sink.writeln('</div>');
-
-    sink.writeln('<div style="float: right">');
-    if (pageStart == 0) {
-      sink.writeln('<button type="button" disabled><b>&lt;</b></button>');
-    } else {
-      sink.write('<button type="button">');
-      sink.write(
-          '<a href="${WebServer.taskPath}?analysisStart=$analysisStart&start=${pageStart - pageLength}">');
-      sink.write('<b>&lt;</b>');
-      sink.writeln('</a></button>');
-    }
-    // TODO(brianwilkerson) Add a text field for selecting the start index.
-    if (pageEnd == length) {
-      sink.writeln('<button type="button" disabled><b>&gt;</b></button>');
-    } else {
-      sink.write('<button type="button">');
-      sink.write(
-          '<a href="${WebServer.taskPath}?analysisStart=$analysisStart&start=${pageStart + pageLength}">');
-      sink.write('<b>&gt;</b>');
-      sink.writeln('</a></button>');
-    }
-    sink.writeln('</div>');
-    sink.writeln('</div>');
-    //
-    // Write the main body of the column.
-    //
-    sink.writeln('<table class="fullWidth">');
-    sink.writeln('<tr>');
-    sink.writeln('<th>Time</th>');
-    sink.writeln('<th>Task</th>');
-    sink.writeln('<th>Target</th>');
-    sink.writeln('</tr>');
-    for (int i = pageStart; i < pageEnd; i++) {
-      LogEntry entry = entries[i];
-      _writeEntry(sink, entry);
-    }
-    sink.writeln('</table>');
-  }
-
-  /**
-   * Write a placeholder to the given [sink] where the details of a selected
-   * entry can be displayed.
-   */
-  void _writeRightColumn(StringSink sink) {
-    //
-    // Write the header of the column.
-    //
-    sink.writeln('<div class="columnHeader">');
-    sink.writeln('<p><b>Task Details</b></p>');
-    sink.writeln('</div>');
-    sink.writeln('<div id="details"></div>');
-  }
-}
diff --git a/pkg/analysis_server/tool/instrumentation/server.dart b/pkg/analysis_server/tool/instrumentation/server.dart
index 4fd50e1..cbb0068 100644
--- a/pkg/analysis_server/tool/instrumentation/server.dart
+++ b/pkg/analysis_server/tool/instrumentation/server.dart
@@ -9,7 +9,6 @@
 import 'log/log.dart';
 import 'page/log_page.dart';
 import 'page/stats_page.dart';
-import 'page/task_page.dart';
 
 /**
  * An exception that is thrown when a request is received that cannot be
@@ -32,11 +31,6 @@
   static final String statsPath = '/stats';
 
   /**
-   * The path to the page containing statistics about the instrumentation log.
-   */
-  static final String taskPath = '/task';
-
-  /**
    * The content type for HTML responses.
    */
   static final ContentType _htmlContent =
@@ -118,8 +112,6 @@
         _writeLogPage(request, buffer);
       } else if (path == statsPath) {
         _writeStatsPage(request, buffer);
-      } else if (path == taskPath) {
-        _writeTaskPage(request, buffer);
       } else {
         _returnUnknownRequest(request);
         return;
@@ -219,22 +211,4 @@
   void _writeStatsPage(HttpRequest request, StringBuffer buffer) {
     new StatsPage(log).writePage(buffer);
   }
-
-  void _writeTaskPage(HttpRequest request, StringBuffer buffer) {
-    Map<String, String> parameterMap = getParameterMap(request);
-    String analysisStart = parameterMap['analysisStart'];
-    String start = parameterMap['start'];
-    TaskPage page = new TaskPage(log);
-    if (analysisStart == null) {
-      throw new UnknownRequest();
-    }
-    page.analysisStart = int.parse(analysisStart);
-    if (start != null) {
-      page.pageStart = int.parse(start);
-    } else {
-      page.pageStart = 0;
-    }
-    page.pageLength = 25;
-    page.writePage(buffer);
-  }
 }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 435477a..41ef7cc 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/ast/precedence.dart';
-
 /// Defines the AST model. The AST (Abstract Syntax Tree) model describes the
 /// syntactic (as opposed to semantic) structure of Dart code. The semantic
 /// structure of the code is modeled by the
@@ -35,6 +32,8 @@
 /// When an AST is resolved, the identifiers in the AST will be associated with
 /// the elements that they refer to and every expression in the AST will have a
 /// type associated with it.
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -286,7 +285,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class AssignmentExpression
-    implements Expression, MethodReferenceExpression {
+    implements NullShortableExpression, MethodReferenceExpression {
   /// Return the expression used to compute the left hand side.
   Expression get leftHandSide;
 
@@ -2178,11 +2177,6 @@
   /// is not a function-typed field formal parameter.
   FormalParameterList get parameters;
 
-  /// If the parameter is function-typed, and has the question mark, then its
-  /// function type is nullable. Having a nullable function type means that the
-  /// parameter can be null.
-  Token get question;
-
   /// Set the parameters of the function-typed parameter to the given
   /// [parameters].
   void set parameters(FormalParameterList parameters);
@@ -2193,6 +2187,11 @@
   /// Set the token representing the period to the given [token].
   void set period(Token token);
 
+  /// If the parameter is function-typed, and has the question mark, then its
+  /// function type is nullable. Having a nullable function type means that the
+  /// parameter can be null.
+  Token get question;
+
   /// Return the token representing the 'this' keyword.
   Token get thisKeyword;
 
@@ -3162,7 +3161,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class IndexExpression
-    implements Expression, MethodReferenceExpression {
+    implements NullShortableExpression, MethodReferenceExpression {
   /// Return the auxiliary elements associated with this identifier, or `null`
   /// if this identifier is not in both a getter and setter context.
   ///
@@ -4054,6 +4053,24 @@
   void set literal(Token token);
 }
 
+/// Abstract interface for expressions that may participate in null-shorting.
+abstract class NullShortableExpression implements Expression {
+  /// Returns the expression that terminates any null shorting that might occur
+  /// in this expression.  This may be called regardless of whether this
+  /// expression is itself null-aware.
+  ///
+  /// For example, the statement `a?.b[c] = d;` contains the following
+  /// null-shortable subexpressions:
+  /// - `a?.b`
+  /// - `a?.b[c]`
+  /// - `a?.b[c] = d`
+  ///
+  /// Calling [nullShortingTermination] on any of these subexpressions yields
+  /// the expression `a?.b[c] = d`, indicating that the null-shorting induced by
+  /// the `?.` causes the rest of the subexpression `a?.b[c] = d` to be skipped.
+  Expression get nullShortingTermination;
+}
+
 /// The "on" clause in a mixin declaration.
 ///
 ///    onClause ::=
@@ -4250,7 +4267,7 @@
 ///        [Expression] '.' [SimpleIdentifier]
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class PropertyAccess implements Expression {
+abstract class PropertyAccess implements NullShortableExpression {
   /// Return `true` if this expression is cascaded.
   ///
   /// If it is, then the target of this expression is not stored locally but is
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 951dfe4..29038c6 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -442,6 +442,9 @@
 abstract class ConstructorElement
     implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
   @override
+  ConstructorElement get declaration;
+
+  @override
   ClassElement get enclosingElement;
 
   /// Return `true` if this constructor is a const constructor.
@@ -501,6 +504,13 @@
   /// Return the analysis context in which this element is defined.
   AnalysisContext get context;
 
+  /// Return the declaration of this element. If the element is a view on an
+  /// element, e.g. a method from an interface type, with substituted type
+  /// parameters, return the corresponding element from the class, without any
+  /// substitutions. If this element is already a declaration (or a synthetic
+  /// element, e.g. a synthetic property accessor), return itself.
+  Element get declaration;
+
   /// Return the display name of this element, or `null` if this element does
   /// not have a name.
   ///
@@ -959,6 +969,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ExecutableElement implements FunctionTypedElement {
+  @override
+  ExecutableElement get declaration;
+
   /// Return `true` if this executable element did not have an explicit return
   /// type specified for it in the original source. Note that if there was no
   /// explicit return type, and if the element model is fully populated, then
@@ -1051,6 +1064,9 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class FieldElement
     implements ClassMemberElement, PropertyInducingElement {
+  @override
+  FieldElement get declaration;
+
   /// Return `true` if this field was explicitly marked as being covariant.
   bool get isCovariant;
 
@@ -1327,7 +1343,10 @@
 /// be contained within an extension element.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class MethodElement implements ClassMemberElement, ExecutableElement {}
+abstract class MethodElement implements ClassMemberElement, ExecutableElement {
+  @override
+  MethodElement get declaration;
+}
 
 /// A pseudo-element that represents multiple elements defined within a single
 /// scope that have the same name. This situation is not allowed by the
@@ -1366,6 +1385,9 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ParameterElement
     implements PromotableElement, ConstantEvaluationTarget {
+  @override
+  ParameterElement get declaration;
+
   /// Return the Dart code of the default value, or `null` if no default value.
   String get defaultValueCode;
 
@@ -1481,6 +1503,9 @@
   /// if there is no corresponding setter.
   PropertyAccessorElement get correspondingSetter;
 
+  @override
+  PropertyAccessorElement get declaration;
+
   /// Return `true` if this accessor represents a getter.
   bool get isGetter;
 
@@ -1568,6 +1593,9 @@
   DartType get bound;
 
   @override
+  TypeParameterElement get declaration;
+
+  @override
   @deprecated
   TypeParameterType get type;
 
@@ -1633,6 +1661,9 @@
   /// errors.
   DartObject get constantValue;
 
+  @override
+  VariableElement get declaration;
+
   /// Return `true` if this variable element did not have an explicit type
   /// specified for it.
   bool get hasImplicitType;
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 75cf369..7313b18 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -128,6 +128,7 @@
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
   CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
+  CompileTimeErrorCode.DEFERRED_IMPORT_OF_EXTENSION,
   CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
   CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
   CompileTimeErrorCode.DUPLICATE_DEFINITION,
diff --git a/pkg/analyzer/lib/exception/exception.dart b/pkg/analyzer/lib/exception/exception.dart
index 5fd7348..e5f6335 100644
--- a/pkg/analyzer/lib/exception/exception.dart
+++ b/pkg/analyzer/lib/exception/exception.dart
@@ -68,12 +68,6 @@
   CaughtException.withMessage(this.message, this.exception, stackTrace)
       : this.stackTrace = stackTrace ?? StackTrace.current;
 
-  /**
-   * Create a [CaughtException] to wrap a prior one, adding a [message].
-   */
-  CaughtException.wrapInMessage(String message, CaughtException exception)
-      : this.withMessage(message, exception, null);
-
   @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
@@ -108,3 +102,20 @@
     }
   }
 }
+
+/**
+ * A form of [CaughtException] that should be silent to users.
+ *
+ * This is still considered an exceptional situation and will be sent to crash
+ * reporting.
+ */
+class SilentException extends CaughtException {
+  SilentException(String message, exception, stackTrace)
+      : super.withMessage(message, exception, stackTrace);
+
+  /**
+   * Create a [SilentException] to wrap a [CaughtException], adding a [message].
+   */
+  SilentException.wrapInMessage(String message, CaughtException exception)
+      : this(message, exception, null);
+}
diff --git a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
index 2ac447f..5de75d8 100644
--- a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
@@ -7,38 +7,24 @@
 
 import 'package:analyzer/instrumentation/instrumentation.dart';
 
-/**
- * An [InstrumentationServer] that writes to a file.
- */
-class FileInstrumentationServer implements InstrumentationServer {
+/// An [InstrumentationLogger] that writes to a file (as opposed to an external
+/// source or in-memory source etc.)
+class FileInstrumentationLogger implements InstrumentationLogger {
   final String filePath;
   IOSink _sink;
 
-  FileInstrumentationServer(this.filePath) {
+  FileInstrumentationLogger(this.filePath) {
     File file = new File(filePath);
     _sink = file.openWrite();
   }
 
   @override
-  String get describe => "file: $filePath";
-
-  @override
-  String get sessionId => '';
-
-  @override
   void log(String message) {
     _sink.writeln(message);
   }
 
   @override
-  void logWithPriority(String message) {
-    log(message);
-  }
-
-  @override
   Future shutdown() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     await _sink.close();
     _sink = null;
   }
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index 449fb2c..c7742d2 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -2,512 +2,9 @@
 // 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.
 
-import 'dart:async';
-import 'dart:convert';
-
-/**
- * A container with analysis performance constants.
- */
-class AnalysisPerformanceKind {
-  static const String FULL = 'analysis_full';
-  static const String INCREMENTAL = 'analysis_incremental';
-}
-
-/**
- * The interface used by client code to communicate with an instrumentation
- * server.
- */
-abstract class InstrumentationServer {
-  /**
-   * A user-friendly description of this instrumentation server.
-   */
-  String get describe;
-
-  /**
-   * Return the identifier used to identify the current session.
-   */
-  String get sessionId;
-
-  /**
-   * Pass the given [message] to the instrumentation server so that it will be
-   * logged with other messages.
-   *
-   * This method should be used for most logging.
-   */
-  void log(String message);
-
-  /**
-   * Pass the given [message] to the instrumentation server so that it will be
-   * logged with other messages.
-   *
-   * This method should only be used for logging high priority messages, such as
-   * exceptions that cause the server to shutdown.
-   */
-  void logWithPriority(String message);
-
-  /**
-   * Signal that the client is done communicating with the instrumentation
-   * server. This method should be invoked exactly one time and no other methods
-   * should be invoked on this instance after this method has been invoked.
-   */
-  Future shutdown();
-}
-
-/**
- * The interface used by client code to communicate with an instrumentation
- * server by wrapping an [InstrumentationServer].
- */
-class InstrumentationService {
-  /**
-   * An instrumentation service that will not log any instrumentation data.
-   */
-  static final InstrumentationService NULL_SERVICE =
-      new InstrumentationService(null);
-
-  static const String TAG_ANALYSIS_TASK = 'Task';
-  static const String TAG_ERROR = 'Err';
-  static const String TAG_EXCEPTION = 'Ex';
-  static const String TAG_FILE_READ = 'Read';
-  static const String TAG_INFO = 'Info';
-  static const String TAG_LOG_ENTRY = 'Log';
-  static const String TAG_NOTIFICATION = 'Noti';
-  static const String TAG_PERFORMANCE = 'Perf';
-  static const String TAG_PLUGIN_ERROR = 'PluginErr';
-  static const String TAG_PLUGIN_EXCEPTION = 'PluginEx';
-  static const String TAG_PLUGIN_NOTIFICATION = 'PluginNoti';
-  static const String TAG_PLUGIN_REQUEST = 'PluginReq';
-  static const String TAG_PLUGIN_RESPONSE = 'PluginRes';
-  static const String TAG_PLUGIN_TIMEOUT = 'PluginTo';
-  static const String TAG_REQUEST = 'Req';
-  static const String TAG_RESPONSE = 'Res';
-  static const String TAG_SUBPROCESS_START = 'SPStart';
-  static const String TAG_SUBPROCESS_RESULT = 'SPResult';
-  static const String TAG_VERSION = 'Ver';
-  static const String TAG_WATCH_EVENT = 'Watch';
-
-  /**
-   * The instrumentation server used to communicate with the server, or `null`
-   * if instrumentation data should not be logged.
-   */
-  InstrumentationServer _instrumentationServer;
-
-  /**
-   * Counter used to generate unique ID's for [logSubprocessStart].
-   */
-  int _subprocessCounter = 0;
-
-  /**
-   * Initialize a newly created instrumentation service to communicate with the
-   * given [_instrumentationServer].
-   */
-  InstrumentationService(this._instrumentationServer);
-
-  InstrumentationServer get instrumentationServer => _instrumentationServer;
-
-  /**
-   * Return `true` if this [InstrumentationService] was initialized with a
-   * non-`null` server (and hence instrumentation is active).
-   */
-  bool get isActive => _instrumentationServer != null;
-
-  /**
-   * Return the identifier used to identify the current session.
-   */
-  String get sessionId => _instrumentationServer?.sessionId ?? '';
-
-  /**
-   * The current time, expressed as a decimal encoded number of milliseconds.
-   */
-  String get _timestamp => new DateTime.now().millisecondsSinceEpoch.toString();
-
-  /**
-   * Log the fact that an error, described by the given [message], has occurred.
-   */
-  void logError(String message) {
-    _log(TAG_ERROR, message);
-  }
-
-  /**
-   * Log that the given non-priority [exception] was thrown, with the given
-   * [stackTrace].
-   */
-  void logException(dynamic exception, [StackTrace stackTrace]) {
-    if (_instrumentationServer != null) {
-      String message = _toString(exception);
-      String trace = _toString(stackTrace);
-      _instrumentationServer.log(_join([TAG_EXCEPTION, message, trace]));
-    }
-  }
-
-  /**
-   * Log that the contents of the file with the given [path] were read. The file
-   * had the given [content] and [modificationTime].
-   */
-  void logFileRead(String path, int modificationTime, String content) {
-    if (_instrumentationServer != null) {
-      String timeStamp = _toString(modificationTime);
-      _instrumentationServer
-          .log(_join([TAG_FILE_READ, path, timeStamp, content]));
-    }
-  }
-
-  /**
-   * Log unstructured text information for debugging purposes.
-   */
-  void logInfo(String message, [dynamic exception]) =>
-      _log(TAG_INFO, message + (exception == null ? "" : _toString(exception)));
-
-  /**
-   * Log that a log entry that was written to the analysis engine's log. The log
-   * entry has the given [level] and [message], and was created at the given
-   * [time].
-   */
-  void logLogEntry(String level, DateTime time, String message,
-      Object exception, StackTrace stackTrace) {
-    if (_instrumentationServer != null) {
-      String timeStamp =
-          time == null ? 'null' : time.millisecondsSinceEpoch.toString();
-      String exceptionText = exception.toString();
-      String stackTraceText = stackTrace.toString();
-      _instrumentationServer.log(_join([
-        TAG_LOG_ENTRY,
-        level,
-        timeStamp,
-        message,
-        exceptionText,
-        stackTraceText
-      ]));
-    }
-  }
-
-  /**
-   * Log that a notification has been sent to the client.
-   */
-  void logNotification(String notification) {
-    _log(TAG_NOTIFICATION, notification);
-  }
-
-  /**
-   * Log the given performance fact.
-   */
-  void logPerformance(String kind, Stopwatch sw, String message) {
-    sw.stop();
-    String elapsed = sw.elapsedMilliseconds.toString();
-    if (_instrumentationServer != null) {
-      _instrumentationServer
-          .log(_join([TAG_PERFORMANCE, kind, elapsed, message]));
-    }
-  }
-
-  /**
-   * Log the fact that an error, described by the given [message], was reported
-   * by the given [plugin].
-   */
-  void logPluginError(
-      PluginData plugin, String code, String message, String stackTrace) {
-    if (_instrumentationServer != null) {
-      List<String> fields = <String>[
-        TAG_PLUGIN_ERROR,
-        code,
-        message,
-        stackTrace
-      ];
-      plugin.addToFields(fields);
-      _instrumentationServer.log(_join(fields));
-    }
-  }
-
-  /**
-   * Log that the given non-priority [exception] was thrown, with the given
-   * [stackTrace] by the given [plugin].
-   */
-  void logPluginException(
-      PluginData plugin, dynamic exception, StackTrace stackTrace) {
-    if (_instrumentationServer != null) {
-      List<String> fields = <String>[
-        TAG_PLUGIN_EXCEPTION,
-        _toString(exception),
-        _toString(stackTrace)
-      ];
-      plugin.addToFields(fields);
-      _instrumentationServer.log(_join(fields));
-    }
-  }
-
-  void logPluginNotification(String pluginId, String notification) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer.log(
-          _join([TAG_PLUGIN_NOTIFICATION, notification, pluginId, '', '']));
-    }
-  }
-
-  void logPluginRequest(String pluginId, String request) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer
-          .log(_join([TAG_PLUGIN_REQUEST, request, pluginId, '', '']));
-    }
-  }
-
-  void logPluginResponse(String pluginId, String response) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer
-          .log(_join([TAG_PLUGIN_RESPONSE, response, pluginId, '', '']));
-    }
-  }
-
-  /**
-   * Log that the given [plugin] took too long to execute the given [request].
-   * This doesn't necessarily imply that there is a problem with the plugin,
-   * only that this particular response was not included in the data returned
-   * to the client.
-   */
-  void logPluginTimeout(PluginData plugin, String request) {
-    if (_instrumentationServer != null) {
-      List<String> fields = <String>[TAG_PLUGIN_TIMEOUT, request];
-      plugin.addToFields(fields);
-      _instrumentationServer.log(_join(fields));
-    }
-  }
-
-  /**
-   * Log that the given priority [exception] was thrown, with the given
-   * [stackTrace].
-   */
-  void logPriorityException(dynamic exception, StackTrace stackTrace) {
-    if (_instrumentationServer != null) {
-      String message = _toString(exception);
-      String trace = _toString(stackTrace);
-      _instrumentationServer
-          .logWithPriority(_join([TAG_EXCEPTION, message, trace]));
-    }
-  }
-
-  /**
-   * Log that a request has been sent to the client.
-   */
-  void logRequest(String request) {
-    _log(TAG_REQUEST, request);
-  }
-
-  /**
-   * Log that a response has been sent to the client.
-   */
-  void logResponse(String response) {
-    _log(TAG_RESPONSE, response);
-  }
-
-  /**
-   * Log the result of executing a subprocess.  [subprocessId] should be the
-   * unique ID returned by [logSubprocessStart].
-   */
-  void logSubprocessResult(
-      int subprocessId, int exitCode, String stdout, String stderr) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer.log(_join([
-        TAG_SUBPROCESS_RESULT,
-        subprocessId.toString(),
-        exitCode.toString(),
-        json.encode(stdout),
-        json.encode(stderr)
-      ]));
-    }
-  }
-
-  /**
-   * Log that the given subprocess is about to be executed.  Returns a unique
-   * identifier that can be used to identify the subprocess for later log
-   * entries.
-   */
-  int logSubprocessStart(
-      String executablePath, List<String> arguments, String workingDirectory) {
-    int subprocessId = _subprocessCounter++;
-    if (_instrumentationServer != null) {
-      _instrumentationServer.log(_join([
-        TAG_SUBPROCESS_START,
-        subprocessId.toString(),
-        executablePath,
-        workingDirectory,
-        json.encode(arguments)
-      ]));
-    }
-    return subprocessId;
-  }
-
-  /**
-   * Signal that the client has started analysis server.
-   * This method should be invoked exactly one time.
-   */
-  void logVersion(String uuid, String clientId, String clientVersion,
-      String serverVersion, String sdkVersion) {
-    String normalize(String value) =>
-        value != null && value.isNotEmpty ? value : 'unknown';
-
-    if (_instrumentationServer != null) {
-      _instrumentationServer.logWithPriority(_join([
-        TAG_VERSION,
-        uuid,
-        normalize(clientId),
-        normalize(clientVersion),
-        serverVersion,
-        sdkVersion
-      ]));
-    }
-  }
-
-  /**
-   * Log that the file system watcher sent an event. The [folderPath] is the
-   * path to the folder containing the changed file, the [filePath] is the path
-   * of the file that changed, and the [changeType] indicates what kind of
-   * change occurred.
-   */
-  void logWatchEvent(String folderPath, String filePath, String changeType) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer
-          .log(_join([TAG_WATCH_EVENT, folderPath, filePath, changeType]));
-    }
-  }
-
-  /**
-   * Signal that the client is done communicating with the instrumentation
-   * server. This method should be invoked exactly one time and no other methods
-   * should be invoked on this instance after this method has been invoked.
-   */
-  Future shutdown() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    if (_instrumentationServer != null) {
-      await _instrumentationServer.shutdown();
-      _instrumentationServer = null;
-    }
-  }
-
-  /**
-   * Write an escaped version of the given [field] to the given [buffer].
-   */
-  void _escape(StringBuffer buffer, String field) {
-    int index = field.indexOf(':');
-    if (index < 0) {
-      buffer.write(field);
-      return;
-    }
-    int start = 0;
-    while (index >= 0) {
-      buffer.write(field.substring(start, index));
-      buffer.write('::');
-      start = index + 1;
-      index = field.indexOf(':', start);
-    }
-    buffer.write(field.substring(start));
-  }
-
-  /**
-   * Return the result of joining the values of the given fields, escaping the
-   * separator character by doubling it.
-   */
-  String _join(List<String> fields) {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(_timestamp);
-    int length = fields.length;
-    for (int i = 0; i < length; i++) {
-      buffer.write(':');
-      _escape(buffer, fields[i] ?? 'null');
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * Log the given message with the given tag.
-   */
-  void _log(String tag, String message) {
-    if (_instrumentationServer != null) {
-      _instrumentationServer.log(_join([tag, message]));
-    }
-  }
-
-  /**
-   * Convert the given [object] to a string.
-   */
-  String _toString(Object object) {
-    if (object == null) {
-      return 'null';
-    }
-    return object.toString();
-  }
-}
-
-/**
- * An [InstrumentationServer] that sends messages to multiple instances.
- */
-class MulticastInstrumentationServer implements InstrumentationServer {
-  final List<InstrumentationServer> _servers;
-
-  MulticastInstrumentationServer(this._servers);
-
-  @override
-  String get describe {
-    return _servers
-        .map((InstrumentationServer server) => server.describe)
-        .join("\n");
-  }
-
-  @override
-  String get sessionId => _servers[0].sessionId;
-
-  @override
-  void log(String message) {
-    for (InstrumentationServer server in _servers) {
-      server.log(message);
-    }
-  }
-
-  @override
-  void logWithPriority(String message) {
-    for (InstrumentationServer server in _servers) {
-      server.logWithPriority(message);
-    }
-  }
-
-  @override
-  Future shutdown() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    for (InstrumentationServer server in _servers) {
-      await server.shutdown();
-    }
-  }
-}
-
-/**
- * Information about a plugin.
- */
-class PluginData {
-  /**
-   * The id used to uniquely identify the plugin.
-   */
-  final String pluginId;
-
-  /**
-   * The name of the plugin.
-   */
-  final String name;
-
-  /**
-   * The version of the plugin.
-   */
-  final String version;
-
-  /**
-   * Initialize a newly created set of data about a plugin.
-   */
-  PluginData(this.pluginId, this.name, this.version);
-
-  /**
-   * Add the information about the plugin to the list of [fields] to be sent to
-   * the instrumentation server.
-   */
-  void addToFields(List<String> fields) {
-    fields.add(pluginId);
-    fields.add(name ?? '');
-    fields.add(version ?? '');
-  }
-}
+export 'package:analyzer/instrumentation/log_adapter.dart';
+export 'package:analyzer/instrumentation/logger.dart';
+export 'package:analyzer/instrumentation/multicast_service.dart';
+export 'package:analyzer/instrumentation/noop_service.dart';
+export 'package:analyzer/instrumentation/plugin_data.dart';
+export 'package:analyzer/instrumentation/service.dart';
diff --git a/pkg/analyzer/lib/instrumentation/log_adapter.dart b/pkg/analyzer/lib/instrumentation/log_adapter.dart
new file mode 100644
index 0000000..ff85100
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/log_adapter.dart
@@ -0,0 +1,217 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/instrumentation/logger.dart';
+import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:analyzer/instrumentation/service.dart';
+
+/// A class to adapt an [InstrumentationService] into a log using an [InstrumentationLogger].
+class InstrumentationLogAdapter implements InstrumentationService {
+  static const String TAG_ERROR = 'Err';
+  static const String TAG_EXCEPTION = 'Ex';
+  static const String TAG_INFO = 'Info';
+  static const String TAG_LOG_ENTRY = 'Log';
+  static const String TAG_NOTIFICATION = 'Noti';
+  static const String TAG_PLUGIN_ERROR = 'PluginErr';
+  static const String TAG_PLUGIN_EXCEPTION = 'PluginEx';
+  static const String TAG_PLUGIN_NOTIFICATION = 'PluginNoti';
+  static const String TAG_PLUGIN_REQUEST = 'PluginReq';
+  static const String TAG_PLUGIN_RESPONSE = 'PluginRes';
+  static const String TAG_PLUGIN_TIMEOUT = 'PluginTo';
+  static const String TAG_REQUEST = 'Req';
+  static const String TAG_RESPONSE = 'Res';
+  static const String TAG_VERSION = 'Ver';
+  static const String TAG_WATCH_EVENT = 'Watch';
+
+  /// A logger used to log instrumentation in string format.
+  InstrumentationLogger _instrumentationLogger;
+
+  /// Initialize a newly created instrumentation service to communicate with the
+  /// given [_instrumentationLogger].
+  InstrumentationLogAdapter(this._instrumentationLogger);
+
+  /// The current time, expressed as a decimal encoded number of milliseconds.
+  String get _timestamp => new DateTime.now().millisecondsSinceEpoch.toString();
+
+  @override
+  void logError(String message) => _log(TAG_ERROR, message);
+
+  @override
+  void logException(dynamic exception, [StackTrace stackTrace]) {
+    if (_instrumentationLogger != null) {
+      String message = _toString(exception);
+      String trace = _toString(stackTrace);
+      _instrumentationLogger.log(_join([TAG_EXCEPTION, message, trace]));
+    }
+  }
+
+  @override
+  void logInfo(String message, [dynamic exception]) =>
+      _log(TAG_INFO, message + (exception == null ? "" : exception.toString()));
+
+  @override
+  void logLogEntry(String level, DateTime time, String message,
+      Object exception, StackTrace stackTrace) {
+    if (_instrumentationLogger != null) {
+      String timeStamp =
+          time == null ? 'null' : time.millisecondsSinceEpoch.toString();
+      String exceptionText = exception.toString();
+      String stackTraceText = stackTrace.toString();
+      _instrumentationLogger.log(_join([
+        TAG_LOG_ENTRY,
+        level,
+        timeStamp,
+        message,
+        exceptionText,
+        stackTraceText
+      ]));
+    }
+  }
+
+  @override
+  void logNotification(String notification) =>
+      _log(TAG_NOTIFICATION, notification);
+
+  @override
+  void logPluginError(
+      PluginData plugin, String code, String message, String stackTrace) {
+    if (_instrumentationLogger != null) {
+      List<String> fields = <String>[
+        TAG_PLUGIN_ERROR,
+        code,
+        message,
+        stackTrace
+      ];
+      plugin.addToFields(fields);
+      _instrumentationLogger.log(_join(fields));
+    }
+  }
+
+  @override
+  void logPluginException(
+      PluginData plugin, dynamic exception, StackTrace stackTrace) {
+    if (_instrumentationLogger != null) {
+      List<String> fields = <String>[
+        TAG_PLUGIN_EXCEPTION,
+        _toString(exception),
+        _toString(stackTrace)
+      ];
+      plugin.addToFields(fields);
+      _instrumentationLogger.log(_join(fields));
+    }
+  }
+
+  @override
+  void logPluginNotification(String pluginId, String notification) {
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger.log(
+          _join([TAG_PLUGIN_NOTIFICATION, notification, pluginId, '', '']));
+    }
+  }
+
+  @override
+  void logPluginRequest(String pluginId, String request) {
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger
+          .log(_join([TAG_PLUGIN_REQUEST, request, pluginId, '', '']));
+    }
+  }
+
+  @override
+  void logPluginResponse(String pluginId, String response) {
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger
+          .log(_join([TAG_PLUGIN_RESPONSE, response, pluginId, '', '']));
+    }
+  }
+
+  @override
+  void logPluginTimeout(PluginData plugin, String request) {
+    if (_instrumentationLogger != null) {
+      List<String> fields = <String>[TAG_PLUGIN_TIMEOUT, request];
+      plugin.addToFields(fields);
+      _instrumentationLogger.log(_join(fields));
+    }
+  }
+
+  @override
+  void logRequest(String request) => _log(TAG_REQUEST, request);
+
+  @override
+  void logResponse(String response) => _log(TAG_RESPONSE, response);
+
+  @override
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion) {
+    String normalize(String value) =>
+        value != null && value.isNotEmpty ? value : 'unknown';
+
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger.log(_join([
+        TAG_VERSION,
+        uuid,
+        normalize(clientId),
+        normalize(clientVersion),
+        serverVersion,
+        sdkVersion
+      ]));
+    }
+  }
+
+  @override
+  void logWatchEvent(String folderPath, String filePath, String changeType) {
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger
+          .log(_join([TAG_WATCH_EVENT, folderPath, filePath, changeType]));
+    }
+  }
+
+  @override
+  Future<void> shutdown() => _instrumentationLogger.shutdown();
+
+  /// Write an escaped version of the given [field] to the given [buffer].
+  void _escape(StringBuffer buffer, String field) {
+    int index = field.indexOf(':');
+    if (index < 0) {
+      buffer.write(field);
+      return;
+    }
+    int start = 0;
+    while (index >= 0) {
+      buffer.write(field.substring(start, index));
+      buffer.write('::');
+      start = index + 1;
+      index = field.indexOf(':', start);
+    }
+    buffer.write(field.substring(start));
+  }
+
+  /// Return the result of joining the values of the given fields, escaping the
+  /// separator character by doubling it.
+  String _join(List<String> fields) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(_timestamp);
+    int length = fields.length;
+    for (int i = 0; i < length; i++) {
+      buffer.write(':');
+      _escape(buffer, fields[i] ?? 'null');
+    }
+    return buffer.toString();
+  }
+
+  /// Log the given message with the given tag.
+  void _log(String tag, String message) {
+    if (_instrumentationLogger != null) {
+      _instrumentationLogger.log(_join([tag, message]));
+    }
+  }
+
+  /// Convert the given [object] to a string.
+  String _toString(Object object) {
+    if (object == null) {
+      return 'null';
+    }
+    return object.toString();
+  }
+}
diff --git a/pkg/analyzer/lib/instrumentation/logger.dart b/pkg/analyzer/lib/instrumentation/logger.dart
new file mode 100644
index 0000000..d1eaea4
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/logger.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// The interface used by client code to communicate with an instrumentation
+/// server.
+abstract class InstrumentationLogger {
+  /// Pass the given [message] to the instrumentation server so that it will be
+  /// logged with other messages.
+  ///
+  /// This method should be used for most logging.
+  void log(String message);
+
+  /// Shut down this logger, including file handles etc.
+  Future<void> shutdown();
+}
diff --git a/pkg/analyzer/lib/instrumentation/multicast_service.dart b/pkg/analyzer/lib/instrumentation/multicast_service.dart
new file mode 100644
index 0000000..0d4fa40
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/multicast_service.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:analyzer/instrumentation/service.dart';
+
+/// An [InstrumentationService] that sends messages to multiple services.
+class MulticastInstrumentationService implements InstrumentationService {
+  final List<InstrumentationService> _services;
+
+  MulticastInstrumentationService(this._services);
+
+  @override
+  void logError(String message) {
+    _services.forEach((s) => s.logError(message));
+  }
+
+  @override
+  void logException(exception, [StackTrace stackTrace]) {
+    _services.forEach((s) => s.logException(exception, stackTrace));
+  }
+
+  @override
+  void logInfo(String message, [dynamic exception]) {
+    _services.forEach((s) => s.logInfo(message, exception));
+  }
+
+  @override
+  void logLogEntry(String level, DateTime time, String message,
+      Object exception, StackTrace stackTrace) {
+    _services.forEach(
+        (s) => s.logLogEntry(level, time, message, exception, stackTrace));
+  }
+
+  @override
+  void logNotification(String notification) {
+    _services.forEach((s) => s.logNotification(notification));
+  }
+
+  @override
+  void logPluginError(
+      PluginData plugin, String code, String message, String stackTrace) {
+    _services
+        .forEach((s) => s.logPluginError(plugin, code, message, stackTrace));
+  }
+
+  @override
+  void logPluginException(PluginData plugin, exception, StackTrace stackTrace) {
+    _services
+        .forEach((s) => s.logPluginException(plugin, exception, stackTrace));
+  }
+
+  @override
+  void logPluginNotification(String pluginId, String notification) {
+    _services.forEach((s) => s.logPluginNotification(pluginId, notification));
+  }
+
+  @override
+  void logPluginRequest(String pluginId, String request) {
+    _services.forEach((s) => s.logPluginRequest(pluginId, request));
+  }
+
+  @override
+  void logPluginResponse(String pluginId, String response) {
+    _services.forEach((s) => s.logPluginResponse(pluginId, response));
+  }
+
+  @override
+  void logPluginTimeout(PluginData plugin, String request) {
+    _services.forEach((s) => s.logPluginTimeout(plugin, request));
+  }
+
+  @override
+  void logRequest(String request) {
+    _services.forEach((s) => s.logRequest(request));
+  }
+
+  @override
+  void logResponse(String response) {
+    _services.forEach((s) => s.logResponse(response));
+  }
+
+  @override
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion) {
+    _services.forEach((s) =>
+        s.logVersion(uuid, clientId, clientVersion, serverVersion, sdkVersion));
+  }
+
+  @override
+  void logWatchEvent(String folderPath, String filePath, String changeType) {
+    _services.forEach((s) => s.logWatchEvent(folderPath, filePath, changeType));
+  }
+
+  @override
+  Future<void> shutdown() {
+    return Future.wait(_services.map((s) => s.shutdown()));
+  }
+}
diff --git a/pkg/analyzer/lib/instrumentation/noop_service.dart b/pkg/analyzer/lib/instrumentation/noop_service.dart
new file mode 100644
index 0000000..c550863
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/noop_service.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:analyzer/instrumentation/service.dart';
+
+/// An implementation of [InstrumentationService] which noops instead of saving
+/// instrumentation logs.
+class NoopInstrumentationService implements InstrumentationService {
+  @override
+  void logError(String message) {}
+
+  @override
+  void logException(dynamic exception, [StackTrace stackTrace]) {}
+
+  @override
+  void logInfo(String message, [dynamic exception]) {}
+
+  @override
+  void logLogEntry(String level, DateTime time, String message,
+      Object exception, StackTrace stackTrace) {}
+
+  @override
+  void logNotification(String notification) {}
+
+  @override
+  void logPluginError(
+      PluginData plugin, String code, String message, String stackTrace) {}
+
+  @override
+  void logPluginException(
+      PluginData plugin, dynamic exception, StackTrace stackTrace) {}
+
+  @override
+  void logPluginNotification(String pluginId, String notification) {}
+
+  @override
+  void logPluginRequest(String pluginId, String request) {}
+
+  @override
+  void logPluginResponse(String pluginId, String response) {}
+
+  @override
+  void logPluginTimeout(PluginData plugin, String request) {}
+
+  @override
+  void logRequest(String request) {}
+
+  @override
+  void logResponse(String response) {}
+
+  @override
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion) {}
+
+  @override
+  void logWatchEvent(String folderPath, String filePath, String changeType) {}
+
+  @override
+  Future<void> shutdown() async {}
+}
diff --git a/pkg/analyzer/lib/instrumentation/plugin_data.dart b/pkg/analyzer/lib/instrumentation/plugin_data.dart
new file mode 100644
index 0000000..bc4c3e5
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/plugin_data.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Information about a plugin.
+class PluginData {
+  /// The id used to uniquely identify the plugin.
+  final String pluginId;
+
+  /// The name of the plugin.
+  final String name;
+
+  /// The version of the plugin.
+  final String version;
+
+  /// Initialize a newly created set of data about a plugin.
+  PluginData(this.pluginId, this.name, this.version);
+
+  /// Add the information about the plugin to the list of [fields] to be sent to
+  /// the instrumentation server.
+  void addToFields(List<String> fields) {
+    fields.add(pluginId);
+    fields.add(name ?? '');
+    fields.add(version ?? '');
+  }
+}
diff --git a/pkg/analyzer/lib/instrumentation/service.dart b/pkg/analyzer/lib/instrumentation/service.dart
new file mode 100644
index 0000000..59d9a2a
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/service.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/instrumentation/noop_service.dart';
+import 'package:analyzer/instrumentation/plugin_data.dart';
+
+/// The interface used by client code to communicate with an instrumentation
+/// service of some kind.
+abstract class InstrumentationService {
+  /// A service which does not log or otherwise record instrumentation.
+  static final NULL_SERVICE = NoopInstrumentationService();
+
+  /// Log the fact that an error, described by the given [message], has occurred.
+  void logError(String message);
+
+  /// Log that the given non-priority [exception] was thrown, with the given
+  /// [stackTrace].
+  void logException(dynamic exception, [StackTrace stackTrace]);
+
+  /// Log unstructured text information for debugging purposes.
+  void logInfo(String message, [dynamic exception]);
+
+  /// Log that a log entry that was written to the analysis engine's log. The log
+  /// entry has the given [level] and [message], and was created at the given
+  /// [time].
+  void logLogEntry(String level, DateTime time, String message,
+      Object exception, StackTrace stackTrace);
+
+  /// Log that a notification has been sent to the client.
+  void logNotification(String notification);
+
+  /// Log the fact that an error, described by the given [message], was reported
+  /// by the given [plugin].
+  void logPluginError(
+      PluginData plugin, String code, String message, String stackTrace);
+
+  /// Log that the given non-priority [exception] was thrown, with the given
+  /// [stackTrace] by the given [plugin].
+  void logPluginException(
+      PluginData plugin, dynamic exception, StackTrace stackTrace);
+
+  /// Log a notification from the plugin with the given [pluginId].
+  void logPluginNotification(String pluginId, String notification);
+
+  /// Log a request to the plugin with the given [pluginId].
+  void logPluginRequest(String pluginId, String request);
+
+  /// Log a response from the plugin with the given [pluginId].
+  void logPluginResponse(String pluginId, String response);
+
+  /// Log that the given [plugin] took too long to execute the given [request].
+  /// This doesn't necessarily imply that there is a problem with the plugin,
+  /// only that this particular response was not included in the data returned
+  /// to the client.
+  void logPluginTimeout(PluginData plugin, String request);
+
+  /// Log that a request has been sent to the client.
+  void logRequest(String request);
+
+  /// Log that a response has been sent to the client.
+  void logResponse(String response);
+
+  /// Signal that the client has started analysis server.
+  /// This method should be invoked exactly one time.
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion);
+
+  /// Log that the file system watcher sent an event. The [folderPath] is the
+  /// path to the folder containing the changed file, the [filePath] is the path
+  /// of the file that changed, and the [changeType] indicates what kind of
+  /// change occurred.
+  void logWatchEvent(String folderPath, String filePath, String changeType);
+
+  /// Shut down this service.
+  Future<void> shutdown();
+}
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 05cbe28..dd56ff4b 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -110,8 +110,9 @@
         return _internalResolveUri(null, uri);
       }
     } catch (exception, stackTrace) {
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.withMessage(
+          new SilentException(
               "Could not resolve URI: $absoluteUri", exception, stackTrace));
     }
     return null;
@@ -123,8 +124,9 @@
       try {
         return _internalResolveUri(null, absoluteUri);
       } on AnalysisException catch (exception, stackTrace) {
+        // TODO(39284): should this exception be silent?
         AnalysisEngine.instance.instrumentationService.logException(
-            new CaughtException.withMessage(
+            new SilentException(
                 "Could not resolve URI: $absoluteUri", exception, stackTrace));
       }
     }
@@ -144,8 +146,9 @@
     } catch (exception, stackTrace) {
       String containingFullName =
           containingSource != null ? containingSource.fullName : '<null>';
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService
-          .logException(new CaughtException.withMessage(
+          .logException(new SilentException(
               "Could not resolve URI ($containedUri) "
               "relative to source ($containingFullName)",
               exception,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 75e72e1a..bdbcc87 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -89,7 +89,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 88;
+  static const int DATA_VERSION = 89;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 02b4b51..e2856fc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 
@@ -338,9 +337,7 @@
    * [_ElementInfo.id] is filled by [assemble] during final sorting.
    */
   _ElementInfo _getElementInfo(Element element) {
-    if (element is Member) {
-      element = (element as Member).baseElement;
-    }
+    element = element.declaration;
     return elementMap.putIfAbsent(element, () {
       CompilationUnitElement unitElement = getUnitElement(element);
       int unitId = _getUnitId(unitElement);
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index dc4cc41..1eadd80 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:collection/collection.dart';
 
@@ -384,13 +383,8 @@
 
   Future<List<SearchResult>> _searchReferences_Function(
       Element element, SearchedFiles searchedFiles) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    if (element is Member) {
-      element = (element as Member).baseElement;
-    }
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element, searchedFiles, const {
+    await _addResults(results, element.declaration, searchedFiles, const {
       IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
       IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION
     });
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index 5bd8db5..ec869da 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -2,8 +2,10 @@
 // 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.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/summary/api_signature.dart';
 
@@ -59,6 +61,12 @@
     addToken(node.rightBracket);
   }
 
+  void addFeatureSet(FeatureSet featureSet) {
+    for (var feature in ExperimentStatus.knownFeatures.values) {
+      signature.addBool(featureSet.isEnabled(feature));
+    }
+  }
+
   void addFunctionBodyModifiers(FunctionBody node) {
     signature.addBool(node.isSynchronous);
     signature.addBool(node.isGenerator);
@@ -119,6 +127,8 @@
   }
 
   void compute(CompilationUnit unit) {
+    addFeatureSet(unit.featureSet);
+
     signature.addInt(unit.directives.length);
     unit.directives.forEach(addNode);
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index de7f57f..b6c1232 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -615,6 +615,7 @@
 ///    assignmentExpression ::=
 ///        [Expression] operator [Expression]
 class AssignmentExpressionImpl extends ExpressionImpl
+    with NullShortableExpressionImpl
     implements AssignmentExpression {
   /// The expression used to compute the left hand side.
   ExpressionImpl _leftHandSide;
@@ -647,8 +648,9 @@
       } else {
         message = "The right-hand size is null";
       }
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException(new AnalysisException(message), null),
+          new SilentException(message, new AnalysisException(message), null),
           StackTrace.current);
     }
     _leftHandSide = _becomeParentOf(leftHandSide);
@@ -686,6 +688,9 @@
     _rightHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @override
+  AstNode get _nullShortingExtensionCandidate => parent;
+
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the right operand will be
@@ -726,6 +731,10 @@
     _leftHandSide?.accept(visitor);
     _rightHandSide?.accept(visitor);
   }
+
+  @override
+  bool _extendsNullShorting(Expression child) =>
+      identical(child, _leftHandSide);
 }
 
 /// A node in the AST structure for a Dart program.
@@ -5750,7 +5759,9 @@
 ///
 ///    indexExpression ::=
 ///        [Expression] '[' [Expression] ']'
-class IndexExpressionImpl extends ExpressionImpl implements IndexExpression {
+class IndexExpressionImpl extends ExpressionImpl
+    with NullShortableExpressionImpl
+    implements IndexExpression {
   /// The expression used to compute the object being indexed, or `null` if this
   /// index expression is part of a cascade expression.
   ExpressionImpl _target;
@@ -5861,6 +5872,9 @@
     _target = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @override
+  AstNode get _nullShortingExtensionCandidate => parent;
+
   /// If the AST structure has been resolved, and the function being invoked is
   /// known based on static type information, then return the parameter element
   /// representing the parameter to which the value of the index expression will
@@ -5912,6 +5926,9 @@
     _target?.accept(visitor);
     _index?.accept(visitor);
   }
+
+  @override
+  bool _extendsNullShorting(Expression child) => identical(child, _target);
 }
 
 /// An instance creation expression.
@@ -7718,6 +7735,33 @@
   }
 }
 
+/// Mixin that can be used to implement [NullShortableExpression].
+mixin NullShortableExpressionImpl implements NullShortableExpression {
+  @override
+  Expression get nullShortingTermination {
+    var result = this;
+    while (true) {
+      var parent = result._nullShortingExtensionCandidate;
+      if (parent is NullShortableExpressionImpl &&
+          parent._extendsNullShorting(result)) {
+        result = parent;
+      } else {
+        return result;
+      }
+    }
+  }
+
+  /// Gets the ancestor of this node to which null-shorting might be extended.
+  /// Usually this is just the node's parent, however if `this` is the base of
+  /// a cascade section, it will be the cascade expression itself, which may be
+  /// a more distant ancestor.
+  AstNode get _nullShortingExtensionCandidate;
+
+  /// Indicates whether the effect of any null-shorting within [descendant]
+  /// (which should be a descendant of `this`) should extend to include `this`.
+  bool _extendsNullShorting(Expression descendant);
+}
+
 /// The "on" clause in a mixin declaration.
 ///
 ///    onClause ::=
@@ -8184,7 +8228,9 @@
 ///
 ///    propertyAccess ::=
 ///        [Expression] '.' [SimpleIdentifier]
-class PropertyAccessImpl extends ExpressionImpl implements PropertyAccess {
+class PropertyAccessImpl extends ExpressionImpl
+    with NullShortableExpressionImpl
+    implements PropertyAccess {
   /// The expression computing the object defining the property being accessed.
   ExpressionImpl _target;
 
@@ -8266,6 +8312,9 @@
   }
 
   @override
+  AstNode get _nullShortingExtensionCandidate => parent;
+
+  @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitPropertyAccess(this);
 
   @override
@@ -8273,6 +8322,9 @@
     _target?.accept(visitor);
     _propertyName?.accept(visitor);
   }
+
+  @override
+  bool _extendsNullShorting(Expression child) => identical(child, _target);
 }
 
 /// The invocation of a constructor in the same class from within a
@@ -9969,11 +10021,17 @@
 /// A type parameter.
 ///
 ///    typeParameter ::=
-///        [SimpleIdentifier] ('extends' [TypeName])?
+///        typeParameterVariance? [SimpleIdentifier] ('extends' [TypeName])?
+///
+///    typeParameterVariance ::= 'out' | 'inout' | 'in'
 class TypeParameterImpl extends DeclarationImpl implements TypeParameter {
   /// The name of the type parameter.
   SimpleIdentifierImpl _name;
 
+  /// The token representing the variance modifier keyword, or `null` if
+  /// there is no explicit variance modifier, meaning legacy covariance.
+  Token varianceKeyword;
+
   /// The token representing the 'extends' keyword, or `null` if there is no
   /// explicit upper bound.
   Token extendsKeyword;
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 5d745b6..95d8752 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -2475,9 +2475,9 @@
       buffer.write(currentNode.runtimeType);
       currentNode = currentNode.parent;
     }
+    // TODO(39284): should this exception be silent?
     AnalysisEngine.instance.instrumentationService.logException(
-        new CaughtException.withMessage(
-            buffer.toString(), exception, stackTrace));
+        new SilentException(buffer.toString(), exception, stackTrace));
   }
 }
 
@@ -2531,8 +2531,9 @@
     try {
       node.accept(this);
     } catch (exception, stackTrace) {
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.withMessage(
+          new SilentException(
               "Unable to locate element at offset ($_startOffset - $_endOffset)",
               exception,
               stackTrace));
@@ -2571,8 +2572,9 @@
     } catch (exception, stackTrace) {
       // Ignore the exception and proceed in order to visit the rest of the
       // structure.
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.withMessage(
+          new SilentException(
               "Exception caught while traversing an AST structure.",
               exception,
               stackTrace));
@@ -2631,8 +2633,9 @@
     try {
       node.accept(this);
     } catch (exception, stackTrace) {
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.withMessage(
+          new SilentException(
               "Unable to locate element at offset ($_startOffset - $_endOffset)",
               exception,
               stackTrace));
@@ -2671,8 +2674,9 @@
     } catch (exception, stackTrace) {
       // Ignore the exception and proceed in order to visit the rest of the
       // structure.
+      // TODO(39284): should this exception be silent?
       AnalysisEngine.instance.instrumentationService.logException(
-          new CaughtException.withMessage(
+          new SilentException(
               "Exception caught while traversing an AST structure.",
               exception,
               stackTrace));
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 4fa3e1f..dda42f3 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -268,7 +268,7 @@
       ConstantEvaluationTarget constant, ReferenceFinderCallback callback) {
     ReferenceFinder referenceFinder = new ReferenceFinder(callback);
     if (constant is ConstructorElement) {
-      constant = getConstructorImpl(constant);
+      constant = (constant as ConstructorElement).declaration;
     }
     if (constant is VariableElementImpl) {
       Expression initializer = constant.constantInitializer;
@@ -281,7 +281,7 @@
             getConstRedirectedConstructor(constant);
         if (redirectedConstructor != null) {
           ConstructorElement redirectedConstructorBase =
-              getConstructorImpl(redirectedConstructor);
+              redirectedConstructor?.declaration;
           callback(redirectedConstructorBase);
           return;
         } else if (constant.isFactory) {
@@ -314,7 +314,7 @@
               (constant.returnType as InterfaceType).superclass;
           if (superclass != null && !superclass.isObject) {
             ConstructorElement unnamedConstructor =
-                getConstructorImpl(superclass.element.unnamedConstructor);
+                superclass.element.unnamedConstructor?.declaration;
             if (unnamedConstructor != null) {
               callback(unnamedConstructor);
             }
@@ -422,7 +422,7 @@
       return null;
     }
 
-    if (!getConstructorImpl(constructor).isCycleFree) {
+    if (!(constructor.declaration as ConstructorElementImpl).isCycleFree) {
       // It's not safe to evaluate this constructor, so bail out.
       // TODO(paulberry): ensure that a reasonable error message is produced
       // in this case, as well as other cases involving constant expression
@@ -519,7 +519,7 @@
       // it an unknown value will suppress further errors.
       return new DartObjectImpl.validWithUnknownValue(definingClass);
     }
-    ConstructorElementImpl constructorBase = getConstructorImpl(constructor);
+    ConstructorElementImpl constructorBase = constructor.declaration;
     validator.beforeGetConstantInitializers(constructorBase);
     List<ConstructorInitializer> initializers =
         constructorBase.constantInitializers;
@@ -581,10 +581,7 @@
 
     for (int i = 0; i < parameterCount; i++) {
       ParameterElement parameter = parameters[i];
-      ParameterElement baseParameter = parameter;
-      while (baseParameter is ParameterMember) {
-        baseParameter = (baseParameter as ParameterMember).baseElement;
-      }
+      ParameterElement baseParameter = parameter.declaration;
       DartObjectImpl argumentValue;
       AstNode errorTarget;
       if (baseParameter.isNamed) {
@@ -779,10 +776,10 @@
       if (redirectedConstructor == null) {
         break;
       } else {
-        ConstructorElement constructorBase = getConstructorImpl(constructor);
+        ConstructorElement constructorBase = constructor?.declaration;
         constructorsVisited.add(constructorBase);
         ConstructorElement redirectedConstructorBase =
-            getConstructorImpl(redirectedConstructor);
+            redirectedConstructor?.declaration;
         if (constructorsVisited.contains(redirectedConstructorBase)) {
           // Cycle in redirecting factory constructors--this is not allowed
           // and is checked elsewhere--see
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index e792f72..fc81e96 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -12,15 +12,6 @@
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
-
-ConstructorElementImpl getConstructorImpl(ConstructorElement constructor) {
-  while (constructor is ConstructorMember) {
-    constructor = (constructor as ConstructorMember).baseElement;
-  }
-  return constructor;
-}
 
 /// Callback used by [ReferenceFinder] to report that a dependency was found.
 typedef void ReferenceFinderCallback(ConstantEvaluationTarget dependency);
@@ -304,7 +295,7 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
-      ConstructorElement constructor = getConstructorImpl(node.staticElement);
+      ConstructorElement constructor = node.staticElement?.declaration;
       if (constructor != null) {
         _callback(constructor);
       }
@@ -325,7 +316,7 @@
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     super.visitRedirectingConstructorInvocation(node);
-    ConstructorElement target = getConstructorImpl(node.staticElement);
+    ConstructorElement target = node.staticElement?.declaration;
     if (target != null) {
       _callback(target);
     }
@@ -345,7 +336,7 @@
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     super.visitSuperConstructorInvocation(node);
-    ConstructorElement constructor = getConstructorImpl(node.staticElement);
+    ConstructorElement constructor = node.staticElement?.declaration;
     if (constructor != null) {
       _callback(constructor);
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 7b75052..da91d96 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine, AnalysisOptionsImpl;
@@ -1998,6 +1999,9 @@
   }
 
   @override
+  ConstructorElement get declaration => this;
+
+  @override
   String get displayName {
     if (linkedNode != null) {
       return reference.name;
@@ -2156,12 +2160,12 @@
   @override
   FunctionType get type {
     // TODO(scheglov) Remove "element" in the breaking changes branch.
-    return _type ??= FunctionTypeImpl.synthetic(
-      returnType,
-      typeParameters,
-      parameters,
-      element: this,
+    return _type ??= FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
+      element: this,
     );
   }
 
@@ -2687,6 +2691,9 @@
   }
 
   @override
+  Element get declaration => this;
+
+  @override
   String get displayName => _name;
 
   @override
@@ -3739,12 +3746,12 @@
     if (_type != null) return _type;
 
     // TODO(scheglov) Remove "element" in the breaking changes branch.
-    return _type = FunctionTypeImpl.synthetic(
-      returnType,
-      typeParameters,
-      parameters,
-      element: this,
+    return _type = FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
+      element: this,
     );
   }
 
@@ -4330,6 +4337,9 @@
   FieldElementImpl.forNode(Identifier name) : super.forNode(name);
 
   @override
+  FieldElement get declaration => this;
+
+  @override
   bool get isCovariant {
     if (linkedNode != null) {
       return linkedContext.isExplicitlyCovariant(linkedNode);
@@ -4458,6 +4468,9 @@
   }
 
   @override
+  ExecutableElement get declaration => this;
+
+  @override
   String get displayName {
     if (linkedNode != null) {
       return reference.name;
@@ -4583,12 +4596,12 @@
     if (_type != null) return _type;
 
     // TODO(scheglov) Remove "element" in the breaking changes branch.
-    return _type = FunctionTypeImpl.synthetic(
-      returnType,
-      typeParameters,
-      parameters,
-      element: this,
+    return _type = FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
+      element: this,
     );
   }
 
@@ -4900,13 +4913,13 @@
 
     var substitution = Substitution.fromPairs(typeParameters, typeArguments);
     var type = substitution.substituteType(function.type) as FunctionType;
-    return FunctionTypeImpl.synthetic(
-      type.returnType,
-      type.typeFormals,
-      type.parameters,
+    return FunctionTypeImpl(
+      typeFormals: type.typeFormals,
+      parameters: type.parameters,
+      returnType: type.returnType,
+      nullabilitySuffix: nullabilitySuffix,
       element: this,
       typeArguments: typeArguments,
-      nullabilitySuffix: nullabilitySuffix,
     );
   }
 
@@ -5845,6 +5858,9 @@
   MethodElementImpl.forNode(Identifier name) : super.forNode(name);
 
   @override
+  MethodElement get declaration => this;
+
+  @override
   String get displayName {
     String displayName = super.displayName;
     if ("unary-" == displayName) {
@@ -5871,6 +5887,23 @@
         first == 0x24);
   }
 
+  /// Return `true` if this method is `operator==`, and there is no explicit
+  /// type specified for its formal parameter, in this method or in any
+  /// overridden methods other than the one declared in `Object`.
+  bool get isOperatorEqualWithParameterTypeFromObject {
+    if (linkedNode != null) {
+      return linkedContext.hasOperatorEqualParameterTypeFromObject(linkedNode);
+    }
+    return false;
+  }
+
+  /// See [isOperatorEqualWithParameterTypeFromObject].
+  set isOperatorEqualWithParameterTypeFromObject(bool value) {
+    if (linkedNode != null) {
+      linkedContext.setOperatorEqualParameterTypeFromObject(linkedNode, value);
+    }
+  }
+
   @override
   bool get isStatic {
     if (linkedNode != null) {
@@ -6156,6 +6189,9 @@
       this.context, this.session, this.name, this.conflictingElements);
 
   @override
+  Element get declaration => null;
+
+  @override
   String get displayName => name;
 
   @override
@@ -6316,7 +6352,7 @@
 class NeverElementImpl extends ElementImpl implements TypeDefiningElement {
   /// Return the unique instance of this class.
   static NeverElementImpl get instance =>
-      BottomTypeImpl.instance.element as NeverElementImpl;
+      NeverTypeImpl.instance.element as NeverElementImpl;
 
   /// Initialize a newly created instance of this class. Instances of this class
   /// should <b>not</b> be created except as part of creating the type
@@ -6342,11 +6378,11 @@
   }) {
     switch (nullabilitySuffix) {
       case NullabilitySuffix.question:
-        return BottomTypeImpl.instanceNullable;
+        return NeverTypeImpl.instanceNullable;
       case NullabilitySuffix.star:
-        return BottomTypeImpl.instanceLegacy;
+        return NeverTypeImpl.instanceLegacy;
       case NullabilitySuffix.none:
-        return BottomTypeImpl.instance;
+        return NeverTypeImpl.instance;
     }
     throw StateError('Unsupported nullability: $nullabilitySuffix');
   }
@@ -6413,8 +6449,12 @@
         if (linkedContext.hasInitializer(linkedNode)) {
           _initializer = new FunctionElementImpl('', -1)
             ..isSynthetic = true
-            .._type = FunctionTypeImpl.synthetic(type, [], [],
-                nullabilitySuffix: NullabilitySuffix.star)
+            .._type = FunctionTypeImpl(
+              typeFormals: const [],
+              parameters: const [],
+              returnType: type,
+              nullabilitySuffix: NullabilitySuffix.star,
+            )
             ..enclosingElement = this;
         }
       }
@@ -6534,6 +6574,9 @@
   }
 
   @override
+  ParameterElement get declaration => this;
+
+  @override
   String get defaultValueCode {
     if (linkedNode != null) {
       return linkedContext.getDefaultValueCode(linkedNode);
@@ -7042,6 +7085,9 @@
     return variable.setter;
   }
 
+  @override
+  PropertyAccessorElement get declaration => this;
+
   /// Set whether this accessor is a getter.
   void set getter(bool isGetter) {
     setModifier(Modifier.GETTER, isGetter);
@@ -7158,12 +7204,12 @@
     if (_type != null) return _type;
 
     // TODO(scheglov) Remove "element" in the breaking changes branch.
-    var type = FunctionTypeImpl.synthetic(
-      returnType,
-      const <TypeParameterElement>[],
-      const <ParameterElement>[],
-      element: this,
+    var type = FunctionTypeImpl(
+      typeFormals: const <TypeParameterElement>[],
+      parameters: const <ParameterElement>[],
+      returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
+      element: this,
     );
 
     // Don't cache, because types change during top-level inference.
@@ -7217,12 +7263,12 @@
     if (_type != null) return _type;
 
     // TODO(scheglov) Remove "element" in the breaking changes branch.
-    var type = FunctionTypeImpl.synthetic(
-      returnType,
-      const <TypeParameterElement>[],
-      parameters,
-      element: this,
+    var type = FunctionTypeImpl(
+      typeFormals: const <TypeParameterElement>[],
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
+      element: this,
     );
 
     // Don't cache, because types change during top-level inference.
@@ -7445,6 +7491,10 @@
   /// if this parameter does not have an explicit bound.
   DartType _bound;
 
+  /// The value representing the variance modifier keyword, or `null` if
+  /// there is no explicit variance modifier, meaning legacy covariance.
+  Variance _variance;
+
   /// Initialize a newly created method element to have the given [name] and
   /// [offset].
   TypeParameterElementImpl(String name, int offset) : super(name, offset);
@@ -7494,6 +7544,9 @@
     return super.codeOffset;
   }
 
+  @override
+  TypeParameterElement get declaration => this;
+
   /// The default value of the type parameter. It is used to provide the
   /// corresponding missing type argument in type annotations and as the
   /// fall-back type value in type inference.
@@ -7548,12 +7601,24 @@
     _type = type;
   }
 
+  Variance get variance => _variance ?? Variance.covariant;
+
+  void set variance(Variance newVariance) => _variance = newVariance;
+
+  bool get isLegacyCovariant => _variance == null;
+
   @override
-  bool operator ==(Object object) {
-    if (identical(this, object)) {
+  bool operator ==(Object other) {
+    if (identical(other, this)) {
       return true;
     }
-    return object is TypeParameterElementImpl && object.location == location;
+    if (other is TypeParameterElement) {
+      if (other.enclosingElement == null || enclosingElement == null) {
+        return identical(other, this);
+      }
+      return other.location == location;
+    }
+    return false;
   }
 
   @override
@@ -7703,6 +7768,9 @@
   DartObject get constantValue => evaluationResult?.value;
 
   @override
+  VariableElement get declaration => this;
+
+  @override
   String get displayName => name;
 
   /// Return the result of evaluating this variable's initializer as a
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 550b729..e349274 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -23,41 +23,65 @@
 class ConstructorMember extends ExecutableMember implements ConstructorElement {
   /**
    * Initialize a newly created element to represent a constructor, based on
-   * the [baseElement], and applied [substitution].
+   * the [declaration], and applied [substitution].
    */
   ConstructorMember(
-    ConstructorElement baseElement,
+    ConstructorElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
+
+  @deprecated
+  @override
+  ConstructorElement get baseElement => declaration;
 
   @override
-  ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+  ConstructorElement get declaration => super.declaration as ConstructorElement;
 
   @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
+  ClassElement get enclosingElement => declaration.enclosingElement;
 
   @override
-  bool get isConst => baseElement.isConst;
+  bool get isConst => declaration.isConst;
 
   @override
-  bool get isConstantEvaluated => baseElement.isConstantEvaluated;
+  bool get isConstantEvaluated => declaration.isConstantEvaluated;
 
   @override
-  bool get isDefaultConstructor => baseElement.isDefaultConstructor;
+  bool get isDefaultConstructor => declaration.isDefaultConstructor;
 
   @override
-  bool get isFactory => baseElement.isFactory;
+  bool get isFactory => declaration.isFactory;
 
   @override
-  int get nameEnd => baseElement.nameEnd;
+  int get nameEnd => declaration.nameEnd;
 
   @override
-  int get periodOffset => baseElement.periodOffset;
+  int get periodOffset => declaration.periodOffset;
 
   @override
   ConstructorElement get redirectedConstructor {
-    var definingType = _substitution.substituteType(enclosingElement.thisType);
-    return from(baseElement.redirectedConstructor, definingType);
+    var element = this.declaration.redirectedConstructor;
+    if (element == null) {
+      return null;
+    }
+
+    ConstructorElement declaration;
+    MapSubstitution substitution;
+    if (element is ConstructorMember) {
+      declaration = element._declaration;
+      var map = <TypeParameterElement, DartType>{};
+      var elementMap = element._substitution.map;
+      for (var typeParameter in elementMap.keys) {
+        var type = elementMap[typeParameter];
+        map[typeParameter] = _substitution.substituteType(type);
+      }
+      substitution = Substitution.fromMap(map);
+    } else {
+      declaration = element;
+      substitution = _substitution;
+    }
+
+    return ConstructorMember(declaration, substitution);
   }
 
   @override
@@ -66,7 +90,7 @@
 
   @override
   String toString() {
-    ConstructorElement baseElement = this.baseElement;
+    ConstructorElement declaration = this.declaration;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
@@ -75,7 +99,7 @@
       buffer.write(type.returnType);
       buffer.write(' ');
     }
-    buffer.write(baseElement.enclosingElement.displayName);
+    buffer.write(declaration.enclosingElement.displayName);
     String name = displayName;
     if (name != null && name.isNotEmpty) {
       buffer.write('.');
@@ -126,47 +150,51 @@
 
   /**
    * Initialize a newly created element to represent a callable element (like a
-   * method or function or property), based on the [baseElement], and applied
+   * method or function or property), based on the [declaration], and applied
    * [substitution].
    */
   ExecutableMember(
-    ExecutableElement baseElement,
+    ExecutableElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
+
+  @deprecated
+  @override
+  ExecutableElement get baseElement => declaration;
 
   @override
-  ExecutableElement get baseElement => super.baseElement as ExecutableElement;
+  ExecutableElement get declaration => super.declaration as ExecutableElement;
 
   @override
-  bool get hasImplicitReturnType => baseElement.hasImplicitReturnType;
+  bool get hasImplicitReturnType => declaration.hasImplicitReturnType;
 
   @override
-  bool get isAbstract => baseElement.isAbstract;
+  bool get isAbstract => declaration.isAbstract;
 
   @override
-  bool get isAsynchronous => baseElement.isAsynchronous;
+  bool get isAsynchronous => declaration.isAsynchronous;
 
   @override
-  bool get isExternal => baseElement.isExternal;
+  bool get isExternal => declaration.isExternal;
 
   @override
-  bool get isGenerator => baseElement.isGenerator;
+  bool get isGenerator => declaration.isGenerator;
 
   @override
-  bool get isOperator => baseElement.isOperator;
+  bool get isOperator => declaration.isOperator;
 
   @override
-  bool get isSimplyBounded => baseElement.isSimplyBounded;
+  bool get isSimplyBounded => declaration.isSimplyBounded;
 
   @override
-  bool get isStatic => baseElement.isStatic;
+  bool get isStatic => declaration.isStatic;
 
   @override
-  bool get isSynchronous => baseElement.isSynchronous;
+  bool get isSynchronous => declaration.isSynchronous;
 
   @override
   List<ParameterElement> get parameters {
-    return baseElement.parameters.map((p) {
+    return declaration.parameters.map((p) {
       if (p is FieldFormalParameterElement) {
         return FieldFormalParameterMember(p, _substitution);
       }
@@ -181,13 +209,13 @@
   FunctionType get type {
     if (_type != null) return _type;
 
-    return _type = _substitution.substituteType(baseElement.type);
+    return _type = _substitution.substituteType(declaration.type);
   }
 
   @override
   List<TypeParameterElement> get typeParameters {
     return TypeParameterMember.from(
-      baseElement.typeParameters,
+      declaration.typeParameters,
       _substitution,
     );
   }
@@ -207,7 +235,7 @@
     var combined = substitution;
     if (element is ExecutableMember) {
       ExecutableMember member = element;
-      element = member.baseElement;
+      element = member.declaration;
       var map = <TypeParameterElement, DartType>{};
       map.addAll(member._substitution.map);
       map.addAll(substitution.map);
@@ -238,16 +266,16 @@
     implements FieldFormalParameterElement {
   /**
    * Initialize a newly created element to represent a field formal parameter,
-   * based on the [baseElement], with applied [substitution].
+   * based on the [declaration], with applied [substitution].
    */
   FieldFormalParameterMember(
-    FieldFormalParameterElement baseElement,
+    FieldFormalParameterElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
 
   @override
   FieldElement get field {
-    var field = (baseElement as FieldFormalParameterElement).field;
+    var field = (declaration as FieldFormalParameterElement).field;
     if (field == null) {
       return null;
     }
@@ -256,7 +284,7 @@
   }
 
   @override
-  bool get isCovariant => baseElement.isCovariant;
+  bool get isCovariant => declaration.isCovariant;
 
   @override
   T accept<T>(ElementVisitor<T> visitor) =>
@@ -270,22 +298,26 @@
 class FieldMember extends VariableMember implements FieldElement {
   /**
    * Initialize a newly created element to represent a field, based on the
-   * [baseElement], with applied [substitution].
+   * [declaration], with applied [substitution].
    */
   FieldMember(
-    FieldElement baseElement,
+    FieldElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
+
+  @deprecated
+  @override
+  FieldElement get baseElement => declaration;
 
   @override
-  FieldElement get baseElement => super.baseElement as FieldElement;
+  FieldElement get declaration => super.declaration as FieldElement;
 
   @override
-  Element get enclosingElement => baseElement.enclosingElement;
+  Element get enclosingElement => declaration.enclosingElement;
 
   @override
   PropertyAccessorElement get getter {
-    var baseGetter = baseElement.getter;
+    var baseGetter = declaration.getter;
     if (baseGetter == null) {
       return null;
     }
@@ -293,14 +325,14 @@
   }
 
   @override
-  bool get isCovariant => baseElement.isCovariant;
+  bool get isCovariant => declaration.isCovariant;
 
   @override
-  bool get isEnumConstant => baseElement.isEnumConstant;
+  bool get isEnumConstant => declaration.isEnumConstant;
 
   @override
   PropertyAccessorElement get setter {
-    var baseSetter = baseElement.setter;
+    var baseSetter = declaration.setter;
     if (baseSetter == null) {
       return null;
     }
@@ -349,7 +381,7 @@
   /**
    * The element on which the parameterized element was created.
    */
-  final Element _baseElement;
+  final Element _declaration;
 
   /**
    * The substitution for type parameters referenced in the base element.
@@ -358,113 +390,121 @@
 
   /**
    * Initialize a newly created element to represent a member, based on the
-   * [baseElement], and applied [_substitution].
+   * [declaration], and applied [_substitution].
    */
-  Member(this._baseElement, this._substitution);
+  Member(this._declaration, this._substitution) {
+    if (_declaration is Member) {
+      throw StateError('Members must be created from a declarations.');
+    }
+  }
 
   /**
    * Return the element on which the parameterized element was created.
    */
-  Element get baseElement => _baseElement;
+  @Deprecated('Use Element.declaration instead')
+  Element get baseElement => _declaration;
 
   @override
-  AnalysisContext get context => _baseElement.context;
+  AnalysisContext get context => _declaration.context;
 
   @override
-  String get displayName => _baseElement.displayName;
+  Element get declaration => _declaration;
 
   @override
-  String get documentationComment => _baseElement.documentationComment;
+  String get displayName => _declaration.displayName;
 
   @override
-  bool get hasAlwaysThrows => _baseElement.hasAlwaysThrows;
+  String get documentationComment => _declaration.documentationComment;
 
   @override
-  bool get hasDeprecated => _baseElement.hasDeprecated;
+  bool get hasAlwaysThrows => _declaration.hasAlwaysThrows;
 
   @override
-  bool get hasFactory => _baseElement.hasFactory;
+  bool get hasDeprecated => _declaration.hasDeprecated;
 
   @override
-  bool get hasIsTest => _baseElement.hasIsTest;
+  bool get hasFactory => _declaration.hasFactory;
 
   @override
-  bool get hasIsTestGroup => _baseElement.hasIsTestGroup;
+  bool get hasIsTest => _declaration.hasIsTest;
 
   @override
-  bool get hasJS => _baseElement.hasJS;
+  bool get hasIsTestGroup => _declaration.hasIsTestGroup;
 
   @override
-  bool get hasLiteral => _baseElement.hasLiteral;
+  bool get hasJS => _declaration.hasJS;
 
   @override
-  bool get hasMustCallSuper => _baseElement.hasMustCallSuper;
+  bool get hasLiteral => _declaration.hasLiteral;
 
   @override
-  bool get hasNonVirtual => _baseElement.hasNonVirtual;
+  bool get hasMustCallSuper => _declaration.hasMustCallSuper;
 
   @override
-  bool get hasOptionalTypeArgs => _baseElement.hasOptionalTypeArgs;
+  bool get hasNonVirtual => _declaration.hasNonVirtual;
 
   @override
-  bool get hasOverride => _baseElement.hasOverride;
+  bool get hasOptionalTypeArgs => _declaration.hasOptionalTypeArgs;
 
   @override
-  bool get hasProtected => _baseElement.hasProtected;
+  bool get hasOverride => _declaration.hasOverride;
 
   @override
-  bool get hasRequired => _baseElement.hasRequired;
+  bool get hasProtected => _declaration.hasProtected;
 
   @override
-  bool get hasSealed => _baseElement.hasSealed;
+  bool get hasRequired => _declaration.hasRequired;
 
   @override
-  bool get hasVisibleForTemplate => _baseElement.hasVisibleForTemplate;
+  bool get hasSealed => _declaration.hasSealed;
 
   @override
-  bool get hasVisibleForTesting => _baseElement.hasVisibleForTesting;
+  bool get hasVisibleForTemplate => _declaration.hasVisibleForTemplate;
 
   @override
-  int get id => _baseElement.id;
+  bool get hasVisibleForTesting => _declaration.hasVisibleForTesting;
 
   @override
-  bool get isPrivate => _baseElement.isPrivate;
+  int get id => _declaration.id;
 
   @override
-  bool get isPublic => _baseElement.isPublic;
+  bool get isPrivate => _declaration.isPrivate;
 
   @override
-  bool get isSynthetic => _baseElement.isSynthetic;
+  bool get isPublic => _declaration.isPublic;
 
   @override
-  ElementKind get kind => _baseElement.kind;
+  bool get isSynthetic => _declaration.isSynthetic;
 
   @override
-  LibraryElement get library => _baseElement.library;
+  ElementKind get kind => _declaration.kind;
 
   @override
-  Source get librarySource => _baseElement.librarySource;
+  LibraryElement get library => _declaration.library;
 
   @override
-  ElementLocation get location => _baseElement.location;
+  Source get librarySource => _declaration.librarySource;
 
   @override
-  List<ElementAnnotation> get metadata => _baseElement.metadata;
+  ElementLocation get location => _declaration.location;
 
   @override
-  String get name => _baseElement.name;
+  List<ElementAnnotation> get metadata => _declaration.metadata;
 
   @override
-  int get nameLength => _baseElement.nameLength;
+  String get name => _declaration.name;
 
   @override
-  int get nameOffset => _baseElement.nameOffset;
+  int get nameLength => _declaration.nameLength;
 
   @override
-  AnalysisSession get session => _baseElement.session;
+  int get nameOffset => _declaration.nameOffset;
 
   @override
-  Source get source => _baseElement.source;
+  AnalysisSession get session => _declaration.session;
+
+  @override
+  Source get source => _declaration.source;
 
   /**
    * The substitution for type parameters referenced in the base element.
@@ -473,15 +513,15 @@
 
   @override
   E getAncestor<E extends Element>(Predicate<Element> predicate) =>
-      baseElement.getAncestor(predicate);
+      declaration.getAncestor(predicate);
 
   @override
   String getExtendedDisplayName(String shortName) =>
-      _baseElement.getExtendedDisplayName(shortName);
+      _declaration.getExtendedDisplayName(shortName);
 
   @override
   bool isAccessibleIn(LibraryElement library) =>
-      _baseElement.isAccessibleIn(library);
+      _declaration.isAccessibleIn(library);
 
   /**
    * Use the given [visitor] to visit all of the [children].
@@ -508,25 +548,29 @@
 class MethodMember extends ExecutableMember implements MethodElement {
   /**
    * Initialize a newly created element to represent a method, based on the
-   * [baseElement], with applied [substitution].
+   * [declaration], with applied [substitution].
    */
   MethodMember(
-    MethodElement baseElement,
+    MethodElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
+
+  @deprecated
+  @override
+  MethodElement get baseElement => declaration;
 
   @override
-  MethodElement get baseElement => super.baseElement as MethodElement;
+  MethodElement get declaration => super.declaration as MethodElement;
 
   @override
-  Element get enclosingElement => baseElement.enclosingElement;
+  Element get enclosingElement => declaration.enclosingElement;
 
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 
   @override
   String toString() {
-    MethodElement baseElement = this.baseElement;
+    MethodElement declaration = this.declaration;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
@@ -535,9 +579,9 @@
       buffer.write(type.returnType);
       buffer.write(' ');
     }
-    buffer.write(baseElement.enclosingElement.displayName);
+    buffer.write(declaration.enclosingElement.displayName);
     buffer.write('.');
-    buffer.write(baseElement.displayName);
+    buffer.write(declaration.displayName);
     int typeParameterCount = typeParameters.length;
     if (typeParameterCount > 0) {
       buffer.write('<');
@@ -627,36 +671,38 @@
     implements ParameterElement {
   /**
    * Initialize a newly created element to represent a parameter, based on the
-   * [baseElement], with applied [substitution]. If [type] is passed it will
-   * represent the already substituted type.
+   * [declaration], with applied [substitution].
    */
   ParameterMember(
-    ParameterElement baseElement,
-    MapSubstitution substitution, [
-    DartType type,
-  ]) : super._(baseElement, substitution, type);
-
-  @override
-  ParameterElement get baseElement => super.baseElement as ParameterElement;
-
-  @override
-  String get defaultValueCode => baseElement.defaultValueCode;
-
-  @override
-  Element get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  int get hashCode => baseElement.hashCode;
-
-  @override
-  bool get isCovariant => baseElement.isCovariant;
-
-  @override
-  bool get isInitializingFormal => baseElement.isInitializingFormal;
+    ParameterElement declaration,
+    MapSubstitution substitution,
+  ) : super(declaration, substitution);
 
   @deprecated
   @override
-  ParameterKind get parameterKind => baseElement.parameterKind;
+  ParameterElement get baseElement => declaration;
+
+  @override
+  ParameterElement get declaration => super.declaration as ParameterElement;
+
+  @override
+  String get defaultValueCode => declaration.defaultValueCode;
+
+  @override
+  Element get enclosingElement => declaration.enclosingElement;
+
+  @override
+  int get hashCode => declaration.hashCode;
+
+  @override
+  bool get isCovariant => declaration.isCovariant;
+
+  @override
+  bool get isInitializingFormal => declaration.isInitializingFormal;
+
+  @deprecated
+  @override
+  ParameterKind get parameterKind => declaration.parameterKind;
 
   @override
   List<ParameterElement> get parameters {
@@ -670,7 +716,7 @@
   @override
   List<TypeParameterElement> get typeParameters {
     return TypeParameterMember.from(
-      baseElement.typeParameters,
+      declaration.typeParameters,
       _substitution,
     );
   }
@@ -680,7 +726,7 @@
 
   @override
   E getAncestor<E extends Element>(Predicate<Element> predicate) {
-    Element element = baseElement.getAncestor(predicate);
+    Element element = declaration.getAncestor(predicate);
     if (element is ExecutableElement) {
       return ExecutableMember.from2(element, _substitution) as E;
     }
@@ -689,20 +735,20 @@
 
   @override
   String toString() {
-    ParameterElement baseElement = this.baseElement;
+    ParameterElement declaration = this.declaration;
     String left = "";
     String right = "";
     while (true) {
-      if (baseElement.isNamed) {
+      if (declaration.isNamed) {
         left = "{";
         right = "}";
-      } else if (baseElement.isOptionalPositional) {
+      } else if (declaration.isOptionalPositional) {
         left = "[";
         right = "]";
       }
       break;
     }
-    return '$left$type ${baseElement.displayName}$right';
+    return '$left$type ${declaration.displayName}$right';
   }
 
   @override
@@ -720,21 +766,21 @@
     implements PropertyAccessorElement {
   /**
    * Initialize a newly created element to represent a property, based on the
-   * [baseElement], with applied [substitution].
+   * [declaration], with applied [substitution].
    */
   PropertyAccessorMember(
-    PropertyAccessorElement baseElement,
+    PropertyAccessorElement declaration,
     MapSubstitution substitution,
-  ) : super(baseElement, substitution);
+  ) : super(declaration, substitution);
 
+  @deprecated
   @override
-  PropertyAccessorElement get baseElement =>
-      super.baseElement as PropertyAccessorElement;
+  PropertyAccessorElement get baseElement => declaration;
 
   @override
   PropertyAccessorElement get correspondingGetter {
     return PropertyAccessorMember(
-      baseElement.correspondingGetter,
+      declaration.correspondingGetter,
       _substitution,
     );
   }
@@ -742,23 +788,27 @@
   @override
   PropertyAccessorElement get correspondingSetter {
     return PropertyAccessorMember(
-      baseElement.correspondingSetter,
+      declaration.correspondingSetter,
       _substitution,
     );
   }
 
   @override
-  Element get enclosingElement => baseElement.enclosingElement;
+  PropertyAccessorElement get declaration =>
+      super.declaration as PropertyAccessorElement;
 
   @override
-  bool get isGetter => baseElement.isGetter;
+  Element get enclosingElement => declaration.enclosingElement;
 
   @override
-  bool get isSetter => baseElement.isSetter;
+  bool get isGetter => declaration.isGetter;
+
+  @override
+  bool get isSetter => declaration.isSetter;
 
   @override
   PropertyInducingElement get variable {
-    PropertyInducingElement variable = baseElement.variable;
+    PropertyInducingElement variable = declaration.variable;
     if (variable is FieldElement) {
       return FieldMember(variable, _substitution);
     }
@@ -771,7 +821,7 @@
 
   @override
   String toString() {
-    PropertyAccessorElement baseElement = this.baseElement;
+    PropertyAccessorElement declaration = this.declaration;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
@@ -785,9 +835,9 @@
     } else {
       builder.write('set ');
     }
-    builder.write(baseElement.enclosingElement.displayName);
+    builder.write(declaration.enclosingElement.displayName);
     builder.write('.');
-    builder.write(baseElement.displayName);
+    builder.write(declaration.displayName);
     builder.write('(');
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
@@ -839,33 +889,36 @@
   DartType _bound;
   DartType _type;
 
-  TypeParameterMember(TypeParameterElement baseElement,
+  TypeParameterMember(TypeParameterElement declaration,
       MapSubstitution substitution, this._bound)
-      : super(baseElement, substitution) {
+      : super(declaration, substitution) {
     _type = TypeParameterTypeImpl(this);
   }
 
+  @deprecated
   @override
-  TypeParameterElement get baseElement =>
-      super.baseElement as TypeParameterElement;
+  TypeParameterElement get baseElement => declaration;
 
   @override
   DartType get bound => _bound;
 
   @override
-  Element get enclosingElement => baseElement.enclosingElement;
+  TypeParameterElement get declaration =>
+      super.declaration as TypeParameterElement;
 
   @override
-  int get hashCode => baseElement.hashCode;
+  Element get enclosingElement => declaration.enclosingElement;
+
+  @override
+  int get hashCode => declaration.hashCode;
 
   @override
   TypeParameterType get type => _type;
 
   @override
-  bool operator ==(Object other) =>
-      other is TypeParameterMember &&
-      other.baseElement == baseElement &&
-      other._bound == _bound;
+  bool operator ==(Object other) {
+    return declaration == other;
+  }
 
   @override
   T accept<T>(ElementVisitor<T> visitor) =>
@@ -938,29 +991,23 @@
 
   /**
    * Initialize a newly created element to represent a variable, based on the
-   * [baseElement], with applied [substitution].
+   * [declaration], with applied [substitution].
    */
-  VariableMember(
-    VariableElement baseElement,
-    MapSubstitution substitution, [
-    DartType type,
-  ])  : _type = type,
-        super(baseElement, substitution);
+  VariableMember(VariableElement declaration, MapSubstitution substitution)
+      : super(declaration, substitution);
 
-  // TODO(jmesserly): this is temporary to allow the ParameterMember subclass.
-  // Apparently mixins don't work with optional params.
-  VariableMember._(VariableElement baseElement, MapSubstitution substitution,
-      [DartType type])
-      : this(baseElement, substitution, type);
+  @deprecated
+  @override
+  VariableElement get baseElement => declaration;
 
   @override
-  VariableElement get baseElement => super.baseElement as VariableElement;
+  DartObject get constantValue => declaration.constantValue;
 
   @override
-  DartObject get constantValue => baseElement.constantValue;
+  VariableElement get declaration => super.declaration as VariableElement;
 
   @override
-  bool get hasImplicitType => baseElement.hasImplicitType;
+  bool get hasImplicitType => declaration.hasImplicitType;
 
   @override
   FunctionElement get initializer {
@@ -973,35 +1020,35 @@
   }
 
   @override
-  bool get isConst => baseElement.isConst;
+  bool get isConst => declaration.isConst;
 
   @override
-  bool get isConstantEvaluated => baseElement.isConstantEvaluated;
+  bool get isConstantEvaluated => declaration.isConstantEvaluated;
 
   @override
-  bool get isFinal => baseElement.isFinal;
+  bool get isFinal => declaration.isFinal;
 
   @override
-  bool get isLate => baseElement.isLate;
+  bool get isLate => declaration.isLate;
 
   @override
-  bool get isStatic => baseElement.isStatic;
+  bool get isStatic => declaration.isStatic;
 
   @override
   DartType get type {
     if (_type != null) return _type;
 
-    return _type = _substitution.substituteType(baseElement.type);
+    return _type = _substitution.substituteType(declaration.type);
   }
 
   @override
-  DartObject computeConstantValue() => baseElement.computeConstantValue();
+  DartObject computeConstantValue() => declaration.computeConstantValue();
 
   @override
   void visitChildren(ElementVisitor visitor) {
     // TODO(brianwilkerson) We need to finish implementing the accessors used
     // below so that we can safely invoke them.
     super.visitChildren(visitor);
-    baseElement.initializer?.accept(visitor);
+    declaration.initializer?.accept(visitor);
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart b/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart
new file mode 100644
index 0000000..c1485e2
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_visitor.dart';
+
+class NullabilityEliminator extends DartTypeVisitor<DartType> {
+  int _counter = 0;
+
+  @override
+  DartType defaultDartType(DartType type) {
+    throw UnimplementedError('(${type.runtimeType}) $type');
+  }
+
+  DartType visit(DartType type) {
+    return DartTypeVisitor.visit(type, this);
+  }
+
+  @override
+  DartType visitDynamicType(DynamicTypeImpl type) {
+    return type;
+  }
+
+  @override
+  DartType visitFunctionType(FunctionType type) {
+    var before = _counter;
+    _incrementCounterIfNotLegacy(type);
+
+    type = _freshTypeParameters(type);
+
+    var parameters = type.parameters.map((parameter) {
+      var type = visit(parameter.type);
+      return _parameterElement(parameter, type);
+    }).toList();
+
+    var returnType = visit(type.returnType);
+    var typeArguments = type.typeArguments.map(visit).toList();
+
+    if (_counter == before) {
+      return type;
+    }
+
+    return FunctionTypeImpl(
+      typeFormals: type.typeFormals,
+      parameters: parameters,
+      returnType: returnType,
+      nullabilitySuffix: NullabilitySuffix.star,
+      element: type.element,
+      typeArguments: typeArguments,
+    );
+  }
+
+  @override
+  DartType visitInterfaceType(InterfaceType type) {
+    var before = _counter;
+    _incrementCounterIfNotLegacy(type);
+
+    var typeArguments = type.typeArguments;
+    if (typeArguments.isNotEmpty) {
+      typeArguments = type.typeArguments.map(visit).toList();
+    }
+
+    if (_counter == before) {
+      return type;
+    }
+
+    return type.element.instantiate(
+      typeArguments: typeArguments,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
+  @override
+  DartType visitNeverType(NeverTypeImpl type) {
+    return type.withNullability(NullabilitySuffix.star);
+  }
+
+  @override
+  DartType visitTypeParameterType(TypeParameterType type) {
+    var before = _counter;
+    _incrementCounterIfNotLegacy(type);
+
+    if (_counter == before) {
+      return type;
+    }
+
+    return type.element.instantiate(
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
+  @override
+  DartType visitVoidType(VoidType type) {
+    return type;
+  }
+
+  /// If the [type] has type parameters, and any of them has bounds with
+  /// nullability to eliminate, return a new [FunctionType] instance, with
+  /// new type parameters with legacy types as their bounds, incrementing
+  /// [_counter] as necessary. Otherwise return the original [type] instance.
+  FunctionType _freshTypeParameters(FunctionType type) {
+    var elements = type.typeFormals;
+    if (elements.isEmpty) {
+      return type;
+    }
+
+    var before = _counter;
+
+    var freshBounds = List<DartType>(elements.length);
+    for (var i = 0; i < elements.length; i++) {
+      var bound = elements[i].bound;
+      if (bound != null) {
+        freshBounds[i] = visit(bound);
+      }
+    }
+
+    if (_counter == before) {
+      return type;
+    }
+
+    var freshElements = List<TypeParameterElement>(elements.length);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      var freshElement = TypeParameterElementImpl(element.name, -1);
+      freshElement.bound = freshBounds[i];
+      freshElements[i] = freshElement;
+    }
+
+    FunctionType newType = replaceTypeParameters(type, freshElements);
+    return FunctionTypeImpl(
+      typeFormals: freshElements,
+      parameters: newType.parameters,
+      returnType: newType.returnType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
+  void _incrementCounterIfNotLegacy(DartType type) {
+    var typeImpl = type as TypeImpl;
+    if (typeImpl.nullabilitySuffix != NullabilitySuffix.star) {
+      _counter++;
+    }
+  }
+
+  /// If the [type] itself, or any of its components, has any nullability,
+  /// return a new type with legacy nullability suffixes. Otherwise return the
+  /// original instance.
+  static T perform<T extends DartType>(T type) {
+    return NullabilityEliminator().visit(type);
+  }
+
+  static ParameterElementImpl _parameterElement(
+    ParameterElement parameter,
+    DartType type,
+  ) {
+    var result = ParameterElementImpl.synthetic(
+      parameter.name,
+      type,
+      // ignore: deprecated_member_use_from_same_package
+      parameter.parameterKind,
+    );
+    result.isExplicitlyCovariant = parameter.isCovariant;
+    return result;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index d518283..920a511 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -40,102 +40,6 @@
 }
 
 /**
- * A [Type] that represents the type 'bottom'.
- */
-class BottomTypeImpl extends TypeImpl {
-  /**
-   * The unique instance of this class, nullable.
-   *
-   * This behaves equivalently to the `Null` type, but we distinguish it for two
-   * reasons: (1) there are circumstances where we need access to this type, but
-   * we don't have access to the type provider, so using `Never?` is a
-   * convenient solution.  (2) we may decide that the distinction is convenient
-   * in diagnostic messages (this is TBD).
-   */
-  static final BottomTypeImpl instanceNullable =
-      new BottomTypeImpl._(NullabilitySuffix.question);
-
-  /**
-   * The unique instance of this class, starred.
-   *
-   * This behaves like a version of the Null* type that could be conceivably
-   * migrated to be of type Never. Therefore, it's the bottom of all legacy
-   * types, and also assignable to the true bottom. Note that Never? and Never*
-   * are not the same type, as Never* is a subtype of Never, while Never? is
-   * not.
-   */
-  static final BottomTypeImpl instanceLegacy =
-      new BottomTypeImpl._(NullabilitySuffix.star);
-
-  /**
-   * The unique instance of this class, non-nullable.
-   */
-  static final BottomTypeImpl instance =
-      new BottomTypeImpl._(NullabilitySuffix.none);
-
-  @override
-  final NullabilitySuffix nullabilitySuffix;
-
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  BottomTypeImpl._(this.nullabilitySuffix)
-      : super(new NeverElementImpl(), "Never");
-
-  @override
-  int get hashCode => 0;
-
-  @override
-  bool get isBottom => true;
-
-  @override
-  bool get isDartCoreNull {
-    // `Never?` is equivalent to `Null`, so make sure it behaves the same.
-    return nullabilitySuffix == NullabilitySuffix.question;
-  }
-
-  @override
-  bool operator ==(Object object) => identical(object, this);
-
-  @override
-  DartType replaceTopAndBottom(TypeProvider typeProvider,
-      {bool isCovariant = true}) {
-    if (isCovariant) {
-      return this;
-    } else {
-      // In theory this should never happen, since we only need to do this
-      // replacement when checking super-boundedness of explicitly-specified
-      // types, or types produced by mixin inference or instantiate-to-bounds,
-      // and bottom can't occur in any of those cases.
-      assert(false,
-          'Attempted to check super-boundedness of a type including "bottom"');
-      // But just in case it does, return `dynamic` since that's similar to what
-      // we do with Null.
-      return typeProvider.objectType;
-    }
-  }
-
-  @override
-  @deprecated
-  BottomTypeImpl substitute2(
-          List<DartType> argumentTypes, List<DartType> parameterTypes) =>
-      this;
-
-  @override
-  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
-    switch (nullabilitySuffix) {
-      case NullabilitySuffix.question:
-        return instanceNullable;
-      case NullabilitySuffix.star:
-        return instanceLegacy;
-      case NullabilitySuffix.none:
-        return instance;
-    }
-    throw StateError('Unexpected nullabilitySuffix: $nullabilitySuffix');
-  }
-}
-
-/**
  * The [Type] representing the type `dynamic`.
  */
 class DynamicTypeImpl extends TypeImpl {
@@ -210,13 +114,28 @@
   @override
   final NullabilitySuffix nullabilitySuffix;
 
-  /// Creates a function type that's not associated with any element in the
-  /// element tree.
-  FunctionTypeImpl.synthetic(this.returnType, this.typeFormals, this.parameters,
+  FunctionTypeImpl({
+    @required List<TypeParameterElement> typeFormals,
+    @required List<ParameterElement> parameters,
+    @required DartType returnType,
+    @required NullabilitySuffix nullabilitySuffix,
+    Element element,
+    List<DartType> typeArguments,
+  })  : typeFormals = typeFormals,
+        parameters = _sortNamedParameters(parameters),
+        returnType = returnType,
+        nullabilitySuffix = nullabilitySuffix,
+        typeArguments = typeArguments ?? const <DartType>[],
+        super(element, null);
+
+  @deprecated
+  FunctionTypeImpl.synthetic(
+      this.returnType, this.typeFormals, List<ParameterElement> parameters,
       {Element element,
       List<DartType> typeArguments,
       @required NullabilitySuffix nullabilitySuffix})
-      : typeArguments = typeArguments ?? const <DartType>[],
+      : parameters = _sortNamedParameters(parameters),
+        typeArguments = typeArguments ?? const <DartType>[],
         nullabilitySuffix = nullabilitySuffix,
         super(element, null);
 
@@ -369,11 +288,7 @@
       }
 
       return returnType == object.returnType &&
-          TypeImpl.equalArrays(
-              normalParameterTypes, object.normalParameterTypes) &&
-          TypeImpl.equalArrays(
-              optionalParameterTypes, object.optionalParameterTypes) &&
-          _equals(namedParameterTypes, object.namedParameterTypes) &&
+          _equalParameters(parameters, object.parameters) &&
           nullabilitySuffix == object.nullabilitySuffix;
     }
     return false;
@@ -389,14 +304,12 @@
         StringBuffer typeParametersBuffer = StringBuffer();
         // To print a type with type variables, first make sure we have unique
         // variable names to print.
-        Set<TypeParameterType> freeVariables = new HashSet<TypeParameterType>();
+        var freeVariables = <TypeParameterElement>{};
         _freeVariablesInFunctionType(this, freeVariables);
 
-        Set<String> namesToAvoid = new HashSet<String>();
-        for (DartType arg in freeVariables) {
-          if (arg is TypeParameterType) {
-            namesToAvoid.add(arg.displayName);
-          }
+        var namesToAvoid = <String>{};
+        for (TypeParameterElement arg in freeVariables) {
+          namesToAvoid.add(arg.displayName);
         }
 
         List<DartType> instantiateTypeArgs = <DartType>[];
@@ -404,7 +317,7 @@
         typeParametersBuffer.write('<');
         for (TypeParameterElement e in typeFormals) {
           if (e != typeFormals[0]) {
-            typeParametersBuffer.write(',');
+            typeParametersBuffer.write(', ');
           }
           String name = e.name;
           int counter = 0;
@@ -475,9 +388,12 @@
         ..isExplicitlyCovariant = p.isCovariant;
     }
 
-    return FunctionTypeImpl.synthetic(substitution.substituteType(returnType),
-        const [], _transformOrShare(parameters, transformParameter),
-        nullabilitySuffix: nullabilitySuffix);
+    return FunctionTypeImpl(
+      returnType: substitution.substituteType(returnType),
+      typeFormals: const [],
+      parameters: _transformOrShare(parameters, transformParameter),
+      nullabilitySuffix: nullabilitySuffix,
+    );
   }
 
   @override
@@ -502,8 +418,12 @@
         identical(parameters, this.parameters)) {
       return this;
     }
-    return FunctionTypeImpl.synthetic(returnType, typeFormals, parameters,
-        nullabilitySuffix: nullabilitySuffix);
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
+      nullabilitySuffix: nullabilitySuffix,
+    );
   }
 
   @override
@@ -531,17 +451,20 @@
   @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     if (this.nullabilitySuffix == nullabilitySuffix) return this;
-    return FunctionTypeImpl.synthetic(returnType, typeFormals, parameters,
-        element: element,
-        typeArguments: typeArguments,
-        nullabilitySuffix: nullabilitySuffix);
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
+      nullabilitySuffix: nullabilitySuffix,
+      element: element,
+      typeArguments: typeArguments,
+    );
   }
 
   void _appendToWithTypeParameters(StringBuffer buffer,
       Set<TypeImpl> visitedTypes, bool withNullability, String typeParameters) {
     List<DartType> normalParameterTypes = this.normalParameterTypes;
     List<DartType> optionalParameterTypes = this.optionalParameterTypes;
-    Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
     DartType returnType = this.returnType;
 
     if (returnType == null) {
@@ -588,19 +511,25 @@
       buffer.write(']');
       needsComma = true;
     }
-    if (namedParameterTypes.isNotEmpty) {
+
+    var namedParameters = parameters.where((e) => e.isNamed).toList();
+    if (namedParameters.isNotEmpty) {
       startOptionalParameters();
       buffer.write('{');
-      namedParameterTypes.forEach((String name, DartType type) {
+      for (var parameter in namedParameters) {
         writeSeparator();
-        buffer.write(name);
+        if (withNullability && parameter.isRequiredNamed) {
+          buffer.write('required ');
+        }
+        buffer.write(parameter.name);
         buffer.write(': ');
-        (type as TypeImpl)
+        (parameter.type as TypeImpl)
             .appendTo(buffer, visitedTypes, withNullability: withNullability);
-      });
+      }
       buffer.write('}');
       needsComma = true;
     }
+
     buffer.write(')');
     if (withNullability) {
       _appendNullability(buffer);
@@ -618,35 +547,24 @@
   }
 
   void _freeVariablesInFunctionType(
-      FunctionType type, Set<TypeParameterType> free) {
-    // Make some fresh variables to avoid capture.
-    List<DartType> typeArgs = const <DartType>[];
-    if (type.typeFormals.isNotEmpty) {
-      typeArgs = new List<DartType>.from(type.typeFormals.map((e) =>
-          new TypeParameterTypeImpl(new TypeParameterElementImpl(e.name, -1))));
-
-      type = type.instantiate(typeArgs);
-    }
-
-    for (ParameterElement p in type.parameters) {
-      _freeVariablesInType(p.type, free);
+      FunctionType type, Set<TypeParameterElement> free) {
+    for (var parameter in type.parameters) {
+      _freeVariablesInType(parameter.type, free);
     }
     _freeVariablesInType(type.returnType, free);
-
-    // Remove all of our bound variables.
-    free.removeAll(typeArgs);
+    free.removeAll(type.typeFormals);
   }
 
   void _freeVariablesInInterfaceType(
-      InterfaceType type, Set<TypeParameterType> free) {
+      InterfaceType type, Set<TypeParameterElement> free) {
     for (DartType typeArg in type.typeArguments) {
       _freeVariablesInType(typeArg, free);
     }
   }
 
-  void _freeVariablesInType(DartType type, Set<TypeParameterType> free) {
+  void _freeVariablesInType(DartType type, Set<TypeParameterElement> free) {
     if (type is TypeParameterType) {
-      free.add(type);
+      free.add(type.element);
     } else if (type is FunctionType) {
       _freeVariablesInFunctionType(type, free);
     } else if (type is InterfaceType) {
@@ -884,30 +802,72 @@
     return variablesFresh;
   }
 
-  /**
-   * Return `true` if all of the name/type pairs in the first map ([firstTypes])
-   * are equal to the corresponding name/type pairs in the second map
-   * ([secondTypes]). The maps are expected to iterate over their entries in the
-   * same order in which those entries were added to the map.
-   */
-  static bool _equals(
-      Map<String, DartType> firstTypes, Map<String, DartType> secondTypes) {
-    if (secondTypes.length != firstTypes.length) {
+  /// Return `true` if given lists of parameters are semantically - have the
+  /// same kinds (required, optional position, named, required named), and
+  /// the same types. Named parameters must also have same names. Named
+  /// parameters must be sorted in the given lists.
+  static bool _equalParameters(
+    List<ParameterElement> firstParameters,
+    List<ParameterElement> secondParameters,
+  ) {
+    if (firstParameters.length != secondParameters.length) {
       return false;
     }
-    Iterator<String> firstKeys = firstTypes.keys.iterator;
-    Iterator<String> secondKeys = secondTypes.keys.iterator;
-    while (firstKeys.moveNext() && secondKeys.moveNext()) {
-      String firstKey = firstKeys.current;
-      String secondKey = secondKeys.current;
-      TypeImpl firstType = firstTypes[firstKey];
-      TypeImpl secondType = secondTypes[secondKey];
-      if (firstKey != secondKey || firstType != secondType) {
+    for (var i = 0; i < firstParameters.length; ++i) {
+      var firstParameter = firstParameters[i];
+      var secondParameter = secondParameters[i];
+      // ignore: deprecated_member_use_from_same_package
+      if (firstParameter.parameterKind != secondParameter.parameterKind) {
+        return false;
+      }
+      if (firstParameter.type != secondParameter.type) {
+        return false;
+      }
+      if (firstParameter.isNamed &&
+          firstParameter.name != secondParameter.name) {
         return false;
       }
     }
     return true;
   }
+
+  /// If named parameters are already sorted in [parameters], return it.
+  /// Otherwise, return a new list, in which named parameters are sorted.
+  static List<ParameterElement> _sortNamedParameters(
+    List<ParameterElement> parameters,
+  ) {
+    int firstNamedParameterIndex;
+
+    // Check if already sorted.
+    var namedParametersAlreadySorted = true;
+    var lastNamedParameterName = '';
+    for (var i = 0; i < parameters.length; ++i) {
+      var parameter = parameters[i];
+      if (parameter.isNamed) {
+        firstNamedParameterIndex ??= i;
+        var name = parameter.name;
+        if (lastNamedParameterName.compareTo(name) > 0) {
+          namedParametersAlreadySorted = false;
+          break;
+        }
+        lastNamedParameterName = name;
+      }
+    }
+    if (namedParametersAlreadySorted) {
+      return parameters;
+    }
+
+    // Sort named parameters.
+    var namedParameters =
+        parameters.sublist(firstNamedParameterIndex, parameters.length);
+    namedParameters.sort((a, b) => a.name.compareTo(b.name));
+
+    // Combine into a new list, with sorted named parameters.
+    var newParameters = parameters.toList();
+    newParameters.replaceRange(
+        firstNamedParameterIndex, parameters.length, namedParameters);
+    return newParameters;
+  }
 }
 
 /**
@@ -1895,6 +1855,102 @@
 }
 
 /**
+ * The type `Never` represents the uninhabited bottom type.
+ */
+class NeverTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class, nullable.
+   *
+   * This behaves equivalently to the `Null` type, but we distinguish it for two
+   * reasons: (1) there are circumstances where we need access to this type, but
+   * we don't have access to the type provider, so using `Never?` is a
+   * convenient solution.  (2) we may decide that the distinction is convenient
+   * in diagnostic messages (this is TBD).
+   */
+  static final NeverTypeImpl instanceNullable =
+      new NeverTypeImpl._(NullabilitySuffix.question);
+
+  /**
+   * The unique instance of this class, starred.
+   *
+   * This behaves like a version of the Null* type that could be conceivably
+   * migrated to be of type Never. Therefore, it's the bottom of all legacy
+   * types, and also assignable to the true bottom. Note that Never? and Never*
+   * are not the same type, as Never* is a subtype of Never, while Never? is
+   * not.
+   */
+  static final NeverTypeImpl instanceLegacy =
+      new NeverTypeImpl._(NullabilitySuffix.star);
+
+  /**
+   * The unique instance of this class, non-nullable.
+   */
+  static final NeverTypeImpl instance =
+      new NeverTypeImpl._(NullabilitySuffix.none);
+
+  @override
+  final NullabilitySuffix nullabilitySuffix;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  NeverTypeImpl._(this.nullabilitySuffix)
+      : super(new NeverElementImpl(), 'Never');
+
+  @override
+  int get hashCode => 0;
+
+  @override
+  bool get isBottom => true;
+
+  @override
+  bool get isDartCoreNull {
+    // `Never?` is equivalent to `Null`, so make sure it behaves the same.
+    return nullabilitySuffix == NullabilitySuffix.question;
+  }
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    if (isCovariant) {
+      return this;
+    } else {
+      // In theory this should never happen, since we only need to do this
+      // replacement when checking super-boundedness of explicitly-specified
+      // types, or types produced by mixin inference or instantiate-to-bounds,
+      // and bottom can't occur in any of those cases.
+      assert(false,
+          'Attempted to check super-boundedness of a type including "bottom"');
+      // But just in case it does, return `dynamic` since that's similar to what
+      // we do with Null.
+      return typeProvider.objectType;
+    }
+  }
+
+  @override
+  @deprecated
+  NeverTypeImpl substitute2(
+          List<DartType> argumentTypes, List<DartType> parameterTypes) =>
+      this;
+
+  @override
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    switch (nullabilitySuffix) {
+      case NullabilitySuffix.question:
+        return instanceNullable;
+      case NullabilitySuffix.star:
+        return instanceLegacy;
+      case NullabilitySuffix.none:
+        return instance;
+    }
+    throw StateError('Unexpected nullabilitySuffix: $nullabilitySuffix');
+  }
+}
+
+/**
  * The abstract class `TypeImpl` implements the behavior common to objects
  * representing the declared type of elements in the element model.
  */
@@ -2140,6 +2196,7 @@
     }
     return other is TypeParameterTypeImpl &&
         other.element == element &&
+        other.bound == bound &&
         other.nullabilitySuffix == nullabilitySuffix;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index adeeb1e..c74ce935 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -75,10 +75,10 @@
     )..isExplicitlyCovariant = p.isCovariant;
   }
 
-  return FunctionTypeImpl.synthetic(
-    substitution.substituteType(type.returnType),
-    newTypeParameters,
-    type.parameters.map(transformParameter).toList(),
+  return FunctionTypeImpl(
+    typeFormals: newTypeParameters,
+    parameters: type.parameters.map(transformParameter).toList(),
+    returnType: substitution.substituteType(type.returnType),
     nullabilitySuffix: type.nullabilitySuffix,
   );
 }
@@ -109,10 +109,9 @@
   FreshTypeParameters(this.freshTypeParameters, this.substitution);
 
   FunctionType applyToFunctionType(FunctionType type) {
-    return new FunctionTypeImpl.synthetic(
-      substitute(type.returnType),
-      freshTypeParameters,
-      type.parameters.map((parameter) {
+    return new FunctionTypeImpl(
+      typeFormals: freshTypeParameters,
+      parameters: type.parameters.map((parameter) {
         return ParameterElementImpl.synthetic(
           parameter.name,
           substitute(parameter.type),
@@ -120,6 +119,7 @@
           parameter.parameterKind,
         );
       }).toList(),
+      returnType: substitute(type.returnType),
       nullabilitySuffix: (type as TypeImpl).nullabilitySuffix,
     );
   }
@@ -376,9 +376,6 @@
   }
 
   @override
-  DartType visitBottomType(BottomTypeImpl type) => type;
-
-  @override
   DartType visitDynamicType(DynamicTypeImpl type) => type;
 
   @override
@@ -418,13 +415,13 @@
 
     if (this.useCounter == before) return type;
 
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeFormals,
-      parameters,
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
+      nullabilitySuffix: (type as TypeImpl).nullabilitySuffix,
       element: type.element,
       typeArguments: typeArguments,
-      nullabilitySuffix: (type as TypeImpl).nullabilitySuffix,
     );
   }
 
@@ -509,6 +506,9 @@
   }
 
   @override
+  DartType visitNeverType(NeverTypeImpl type) => type;
+
+  @override
   DartType visitTypeParameterType(TypeParameterType type) {
     var argument = getSubstitute(type.element);
     if (argument == null) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 952e495..07a7fe8 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -45,13 +45,20 @@
   final LibraryElement _coreLibrary;
   final LibraryElement _asyncLibrary;
 
+  ClassElement _boolElement;
+  ClassElement _doubleElement;
   ClassElement _futureElement;
   ClassElement _futureOrElement;
+  ClassElement _intElement;
   ClassElement _iterableElement;
   ClassElement _listElement;
   ClassElement _mapElement;
+  ClassElement _nullElement;
+  ClassElement _numElement;
+  ClassElement _objectElement;
   ClassElement _setElement;
   ClassElement _streamElement;
+  ClassElement _stringElement;
   ClassElement _symbolElement;
 
   InterfaceType _boolType;
@@ -82,6 +89,11 @@
   InterfaceType _symbolType;
   InterfaceType _typeType;
 
+  InterfaceType _iterableForSetMapDisambiguation;
+  InterfaceType _mapForSetMapDisambiguation;
+
+  Set<ClassElement> _nonSubtypableClasses;
+
   /// Initialize a newly created type provider to provide the types defined in
   /// the given [coreLibrary] and [asyncLibrary].
   TypeProviderImpl(
@@ -93,6 +105,11 @@
         _asyncLibrary = asyncLibrary;
 
   @override
+  ClassElement get boolElement {
+    return _boolElement ??= _getClassElement(_coreLibrary, 'bool');
+  }
+
+  @override
   InterfaceType get boolType {
     _boolType ??= _getType(_coreLibrary, "bool");
     return _boolType;
@@ -101,9 +118,9 @@
   @override
   DartType get bottomType {
     if (_nullabilitySuffix == NullabilitySuffix.none) {
-      return BottomTypeImpl.instance;
+      return NeverTypeImpl.instance;
     }
-    return BottomTypeImpl.instanceLegacy;
+    return NeverTypeImpl.instanceLegacy;
   }
 
   @override
@@ -113,6 +130,11 @@
   }
 
   @override
+  ClassElement get doubleElement {
+    return _doubleElement ??= _getClassElement(_coreLibrary, "double");
+  }
+
+  @override
   InterfaceType get doubleType {
     _doubleType ??= _getType(_coreLibrary, "double");
     return _doubleType;
@@ -178,6 +200,11 @@
   }
 
   @override
+  ClassElement get intElement {
+    return _intElement ??= _getClassElement(_coreLibrary, "int");
+  }
+
+  @override
   InterfaceType get intType {
     _intType ??= _getType(_coreLibrary, "int");
     return _intType;
@@ -198,6 +225,25 @@
     return _iterableElement ??= _getClassElement(_coreLibrary, 'Iterable');
   }
 
+  /// Return the type that should be used during disambiguation between `Set`
+  /// and `Map` literals. If NNBD enabled, use `Iterable<Object?, Object?>`,
+  /// otherwise use `Iterable<Object*, Object*>*`.
+  InterfaceType get iterableForSetMapDisambiguation {
+    if (_iterableForSetMapDisambiguation == null) {
+      var objectType = objectElement.instantiate(
+        typeArguments: const [],
+        nullabilitySuffix: _questionOrStarSuffix,
+      );
+      _iterableForSetMapDisambiguation = iterableElement.instantiate(
+        typeArguments: [
+          objectType,
+        ],
+        nullabilitySuffix: _questionOrStarSuffix,
+      );
+    }
+    return _iterableForSetMapDisambiguation;
+  }
+
   @override
   InterfaceType get iterableObjectType {
     _iterableObjectType ??= InterfaceTypeImpl.explicit(
@@ -230,6 +276,26 @@
     return _mapElement ??= _getClassElement(_coreLibrary, 'Map');
   }
 
+  /// Return the type that should be used during disambiguation between `Set`
+  /// and `Map` literals. If NNBD enabled, use `Map<Object?, Object?>`,
+  /// otherwise use `Map<Object*, Object*>*`.
+  InterfaceType get mapForSetMapDisambiguation {
+    if (_mapForSetMapDisambiguation == null) {
+      var objectType = objectElement.instantiate(
+        typeArguments: const [],
+        nullabilitySuffix: _questionOrStarSuffix,
+      );
+      _mapForSetMapDisambiguation = mapElement.instantiate(
+        typeArguments: [
+          objectType,
+          objectType,
+        ],
+        nullabilitySuffix: _questionOrStarSuffix,
+      );
+    }
+    return _mapForSetMapDisambiguation;
+  }
+
   @override
   InterfaceType get mapObjectObjectType {
     _mapObjectObjectType ??= InterfaceTypeImpl.explicit(
@@ -247,7 +313,23 @@
   }
 
   @override
-  DartType get neverType => BottomTypeImpl.instance;
+  DartType get neverType => NeverTypeImpl.instance;
+
+  @override
+  Set<ClassElement> get nonSubtypableClasses => _nonSubtypableClasses ??= {
+        boolElement,
+        doubleElement,
+        futureOrElement,
+        intElement,
+        nullElement,
+        numElement,
+        stringElement,
+      };
+
+  @override
+  ClassElement get nullElement {
+    return _nullElement ??= _getClassElement(_coreLibrary, 'Null');
+  }
 
   @override
   DartObjectImpl get nullObject {
@@ -264,11 +346,20 @@
   }
 
   @override
+  ClassElement get numElement {
+    return _numElement ??= _getClassElement(_coreLibrary, 'num');
+  }
+
+  @override
   InterfaceType get numType {
     _numType ??= _getType(_coreLibrary, "num");
     return _numType;
   }
 
+  ClassElement get objectElement {
+    return _objectElement ??= _getClassElement(_coreLibrary, 'Object');
+  }
+
   @override
   InterfaceType get objectType {
     _objectType ??= _getType(_coreLibrary, "Object");
@@ -313,6 +404,11 @@
   }
 
   @override
+  ClassElement get stringElement {
+    return _stringElement ??= _getClassElement(_coreLibrary, 'String');
+  }
+
+  @override
   InterfaceType get stringType {
     _stringType ??= _getType(_coreLibrary, "String");
     return _stringType;
@@ -338,6 +434,12 @@
   @override
   VoidType get voidType => VoidTypeImpl.instance;
 
+  NullabilitySuffix get _questionOrStarSuffix {
+    return _nullabilitySuffix == NullabilitySuffix.none
+        ? NullabilitySuffix.question
+        : NullabilitySuffix.star;
+  }
+
   @override
   InterfaceType futureOrType2(DartType valueType) {
     return futureOrElement.instantiate(
diff --git a/pkg/analyzer/lib/src/dart/element/type_visitor.dart b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
index fe8a706..60ce66d 100644
--- a/pkg/analyzer/lib/src/dart/element/type_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
@@ -13,8 +13,6 @@
 
   R defaultDartType(DartType type) => null;
 
-  R visitBottomType(BottomTypeImpl type) => defaultDartType(type);
-
   R visitDynamicType(DynamicTypeImpl type) => defaultDartType(type);
 
   R visitFunctionType(FunctionType type) => defaultDartType(type);
@@ -25,6 +23,8 @@
 
   R visitNamedTypeBuilder(NamedTypeBuilder type) => defaultDartType(type);
 
+  R visitNeverType(NeverTypeImpl type) => defaultDartType(type);
+
   R visitTypeParameterType(TypeParameterType type) => defaultDartType(type);
 
   R visitUnknownInferredType(UnknownInferredType type) => defaultDartType(type);
@@ -32,8 +32,8 @@
   R visitVoidType(VoidType type) => defaultDartType(type);
 
   static R visit<R>(DartType type, DartTypeVisitor<R> visitor) {
-    if (type is BottomTypeImpl) {
-      return visitor.visitBottomType(type);
+    if (type is NeverTypeImpl) {
+      return visitor.visitNeverType(type);
     }
     if (type is DynamicTypeImpl) {
       return visitor.visitDynamicType(type);
diff --git a/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart b/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
index 27e447b..c109df6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/legacy_type_asserter.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:collection';
-
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -24,14 +22,7 @@
 /// nodes, have legacy types, and asserts that the legacy types are deep legacy
 /// types.
 class LegacyTypeAsserter extends GeneralizingAstVisitor {
-  // TODO(mfairhurst): remove custom equality/hashCode once both use nullability
-  Set<DartType> visitedTypes = LinkedHashSet<DartType>(
-      equals: (a, b) =>
-          a == b &&
-          (a as TypeImpl).nullabilitySuffix ==
-              (b as TypeImpl).nullabilitySuffix,
-      hashCode: (a) =>
-          a.hashCode * 11 + (a as TypeImpl).nullabilitySuffix.hashCode);
+  Set<DartType> _visitedTypes = {};
 
   LegacyTypeAsserter({bool requireIsDebug = true}) {
     if (requireIsDebug) {
@@ -72,9 +63,10 @@
   }
 
   @override
-  visitExpression(Expression e) {
-    _assertLegacyType(e.staticType);
-    super.visitExpression(e);
+  visitExpression(Expression node) {
+    _assertLegacyType(node.staticType);
+    _assertLegacyType(node.staticParameterElement?.type);
+    super.visitExpression(node);
   }
 
   @override
@@ -90,6 +82,13 @@
   }
 
   @override
+  visitInvocationExpression(InvocationExpression node) {
+    _assertLegacyType(node.staticInvokeType);
+    node.typeArgumentTypes?.forEach(_assertLegacyType);
+    return super.visitInvocationExpression(node);
+  }
+
+  @override
   visitTypeAnnotation(TypeAnnotation node) {
     _assertLegacyType(node.type);
     super.visitTypeAnnotation(node);
@@ -125,12 +124,10 @@
       return;
     }
 
-    if (visitedTypes.contains(type)) {
+    if (!_visitedTypes.add(type)) {
       return;
     }
 
-    visitedTypes.add(type);
-
     if (type is TypeParameterType) {
       _assertLegacyType(type.bound);
     } else if (type is InterfaceType) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index e119faf..dfff9aa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -159,7 +159,7 @@
       return;
     }
 
-    if (receiverType == BottomTypeImpl.instance) {
+    if (receiverType == NeverTypeImpl.instance) {
       _reportUseOfNeverType(node, receiver);
       return;
     }
@@ -885,7 +885,7 @@
       return _reportUseOfVoidType(node, node.methodName);
     }
 
-    if (type == BottomTypeImpl.instance) {
+    if (type == NeverTypeImpl.instance) {
       return _reportUseOfNeverType(node, node.methodName);
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index c3489dd..8df0142 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/ast_rewrite.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/declaration_resolver.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -635,10 +636,10 @@
 
             node.returnType?.accept(this);
             if (_elementWalker == null) {
-              element.type = FunctionTypeImpl.synthetic(
-                node.returnType?.type ?? _dynamicType,
-                element.typeParameters,
-                element.parameters,
+              element.type = FunctionTypeImpl(
+                typeFormals: element.typeParameters,
+                parameters: element.parameters,
+                returnType: node.returnType?.type ?? _dynamicType,
                 nullabilitySuffix: _getNullability(node.question != null),
               );
             }
@@ -673,10 +674,10 @@
       });
     });
 
-    var type = FunctionTypeImpl.synthetic(
-      element.returnType,
-      element.typeParameters,
-      element.parameters,
+    var type = FunctionTypeImpl(
+      typeFormals: element.typeParameters,
+      parameters: element.parameters,
+      returnType: element.returnType,
       nullabilitySuffix: _getNullability(node.question != null),
     );
     element.type = type;
@@ -892,6 +893,13 @@
   void visitTypeParameter(TypeParameter node) {
     TypeParameterElementImpl element = node.declaredElement;
 
+    // TODO (kallentu) : Clean up TypeParameterImpl checks and casting once
+    //  variance is added to the interface.
+    if (node is TypeParameterImpl && node.varianceKeyword != null) {
+      element.variance =
+          Variance.fromKeywordString(node.varianceKeyword.lexeme);
+    }
+
     node.metadata?.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 40ca63b..d59b9ba 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -410,11 +410,9 @@
       List<ImportElement> imports = _definingLibrary.imports;
       int count = imports.length;
       for (int i = 0; i < count; i++) {
-        if (imports[i].prefix == null) {
-          for (var element in imports[i].namespace.definedNames.values) {
-            if (element is ExtensionElement && !_extensions.contains(element)) {
-              _extensions.add(element);
-            }
+        for (var element in imports[i].namespace.definedNames.values) {
+          if (element is ExtensionElement && !_extensions.contains(element)) {
+            _extensions.add(element);
           }
         }
       }
@@ -786,7 +784,7 @@
     // which is not possible for `dynamic`.
     if (library.isDartCore) {
       definedNames['dynamic'] = DynamicElementImpl.instance;
-      definedNames['Never'] = BottomTypeImpl.instance.element;
+      definedNames['Never'] = NeverTypeImpl.instance.element;
     }
 
     return new Namespace(definedNames);
diff --git a/pkg/analyzer/lib/src/dart/resolver/variance.dart b/pkg/analyzer/lib/src/dart/resolver/variance.dart
index 69bc580..3f69514 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variance.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variance.dart
@@ -5,108 +5,157 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 
-/// Computes the variance of the [typeParameter] in the [type].
-int computeVariance(TypeParameterElement typeParameter, DartType type) {
-  if (type is TypeParameterType) {
-    if (type.element == typeParameter) {
-      return Variance.covariant;
-    } else {
-      return Variance.unrelated;
-    }
-  } else if (type is InterfaceType) {
-    var result = Variance.unrelated;
-    for (var argument in type.typeArguments) {
-      result = Variance.meet(
-        result,
-        computeVariance(typeParameter, argument),
-      );
-    }
-    return result;
-  } else if (type is FunctionType) {
-    var result = computeVariance(typeParameter, type.returnType);
-
-    for (var parameter in type.typeFormals) {
-      // If [parameter] is referenced in the bound at all, it makes the
-      // variance of [parameter] in the entire type invariant.  The invocation
-      // of [computeVariance] below is made to simply figure out if [variable]
-      // occurs in the bound.
-      var bound = parameter.bound;
-      if (bound != null &&
-          computeVariance(typeParameter, bound) != Variance.unrelated) {
-        result = Variance.invariant;
-      }
-    }
-
-    for (var parameter in type.parameters) {
-      result = Variance.meet(
-        result,
-        Variance.combine(
-          Variance.contravariant,
-          computeVariance(typeParameter, parameter.type),
-        ),
-      );
-    }
-    return result;
-  }
-  return Variance.unrelated;
-}
-
-/// Value set for variance of a type parameter `X` in a type `T`.
+/// The variance of a type parameter `X` in a type `T`.
 class Variance {
   /// Used when `X` does not occur free in `T`.
-  static const int unrelated = 0;
+  static const Variance unrelated = Variance._(0);
 
   /// Used when `X` occurs free in `T`, and `U <: V` implies `[U/X]T <: [V/X]T`.
-  static const int covariant = 1;
+  static const Variance covariant = Variance._(1);
 
   /// Used when `X` occurs free in `T`, and `U <: V` implies `[V/X]T <: [U/X]T`.
-  static const int contravariant = 2;
+  static const Variance contravariant = Variance._(2);
 
   /// Used when there exists a pair `U` and `V` such that `U <: V`, but
   /// `[U/X]T` and `[V/X]T` are incomparable.
-  static const int invariant = 3;
+  static const Variance invariant = Variance._(3);
+
+  /// The encoding associated with the variance.
+  final int _encoding;
+
+  /// Computes the variance of the [typeParameter] in the [type].
+  factory Variance(TypeParameterElement typeParameter, DartType type) {
+    if (type is TypeParameterType) {
+      if (type.element == typeParameter) {
+        return covariant;
+      } else {
+        return unrelated;
+      }
+    } else if (type is InterfaceType) {
+      var result = unrelated;
+      for (var argument in type.typeArguments) {
+        result = result.meet(
+          Variance(typeParameter, argument),
+        );
+      }
+      return result;
+    } else if (type is FunctionType) {
+      var result = Variance(typeParameter, type.returnType);
+
+      for (var parameter in type.typeFormals) {
+        // If [parameter] is referenced in the bound at all, it makes the
+        // variance of [parameter] in the entire type invariant.  The invocation
+        // of [computeVariance] below is made to simply figure out if [variable]
+        // occurs in the bound.
+        var bound = parameter.bound;
+        if (bound != null && !Variance(typeParameter, bound).isUnrelated) {
+          result = invariant;
+        }
+      }
+
+      for (var parameter in type.parameters) {
+        result = result.meet(
+          contravariant.combine(
+            Variance(typeParameter, parameter.type),
+          ),
+        );
+      }
+      return result;
+    }
+    return unrelated;
+  }
+
+  /// Initialize a newly created variance to have the given [encoding].
+  const Variance._(this._encoding);
+
+  /// Return the variance with the given [encoding].
+  factory Variance._fromEncoding(int encoding) {
+    switch (encoding) {
+      case 0:
+        return unrelated;
+      case 1:
+        return covariant;
+      case 2:
+        return contravariant;
+      case 3:
+        return invariant;
+    }
+    throw new ArgumentError('Invalid encoding for variance: $encoding');
+  }
+
+  /// Return the variance associated with the string representation of variance.
+  factory Variance.fromKeywordString(String varianceString) {
+    if (varianceString == "in") {
+      return contravariant;
+    } else if (varianceString == "inout") {
+      return invariant;
+    } else if (varianceString == "out") {
+      return covariant;
+    } else if (varianceString == "unrelated") {
+      return unrelated;
+    }
+    throw new ArgumentError(
+        'Invalid keyword string for variance: $varianceString');
+  }
+
+  /// Return `true` if this represents the case when `X` occurs free in `T`, and
+  /// `U <: V` implies `[V/X]T <: [U/X]T`.
+  bool get isContravariant => this == contravariant;
+
+  /// Return `true` if this represents the case when `X` occurs free in `T`, and
+  /// `U <: V` implies `[U/X]T <: [V/X]T`.
+  bool get isCovariant => this == covariant;
+
+  /// Return `true` if this represents the case when there exists a pair `U` and
+  /// `V` such that `U <: V`, but `[U/X]T` and `[V/X]T` are incomparable.
+  bool get isInvariant => this == invariant;
+
+  /// Return `true` if this represents the case when `X` does not occur free in
+  /// `T`.
+  bool get isUnrelated => this == unrelated;
 
   /// Combines variances of `X` in `T` and `Y` in `S` into variance of `X` in
   /// `[Y/T]S`.
   ///
   /// Consider the following examples:
   ///
-  /// * variance of `X` in `Function(X)` is [contravariant], variance of `Y`
-  /// in `List<Y>` is [covariant], so variance of `X` in `List<Function(X)>` is
-  /// [contravariant];
+  /// * variance of `X` in `Function(X)` is contravariant, variance of `Y`
+  /// in `List<Y>` is covariant, so variance of `X` in `List<Function(X)>` is
+  /// contravariant;
   ///
-  /// * variance of `X` in `List<X>` is [covariant], variance of `Y` in
-  /// `Function(Y)` is [contravariant], so variance of `X` in
-  /// `Function(List<X>)` is [contravariant];
+  /// * variance of `X` in `List<X>` is covariant, variance of `Y` in
+  /// `Function(Y)` is contravariant, so variance of `X` in
+  /// `Function(List<X>)` is contravariant;
   ///
-  /// * variance of `X` in `Function(X)` is [contravariant], variance of `Y` in
-  /// `Function(Y)` is [contravariant], so variance of `X` in
-  /// `Function(Function(X))` is [covariant];
+  /// * variance of `X` in `Function(X)` is contravariant, variance of `Y` in
+  /// `Function(Y)` is contravariant, so variance of `X` in
+  /// `Function(Function(X))` is covariant;
   ///
   /// * let the following be declared:
   ///
   ///     typedef F<Z> = Function();
   ///
-  /// then variance of `X` in `F<X>` is [unrelated], variance of `Y` in
-  /// `List<Y>` is [covariant], so variance of `X` in `List<F<X>>` is
-  /// [unrelated];
+  /// then variance of `X` in `F<X>` is unrelated, variance of `Y` in
+  /// `List<Y>` is covariant, so variance of `X` in `List<F<X>>` is
+  /// unrelated;
   ///
   /// * let the following be declared:
   ///
   ///     typedef G<Z> = Z Function(Z);
   ///
-  /// then variance of `X` in `List<X>` is [covariant], variance of `Y` in
-  /// `G<Y>` is [invariant], so variance of `X` in `G<List<X>>` is [invariant].
-  static int combine(int a, int b) {
-    if (a == unrelated || b == unrelated) return unrelated;
-    if (a == invariant || b == invariant) return invariant;
-    return a == b ? covariant : contravariant;
+  /// then variance of `X` in `List<X>` is covariant, variance of `Y` in
+  /// `G<Y>` is invariant, so variance of `X` in `G<List<X>>` is invariant.
+  Variance combine(Variance other) {
+    if (isUnrelated || other.isUnrelated) return unrelated;
+    if (isInvariant || other.isInvariant) return invariant;
+    return this == other ? covariant : contravariant;
   }
 
-  /// Variance values form a lattice where [unrelated] is the top, [invariant]
-  /// is the bottom, and [covariant] and [contravariant] are incomparable.
+  /// Variance values form a lattice where unrelated is the top, invariant
+  /// is the bottom, and covariant and contravariant are incomparable.
   /// [meet] calculates the meet of two elements of such lattice.  It can be
   /// used, for example, to calculate the variance of a typedef type parameter
   /// if it's encountered on the RHS of the typedef multiple times.
-  static int meet(int a, int b) => a | b;
+  Variance meet(Variance other) =>
+      Variance._fromEncoding(_encoding | other._encoding);
 }
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 7657ed0..10e559f 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -635,9 +635,9 @@
     if (resourceProvider is MemoryResourceProvider) {
       (resourceProvider as MemoryResourceProvider).writeOn(buffer);
     }
+    // TODO(39284): should this exception be silent?
     AnalysisEngine.instance.instrumentationService.logException(
-        new CaughtException.withMessage(
-            buffer.toString(), lastException, lastStackTrace));
+        new SilentException(buffer.toString(), lastException, lastStackTrace));
     return new LibraryMap();
   }
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 159c539..240ec8c 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1229,6 +1229,17 @@
               "modifier.");
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode DEFERRED_IMPORT_OF_EXTENSION =
+      const CompileTimeErrorCode('DEFERRED_IMPORT_OF_EXTENSION',
+          "Imports of deferred libraries must hide all extensions",
+          correction:
+              "Try adding either a show combinator listing the names you need "
+              "to reference or a hide combinator listing all of the "
+              "extensions.");
+
+  /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity
    * with the same name declared in the same scope.
    */
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 6640df9..16ae004 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -331,7 +330,8 @@
     }
 
     DartType type = typeName.type;
-    if (typeProvider.nonSubtypableTypes.contains(type)) {
+    if (type is InterfaceType &&
+        typeProvider.nonSubtypableClasses.contains(type.element)) {
       reporter.reportErrorForNode(errorCode, typeName, [type.displayName]);
       return true;
     }
@@ -450,10 +450,7 @@
     for (var i = 0; i < baseParameterElements.length; ++i) {
       var baseParameter = baseParameterElements[i];
       if (baseParameter.isOptional) {
-        if (baseParameter is ParameterMember) {
-          baseParameter = (baseParameter as ParameterMember).baseElement;
-        }
-        baseOptionalElements.add(baseParameter);
+        baseOptionalElements.add(baseParameter.declaration);
       }
     }
 
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index 66fa754..8aeb435 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -145,13 +144,8 @@
     }
 
     InterfaceType iterableType;
-    var iterableDynamicType = (typeProvider.iterableDynamicType as TypeImpl)
-        .withNullability(NullabilitySuffix.question);
-    if (expressionType is InterfaceTypeImpl &&
-        typeSystem.isSubtypeOf(expressionType, iterableDynamicType)) {
-      iterableType = expressionType.asInstanceOf(
-        iterableDynamicType.element,
-      );
+    if (expressionType is InterfaceTypeImpl) {
+      iterableType = expressionType.asInstanceOf(typeProvider.iterableElement);
     }
 
     if (iterableType == null) {
@@ -192,10 +186,8 @@
     }
 
     InterfaceType mapType;
-    var mapObjectObjectType = typeProvider.mapObjectObjectType;
-    if (expressionType is InterfaceTypeImpl &&
-        typeSystem.isSubtypeOf(expressionType, mapObjectObjectType)) {
-      mapType = expressionType.asInstanceOf(mapObjectObjectType.element);
+    if (expressionType is InterfaceTypeImpl) {
+      mapType = expressionType.asInstanceOf(typeProvider.mapElement);
     }
 
     if (mapType == null) {
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 94fcd92..c40153a2 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -25,6 +25,7 @@
         templateExpectedButGot,
         templateExpectedIdentifier,
         templateExperimentNotEnabled,
+        templateInternalProblemUnhandled,
         templateUnexpectedToken;
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show
@@ -36,6 +37,9 @@
         MemberKind,
         optional,
         Parser;
+import 'package:_fe_analyzer_shared/src/parser/quote.dart';
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
+    show NullValue, StackListener;
 import 'package:_fe_analyzer_shared/src/scanner/errors.dart'
     show translateErrorToken;
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' hide StringToken;
@@ -54,14 +58,10 @@
         ClassDeclarationImpl,
         CompilationUnitImpl,
         ExtensionDeclarationImpl,
-        MixinDeclarationImpl;
+        MixinDeclarationImpl,
+        TypeParameterImpl;
 import 'package:analyzer/src/fasta/error_converter.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:front_end/src/fasta/problems.dart' show unhandled;
-import 'package:front_end/src/fasta/quote.dart';
-import 'package:front_end/src/fasta/source/stack_listener.dart'
-    show NullValue, StackListener;
-import 'package:kernel/ast.dart' show AsyncMarker;
 
 const _invalidCollectionElement = const _InvalidCollectionElement._();
 
@@ -78,6 +78,11 @@
   @override
   final Uri uri;
 
+  @override
+  dynamic internalProblem(Message message, int charOffset, Uri uri) {
+    throw UnsupportedError(message.message);
+  }
+
   /// The parser that uses this listener, used to parse optional parts, e.g.
   /// `native` support.
   Parser parser;
@@ -672,8 +677,11 @@
       redirectedConstructor = bodyObject.constructorName;
       body = ast.emptyFunctionBody(endToken);
     } else {
-      unhandled("${bodyObject.runtimeType}", "bodyObject",
-          beginToken.charOffset, uri);
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments(
+              "${bodyObject.runtimeType}", "bodyObject"),
+          beginToken.charOffset,
+          uri);
     }
 
     SimpleIdentifier prefixOrName;
@@ -753,8 +761,11 @@
       redirectedConstructor = bodyObject.constructorName;
       body = ast.emptyFunctionBody(endToken);
     } else {
-      unhandled("${bodyObject.runtimeType}", "bodyObject",
-          beginToken.charOffset, uri);
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments(
+              "${bodyObject.runtimeType}", "bodyObject"),
+          beginToken.charOffset,
+          uri);
     }
 
     FormalParameterList parameters = pop();
@@ -856,8 +867,11 @@
     } else if (bodyObject is _RedirectingFactoryBody) {
       body = ast.emptyFunctionBody(endToken);
     } else {
-      unhandled("${bodyObject.runtimeType}", "bodyObject",
-          beginToken.charOffset, uri);
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments(
+              "${bodyObject.runtimeType}", "bodyObject"),
+          beginToken.charOffset,
+          uri);
     }
 
     Token operatorKeyword;
@@ -1576,7 +1590,11 @@
     } else if (node is SimpleIdentifier) {
       variable = _makeVariableDeclaration(node, null, null);
     } else {
-      unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
+      internalProblem(
+          templateInternalProblemUnhandled.withArguments(
+              "${node.runtimeType}", "identifier"),
+          nameToken.charOffset,
+          uri);
     }
     push(variable);
   }
@@ -1659,8 +1677,11 @@
         } else if (part is InterpolationExpression) {
           elements.add(part);
         } else {
-          unhandled("${part.runtimeType}", "string interpolation",
-              first.charOffset, uri);
+          internalProblem(
+              templateInternalProblemUnhandled.withArguments(
+                  "${part.runtimeType}", "string interpolation"),
+              first.charOffset,
+              uri);
         }
       }
       elements.add(ast.interpolationString(
@@ -2121,9 +2142,14 @@
 
     // Peek to leave type parameters on top of stack.
     List<TypeParameter> typeParameters = peek();
-    typeParameters[index]
+    TypeParameter typeParameter = typeParameters[index];
+    typeParameter
       ..extendsKeyword = extendsOrSuper
       ..bound = bound;
+
+    if (typeParameter is TypeParameterImpl) {
+      typeParameter.varianceKeyword = variance;
+    }
   }
 
   @override
@@ -2197,41 +2223,6 @@
     push(ast.yieldStatement(yieldToken, starToken, expression, semicolon));
   }
 
-  @override
-  void exitLocalScope() {}
-
-  @override
-  AstNode finishFields() {
-    debugEvent("finishFields");
-
-    if (classDeclaration != null) {
-      return classDeclaration.members
-          .removeAt(classDeclaration.members.length - 1);
-    } else if (mixinDeclaration != null) {
-      return mixinDeclaration.members
-          .removeAt(mixinDeclaration.members.length - 1);
-    } else {
-      return declarations.removeLast();
-    }
-  }
-
-  void finishFunction(formals, AsyncMarker asyncModifier, FunctionBody body) {
-    debugEvent("finishFunction");
-
-    Statement bodyStatement;
-    if (body is EmptyFunctionBody) {
-      bodyStatement = ast.emptyStatement(body.semicolon);
-    } else if (body is NativeFunctionBody) {
-      // TODO(danrubel): what do we need to do with NativeFunctionBody?
-    } else if (body is ExpressionFunctionBody) {
-      bodyStatement = ast.returnStatement(null, body.expression, null);
-    } else {
-      bodyStatement = (body as BlockFunctionBody).block;
-    }
-    // TODO(paulberry): what do we need to do with bodyStatement at this point?
-    bodyStatement; // Suppress "unused local variable" hint
-  }
-
   void handleAsOperator(Token asOperator) {
     assert(optional('as', asOperator));
     debugEvent("AsOperator");
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 1132017..b7ce355 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
@@ -274,12 +273,6 @@
    */
   HiddenElements _hiddenElements;
 
-  /**
-   * A list of types used by the [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]
-   * and [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS] error codes.
-   */
-  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
-
   final _UninstantiatedBoundChecker _uninstantiatedBoundChecker;
 
   /// Setting this flag to `true` disables the check for conflicting generics.
@@ -318,7 +311,6 @@
     _isInStaticMethod = false;
     _boolType = _typeProvider.boolType;
     _intType = _typeProvider.intType;
-    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = _typeProvider.nonSubtypableTypes;
     _typeSystem = _currentLibrary.context.typeSystem;
     _options = _currentLibrary.context.analysisOptions;
     _typeArgumentsVerifier =
@@ -953,6 +945,9 @@
     if (importElement != null) {
       _checkForImportDuplicateLibraryName(node, importElement);
       _checkForImportInternalLibrary(node, importElement);
+      if (importElement.isDeferred) {
+        _checkForDeferredImportOfExtensions(node, importElement);
+      }
     }
     super.visitImportDirective(node);
   }
@@ -2624,6 +2619,39 @@
   }
 
   /**
+   * Report a diagnostic if there are any extensions in the imported library
+   * that are not hidden.
+   */
+  void _checkForDeferredImportOfExtensions(
+      ImportDirective directive, ImportElement importElement) {
+    List<String> shownNames = [];
+    List<String> hiddenNames = [];
+
+    Iterable<String> namesOf(List<SimpleIdentifier> identifiers) =>
+        identifiers.map((identifier) => identifier.name);
+    for (Combinator combinator in directive.combinators) {
+      if (combinator is HideCombinator) {
+        hiddenNames.addAll(namesOf(combinator.hiddenNames));
+      } else if (combinator is ShowCombinator) {
+        shownNames.addAll(namesOf(combinator.shownNames));
+      }
+    }
+    for (Element element in importElement.importedLibrary.topLevelElements) {
+      if (element is ExtensionElement) {
+        String name = element.name;
+        if (name != null &&
+            name.isNotEmpty &&
+            (shownNames.contains(name) ||
+                (shownNames.isEmpty && !hiddenNames.contains(name)))) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DEFERRED_IMPORT_OF_EXTENSION, directive.uri);
+          return;
+        }
+      }
+    }
+  }
+
+  /**
    * Verify that any deferred imports in the given compilation [unit] have a
    * unique prefix.
    *
@@ -2876,7 +2904,8 @@
     if (_currentLibrary.source.isInSystemLibrary) {
       return false;
     }
-    return _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT.contains(typeName.type);
+    return typeName.type is InterfaceType &&
+        _typeProvider.nonSubtypableClasses.contains(typeName.type.element);
   }
 
   void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
@@ -3130,7 +3159,7 @@
     // Similar logic applies for sync* and async*.
     //
     var lowerBound = expectedElement.instantiate(
-      typeArguments: [BottomTypeImpl.instance],
+      typeArguments: [NeverTypeImpl.instance],
       nullabilitySuffix: NullabilitySuffix.star,
     );
     if (!_typeSystem.isSubtypeOf(lowerBound, returnType)) {
@@ -5092,7 +5121,7 @@
    */
   bool _checkForUseOfNever(Expression expression) {
     if (expression == null ||
-        !identical(expression.staticType, BottomTypeImpl.instance)) {
+        !identical(expression.staticType, NeverTypeImpl.instance)) {
       return false;
     }
 
@@ -5274,9 +5303,8 @@
     void checkOne(DartType superInterface) {
       if (superInterface != null) {
         for (var typeParameter in _enclosingClass.typeParameters) {
-          var variance = computeVariance(typeParameter, superInterface);
-          if (variance == Variance.contravariant ||
-              variance == Variance.invariant) {
+          var variance = Variance(typeParameter, superInterface);
+          if (variance.isContravariant || variance.isInvariant) {
             _errorReporter.reportErrorForElement(
               CompileTimeErrorCode
                   .WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
@@ -5744,12 +5772,6 @@
    * indirectly.
    */
   bool _hasRedirectingFactoryConstructorCycle(ConstructorElement constructor) {
-    ConstructorElement nonMember(ConstructorElement constructor) {
-      return constructor is ConstructorMember
-          ? constructor.baseElement
-          : constructor;
-    }
-
     Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
     ConstructorElement current = constructor;
     while (current != null) {
@@ -5757,7 +5779,7 @@
         return identical(current, constructor);
       }
       constructors.add(current);
-      current = nonMember(current.redirectedConstructor);
+      current = current.redirectedConstructor?.declaration;
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index d0e1e5f..8a3ddfc 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
@@ -364,7 +365,7 @@
           node.returnType, node.functionExpression.body, element, node);
 
       // Return types are inferred only on non-recursive local functions.
-      if (node.parent is CompilationUnit) {
+      if (node.parent is CompilationUnit && !node.isSetter) {
         _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
       }
       _checkStrictInferenceInParameters(node.functionExpression.parameters);
@@ -498,7 +499,7 @@
       _checkForMissingReturn(node.returnType, node.body, element, node);
       _checkForUnnecessaryNoSuchMethod(node);
 
-      if (_strictInference && !node.isSetter && !elementIsOverride()) {
+      if (!node.isSetter && !elementIsOverride()) {
         _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
       }
       _checkStrictInferenceInParameters(node.parameters);
@@ -1359,6 +1360,10 @@
   /// `null` if the element doesn't have a deprecated annotation or if the
   /// annotation does not have a message.
   static String _deprecatedMessage(Element element) {
+    // Implicit getters/setters.
+    if (element.isSynthetic && element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
     ElementAnnotationImpl annotation = element.metadata.firstWhere(
       (e) => e.isDeprecated,
       orElse: () => null,
@@ -2697,8 +2702,12 @@
   /// or `null` if not in a [SwitchStatement].
   DartType _enclosingSwitchStatementExpressionType;
 
-  InterfaceType _iterableForSetMapDisambiguationCached;
-  InterfaceType _mapForSetMapDisambiguationCached;
+  /// Stack of expressions which we have not yet finished visiting, that should
+  /// terminate a null-shorting expression.
+  ///
+  /// The stack contains a `null` sentinel as its first entry so that it is
+  /// always safe to use `.last` to examine the top of the stack.
+  final List<Expression> unfinishedNullShorts = [null];
 
   /// Initialize a newly created visitor to resolve the nodes in an AST node.
   ///
@@ -2792,31 +2801,6 @@
         : NullabilitySuffix.star;
   }
 
-  InterfaceType get _iterableForSetMapDisambiguation {
-    return _iterableForSetMapDisambiguationCached ??=
-        typeProvider.iterableElement.instantiate(
-      typeArguments: [
-        typeProvider.dynamicType,
-      ],
-      nullabilitySuffix: _nonNullableEnabled
-          ? NullabilitySuffix.question
-          : NullabilitySuffix.star,
-    );
-  }
-
-  InterfaceType get _mapForSetMapDisambiguation {
-    return _mapForSetMapDisambiguationCached ??=
-        typeProvider.mapElement.instantiate(
-      typeArguments: [
-        typeProvider.dynamicType,
-        typeProvider.dynamicType,
-      ],
-      nullabilitySuffix: _nonNullableEnabled
-          ? NullabilitySuffix.question
-          : NullabilitySuffix.star,
-    );
-  }
-
   /**
    * Return `true` if NNBD is enabled for this compilation unit.
    */
@@ -3840,8 +3824,9 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     node.target?.accept(this);
-    if (node.isNullAware) {
-      _flowAnalysis?.flow?.nullAwareAccess_rightBegin(node.target);
+    if (node.isNullAware && _nonNullableEnabled) {
+      _flowAnalysis.flow.nullAwareAccess_rightBegin(node.target);
+      unfinishedNullShorts.add(node.nullShortingTermination);
     }
     node.accept(elementResolver);
     var method = node.staticElement;
@@ -4037,8 +4022,9 @@
     // to be visited in the context of the property access node.
     //
     node.target?.accept(this);
-    if (node.isNullAware) {
-      _flowAnalysis?.flow?.nullAwareAccess_rightBegin(node.target);
+    if (node.isNullAware && _nonNullableEnabled) {
+      _flowAnalysis.flow.nullAwareAccess_rightBegin(node.target);
+      unfinishedNullShorts.add(node.nullShortingTermination);
     }
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
@@ -4509,9 +4495,9 @@
       // TODO(brianwilkerson) Find out what the "greatest closure" is and use that
       // where [unwrappedContextType] is used below.
       bool isIterable = typeSystem.isSubtypeOf(
-          unwrappedContextType, _iterableForSetMapDisambiguation);
+          unwrappedContextType, typeProvider.iterableForSetMapDisambiguation);
       bool isMap = typeSystem.isSubtypeOf(
-          unwrappedContextType, _mapForSetMapDisambiguation);
+          unwrappedContextType, typeProvider.mapForSetMapDisambiguation);
       if (isIterable && !isMap) {
         return _LiteralResolution(
             _LiteralResolutionKind.set, unwrappedContextType);
@@ -4604,7 +4590,7 @@
       // Get back to the uninstantiated generic constructor.
       // TODO(jmesserly): should we store this earlier in resolution?
       // Or look it up, instead of jumping backwards through the Member?
-      var rawElement = originalElement.baseElement;
+      var rawElement = originalElement.declaration;
 
       FunctionType constructorType =
           StaticTypeAnalyzer.constructorToGenericFunctionType(rawElement);
@@ -4834,7 +4820,7 @@
   final Source source;
 
   /// The object used to access the types from the core library.
-  final TypeProvider typeProvider;
+  final TypeProviderImpl typeProvider;
 
   /// The error reporter that will be informed of any errors that are found
   /// during resolution.
@@ -6292,6 +6278,9 @@
 /// The interface `TypeProvider` defines the behavior of objects that provide
 /// access to types defined by the language.
 abstract class TypeProvider {
+  /// Return the element representing the built-in class 'bool'.
+  ClassElement get boolElement;
+
   /// Return the type representing the built-in type 'bool'.
   InterfaceType get boolType;
 
@@ -6301,6 +6290,9 @@
   /// Return the type representing the built-in type 'Deprecated'.
   InterfaceType get deprecatedType;
 
+  /// Return the element representing the built-in class 'double'.
+  ClassElement get doubleElement;
+
   /// Return the type representing the built-in type 'double'.
   InterfaceType get doubleType;
 
@@ -6333,6 +6325,9 @@
   @Deprecated('Use futureType2() instead.')
   InterfaceType get futureType;
 
+  /// Return the element representing the built-in class 'int'.
+  ClassElement get intElement;
+
   /// Return the type representing the built-in type 'int'.
   InterfaceType get intType;
 
@@ -6371,14 +6366,25 @@
 
   /// Return a list containing all of the types that cannot be either extended
   /// or implemented.
+  Set<ClassElement> get nonSubtypableClasses;
+
+  /// Return a list containing all of the types that cannot be either extended
+  /// or implemented.
+  @Deprecated('Use nonSubtypableClasses instead.')
   List<InterfaceType> get nonSubtypableTypes;
 
+  /// Return the element representing the built-in class 'null'.
+  ClassElement get nullElement;
+
   /// Return a [DartObjectImpl] representing the `null` object.
   DartObjectImpl get nullObject;
 
   /// Return the type representing the built-in type 'Null'.
   InterfaceType get nullType;
 
+  /// Return the element representing the built-in class 'num'.
+  ClassElement get numElement;
+
   /// Return the type representing the built-in type 'num'.
   InterfaceType get numType;
 
@@ -6405,6 +6411,9 @@
   @Deprecated('Use streamType2() instead.')
   InterfaceType get streamType;
 
+  /// Return the element representing the built-in class 'String'.
+  ClassElement get stringElement;
+
   /// Return the type representing the built-in type 'String'.
   InterfaceType get stringType;
 
@@ -6882,7 +6891,16 @@
       return;
     }
 
-    Element element = identifier.staticElement;
+    // This is the same logic used in [checkForDeprecatedMemberUseAtIdentifier]
+    // to avoid reporting an error twice for named constructors.
+    AstNode parent = identifier.parent;
+    if (parent is ConstructorName && identical(identifier, parent.name)) {
+      return;
+    }
+    AstNode grandparent = parent?.parent;
+    Element element = grandparent is ConstructorName
+        ? grandparent.staticElement
+        : identifier.staticElement;
     if (element == null || _inCurrentLibrary(element)) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 33f39c3..6ed57e1 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -339,13 +339,15 @@
       pkgDir = pkgDir.getCanonicalFile();
     } catch (exception, stackTrace) {
       if (!exception.toString().contains("Required key not available")) {
+        // TODO(39284): should this exception be silent?
         AnalysisEngine.instance.instrumentationService.logException(
-            new CaughtException.withMessage(
+            new SilentException(
                 "Canonical failed: $pkgDir", exception, stackTrace));
       } else if (_CanLogRequiredKeyIoException) {
         _CanLogRequiredKeyIoException = false;
+        // TODO(39284): should this exception be silent?
         AnalysisEngine.instance.instrumentationService.logException(
-            new CaughtException.withMessage(
+            new SilentException(
                 "Canonical failed: $pkgDir", exception, stackTrace));
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index e4ba3a4..ff85dcb 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/src/dart/element/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -47,7 +48,7 @@
   /**
    * The object providing access to the types defined by the language.
    */
-  TypeProvider _typeProvider;
+  TypeProviderImpl _typeProvider;
 
   /**
    * The type system in use for static type analysis.
@@ -70,9 +71,6 @@
    */
   DartType thisType;
 
-  InterfaceType _iterableForSetMapDisambiguationCached;
-  InterfaceType _mapForSetMapDisambiguationCached;
-
   /**
    * The object providing promoted or declared types of variables.
    */
@@ -96,31 +94,6 @@
     _strictInference = analysisOptions.strictInference;
   }
 
-  InterfaceType get _iterableForSetMapDisambiguation {
-    return _iterableForSetMapDisambiguationCached ??=
-        _typeProvider.iterableElement.instantiate(
-      typeArguments: [
-        _typeProvider.dynamicType,
-      ],
-      nullabilitySuffix: _nonNullableEnabled
-          ? NullabilitySuffix.question
-          : NullabilitySuffix.star,
-    );
-  }
-
-  InterfaceType get _mapForSetMapDisambiguation {
-    return _mapForSetMapDisambiguationCached ??=
-        _typeProvider.mapElement.instantiate(
-      typeArguments: [
-        _typeProvider.dynamicType,
-        _typeProvider.dynamicType,
-      ],
-      nullabilitySuffix: _nonNullableEnabled
-          ? NullabilitySuffix.question
-          : NullabilitySuffix.star,
-    );
-  }
-
   NullabilitySuffix get _noneOrStarSuffix {
     return _nonNullableEnabled
         ? NullabilitySuffix.none
@@ -1449,35 +1422,6 @@
     return returnType.type;
   }
 
-  /// If [node] is a null-shorting expression, updates flow analysis as
-  /// appropriate to finish the null shorting, and returns `true`.  Otherwise
-  /// returns `false`.
-  bool _finishNullShorting(Expression node) {
-    bool nullShortingFound = false;
-    while (true) {
-      Expression next;
-      if (node is AssignmentExpression) {
-        next = node.leftHandSide;
-      } else if (node is IndexExpression) {
-        if (node.isNullAware) {
-          nullShortingFound = true;
-          _flowAnalysis?.flow?.nullAwareAccess_end();
-        }
-        next = node.target;
-      } else if (node is PropertyAccess) {
-        if (node.isNullAware) {
-          nullShortingFound = true;
-          _flowAnalysis?.flow?.nullAwareAccess_end();
-        }
-        next = node.target;
-      } else {
-        break;
-      }
-      node = next;
-    }
-    return nullShortingFound;
-  }
-
   /**
    * If the given element name can be mapped to the name of a class defined within the given
    * library, return the type specified by the argument.
@@ -1636,7 +1580,7 @@
       bool isNull = expressionType.isDartCoreNull;
       if (!isNull && expressionType is InterfaceType) {
         if (_typeSystem.isSubtypeOf(
-            expressionType, _typeProvider.iterableObjectType)) {
+            expressionType, _typeProvider.iterableForSetMapDisambiguation)) {
           InterfaceType iterableType = (expressionType as InterfaceTypeImpl)
               .asInstanceOf(_typeProvider.iterableElement);
           return _InferredCollectionElementTypeInformation(
@@ -1644,7 +1588,7 @@
               keyType: null,
               valueType: null);
         } else if (_typeSystem.isSubtypeOf(
-            expressionType, _typeProvider.mapObjectObjectType)) {
+            expressionType, _typeProvider.mapForSetMapDisambiguation)) {
           InterfaceType mapType = (expressionType as InterfaceTypeImpl)
               .asInstanceOf(_typeProvider.mapElement);
           List<DartType> typeArguments = mapType.typeArguments;
@@ -1786,7 +1730,7 @@
     // Get back to the uninstantiated generic constructor.
     // TODO(jmesserly): should we store this earlier in resolution?
     // Or look it up, instead of jumping backwards through the Member?
-    var rawElement = (originalElement as ConstructorMember).baseElement;
+    var rawElement = originalElement.declaration;
 
     FunctionType constructorType = constructorToGenericFunctionType(rawElement);
 
@@ -1899,14 +1843,19 @@
   // node's argumentList. (This likely affects only explicit calls to
   // `Object.noSuchMethod`.)
   bool _inferMethodInvocationObject(MethodInvocation node) {
-    // If we have a call like `toString()` or `libraryPrefix.toString()` don't
+    // If we have a call like `toString()` or `libraryPrefix.toString()`, don't
     // infer it.
     Expression target = node.realTarget;
     if (target == null ||
         target is SimpleIdentifier && target.staticElement is PrefixElement) {
       return false;
     }
-
+    DartType nodeType = node.staticInvokeType;
+    if (nodeType == null ||
+        !nodeType.isDynamic ||
+        node.argumentList.arguments.isNotEmpty) {
+      return false;
+    }
     // Object methods called on dynamic targets can have their types improved.
     String name = node.methodName.name;
     MethodElement inferredElement =
@@ -1915,16 +1864,15 @@
       return false;
     }
     DartType inferredType = inferredElement.type;
-    DartType nodeType = node.staticInvokeType;
-    if (nodeType != null &&
-        nodeType.isDynamic &&
-        inferredType is FunctionType &&
-        inferredType.parameters.isEmpty &&
-        node.argumentList.arguments.isEmpty &&
-        _typeProvider.nonSubtypableTypes.contains(inferredType.returnType)) {
-      node.staticInvokeType = inferredType;
-      _recordStaticType(node, inferredType.returnType);
-      return true;
+    if (inferredType is FunctionType) {
+      DartType returnType = inferredType.returnType;
+      if (inferredType.parameters.isEmpty &&
+          returnType is InterfaceType &&
+          _typeProvider.nonSubtypableClasses.contains(returnType.element)) {
+        node.staticInvokeType = inferredType;
+        _recordStaticType(node, inferredType.returnType);
+        return true;
+      }
     }
     return false;
   }
@@ -1953,8 +1901,8 @@
     DartType inferredType = inferredElement.type.returnType;
     if (nodeType != null &&
         nodeType.isDynamic &&
-        inferredType != null &&
-        _typeProvider.nonSubtypableTypes.contains(inferredType)) {
+        inferredType is InterfaceType &&
+        _typeProvider.nonSubtypableClasses.contains(inferredType.element)) {
       _recordStaticType(id, inferredType);
       _recordStaticType(node, inferredType);
       return true;
@@ -1995,9 +1943,11 @@
     bool contextProvidesAmbiguityResolutionClues =
         contextType != null && contextType is! UnknownInferredType;
     bool contextIsIterable = contextProvidesAmbiguityResolutionClues &&
-        _typeSystem.isSubtypeOf(contextType, _iterableForSetMapDisambiguation);
+        _typeSystem.isSubtypeOf(
+            contextType, _typeProvider.iterableForSetMapDisambiguation);
     bool contextIsMap = contextProvidesAmbiguityResolutionClues &&
-        _typeSystem.isSubtypeOf(contextType, _mapForSetMapDisambiguation);
+        _typeSystem.isSubtypeOf(
+            contextType, _typeProvider.mapForSetMapDisambiguation);
     if (contextIsIterable && !contextIsMap) {
       return _toSetType(literal, contextType, inferredTypes);
     } else if ((contextIsMap && !contextIsIterable) || elements.isEmpty) {
@@ -2084,20 +2034,12 @@
   void _nullShortingTermination(Expression node) {
     if (!_nonNullableEnabled) return;
 
-    var parent = node.parent;
-    if (parent is AssignmentExpression && parent.leftHandSide == node) {
-      return;
-    }
-    if (parent is PropertyAccess) {
-      return;
-    }
-    if (parent is IndexExpression && parent.target == node) {
-      return;
-    }
-
-    if (_finishNullShorting(node)) {
-      var type = node.staticType;
-      node.staticType = _typeSystem.makeNullable(type);
+    if (identical(_resolver.unfinishedNullShorts.last, node)) {
+      do {
+        _resolver.unfinishedNullShorts.removeLast();
+        _flowAnalysis.flow.nullAwareAccess_end();
+      } while (identical(_resolver.unfinishedNullShorts.last, node));
+      node.staticType = _typeSystem.makeNullable(node.staticType);
     }
   }
 
@@ -2112,7 +2054,7 @@
       expression.staticType = _dynamicType;
     } else {
       expression.staticType = type;
-      if (identical(type, BottomTypeImpl.instance)) {
+      if (identical(type, NeverTypeImpl.instance)) {
         _flowAnalysis?.flow?.handleExit();
       }
     }
@@ -2236,10 +2178,10 @@
       return constructor.type;
     }
 
-    return FunctionTypeImpl.synthetic(
-      constructor.returnType,
-      typeParameters,
-      constructor.parameters,
+    return FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: constructor.parameters,
+      returnType: constructor.returnType,
       nullabilitySuffix: NullabilitySuffix.star,
     );
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 9538549..411503d 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -15,12 +15,10 @@
  * for the core library.
  */
 class TestTypeProvider extends TypeProviderImpl {
-  factory TestTypeProvider([
-    AnalysisContext context,
-    Object analysisDriver,
+  factory TestTypeProvider({
     NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star,
-  ]) {
-    context ??= _MockAnalysisContext();
+  }) {
+    var context = _MockAnalysisContext();
     var sdkElements = MockSdkElements(context, nullabilitySuffix);
     return TestTypeProvider._(
       nullabilitySuffix,
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index cfebd50..1b841ec 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/error/codes.dart' show HintCode, StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptionsImpl;
@@ -217,7 +218,7 @@
 
     // No subtype relation, so no known GLB.
     // TODO(mfairhurst): implement fully NNBD GLB, and return Never (non-legacy)
-    return BottomTypeImpl.instanceLegacy;
+    return NeverTypeImpl.instanceLegacy;
   }
 
   /**
@@ -634,7 +635,7 @@
     }
 
     // Left Bottom: if `T0` is `Never`, then `T0 <: T1`.
-    if (identical(T0, BottomTypeImpl.instance)) {
+    if (identical(T0, NeverTypeImpl.instance)) {
       return true;
     }
 
@@ -1073,11 +1074,21 @@
 
   /// Check that [f1] is a subtype of [f2].
   bool _isFunctionSubtypeOf(FunctionType f1, FunctionType f2) {
-    return FunctionTypeImpl.relate(f1, f2, isSubtypeOf,
-        parameterRelation: (p1, p2) => isSubtypeOf(p2.type, p1.type),
+    return FunctionTypeImpl.relate(
+      f1,
+      f2,
+      isSubtypeOf,
+      parameterRelation: (p1, p2) {
+        if (p1.isRequiredNamed && !p2.isRequiredNamed) {
+          return false;
+        }
+        return isSubtypeOf(p2.type, p1.type);
+      },
+      boundsRelation: (t1, t2, p1, p2) {
         // Type parameter bounds are invariant.
-        boundsRelation: (t1, t2, p1, p2) =>
-            isSubtypeOf(t1, t2) && isSubtypeOf(t2, t1));
+        return isSubtypeOf(t1, t2) && isSubtypeOf(t2, t1);
+      },
+    );
   }
 
   bool _isInterfaceSubtypeOf(
@@ -1097,14 +1108,35 @@
     if (i1Element == i2.element) {
       List<DartType> tArgs1 = i1.typeArguments;
       List<DartType> tArgs2 = i2.typeArguments;
+      List<TypeParameterElement> tParams = i1Element.typeParameters;
 
       assert(tArgs1.length == tArgs2.length);
+      assert(tParams.length == tArgs1.length);
 
       for (int i = 0; i < tArgs1.length; i++) {
         DartType t1 = tArgs1[i];
         DartType t2 = tArgs2[i];
-        if (!isSubtypeOf(t1, t2)) {
-          return false;
+
+        // TODO (kallentu) : Clean up TypeParameterElementImpl checks and
+        // casting once variance is added to the interface.
+        TypeParameterElement parameterElement = tParams[i];
+        Variance variance = Variance.covariant;
+        if (parameterElement is TypeParameterElementImpl) {
+          variance = parameterElement.variance;
+        }
+
+        if (variance.isContravariant) {
+          if (!isSubtypeOf(t2, t1)) {
+            return false;
+          }
+        } else if (variance.isInvariant) {
+          if (!isSubtypeOf(t1, t2) || !isSubtypeOf(t2, t1)) {
+            return false;
+          }
+        } else {
+          if (!isSubtypeOf(t1, t2)) {
+            return false;
+          }
         }
       }
       return true;
@@ -1212,10 +1244,10 @@
         return type;
       }
 
-      return new FunctionTypeImpl.synthetic(
-        newReturnType,
-        type.typeFormals,
-        newParameters,
+      return new FunctionTypeImpl(
+        typeFormals: type.typeFormals,
+        parameters: newParameters,
+        returnType: newReturnType,
         nullabilitySuffix: (type as TypeImpl).nullabilitySuffix,
       );
     }
@@ -1355,10 +1387,10 @@
 
     // Since we're trying to infer the instantiation, we want to ignore type
     // formals as we check the parameters and return type.
-    var inferFnType = FunctionTypeImpl.synthetic(
-      fnType.returnType,
-      const [],
-      fnType.parameters,
+    var inferFnType = FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: fnType.parameters,
+      returnType: fnType.returnType,
       nullabilitySuffix: (fnType as TypeImpl).nullabilitySuffix,
     );
     tryMatchSubtypeOf(inferFnType, contextType, origin, covariant: true);
@@ -2099,13 +2131,17 @@
   /// causing pain in real code.  The current algorithm is:
   /// 1. If either of the types is a supertype of the other, return it.
   ///    This is in fact the best result in this case.
-  /// 2. If the two types have the same class element, then take the
-  ///    pointwise least upper bound of the type arguments.  This is again
-  ///    the best result, except that the recursive calls may not return
-  ///    the true least upper bounds.  The result is guaranteed to be a
-  ///    well-formed type under the assumption that the input types were
-  ///    well-formed (and assuming that the recursive calls return
-  ///    well-formed types).
+  /// 2. If the two types have the same class element and are implicitly or
+  ///    explicitly covariant, then take the pointwise least upper bound of
+  ///    the type arguments. This is again the best result, except that the
+  ///    recursive calls may not return the true least upper bounds. The
+  ///    result is guaranteed to be a well-formed type under the assumption
+  ///    that the input types were well-formed (and assuming that the
+  ///    recursive calls return well-formed types).
+  ///    If the variance of the type parameter is contravariant, we take the
+  ///    greatest lower bound of the type arguments. If the variance of the
+  ///    type parameter is invariant, we verify if the type arguments satisfy
+  ///    subtyping in both directions, then choose a bound.
   /// 3. Otherwise return the spec-defined least upper bound.  This will
   ///    be an upper bound, might (or might not) be least, and might
   ///    (or might not) be a well-formed type.
@@ -2131,11 +2167,42 @@
     if (type1.element == type2.element) {
       var args1 = type1.typeArguments;
       var args2 = type2.typeArguments;
-
+      var params = type1.element.typeParameters;
       assert(args1.length == args2.length);
+      assert(args1.length == params.length);
+
       var args = List<DartType>(args1.length);
       for (int i = 0; i < args1.length; i++) {
-        args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+        // TODO (kallentu) : Clean up TypeParameterElementImpl checks and
+        // casting once variance is added to the interface.
+        TypeParameterElement parameter = params[i];
+        Variance parameterVariance = Variance.covariant;
+        if (parameter is TypeParameterElementImpl) {
+          parameterVariance = parameter.variance;
+        }
+
+        if (parameterVariance.isContravariant) {
+          if (typeSystem is Dart2TypeSystem) {
+            args[i] = (typeSystem as Dart2TypeSystem)
+                .getGreatestLowerBound(args1[i], args2[i]);
+          } else {
+            args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+          }
+        } else if (parameterVariance.isInvariant) {
+          if (!typeSystem.isSubtypeOf(args1[i], args2[i]) ||
+              !typeSystem.isSubtypeOf(args2[i], args1[i])) {
+            // No bound will be valid, find bound at the interface level.
+            return _computeLeastUpperBound(
+              InstantiatedClass.of(type1),
+              InstantiatedClass.of(type2),
+            ).withNullability(nullability);
+          }
+          // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
+          //  parameters.
+          args[i] = args1[i];
+        } else {
+          args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+        }
       }
 
       return new InterfaceTypeImpl.explicit(
@@ -2671,7 +2738,7 @@
   /// Returns a non-nullable version of [type].  This is equivalent to the
   /// operation `NonNull` defined in the spec.
   DartType promoteToNonNull(covariant TypeImpl type) {
-    if (type.isDartCoreNull) return BottomTypeImpl.instance;
+    if (type.isDartCoreNull) return NeverTypeImpl.instance;
 
     if (type is TypeParameterTypeImpl) {
       var element = type.element;
@@ -2902,10 +2969,10 @@
     // Calculate the LUB of the return type.
     DartType returnType = getLeastUpperBound(f.returnType, g.returnType);
 
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeFormals,
-      parameters,
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: (f as TypeImpl).nullabilitySuffix,
     );
   }
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 6268493..35114ca 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -253,9 +253,7 @@
 
 /// Prints logging information comments to the [outSink] and error messages to
 /// [errorSink].
-class StdInstrumentation extends InstrumentationService {
-  StdInstrumentation() : super(null);
-
+class StdInstrumentation extends NoopInstrumentationService {
   @override
   void logError(String message, [exception]) {
     errorSink.writeln(message);
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 0c48fea..6e51f55 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/dart/constant/potentially_constant.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions;
@@ -290,11 +289,8 @@
     }
 
     // Ensure that dependencies (e.g. default parameter values) are computed.
-    var implElement = element;
-    if (element is ConstructorMember) {
-      implElement = element.baseElement;
-    }
-    (implElement as ConstructorElementImpl).computeConstantDependencies();
+    ConstructorElementImpl implElement = element.declaration;
+    implElement.computeConstantDependencies();
 
     //
     // Verify that the evaluation of the constructor would not produce an
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index d907895..f702e50 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -3783,9 +3783,9 @@
   String _variantField_30;
   LinkedNodeBuilder _variantField_14;
   idl.LinkedNodeKind _kind;
+  bool _variantField_31;
   List<String> _variantField_34;
   String _name;
-  bool _variantField_31;
   idl.UnlinkedTokenType _variantField_35;
   TopLevelInferenceErrorBuilder _variantField_32;
   LinkedNodeTypeBuilder _variantField_23;
@@ -6695,6 +6695,37 @@
   }
 
   @override
+  bool get methodDeclaration_hasOperatorEqualWithParameterTypeFromObject {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_31 ??= false;
+  }
+
+  @override
+  bool get simplyBoundable_isSimplyBounded {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_31 ??= false;
+  }
+
+  set methodDeclaration_hasOperatorEqualWithParameterTypeFromObject(
+      bool value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_31 = value;
+  }
+
+  set simplyBoundable_isSimplyBounded(bool value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_31 = value;
+  }
+
+  @override
   List<String> get mixinDeclaration_superInvokedNames {
     assert(kind == idl.LinkedNodeKind.mixinDeclaration);
     return _variantField_34 ??= <String>[];
@@ -6728,25 +6759,6 @@
   }
 
   @override
-  bool get simplyBoundable_isSimplyBounded {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.mixinDeclaration);
-    return _variantField_31 ??= false;
-  }
-
-  set simplyBoundable_isSimplyBounded(bool value) {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.mixinDeclaration);
-    _variantField_31 = value;
-  }
-
-  @override
   idl.UnlinkedTokenType get spreadElement_spreadOperator {
     assert(kind == idl.LinkedNodeKind.spreadElement);
     return _variantField_35 ??= idl.UnlinkedTokenType.NOTHING;
@@ -7545,6 +7557,7 @@
     LinkedNodeBuilder methodDeclaration_returnType,
     LinkedNodeBuilder methodDeclaration_typeParameters,
     int informativeId,
+    bool methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
   })  : _kind = idl.LinkedNodeKind.methodDeclaration,
         _variantField_24 = actualReturnType,
         _variantField_4 = annotatedNode_metadata,
@@ -7552,7 +7565,9 @@
         _variantField_7 = methodDeclaration_formalParameters,
         _variantField_8 = methodDeclaration_returnType,
         _variantField_9 = methodDeclaration_typeParameters,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_31 =
+            methodDeclaration_hasOperatorEqualWithParameterTypeFromObject;
 
   LinkedNodeBuilder.methodInvocation({
     LinkedNodeTypeBuilder invocationExpression_invokeType,
@@ -7576,8 +7591,8 @@
     List<LinkedNodeBuilder> classOrMixinDeclaration_members,
     LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
     int informativeId,
-    List<String> mixinDeclaration_superInvokedNames,
     bool simplyBoundable_isSimplyBounded,
+    List<String> mixinDeclaration_superInvokedNames,
   })  : _kind = idl.LinkedNodeKind.mixinDeclaration,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = mixinDeclaration_onClause,
@@ -7585,8 +7600,8 @@
         _variantField_5 = classOrMixinDeclaration_members,
         _variantField_13 = classOrMixinDeclaration_typeParameters,
         _variantField_36 = informativeId,
-        _variantField_34 = mixinDeclaration_superInvokedNames,
-        _variantField_31 = simplyBoundable_isSimplyBounded;
+        _variantField_31 = simplyBoundable_isSimplyBounded,
+        _variantField_34 = mixinDeclaration_superInvokedNames;
 
   LinkedNodeBuilder.namedExpression({
     LinkedNodeBuilder namedExpression_expression,
@@ -9412,6 +9427,9 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.actualReturnType != null);
       this.actualReturnType?.collectApiSignature(signature);
+      signature.addBool(
+          this.methodDeclaration_hasOperatorEqualWithParameterTypeFromObject ==
+              true);
       signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.methodInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
@@ -10200,15 +10218,15 @@
     if (_kind != null && _kind != idl.LinkedNodeKind.adjacentStrings) {
       fbBuilder.addUint8(0, _kind.index);
     }
+    if (_variantField_31 == true) {
+      fbBuilder.addBool(31, true);
+    }
     if (offset_variantField_34 != null) {
       fbBuilder.addOffset(34, offset_variantField_34);
     }
     if (offset_name != null) {
       fbBuilder.addOffset(37, offset_name);
     }
-    if (_variantField_31 == true) {
-      fbBuilder.addBool(31, true);
-    }
     if (_variantField_35 != null &&
         _variantField_35 != idl.UnlinkedTokenType.NOTHING) {
       fbBuilder.addUint8(35, _variantField_35.index);
@@ -10279,9 +10297,9 @@
   String _variantField_30;
   idl.LinkedNode _variantField_14;
   idl.LinkedNodeKind _kind;
+  bool _variantField_31;
   List<String> _variantField_34;
   String _name;
-  bool _variantField_31;
   idl.UnlinkedTokenType _variantField_35;
   idl.TopLevelInferenceError _variantField_32;
   idl.LinkedNodeType _variantField_23;
@@ -12378,6 +12396,26 @@
   }
 
   @override
+  bool get methodDeclaration_hasOperatorEqualWithParameterTypeFromObject {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_31 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 31, false);
+    return _variantField_31;
+  }
+
+  @override
+  bool get simplyBoundable_isSimplyBounded {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_31 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 31, false);
+    return _variantField_31;
+  }
+
+  @override
   List<String> get mixinDeclaration_superInvokedNames {
     assert(kind == idl.LinkedNodeKind.mixinDeclaration);
     _variantField_34 ??= const fb.ListReader<String>(const fb.StringReader())
@@ -12402,18 +12440,6 @@
   }
 
   @override
-  bool get simplyBoundable_isSimplyBounded {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.mixinDeclaration);
-    _variantField_31 ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 31, false);
-    return _variantField_31;
-  }
-
-  @override
   idl.UnlinkedTokenType get spreadElement_spreadOperator {
     assert(kind == idl.LinkedNodeKind.spreadElement);
     _variantField_35 ??= const _UnlinkedTokenTypeReader()
@@ -13271,6 +13297,10 @@
         _result["methodDeclaration_typeParameters"] =
             methodDeclaration_typeParameters.toJson();
       if (informativeId != 0) _result["informativeId"] = informativeId;
+      if (methodDeclaration_hasOperatorEqualWithParameterTypeFromObject !=
+          false)
+        _result["methodDeclaration_hasOperatorEqualWithParameterTypeFromObject"] =
+            methodDeclaration_hasOperatorEqualWithParameterTypeFromObject;
     }
     if (kind == idl.LinkedNodeKind.methodInvocation) {
       if (invocationExpression_invokeType != null)
@@ -13309,12 +13339,12 @@
         _result["classOrMixinDeclaration_typeParameters"] =
             classOrMixinDeclaration_typeParameters.toJson();
       if (informativeId != 0) _result["informativeId"] = informativeId;
-      if (mixinDeclaration_superInvokedNames.isNotEmpty)
-        _result["mixinDeclaration_superInvokedNames"] =
-            mixinDeclaration_superInvokedNames;
       if (simplyBoundable_isSimplyBounded != false)
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
+      if (mixinDeclaration_superInvokedNames.isNotEmpty)
+        _result["mixinDeclaration_superInvokedNames"] =
+            mixinDeclaration_superInvokedNames;
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
       if (namedExpression_expression != null)
@@ -13834,8 +13864,8 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
+        "name": name,
         "unused11": unused11,
       };
     }
@@ -13849,8 +13879,8 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.comment) {
@@ -14253,8 +14283,8 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
@@ -14298,8 +14328,8 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
@@ -14482,6 +14512,8 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
+        "methodDeclaration_hasOperatorEqualWithParameterTypeFromObject":
+            methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
         "name": name,
       };
     }
@@ -14511,10 +14543,10 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "mixinDeclaration_superInvokedNames":
             mixinDeclaration_superInvokedNames,
         "name": name,
-        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
       };
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 9f3bf60..f65b42b 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -1103,12 +1103,12 @@
 
   kind:LinkedNodeKind (id: 0);
 
+  variantField_31:bool (id: 31);
+
   variantField_34:[string] (id: 34);
 
   name:string (id: 37);
 
-  variantField_31:bool (id: 31);
-
   variantField_35:UnlinkedTokenType (id: 35);
 
   variantField_32:TopLevelInferenceError (id: 32);
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index be60016..d6a9a31 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -1202,6 +1202,9 @@
   @VariantId(7, variant: LinkedNodeKind.methodDeclaration)
   LinkedNode get methodDeclaration_formalParameters;
 
+  @VariantId(31, variant: LinkedNodeKind.methodDeclaration)
+  bool get methodDeclaration_hasOperatorEqualWithParameterTypeFromObject;
+
   @VariantId(8, variant: LinkedNodeKind.methodDeclaration)
   LinkedNode get methodDeclaration_returnType;
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
index 42ffe5c..b866a53 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -407,7 +407,7 @@
   }
 
   static bool hasQuestion(int flags) {
-    return (flags & _isStringInterpolationIdentifier) != 0;
+    return (flags & _hasQuestion) != 0;
   }
 
   static bool hasSeparatorColon(int flags) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 232ab13..5677f4b9 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -1168,6 +1168,10 @@
       body,
     );
     LazyMethodDeclaration.setData(node, data);
+    LazyAst.setOperatorEqualParameterTypeFromObject(
+      node,
+      data.methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
+    );
     return node;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 6bca136..a1cb51c 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -945,6 +945,8 @@
       methodDeclaration_returnType: node.returnType?.accept(this),
       methodDeclaration_typeParameters: node.typeParameters?.accept(this),
       methodDeclaration_formalParameters: node.parameters?.accept(this),
+      methodDeclaration_hasOperatorEqualWithParameterTypeFromObject:
+          LazyAst.hasOperatorEqualParameterTypeFromObject(node),
     );
     builder.name = node.name.name;
     builder.flags = AstBinaryFlags.encode(
@@ -1463,12 +1465,12 @@
   }
 
   _ElementComponents _componentsOfElement(Element element) {
-    while (element is ParameterMember) {
-      element = (element as ParameterMember).baseElement;
+    if (element is ParameterMember) {
+      element = element.declaration;
     }
 
     if (element is Member) {
-      var elementIndex = _indexOfElement(element.baseElement);
+      var elementIndex = _indexOfElement(element.declaration);
       var substitution = element.substitution.map;
       var substitutionBuilder = LinkedNodeTypeSubstitutionBuilder(
         typeParameters: substitution.keys.map(_indexOfElement).toList(),
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index d170f4a..b1119fa 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -73,10 +73,10 @@
     }
 
     var builtReturnType = _buildType(returnType);
-    _type = FunctionTypeImpl.synthetic(
-      builtReturnType,
-      typeFormals,
-      parameters,
+    _type = FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: builtReturnType,
       nullabilitySuffix: nullabilitySuffix,
     );
 
diff --git a/pkg/analyzer/lib/src/summary2/lazy_ast.dart b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
index 179133d..2ab0887 100644
--- a/pkg/analyzer/lib/src/summary2/lazy_ast.dart
+++ b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
@@ -19,6 +19,8 @@
   static const _hasOverrideInferenceKey = 'lazyAst_hasOverrideInference';
   static const _inheritsCovariantKey = 'lazyAst_isCovariant';
   static const _isSimplyBoundedKey = 'lazyAst_simplyBounded';
+  static const _isOperatorEqualParameterTypeFromObjectKey =
+      'lazyAst_isOperatorEqualParameterTypeFromObject';
   static const _rawFunctionTypeKey = 'lazyAst_rawFunctionType';
   static const _returnTypeKey = 'lazyAst_returnType';
   static const _typeInferenceErrorKey = 'lazyAst_typeInferenceError';
@@ -56,6 +58,11 @@
     return node.getProperty(_typeInferenceErrorKey);
   }
 
+  static bool hasOperatorEqualParameterTypeFromObject(AstNode node) {
+    return node.getProperty(_isOperatorEqualParameterTypeFromObjectKey) ??
+        false;
+  }
+
   static bool hasOverrideInferenceDone(AstNode node) {
     return node.getProperty(_hasOverrideInferenceKey) ?? false;
   }
@@ -76,6 +83,10 @@
     node.setProperty(_inheritsCovariantKey, value);
   }
 
+  static void setOperatorEqualParameterTypeFromObject(AstNode node, bool b) {
+    node.setProperty(_isOperatorEqualParameterTypeFromObjectKey, b);
+  }
+
   static void setOverrideInferenceDone(AstNode node) {
     node.setProperty(_hasOverrideInferenceKey, true);
   }
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 47b48b1..8a60db6 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -731,6 +731,10 @@
     return LazyVariableDeclaration.hasInitializer(node);
   }
 
+  bool hasOperatorEqualParameterTypeFromObject(MethodDeclaration node) {
+    return LazyAst.hasOperatorEqualParameterTypeFromObject(node);
+  }
+
   bool hasOverrideInferenceDone(AstNode node) {
     // Only nodes in the libraries being linked might be not inferred yet.
     if (_astReader.isLazy) return true;
@@ -743,6 +747,8 @@
       return node.abstractKeyword != null;
     } else if (node is ClassTypeAlias) {
       return node.abstractKeyword != null;
+    } else if (node is ConstructorDeclaration) {
+      return false;
     } else if (node is FunctionDeclaration) {
       return false;
     } else if (node is MethodDeclaration) {
@@ -902,7 +908,7 @@
     var kind = linkedType.kind;
     if (kind == LinkedNodeTypeKind.bottom) {
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
-      return BottomTypeImpl.instance.withNullability(nullabilitySuffix);
+      return NeverTypeImpl.instance.withNullability(nullabilitySuffix);
     } else if (kind == LinkedNodeTypeKind.dynamic_) {
       return DynamicTypeImpl.instance;
     } else if (kind == LinkedNodeTypeKind.function) {
@@ -947,13 +953,13 @@
 
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
 
-      return FunctionTypeImpl.synthetic(
-        returnType,
-        typeParameters,
-        formalParameters,
+      return FunctionTypeImpl(
+        typeFormals: typeParameters,
+        parameters: formalParameters,
+        returnType: returnType,
+        nullabilitySuffix: nullabilitySuffix,
         element: typedefElement,
         typeArguments: typedefTypeArguments,
-        nullabilitySuffix: nullabilitySuffix,
       );
     } else if (kind == LinkedNodeTypeKind.interface) {
       var element = bundleContext.elementOfIndex(linkedType.interfaceClass);
@@ -997,6 +1003,10 @@
     }
   }
 
+  void setOperatorEqualParameterTypeFromObject(AstNode node, bool value) {
+    LazyAst.setOperatorEqualParameterTypeFromObject(node, value);
+  }
+
   void setOverrideInferenceDone(AstNode node) {
     // TODO(scheglov) This assert fails, check how to avoid this.
 //    assert(!_astReader.isLazy);
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index b44a12a..39b6ef7 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -78,19 +78,19 @@
         var arguments = _buildArguments(parameters);
         var substitution = Substitution.fromPairs(parameters, arguments);
         var instantiated = substitution.substituteType(rawType) as FunctionType;
-        _type = FunctionTypeImpl.synthetic(
-          instantiated.returnType,
-          instantiated.typeFormals,
-          instantiated.parameters,
+        _type = FunctionTypeImpl(
+          typeFormals: instantiated.typeFormals,
+          parameters: instantiated.parameters,
+          returnType: instantiated.returnType,
+          nullabilitySuffix: nullabilitySuffix,
           element: element,
           typeArguments: arguments,
-          nullabilitySuffix: nullabilitySuffix,
         );
       } else {
         _type = _dynamicType;
       }
     } else if (element is NeverElementImpl) {
-      _type = BottomTypeImpl.instance.withNullability(nullabilitySuffix);
+      _type = NeverTypeImpl.instance.withNullability(nullabilitySuffix);
     } else if (element is TypeParameterElement) {
       _type = TypeParameterTypeImpl(
         element,
@@ -188,10 +188,10 @@
       );
     }).toList();
 
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeParameters,
-      formalParameters,
+    return FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: formalParameters,
+      returnType: returnType,
       nullabilitySuffix: _getNullabilitySuffix(hasQuestion),
     );
   }
@@ -200,10 +200,10 @@
     if (node != null) {
       return _buildType(node?.type);
     } else {
-      return FunctionTypeImpl.synthetic(
-        _dynamicType,
-        const <TypeParameterElement>[],
-        const <ParameterElement>[],
+      return FunctionTypeImpl(
+        typeFormals: const <TypeParameterElement>[],
+        parameters: const <ParameterElement>[],
+        returnType: _dynamicType,
         nullabilitySuffix: NullabilitySuffix.none,
       );
     }
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index d4b7b0c..4914569 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -227,13 +226,9 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    var element = node.staticElement;
+    var element = node.staticElement?.declaration;
     if (element == null) return;
 
-    if (element is ConstructorMember) {
-      element = (element as ConstructorMember).baseElement;
-    }
-
     _set.add(element);
 
     if (element.enclosingElement.typeParameters.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 617c152..0ee7be4 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -55,11 +55,10 @@
     }
     node.functionType.returnType = null;
     node.functionType.parameters.parameters.clear();
-    (node.functionType as GenericFunctionTypeImpl).type =
-        FunctionTypeImpl.synthetic(
-      DynamicTypeImpl.instance,
-      [],
-      [],
+    (node.functionType as GenericFunctionTypeImpl).type = FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: const [],
+      returnType: DynamicTypeImpl.instance,
       nullabilitySuffix: _unitNullability,
     );
   }
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index dfda000..bc7fe97 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -77,10 +77,10 @@
       );
     }).toList();
 
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeParameters,
-      formalParameters,
+    return FunctionTypeImpl(
+      typeFormals: typeParameters,
+      parameters: formalParameters,
+      returnType: returnType,
       nullabilitySuffix: nullabilitySuffix,
     );
   }
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 6b90f74..2f88f6f 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -890,8 +890,7 @@
       // This member will need a check, however, because we are calling through
       // an unsafe target.
       if (element.isPrivate && element.parameters.isNotEmpty) {
-        _covariantPrivateMembers
-            .add(element is ExecutableMember ? element.baseElement : element);
+        _covariantPrivateMembers.add(element.declaration);
       }
 
       // Get the lower bound of the declared return type (e.g. `F<bottom>`) and
@@ -903,16 +902,14 @@
       // parameters are properly substituted.
       var classElement = targetType.element;
 
-      var rawElement =
-          (element is ExecutableMember) ? element.baseElement : element;
+      var rawElement = element.declaration;
       var rawReturnType = rawElement.returnType;
 
       // Check if the return type uses a class type parameter contravariantly.
       bool needsCheck = false;
       for (var typeParameter in classElement.typeParameters) {
-        var variance = computeVariance(typeParameter, rawReturnType);
-        if (variance == Variance.contravariant ||
-            variance == Variance.invariant) {
+        var variance = Variance(typeParameter, rawReturnType);
+        if (variance.isContravariant || variance.isInvariant) {
           needsCheck = true;
           break;
         }
@@ -1692,17 +1689,9 @@
 
   static Set<Element> _createCovariantCheckSet() {
     return new LinkedHashSet(
-        equals: _equalMemberElements, hashCode: _hashCodeMemberElements);
-  }
-
-  /// When finding superclass covariance checks, we need to track the
-  /// substituted member/parameter type, but we don't want this type to break
-  /// equality, because [Member] does not implement equality/hashCode, so
-  /// instead we jump to the declaring element.
-  static bool _equalMemberElements(Element x, Element y) {
-    x = x is Member ? x.baseElement : x;
-    y = y is Member ? y.baseElement : y;
-    return x == y;
+      equals: (a, b) => a.declaration == b.declaration,
+      hashCode: (e) => e.declaration.hashCode,
+    );
   }
 
   /// Find all generic interfaces that are implemented by [element], including
@@ -1766,11 +1755,6 @@
     }
     return members;
   }
-
-  static int _hashCodeMemberElements(Element x) {
-    x = x is Member ? x.baseElement : x;
-    return x.hashCode;
-  }
 }
 
 class _TopLevelInitializerValidator extends RecursiveAstVisitor<void> {
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index cd8c597..63503b2 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -23,6 +23,7 @@
   final InheritanceManager3 inheritance;
   final Set<ClassElement> elementsBeingInferred = new HashSet<ClassElement>();
 
+  bool isNonNullableLibrary;
   InterfaceType interfaceType;
 
   /**
@@ -35,6 +36,7 @@
    * compilation [unit].
    */
   void inferCompilationUnit(CompilationUnitElement unit) {
+    isNonNullableLibrary = unit.library.isNonNullableByDefault;
     _inferClasses(unit.mixins);
     _inferClasses(unit.types);
   }
@@ -325,7 +327,7 @@
    * getter or setter, infer the return type and any parameter type(s) where
    * they were not provided.
    */
-  void _inferExecutable(ExecutableElement element) {
+  void _inferExecutable(MethodElementImpl element) {
     if (element.isSynthetic || element.isStatic) {
       return;
     }
@@ -351,11 +353,8 @@
     // Infer the return type.
     //
     if (element.hasImplicitReturnType && element.displayName != '[]=') {
-      (element as ExecutableElementImpl).returnType =
+      element.returnType =
           _computeReturnType(overriddenTypes.map((t) => t.returnType));
-      if (element is PropertyAccessorElement) {
-        _updateSyntheticVariableType(element);
-      }
     }
     //
     // Infer the parameter types.
@@ -369,12 +368,11 @@
 
         if (parameter.hasImplicitType) {
           parameter.type = _computeParameterType(parameter, i, overriddenTypes);
-          if (element is PropertyAccessorElement) {
-            _updateSyntheticVariableType(element);
-          }
         }
       }
     }
+
+    _resetOperatorEqualParameterTypeToDynamic(element, overriddenElements);
   }
 
   /**
@@ -447,6 +445,56 @@
     }
   }
 
+  /// In legacy mode, an override of `operator==` with no explicit parameter
+  /// type inherits the parameter type of the overridden method if any override
+  /// of `operator==` between the overriding method and `Object.==` has an
+  /// explicit parameter type.  Otherwise, the parameter type of the
+  /// overriding method is `dynamic`.
+  ///
+  /// https://github.com/dart-lang/language/issues/569
+  void _resetOperatorEqualParameterTypeToDynamic(
+    MethodElementImpl element,
+    List<ExecutableElement> overriddenElements,
+  ) {
+    if (element.name != '==') return;
+
+    var parameters = element.parameters;
+    if (parameters.length != 1) {
+      element.isOperatorEqualWithParameterTypeFromObject = false;
+      return;
+    }
+
+    ParameterElementImpl parameter = parameters[0];
+    if (!parameter.hasImplicitType) {
+      element.isOperatorEqualWithParameterTypeFromObject = false;
+      return;
+    }
+
+    for (MethodElement overridden in overriddenElements) {
+      overridden = overridden.declaration;
+
+      // Skip Object itself.
+      var enclosingElement = overridden.enclosingElement;
+      if (enclosingElement is ClassElement &&
+          enclosingElement.isDartCoreObject) {
+        continue;
+      }
+
+      // Keep the type if it is not directly from Object.
+      if (overridden is MethodElementImpl &&
+          !overridden.isOperatorEqualWithParameterTypeFromObject) {
+        element.isOperatorEqualWithParameterTypeFromObject = false;
+        return;
+      }
+    }
+
+    // Reset the type.
+    if (!isNonNullableLibrary) {
+      parameter.type = typeProvider.dynamicType;
+    }
+    element.isOperatorEqualWithParameterTypeFromObject = true;
+  }
+
   /**
    * Return the [FunctionType] of the [overriddenElement] that [element]
    * overrides. Return `null`, in case of type parameters inconsistency.
@@ -493,33 +541,6 @@
     }
     return overriddenTypes;
   }
-
-  /**
-   * If the given [element] is a non-synthetic getter or setter, update its
-   * synthetic variable's type to match the getter's return type, or if no
-   * corresponding getter exists, use the setter's parameter type.
-   *
-   * In general, the type of the synthetic variable should not be used, because
-   * getters and setters are independent methods. But this logic matches what
-   * `TypeResolverVisitor.visitMethodDeclaration` would fill in there.
-   */
-  void _updateSyntheticVariableType(PropertyAccessorElement element) {
-    assert(!element.isSynthetic);
-    PropertyAccessorElement getter = element;
-    if (element.isSetter) {
-      // See if we can find any getter.
-      getter = element.correspondingGetter;
-    }
-    DartType newType;
-    if (getter != null) {
-      newType = getter.returnType;
-    } else if (element.isSetter && element.parameters.isNotEmpty) {
-      newType = element.parameters[0].type;
-    }
-    if (newType != null) {
-      (element.variable as VariableElementImpl).type = newType;
-    }
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 5d6413f..2ae5993 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -411,7 +411,7 @@
   int get hashCode => 0;
   Type get runtimeType => null;
 
-  bool operator ==(other) => identical(this, other);
+  bool operator ==(Object other) => identical(this, other);
 
   String toString() => 'a string';
   dynamic noSuchMethod(Invocation invocation) => null;
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index ccc3b5e..e442dec 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -972,10 +972,10 @@
     List<TypeParameterElement> typeFormals = const [],
     List<ParameterElement> parameters = const [],
   }) {
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeFormals,
-      parameters,
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: nullabilitySuffix,
     );
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5e16cc2..816ee39 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -14,10 +14,8 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.29
   glob: ^1.0.3
   html: '>=0.13.4+1 <0.15.0'
-  kernel: 0.3.29
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
index 4e274a6..d5cf46c 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code.dart
@@ -1196,112 +1196,6 @@
     ]);
   }
 
-  test_extendsDisallowedClass_class_bool() async {
-    await assertErrorsInCode('''
-class A extends bool {}
-''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 4),
-    ]);
-  }
-
-  test_extendsDisallowedClass_class_double() async {
-    await assertErrorsInCode('''
-class A extends double {}
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 6),
-    ]);
-  }
-
-  test_extendsDisallowedClass_class_int() async {
-    await assertErrorsInCode('''
-class A extends int {}
-''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 3),
-    ]);
-  }
-
-  test_extendsDisallowedClass_class_Null() async {
-    await assertErrorsInCode('''
-class A extends Null {}
-''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 4),
-    ]);
-  }
-
-  test_extendsDisallowedClass_class_num() async {
-    await assertErrorsInCode('''
-class A extends num {}
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 3),
-    ]);
-  }
-
-  test_extendsDisallowedClass_class_String() async {
-    await assertErrorsInCode('''
-class A extends String {}
-''', [
-      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 6),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_bool() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = bool with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 4),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_double() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = double with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 6),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_int() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = int with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 3),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_Null() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = Null with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 4),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_num() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = num with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 3),
-    ]);
-  }
-
-  test_extendsDisallowedClass_classTypeAlias_String() async {
-    await assertErrorsInCode(r'''
-class M {}
-class C = String with M;
-''', [
-      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 6),
-    ]);
-  }
-
   test_extraPositionalArguments_const() async {
     await assertErrorsInCode(r'''
 class A {
@@ -1732,134 +1626,6 @@
     ]);
   }
 
-  test_implementsDisallowedClass_class_bool() async {
-    await assertErrorsInCode('''
-class A implements bool {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 4),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_double() async {
-    await assertErrorsInCode('''
-class A implements double {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_int() async {
-    await assertErrorsInCode('''
-class A implements int {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_Null() async {
-    await assertErrorsInCode('''
-class A implements Null {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 4),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_num() async {
-    await assertErrorsInCode('''
-class A implements num {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_String() async {
-    await assertErrorsInCode('''
-class A implements String {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
-    ]);
-  }
-
-  test_implementsDisallowedClass_class_String_num() async {
-    await assertErrorsInCode('''
-class A implements String, num {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 27, 3),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_bool() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements bool;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 4),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_double() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements double;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_int() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements int;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 3),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_Null() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements Null;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 4),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_num() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements num;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 3),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_String() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements String;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
-    ]);
-  }
-
-  test_implementsDisallowedClass_classTypeAlias_String_num() async {
-    await assertErrorsInCode(r'''
-class A {}
-class M {}
-class C = A with M implements String, num;
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 60, 3),
-    ]);
-  }
-
   test_implementsNonClass_class() async {
     await assertErrorsInCode(r'''
 int A;
@@ -2951,118 +2717,6 @@
     ]);
   }
 
-  test_mixinOfDisallowedClass_class_bool() async {
-    await assertErrorsInCode('''
-class A extends Object with bool {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_class_double() async {
-    await assertErrorsInCode('''
-class A extends Object with double {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_class_int() async {
-    await assertErrorsInCode('''
-class A extends Object with int {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_class_Null() async {
-    await assertErrorsInCode('''
-class A extends Object with Null {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_class_num() async {
-    await assertErrorsInCode('''
-class A extends Object with num {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_class_String() async {
-    await assertErrorsInCode('''
-class A extends Object with String {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_bool() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with bool;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_double() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with double;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_int() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with int;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_Null() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with Null;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_num() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with num;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_String() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with String;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
-    ]);
-  }
-
-  test_mixinOfDisallowedClass_classTypeAlias_String_num() async {
-    await assertErrorsInCode(r'''
-class A {}
-class C = A with String, num;
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
-      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 36, 3),
-    ]);
-  }
-
   test_mixinOfNonClass() async {
     // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
     // TODO(brianwilkerson) Fix the offset and length.
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index a13cddc..cff157f 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:meta/meta.dart';
@@ -14,6 +15,12 @@
 mixin ElementsTypesMixin {
   DynamicTypeImpl get dynamicType => typeProvider.dynamicType;
 
+  NeverTypeImpl get neverNone => NeverTypeImpl.instance;
+
+  NeverTypeImpl get neverQuestion => NeverTypeImpl.instanceNullable;
+
+  NeverTypeImpl get neverStar => NeverTypeImpl.instanceLegacy;
+
   TypeProvider get typeProvider;
 
   ClassElementImpl class_({
@@ -40,10 +47,10 @@
     @required DartType returnType,
     @required NullabilitySuffix nullabilitySuffix,
   }) {
-    return FunctionTypeImpl.synthetic(
-      returnType,
-      typeFormals,
-      parameters,
+    return FunctionTypeImpl(
+      typeFormals: typeFormals,
+      parameters: parameters,
+      returnType: returnType,
       nullabilitySuffix: nullabilitySuffix,
     );
   }
@@ -161,6 +168,16 @@
     return parameter;
   }
 
+  ParameterElement namedRequiredParameter({
+    @required String name,
+    @required DartType type,
+  }) {
+    var parameter = ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.NAMED_REQUIRED;
+    parameter.type = type;
+    return parameter;
+  }
+
   ParameterElement positionalParameter({String name, @required DartType type}) {
     var parameter = ParameterElementImpl(name ?? '', 0);
     parameter.parameterKind = ParameterKind.POSITIONAL;
@@ -175,9 +192,11 @@
     return parameter;
   }
 
-  TypeParameterElementImpl typeParameter(String name, {DartType bound}) {
+  TypeParameterElementImpl typeParameter(String name,
+      {DartType bound, Variance variance}) {
     var element = TypeParameterElementImpl.synthetic(name);
     element.bound = bound;
+    element.variance = variance;
     return element;
   }
 
@@ -190,4 +209,17 @@
       nullabilitySuffix: nullabilitySuffix,
     );
   }
+
+  TypeParameterTypeImpl typeParameterTypeNone(TypeParameterElement element) {
+    return element.instantiate(nullabilitySuffix: NullabilitySuffix.none);
+  }
+
+  TypeParameterTypeImpl typeParameterTypeQuestion(
+      TypeParameterElement element) {
+    return element.instantiate(nullabilitySuffix: NullabilitySuffix.question);
+  }
+
+  TypeParameterTypeImpl typeParameterTypeStar(TypeParameterElement element) {
+    return element.instantiate(nullabilitySuffix: NullabilitySuffix.star);
+  }
 }
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 761699e..695844b 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -4344,6 +4344,38 @@
         featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
   }
 
+  void test_class_enabled_multiple() {
+    var unit = parseCompilationUnit('class A<in T, inout U, out V, W> { }');
+    expect(unit.declarations, hasLength(1));
+    var classDecl = unit.declarations[0] as ClassDeclaration;
+    expect(classDecl.name.name, 'A');
+
+    expect(classDecl.typeParameters.typeParameters, hasLength(4));
+    expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+    expect(classDecl.typeParameters.typeParameters[1].name.name, 'U');
+    expect(classDecl.typeParameters.typeParameters[2].name.name, 'V');
+    expect(classDecl.typeParameters.typeParameters[3].name.name, 'W');
+
+    var typeParameterImplList = classDecl.typeParameters.typeParameters;
+    expect((typeParameterImplList[0] as TypeParameterImpl).varianceKeyword,
+        isNotNull);
+    expect(
+        (typeParameterImplList[0] as TypeParameterImpl).varianceKeyword.lexeme,
+        "in");
+    expect((typeParameterImplList[1] as TypeParameterImpl).varianceKeyword,
+        isNotNull);
+    expect(
+        (typeParameterImplList[1] as TypeParameterImpl).varianceKeyword.lexeme,
+        "inout");
+    expect((typeParameterImplList[2] as TypeParameterImpl).varianceKeyword,
+        isNotNull);
+    expect(
+        (typeParameterImplList[2] as TypeParameterImpl).varianceKeyword.lexeme,
+        "out");
+    expect((typeParameterImplList[3] as TypeParameterImpl).varianceKeyword,
+        isNull);
+  }
+
   void test_class_disabled_single() {
     parseCompilationUnit('class A<out T> { }',
         errors: [
@@ -4371,6 +4403,11 @@
     expect(classDecl.name.name, 'A');
     expect(classDecl.typeParameters.typeParameters, hasLength(1));
     expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+
+    var typeParameterImpl =
+        classDecl.typeParameters.typeParameters[0] as TypeParameterImpl;
+    expect(typeParameterImpl.varianceKeyword, isNotNull);
+    expect(typeParameterImpl.varianceKeyword.lexeme, "in");
   }
 
   void test_function_disabled() {
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 73583f8..b2c9106 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -358,12 +358,10 @@
 
 /// Instances of the class [TestInstrumentor] implement an instrumentation
 /// service that can be used by tests.
-class TestInstrumentor extends InstrumentationService {
+class TestInstrumentor extends NoopInstrumentationService {
   /// All logged messages.
   List<String> log = [];
 
-  TestInstrumentor() : super(null);
-
   @override
   void logError(String message) {
     log.add("error: $message");
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index ff7a764..ee8f7eb 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -12,21 +12,21 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/token.dart' show KeywordToken;
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart'
     show NonExistingSource, UriKind;
 import 'package:analyzer/src/generated/testing/element_factory.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' show toUri;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'elements_types_mixin.dart';
 import 'test_analysis_context.dart';
 
 main() {
@@ -41,22 +41,14 @@
   });
 }
 
-abstract class AbstractTypeSystemTest {
+abstract class AbstractTypeSystemTest with ElementsTypesMixin {
   TypeProvider typeProvider;
   Dart2TypeSystem typeSystem;
 
-  DartType get bottomType => typeProvider.bottomType;
-
   InterfaceType get doubleType => typeProvider.doubleType;
 
-  DartType get dynamicType => typeProvider.dynamicType;
-
-  InterfaceType get functionType => typeProvider.functionType;
-
   InterfaceType get intType => typeProvider.intType;
 
-  DartType get neverType => typeProvider.neverType;
-
   DartType get nullType => typeProvider.nullType;
 
   InterfaceType get numType => typeProvider.numType;
@@ -73,22 +65,22 @@
 
   DartType futureOrType(DartType T) {
     var futureOrElement = typeProvider.futureOrElement;
-    return _interfaceType(futureOrElement, typeArguments: [T]);
+    return interfaceType(futureOrElement, typeArguments: [T]);
   }
 
   DartType futureType(DartType T) {
     var futureElement = typeProvider.futureElement;
-    return _interfaceType(futureElement, typeArguments: [T]);
+    return interfaceType(futureElement, typeArguments: [T]);
   }
 
   DartType iterableType(DartType T) {
     var iterableElement = typeProvider.iterableElement;
-    return _interfaceType(iterableElement, typeArguments: [T]);
+    return interfaceType(iterableElement, typeArguments: [T]);
   }
 
   DartType listType(DartType T) {
     var listElement = typeProvider.listElement;
-    return _interfaceType(listElement, typeArguments: [T]);
+    return interfaceType(listElement, typeArguments: [T]);
   }
 
   void setUp() {
@@ -97,140 +89,16 @@
     );
     typeProvider = analysisContext.typeProvider;
     typeSystem = analysisContext.typeSystem;
-  }
 
-  ClassElementImpl _class({
-    @required String name,
-    bool isAbstract = false,
-    InterfaceType superType,
-    List<TypeParameterElement> typeParameters = const [],
-    List<InterfaceType> interfaces = const [],
-    List<InterfaceType> mixins = const [],
-    List<MethodElement> methods = const [],
-  }) {
-    var element = ClassElementImpl(name, 0);
-    element.typeParameters = typeParameters;
-    element.supertype = superType ?? objectType;
-    element.interfaces = interfaces;
-    element.mixins = mixins;
-    element.methods = methods;
-    return element;
-  }
-
-  /**
-   * Creates a function type with the given parameter and return types.
-   *
-   * The return type defaults to `void` if omitted.
-   */
-  FunctionType _functionType({
-    List<TypeParameterElement> typeFormals,
-    List<DartType> required,
-    List<DartType> optional,
-    Map<String, DartType> named,
-    DartType returns,
-    NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star,
-  }) {
-    if (optional != null && named != null) {
-      throw ArgumentError(
-        'Cannot have both optional positional and named parameters.',
-      );
-    }
-
-    var parameters = <ParameterElement>[];
-    if (required != null) {
-      for (var i = 0; i < required.length; ++i) {
-        parameters.add(
-          ParameterElementImpl.synthetic(
-            'r$i',
-            required[i],
-            ParameterKind.REQUIRED,
-          ),
-        );
-      }
-    }
-    if (optional != null) {
-      for (var i = 0; i < optional.length; ++i) {
-        parameters.add(
-          ParameterElementImpl.synthetic(
-            'p$i',
-            optional[i],
-            ParameterKind.POSITIONAL,
-          ),
-        );
-      }
-    }
-    if (named != null) {
-      for (var namedEntry in named.entries) {
-        parameters.add(
-          ParameterElementImpl.synthetic(
-            namedEntry.key,
-            namedEntry.value,
-            ParameterKind.NAMED,
-          ),
-        );
-      }
-    }
-
-    return FunctionTypeImpl.synthetic(
-      returns ?? voidType,
-      typeFormals ?? const <TypeParameterElement>[],
-      parameters,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
-  InterfaceType _interfaceType(
-    ClassElement element, {
-    List<DartType> typeArguments = const [],
-    NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star,
-  }) {
-    return InterfaceTypeImpl.explicit(
-      element,
-      typeArguments,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
-  MethodElementImpl _method(
-    String name,
-    DartType returnType, {
-    List<TypeParameterElement> typeFormals = const [],
-    List<ParameterElement> parameters = const [],
-  }) {
-    return MethodElementImpl(name, 0)
-      ..parameters = parameters
-      ..returnType = returnType
-      ..typeParameters = typeFormals;
-  }
-
-  ParameterElement _requiredParameter(String name, DartType type) {
-    var parameter = ParameterElementImpl(name, 0);
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    parameter.type = type;
-    return parameter;
-  }
-
-  TypeParameterElementImpl _typeParameter(String name, {DartType bound}) {
-    var element = TypeParameterElementImpl.synthetic(name);
-    element.bound = bound;
-    return element;
-  }
-
-  TypeParameterTypeImpl _typeParameterType(
-    TypeParameterElement element, {
-    NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star,
-  }) {
-    return TypeParameterTypeImpl(
-      element,
-      nullabilitySuffix: nullabilitySuffix,
-    );
+    typeProvider = typeProvider;
+    typeSystem = typeSystem;
   }
 }
 
 @reflectiveTest
 class AssignabilityTest extends AbstractTypeSystemTest {
   void test_isAssignableTo_bottom_isBottom() {
-    var A = _class(name: 'A');
+    var A = class_(name: 'A');
     List<DartType> interassignable = <DartType>[
       dynamicType,
       objectType,
@@ -238,59 +106,64 @@
       doubleType,
       numType,
       stringType,
-      _interfaceType(A),
-      bottomType,
+      interfaceType(A),
+      neverStar,
     ];
 
-    _checkGroups(bottomType, interassignable: interassignable);
+    _checkGroups(neverStar, interassignable: interassignable);
   }
 
   void test_isAssignableTo_call_method() {
-    var B = _class(
+    var B = class_(
       name: 'B',
       methods: [
-        _method('call', objectType, parameters: [
-          _requiredParameter('_', intType),
+        method('call', objectType, parameters: [
+          requiredParameter(name: '_', type: intType),
         ]),
       ],
     );
 
     _checkIsStrictAssignableTo(
-      _interfaceType(B),
-      _functionType(required: [intType], returns: objectType),
+      interfaceType(B),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: objectType,
+      ),
     );
   }
 
   void test_isAssignableTo_classes() {
-    var classTop = _class(name: 'A');
-    var classLeft = _class(name: 'B', superType: _interfaceType(classTop));
-    var classRight = _class(name: 'C', superType: _interfaceType(classTop));
-    var classBottom = _class(
+    var classTop = class_(name: 'A');
+    var classLeft = class_(name: 'B', superType: interfaceType(classTop));
+    var classRight = class_(name: 'C', superType: interfaceType(classTop));
+    var classBottom = class_(
       name: 'D',
-      superType: _interfaceType(classLeft),
-      interfaces: [_interfaceType(classRight)],
+      superType: interfaceType(classLeft),
+      interfaces: [interfaceType(classRight)],
     );
-    var top = _interfaceType(classTop);
-    var left = _interfaceType(classLeft);
-    var right = _interfaceType(classRight);
-    var bottom = _interfaceType(classBottom);
+    var top = interfaceType(classTop);
+    var left = interfaceType(classLeft);
+    var right = interfaceType(classRight);
+    var bottom = interfaceType(classBottom);
 
     _checkLattice(top, left, right, bottom);
   }
 
   void test_isAssignableTo_double() {
-    var A = _class(name: 'A');
+    var A = class_(name: 'A');
     List<DartType> interassignable = <DartType>[
       dynamicType,
       objectType,
       doubleType,
       numType,
-      bottomType,
+      neverStar,
     ];
     List<DartType> unrelated = <DartType>[
       intType,
       stringType,
-      _interfaceType(A),
+      interfaceType(A),
     ];
 
     _checkGroups(doubleType,
@@ -298,7 +171,7 @@
   }
 
   void test_isAssignableTo_dynamic_isTop() {
-    var A = _class(name: 'A');
+    var A = class_(name: 'A');
     List<DartType> interassignable = <DartType>[
       dynamicType,
       objectType,
@@ -306,49 +179,51 @@
       doubleType,
       numType,
       stringType,
-      _interfaceType(A),
-      bottomType,
+      interfaceType(A),
+      neverStar,
     ];
     _checkGroups(dynamicType, interassignable: interassignable);
   }
 
   void test_isAssignableTo_generics() {
-    var LT = _typeParameter('T');
-    var L = _class(name: 'L', typeParameters: [LT]);
+    var LT = typeParameter('T');
+    var L = class_(name: 'L', typeParameters: [LT]);
 
-    var MT = _typeParameter('T');
-    var M = _class(
+    var MT = typeParameter('T');
+    var M = class_(
       name: 'M',
       typeParameters: [MT],
       interfaces: [
-        _interfaceType(
+        interfaceType(
           L,
-          typeArguments: [_typeParameterType(MT)],
+          typeArguments: [
+            typeParameterTypeStar(MT),
+          ],
         ),
       ],
     );
 
-    var top = _interfaceType(L, typeArguments: [dynamicType]);
-    var left = _interfaceType(M, typeArguments: [dynamicType]);
-    var right = _interfaceType(L, typeArguments: [intType]);
-    var bottom = _interfaceType(M, typeArguments: [intType]);
+    var top = interfaceType(L, typeArguments: [dynamicType]);
+    var left = interfaceType(M, typeArguments: [dynamicType]);
+    var right = interfaceType(L, typeArguments: [intType]);
+    var bottom = interfaceType(M, typeArguments: [intType]);
 
     _checkCrossLattice(top, left, right, bottom);
   }
 
   void test_isAssignableTo_int() {
-    var A = _class(name: 'A');
+    var A = class_(name: 'A');
     List<DartType> interassignable = <DartType>[
       dynamicType,
       objectType,
       intType,
       numType,
-      bottomType,
+      neverStar,
     ];
     List<DartType> unrelated = <DartType>[
       doubleType,
       stringType,
-      _interfaceType(A),
+      interfaceType(A),
     ];
 
     _checkGroups(intType,
@@ -356,35 +231,67 @@
   }
 
   void test_isAssignableTo_named_optional() {
-    var r = _functionType(required: [intType], returns: intType);
-    var o = _functionType(optional: [intType], returns: intType);
-    var n = _functionType(named: {'x': intType}, returns: intType);
+    var r = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: intType,
+    );
+    var o = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+      ],
+      returnType: intType,
+    );
+    var n = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'x', type: intType),
+      ],
+      returnType: intType,
+    );
 
-    var rr = _functionType(
-      required: [intType, intType],
-      returns: intType,
+    var rr = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: intType,
     );
-    var ro = _functionType(
-      required: [intType],
-      optional: [intType],
-      returns: intType,
+    var ro = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: intType,
     );
-    var rn = _functionType(
-      required: [intType],
-      named: {'x': intType},
-      returns: intType,
+    var rn = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        namedParameter(name: 'x', type: intType),
+      ],
+      returnType: intType,
     );
-    var oo = _functionType(
-      optional: [intType, intType],
-      returns: intType,
+    var oo = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: intType,
     );
-    var nn = _functionType(
-      named: {'x': intType, 'y': intType},
-      returns: intType,
+    var nn = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'x', type: intType),
+        namedParameter(name: 'y', type: intType),
+      ],
+      returnType: intType,
     );
-    var nnn = _functionType(
-      named: {'x': intType, 'y': intType, 'z': intType},
-      returns: intType,
+    var nnn = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'x', type: intType),
+        namedParameter(name: 'y', type: intType),
+        namedParameter(name: 'z', type: intType),
+      ],
+      returnType: intType,
     );
 
     _checkGroups(r,
@@ -406,18 +313,18 @@
   }
 
   void test_isAssignableTo_num() {
-    var A = _class(name: 'A');
+    var A = class_(name: 'A');
     List<DartType> interassignable = <DartType>[
       dynamicType,
       objectType,
       numType,
       intType,
       doubleType,
-      bottomType,
+      neverStar,
     ];
     List<DartType> unrelated = <DartType>[
       stringType,
-      _interfaceType(A),
+      interfaceType(A),
     ];
 
     _checkGroups(numType,
@@ -425,17 +332,51 @@
   }
 
   void test_isAssignableTo_simple_function() {
-    var top = _functionType(required: [intType], returns: objectType);
-    var left = _functionType(required: [intType], returns: intType);
-    var right = _functionType(required: [objectType], returns: objectType);
-    var bottom = _functionType(required: [objectType], returns: intType);
+    var top = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: objectType,
+    );
+
+    var left = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: intType,
+    );
+
+    var right = functionTypeStar(
+      parameters: [
+        requiredParameter(type: objectType),
+      ],
+      returnType: objectType,
+    );
+
+    var bottom = functionTypeStar(
+      parameters: [
+        requiredParameter(type: objectType),
+      ],
+      returnType: intType,
+    );
 
     _checkCrossLattice(top, left, right, bottom);
   }
 
   void test_isAssignableTo_void_functions() {
-    var top = _functionType(required: [intType], returns: voidType);
-    var bottom = _functionType(required: [objectType], returns: intType);
+    var top = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
+
+    var bottom = functionTypeStar(
+      parameters: [
+        requiredParameter(type: objectType),
+      ],
+      returnType: intType,
+    );
 
     _checkEquivalent(bottom, top);
   }
@@ -508,45 +449,28 @@
       DartType type1, DartType type2, DartType expectedResult) {
     var glb = typeSystem.getGreatestLowerBound(type1, type2);
     expect(glb, expectedResult);
+
     // Check that the result is a lower bound.
     expect(typeSystem.isSubtypeOf(glb, type1), true);
     expect(typeSystem.isSubtypeOf(glb, type2), true);
-    // Check for symmetry while we're at it.  Unfortunately,
-    // for function types, the current version of equality
-    // does not respect re-ordering of named parameters, so
-    // for function types we just check if they are mutual subtypes.
-    // https://github.com/dart-lang/sdk/issues/26126
-    // TODO(leafp): Fix this.
+
+    // Check for symmetry while we're at it.
     glb = typeSystem.getGreatestLowerBound(type2, type1);
-    if (glb is FunctionTypeImpl) {
-      expect(typeSystem.isSubtypeOf(glb, expectedResult), true);
-      expect(typeSystem.isSubtypeOf(expectedResult, glb), true);
-    } else {
-      expect(glb, expectedResult);
-    }
+    expect(glb, expectedResult);
   }
 
   void _checkLeastUpperBound(
       DartType type1, DartType type2, DartType expectedResult) {
     var lub = typeSystem.getLeastUpperBound(type1, type2);
     expect(lub, expectedResult);
+
     // Check that the result is an upper bound.
     expect(typeSystem.isSubtypeOf(type1, lub), true);
     expect(typeSystem.isSubtypeOf(type2, lub), true);
 
-    // Check for symmetry while we're at it.  Unfortunately,
-    // for function types, the current version of equality
-    // does not respect re-ordering of named parameters, so
-    // for function types we just check if they are mutual subtypes.
-    // https://github.com/dart-lang/sdk/issues/26126
-    // TODO(leafp): Fix this.
+    // Check for symmetry while we're at it.
     lub = typeSystem.getLeastUpperBound(type2, type1);
-    if (lub is FunctionTypeImpl) {
-      expect(typeSystem.isSubtypeOf(lub, expectedResult), true);
-      expect(typeSystem.isSubtypeOf(expectedResult, lub), true);
-    } else {
-      expect(lub, expectedResult);
-    }
+    expect(lub, expectedResult);
   }
 }
 
@@ -556,16 +480,20 @@
 
   void setUp() {
     super.setUp();
-    T = _typeParameterType(
-      _typeParameter('T'),
-      nullabilitySuffix: NullabilitySuffix.star,
+    T = typeParameterTypeStar(
+      typeParameter('T'),
     );
   }
 
   void test_function_coreFunction() {
     _checkOrdinarySubtypeMatch(
-      _functionType(required: [intType], returns: stringType),
-      functionType,
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
+      typeProvider.functionType,
       [T],
       covariant: true,
     );
@@ -573,8 +501,18 @@
 
   void test_function_parameter_types() {
     _checkIsSubtypeMatchOf(
-      _functionType(required: [T], returns: intType),
-      _functionType(required: [stringType], returns: intType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: T),
+        ],
+        returnType: intType,
+      ),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: stringType),
+        ],
+        returnType: intType,
+      ),
       [T],
       ['String <: T'],
       covariant: true,
@@ -583,8 +521,18 @@
 
   void test_function_return_types() {
     _checkIsSubtypeMatchOf(
-      _functionType(required: [intType], returns: T),
-      _functionType(required: [intType], returns: stringType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: T,
+      ),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
       [T],
       ['T <: String'],
       covariant: true,
@@ -635,7 +583,12 @@
     _checkOrdinarySubtypeMatch(nullType, nullType, [T], covariant: false);
     _checkOrdinarySubtypeMatch(
       nullType,
-      _functionType(required: [intType], returns: stringType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
       [T],
       covariant: false,
     );
@@ -651,9 +604,7 @@
     //
     // In other words, List<S> <: List<T> is satisfied provided that
     // S <: T.
-    var S = _typeParameterType(
-      _typeParameter('S'),
-    );
+    var S = typeParameterTypeStar(typeParameter('S'));
     _checkIsSubtypeMatchOf(listType(S), listType(T), [T], ['S <: T'],
         covariant: false);
   }
@@ -666,12 +617,10 @@
     //
     // In other words, S <: List<T> is satisfied provided that
     // bound(S) <: List<T>.
-    var S = _typeParameterType(
-      _typeParameter(
-        'S',
-        bound: listType(stringType),
-      ),
-    );
+    var S = typeParameterTypeStar(typeParameter(
+      'S',
+      bound: listType(stringType),
+    ));
     _checkIsSubtypeMatchOf(S, listType(T), [T], ['String <: T'],
         covariant: false);
   }
@@ -699,9 +648,7 @@
     //
     // In other words, T <: S can be satisfied trivially by the constraint
     // T <: S.
-    var S = _typeParameterType(
-      _typeParameter('S'),
-    );
+    var S = typeParameterTypeStar(typeParameter('S'));
     _checkIsSubtypeMatchOf(T, S, [T], ['T <: S'], covariant: true);
   }
 
@@ -715,9 +662,7 @@
     //
     // In other words, no match can be found for List<T> <: S because regardless
     // of T, we can't guarantee that List<T> <: S for all S.
-    var S = _typeParameterType(
-      _typeParameter('S'),
-    );
+    var S = typeParameterTypeStar(typeParameter('S'));
     _checkIsNotSubtypeMatchOf(listType(T), S, [T], covariant: true);
   }
 
@@ -745,7 +690,12 @@
     _checkOrdinarySubtypeMatch(objectType, dynamicType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(nullType, dynamicType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(
-      _functionType(required: [intType], returns: stringType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
       dynamicType,
       [T],
       covariant: true,
@@ -765,7 +715,12 @@
     _checkOrdinarySubtypeMatch(objectType, objectType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(nullType, objectType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(
-      _functionType(required: [intType], returns: stringType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
       objectType,
       [T],
       covariant: true,
@@ -784,7 +739,12 @@
     _checkOrdinarySubtypeMatch(objectType, voidType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(nullType, voidType, [T], covariant: true);
     _checkOrdinarySubtypeMatch(
-      _functionType(required: [intType], returns: stringType),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intType),
+        ],
+        returnType: stringType,
+      ),
       voidType,
       [T],
       covariant: true,
@@ -911,13 +871,17 @@
 class GenericFunctionInferenceTest extends AbstractTypeSystemTest {
   void test_boundedByAnotherTypeParameter() {
     // <TFrom, TTo extends Iterable<TFrom>>(TFrom) -> TTo
-    var tFrom = _typeParameter('TFrom');
+    var tFrom = typeParameter('TFrom');
     var tTo =
-        _typeParameter('TTo', bound: iterableType(_typeParameterType(tFrom)));
-    var cast = _functionType(
+        typeParameter('TTo', bound: iterableType(typeParameterTypeStar(tFrom)));
+    var cast = functionTypeStar(
       typeFormals: [tFrom, tTo],
-      required: [_typeParameterType(tFrom)],
-      returns: _typeParameterType(tTo),
+      parameters: [
+        requiredParameter(
+          type: typeParameterTypeStar(tFrom),
+        ),
+      ],
+      returnType: typeParameterTypeStar(tTo),
     );
     expect(
         _inferCall(cast, [stringType]), [stringType, iterableType(stringType)]);
@@ -927,37 +891,42 @@
     // Regression test for https://github.com/dart-lang/sdk/issues/25740.
 
     // class A {}
-    var A = _class(name: 'A', superType: objectType);
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A', superType: objectType);
+    var typeA = interfaceType(A);
 
     // class B extends A {}
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
     // class C<T extends A> {
-    var CT = _typeParameter('T', bound: typeA);
-    var C = _class(
+    var CT = typeParameter('T', bound: typeA);
+    var C = class_(
       name: 'C',
       superType: objectType,
       typeParameters: [CT],
     );
     //   S m<S extends T>(S);
-    var S = _typeParameter('S', bound: _typeParameterType(CT));
-    var m = _method(
+    var S = typeParameter('S', bound: typeParameterTypeStar(CT));
+    var m = method(
       'm',
-      _typeParameterType(S),
+      typeParameterTypeStar(S),
       typeFormals: [S],
-      parameters: [_requiredParameter('_', _typeParameterType(S))],
+      parameters: [
+        requiredParameter(
+          name: '_',
+          type: typeParameterTypeStar(S),
+        ),
+      ],
     );
     C.methods = [m];
     // }
 
     // C<Object> cOfObject;
-    var cOfObject = _interfaceType(C, typeArguments: [objectType]);
+    var cOfObject = interfaceType(C, typeArguments: [objectType]);
     // C<A> cOfA;
-    var cOfA = _interfaceType(C, typeArguments: [typeA]);
+    var cOfA = interfaceType(C, typeArguments: [typeA]);
     // C<B> cOfB;
-    var cOfB = _interfaceType(C, typeArguments: [typeB]);
+    var cOfB = interfaceType(C, typeArguments: [typeB]);
     // B b;
     // cOfB.m(b); // infer <B>
     expect(_inferCall2(cOfB.getMethod('m').type, [typeB]).toString(),
@@ -974,38 +943,43 @@
     // Regression test for https://github.com/dart-lang/sdk/issues/25740.
 
     // class A {}
-    var A = _class(name: 'A', superType: objectType);
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A', superType: objectType);
+    var typeA = interfaceType(A);
 
     // class B extends A {}
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
     // class C<T extends A> {
-    var CT = _typeParameter('T', bound: typeA);
-    var C = _class(
+    var CT = typeParameter('T', bound: typeA);
+    var C = class_(
       name: 'C',
       superType: objectType,
       typeParameters: [CT],
     );
     //   S m<S extends Iterable<T>>(S);
-    var iterableOfT = iterableType(_typeParameterType(CT));
-    var S = _typeParameter('S', bound: iterableOfT);
-    var m = _method(
+    var iterableOfT = iterableType(typeParameterTypeStar(CT));
+    var S = typeParameter('S', bound: iterableOfT);
+    var m = method(
       'm',
-      _typeParameterType(S),
+      typeParameterTypeStar(S),
       typeFormals: [S],
-      parameters: [_requiredParameter('_', _typeParameterType(S))],
+      parameters: [
+        requiredParameter(
+          name: '_',
+          type: typeParameterTypeStar(S),
+        ),
+      ],
     );
     C.methods = [m];
     // }
 
     // C<Object> cOfObject;
-    var cOfObject = _interfaceType(C, typeArguments: [objectType]);
+    var cOfObject = interfaceType(C, typeArguments: [objectType]);
     // C<A> cOfA;
-    var cOfA = _interfaceType(C, typeArguments: [typeA]);
+    var cOfA = interfaceType(C, typeArguments: [typeA]);
     // C<B> cOfB;
-    var cOfB = _interfaceType(C, typeArguments: [typeB]);
+    var cOfB = interfaceType(C, typeArguments: [typeB]);
     // List<B> b;
     var listOfB = listType(typeB);
     // cOfB.m(b); // infer <B>
@@ -1021,32 +995,35 @@
 
   void test_boundedRecursively() {
     // class A<T extends A<T>>
-    var T = _typeParameter('T');
-    var A = _class(
+    var T = typeParameter('T');
+    var A = class_(
       name: 'Cloneable',
       superType: objectType,
       typeParameters: [T],
     );
-    T.bound = _interfaceType(
+    T.bound = interfaceType(
       A,
-      typeArguments: [_typeParameterType(T)],
+      typeArguments: [typeParameterTypeStar(T)],
     );
 
     // class B extends A<B> {}
-    var B = _class(name: 'B', superType: null);
-    B.supertype = _interfaceType(A, typeArguments: [_interfaceType(B)]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: null);
+    B.supertype = interfaceType(A, typeArguments: [interfaceType(B)]);
+    var typeB = interfaceType(B);
 
     // <S extends A<S>>
-    var S = _typeParameter('S');
-    var typeS = _typeParameterType(S);
-    S.bound = _interfaceType(A, typeArguments: [typeS]);
+    var S = typeParameter('S');
+    var typeS = typeParameterTypeStar(S);
+    S.bound = interfaceType(A, typeArguments: [typeS]);
 
     // (S, S) -> S
-    var clone = _functionType(
+    var clone = functionTypeStar(
       typeFormals: [S],
-      required: [typeS, typeS],
-      returns: typeS,
+      parameters: [
+        requiredParameter(type: typeS),
+        requiredParameter(type: typeS),
+      ],
+      returnType: typeS,
     );
     expect(_inferCall(clone, [typeB, typeB]), [typeB]);
 
@@ -1059,46 +1036,65 @@
 
   void test_genericCastFunction() {
     // <TFrom, TTo>(TFrom) -> TTo
-    var tFrom = _typeParameter('TFrom');
-    var tTo = _typeParameter('TTo');
-    var cast = _functionType(
+    var tFrom = typeParameter('TFrom');
+    var tTo = typeParameter('TTo');
+    var cast = functionTypeStar(
       typeFormals: [tFrom, tTo],
-      required: [_typeParameterType(tFrom)],
-      returns: _typeParameterType(tTo),
+      parameters: [
+        requiredParameter(
+          type: typeParameterTypeStar(tFrom),
+        ),
+      ],
+      returnType: typeParameterTypeStar(tTo),
     );
     expect(_inferCall(cast, [intType]), [intType, dynamicType]);
   }
 
   void test_genericCastFunctionWithUpperBound() {
     // <TFrom, TTo extends TFrom>(TFrom) -> TTo
-    var tFrom = _typeParameter('TFrom');
-    var tTo = _typeParameter('TTo', bound: _typeParameterType(tFrom));
-    var cast = _functionType(
+    var tFrom = typeParameter('TFrom');
+    var tTo = typeParameter(
+      'TTo',
+      bound: typeParameterTypeStar(tFrom),
+    );
+    var cast = functionTypeStar(
       typeFormals: [tFrom, tTo],
-      required: [_typeParameterType(tFrom)],
-      returns: _typeParameterType(tTo),
+      parameters: [
+        requiredParameter(
+          type: typeParameterTypeStar(tFrom),
+        ),
+      ],
+      returnType: typeParameterTypeStar(tTo),
     );
     expect(_inferCall(cast, [intType]), [intType, intType]);
   }
 
   void test_parametersToFunctionParam() {
     // <T>(f(T t)) -> T
-    var T = _typeParameter('T');
-    var cast = _functionType(
+    var T = typeParameter('T');
+    var cast = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [_typeParameterType(T)],
-          returns: dynamicType,
-        )
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: typeParameterTypeStar(T),
+              ),
+            ],
+            returnType: dynamicType,
+          ),
+        ),
       ],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(
       _inferCall(cast, [
-        _functionType(
-          required: [numType],
-          returns: dynamicType,
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: numType),
+          ],
+          returnType: dynamicType,
         )
       ]),
       [numType],
@@ -1107,54 +1103,61 @@
 
   void test_parametersUseLeastUpperBound() {
     // <T>(T x, T y) -> T
-    var T = _typeParameter('T');
-    var cast = _functionType(
+    var T = typeParameter('T');
+    var cast = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _typeParameterType(T),
-        _typeParameterType(T),
+      parameters: [
+        requiredParameter(type: typeParameterTypeStar(T)),
+        requiredParameter(type: typeParameterTypeStar(T)),
       ],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(cast, [intType, doubleType]), [numType]);
   }
 
   void test_parameterTypeUsesUpperBound() {
     // <T extends num>(T) -> dynamic
-    var T = _typeParameter('T', bound: numType);
-    var f = _functionType(
+    var T = typeParameter('T', bound: numType);
+    var f = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _typeParameterType(T),
+      parameters: [
+        requiredParameter(type: typeParameterTypeStar(T)),
       ],
-      returns: dynamicType,
+      returnType: dynamicType,
     );
     expect(_inferCall(f, [intType]), [intType]);
   }
 
   void test_returnFunctionWithGenericParameter() {
     // <T>(T -> T) -> (T -> void)
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [
-            _typeParameterType(T),
-          ],
-          returns: _typeParameterType(T),
-        )
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: typeParameterTypeStar(T)),
+            ],
+            returnType: typeParameterTypeStar(T),
+          ),
+        ),
       ],
-      returns: _functionType(
-        required: [
-          _typeParameterType(T),
+      returnType: functionTypeStar(
+        parameters: [
+          requiredParameter(type: typeParameterTypeStar(T)),
         ],
-        returns: voidType,
+        returnType: voidType,
       ),
     );
     expect(
       _inferCall(f, [
-        _functionType(required: [numType], returns: intType)
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: numType),
+          ],
+          returnType: intType,
+        ),
       ]),
       [intType],
     );
@@ -1162,31 +1165,35 @@
 
   void test_returnFunctionWithGenericParameterAndContext() {
     // <T>(T -> T) -> (T -> Null)
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [
-            _typeParameterType(T),
-          ],
-          returns: _typeParameterType(T),
-        )
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: typeParameterTypeStar(T)),
+            ],
+            returnType: typeParameterTypeStar(T),
+          ),
+        ),
       ],
-      returns: _functionType(
-        required: [
-          _typeParameterType(T),
+      returnType: functionTypeStar(
+        parameters: [
+          requiredParameter(type: typeParameterTypeStar(T)),
         ],
-        returns: nullType,
+        returnType: nullType,
       ),
     );
     expect(
       _inferCall(
         f,
         [],
-        returnType: _functionType(
-          required: [numType],
-          returns: intType,
+        returnType: functionTypeStar(
+          parameters: [
+            requiredParameter(type: numType),
+          ],
+          returnType: intType,
         ),
       ),
       [numType],
@@ -1195,29 +1202,33 @@
 
   void test_returnFunctionWithGenericParameterAndReturn() {
     // <T>(T -> T) -> (T -> T)
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [
-            _typeParameterType(T),
-          ],
-          returns: _typeParameterType(T),
-        )
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: typeParameterTypeStar(T)),
+            ],
+            returnType: typeParameterTypeStar(T),
+          ),
+        ),
       ],
-      returns: _functionType(
-        required: [
-          _typeParameterType(T),
+      returnType: functionTypeStar(
+        parameters: [
+          requiredParameter(type: typeParameterTypeStar(T)),
         ],
-        returns: _typeParameterType(T),
+        returnType: typeParameterTypeStar(T),
       ),
     );
     expect(
       _inferCall(f, [
-        _functionType(
-          required: [numType],
-          returns: intType,
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: numType),
+          ],
+          returnType: intType,
         )
       ]),
       [intType],
@@ -1226,26 +1237,30 @@
 
   void test_returnFunctionWithGenericReturn() {
     // <T>(T -> T) -> (() -> T)
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [
-            _typeParameterType(T),
-          ],
-          returns: _typeParameterType(T),
-        )
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: typeParameterTypeStar(T)),
+            ],
+            returnType: typeParameterTypeStar(T),
+          ),
+        ),
       ],
-      returns: _functionType(
-        returns: _typeParameterType(T),
+      returnType: functionTypeStar(
+        returnType: typeParameterTypeStar(T),
       ),
     );
     expect(
       _inferCall(f, [
-        _functionType(
-          required: [numType],
-          returns: intType,
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: numType),
+          ],
+          returnType: intType,
         )
       ]),
       [intType],
@@ -1254,55 +1269,77 @@
 
   void test_returnTypeFromContext() {
     // <T>() -> T
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(f, [], returnType: stringType), [stringType]);
   }
 
   void test_returnTypeWithBoundFromContext() {
     // <T extends num>() -> T
-    var T = _typeParameter('T', bound: numType);
-    var f = _functionType(
+    var T = typeParameter('T', bound: numType);
+    var f = functionTypeStar(
       typeFormals: [T],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(f, [], returnType: doubleType), [doubleType]);
   }
 
   void test_returnTypeWithBoundFromInvalidContext() {
     // <T extends num>() -> T
-    var T = _typeParameter('T', bound: numType);
-    var f = _functionType(
+    var T = typeParameter('T', bound: numType);
+    var f = functionTypeStar(
       typeFormals: [T],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(f, [], returnType: stringType), [nullType]);
   }
 
   void test_unifyParametersToFunctionParam() {
     // <T>(f(T t), g(T t)) -> T
-    var T = _typeParameter('T');
-    var cast = _functionType(
+    var T = typeParameter('T');
+    var cast = functionTypeStar(
       typeFormals: [T],
-      required: [
-        _functionType(
-          required: [_typeParameterType(T)],
-          returns: dynamicType,
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: typeParameterTypeStar(T),
+              ),
+            ],
+            returnType: dynamicType,
+          ),
         ),
-        _functionType(
-          required: [_typeParameterType(T)],
-          returns: dynamicType,
-        )
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: typeParameterTypeStar(T),
+              ),
+            ],
+            returnType: dynamicType,
+          ),
+        ),
       ],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(
       _inferCall(cast, [
-        _functionType(required: [intType], returns: dynamicType),
-        _functionType(required: [doubleType], returns: dynamicType)
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: intType),
+          ],
+          returnType: dynamicType,
+        ),
+        functionTypeStar(
+          parameters: [
+            requiredParameter(type: doubleType),
+          ],
+          returnType: dynamicType,
+        )
       ]),
       [nullType],
     );
@@ -1310,20 +1347,20 @@
 
   void test_unusedReturnTypeIsDynamic() {
     // <T>() -> T
-    var T = _typeParameter('T');
-    var f = _functionType(
+    var T = typeParameter('T');
+    var f = functionTypeStar(
       typeFormals: [T],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(f, []), [dynamicType]);
   }
 
   void test_unusedReturnTypeWithUpperBound() {
     // <T extends num>() -> T
-    var T = _typeParameter('T', bound: numType);
-    var f = _functionType(
+    var T = typeParameter('T', bound: numType);
+    var f = functionTypeStar(
       typeFormals: [T],
-      returns: _typeParameterType(T),
+      returnType: typeParameterTypeStar(T),
     );
     expect(_inferCall(f, []), [numType]);
   }
@@ -1372,17 +1409,18 @@
 @reflectiveTest
 class GreatestLowerBoundTest extends BoundTestBase {
   void test_bottom_function() {
-    _checkGreatestLowerBound(bottomType, _functionType(), bottomType);
+    _checkGreatestLowerBound(
+        neverStar, functionTypeStar(returnType: voidType), neverStar);
   }
 
   void test_bottom_interface() {
-    var A = _class(name: 'A');
-    _checkGreatestLowerBound(bottomType, _interfaceType(A), bottomType);
+    var A = class_(name: 'A');
+    _checkGreatestLowerBound(neverStar, interfaceType(A), neverStar);
   }
 
   void test_bottom_typeParam() {
-    var T = _typeParameter('T');
-    _checkGreatestLowerBound(bottomType, _typeParameterType(T), bottomType);
+    var T = typeParameter('T');
+    _checkGreatestLowerBound(neverStar, typeParameterTypeStar(T), neverStar);
   }
 
   void test_bounds_of_top_types_complete() {
@@ -1447,13 +1485,13 @@
     // class A
     // class B extends A
     // class C extends B
-    var A = _class(name: 'A');
-    var B = _class(name: 'B', superType: _interfaceType(A));
-    var C = _class(name: 'C', superType: _interfaceType(B));
+    var A = class_(name: 'A');
+    var B = class_(name: 'B', superType: interfaceType(A));
+    var C = class_(name: 'C', superType: interfaceType(B));
     _checkGreatestLowerBound(
-      _interfaceType(A),
-      _interfaceType(C),
-      _interfaceType(C),
+      interfaceType(A),
+      interfaceType(C),
+      interfaceType(C),
     );
   }
 
@@ -1461,33 +1499,36 @@
     // class A
     // class B implements A
     // class C implements B
-    var A = _class(name: 'A');
-    var B = _class(name: 'B', interfaces: [_interfaceType(A)]);
-    var C = _class(name: 'C', interfaces: [_interfaceType(B)]);
+    var A = class_(name: 'A');
+    var B = class_(name: 'B', interfaces: [interfaceType(A)]);
+    var C = class_(name: 'C', interfaces: [interfaceType(B)]);
     _checkGreatestLowerBound(
-      _interfaceType(A),
-      _interfaceType(C),
-      _interfaceType(C),
+      interfaceType(A),
+      interfaceType(C),
+      interfaceType(C),
     );
   }
 
   void test_dynamic_bottom() {
-    _checkGreatestLowerBound(dynamicType, bottomType, bottomType);
+    _checkGreatestLowerBound(dynamicType, neverStar, neverStar);
   }
 
   void test_dynamic_function() {
-    _checkGreatestLowerBound(dynamicType, _functionType(), _functionType());
+    _checkGreatestLowerBound(
+        dynamicType,
+        functionTypeStar(returnType: voidType),
+        functionTypeStar(returnType: voidType));
   }
 
   void test_dynamic_interface() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
     _checkGreatestLowerBound(dynamicType, typeA, typeA);
   }
 
   void test_dynamic_typeParam() {
-    var T = _typeParameter('T');
-    var typeT = _typeParameterType(T);
+    var T = typeParameter('T');
+    var typeT = typeParameterTypeStar(T);
     _checkGreatestLowerBound(dynamicType, typeT, typeT);
   }
 
@@ -1497,110 +1538,224 @@
   }
 
   void test_functionsDifferentNamedTakeUnion() {
-    var type1 = _functionType(
-      named: {'a': intType, 'b': intType},
+    var type1 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'b', type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      named: {'b': doubleType, 'c': stringType},
+    var type2 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'b', type: doubleType),
+        namedParameter(name: 'c', type: stringType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      named: {'a': intType, 'b': numType, 'c': stringType},
+    var expected = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'b', type: numType),
+        namedParameter(name: 'c', type: stringType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsDifferentOptionalArityTakeMax() {
-    var type1 = _functionType(
-      optional: [intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      optional: [doubleType, stringType, objectType],
+    var type2 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: doubleType),
+        positionalParameter(type: stringType),
+        positionalParameter(type: objectType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      optional: [numType, stringType, objectType],
+    var expected = functionTypeStar(
+      parameters: [
+        positionalParameter(type: numType),
+        positionalParameter(type: stringType),
+        positionalParameter(type: objectType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsDifferentRequiredArityBecomeOptional() {
-    var type1 = _functionType(
-      required: [intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      required: [intType, intType, intType],
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      required: [intType],
-      optional: [intType, intType],
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsFromDynamic() {
-    var type1 = _functionType(required: [dynamicType]);
-    var type2 = _functionType(required: [intType]);
-    var expected = _functionType(required: [dynamicType]);
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: dynamicType),
+      ],
+      returnType: voidType,
+    );
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: dynamicType),
+      ],
+      returnType: voidType,
+    );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsGlbReturnType() {
-    var type1 = _functionType(returns: intType);
-    var type2 = _functionType(returns: numType);
-    var expected = _functionType(returns: intType);
+    var type1 = functionTypeStar(
+      returnType: intType,
+    );
+    var type2 = functionTypeStar(
+      returnType: numType,
+    );
+    var expected = functionTypeStar(
+      returnType: intType,
+    );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsLubNamedParams() {
-    var type1 = _functionType(
-      named: {'a': stringType, 'b': intType},
+    var type1 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: stringType),
+        namedParameter(name: 'b', type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      named: {'a': intType, 'b': numType},
+    var type2 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'b', type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      named: {'a': objectType, 'b': numType},
+    var expected = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: objectType),
+        namedParameter(name: 'b', type: numType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsLubPositionalParams() {
-    var type1 = _functionType(
-      optional: [stringType, intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: stringType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      optional: [intType, numType],
+    var type2 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+        positionalParameter(type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      optional: [objectType, numType],
+    var expected = functionTypeStar(
+      parameters: [
+        positionalParameter(type: objectType),
+        positionalParameter(type: numType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsLubRequiredParams() {
-    var type1 = _functionType(
-      required: [stringType, intType, intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      required: [intType, doubleType, numType],
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: doubleType),
+        requiredParameter(type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      required: [objectType, numType, numType],
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: objectType),
+        requiredParameter(type: numType),
+        requiredParameter(type: numType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsMixedOptionalAndRequiredBecomeOptional() {
-    var type1 = _functionType(
-      required: [intType, intType],
-      optional: [intType, intType, intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      required: [intType],
-      optional: [intType, intType],
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      required: [intType],
-      optional: [intType, intType, intType, intType],
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
     _checkGreatestLowerBound(type1, type2, expected);
   }
@@ -1608,64 +1763,98 @@
   void test_functionsReturnBottomIfMixOptionalAndNamed() {
     // Dart doesn't allow a function to have both optional and named parameters,
     // so if we would have synthethized that, pick bottom instead.
-    var type1 = _functionType(
-      required: [intType],
-      named: {'a': intType},
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        namedParameter(name: 'a', type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      named: {'a': intType},
+    var type2 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+      ],
+      returnType: voidType,
     );
-    _checkGreatestLowerBound(type1, type2, bottomType);
+    _checkGreatestLowerBound(type1, type2, neverStar);
   }
 
   void test_functionsSameType_withNamed() {
-    var type1 = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
-    var type2 = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
-    var expected = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_functionsSameType_withOptional() {
-    var type1 = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
-    var type2 = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
-    var expected = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
     _checkGreatestLowerBound(type1, type2, expected);
   }
 
   void test_interface_function() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
-    _checkGreatestLowerBound(typeA, _functionType(), bottomType);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
+    _checkGreatestLowerBound(
+      typeA,
+      functionTypeStar(returnType: voidType),
+      neverStar,
+    );
   }
 
   void test_mixin() {
@@ -1673,21 +1862,21 @@
     // class B
     // class C
     // class D extends A with B, C
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B');
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B');
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C');
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C');
+    var typeC = interfaceType(C);
 
-    var D = _class(
+    var D = class_(
       name: 'D',
-      superType: _interfaceType(A),
+      superType: interfaceType(A),
       mixins: [typeB, typeC],
     );
-    var typeD = _interfaceType(D);
+    var typeD = interfaceType(D);
 
     _checkGreatestLowerBound(typeA, typeD, typeD);
     _checkGreatestLowerBound(typeB, typeD, typeD);
@@ -1695,16 +1884,16 @@
   }
 
   void test_self() {
-    var T = _typeParameter('T');
-    var A = _class(name: 'A');
+    var T = typeParameter('T');
+    var A = class_(name: 'A');
 
     List<DartType> types = [
       dynamicType,
       voidType,
-      bottomType,
-      _typeParameterType(T),
-      _interfaceType(A),
-      _functionType(),
+      neverStar,
+      typeParameterTypeStar(T),
+      interfaceType(A),
+      functionTypeStar(returnType: voidType),
     ];
 
     for (DartType type in types) {
@@ -1713,36 +1902,36 @@
   }
 
   void test_typeParam_function_noBound() {
-    var T = _typeParameter('T');
+    var T = typeParameter('T');
     _checkGreatestLowerBound(
-      _typeParameterType(T),
-      _functionType(),
-      bottomType,
+      typeParameterTypeStar(T),
+      functionTypeStar(returnType: voidType),
+      neverStar,
     );
   }
 
   void test_typeParam_interface_bounded() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeB);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeB);
+    var typeC = interfaceType(C);
 
-    var T = _typeParameter('T', bound: typeB);
-    _checkGreatestLowerBound(_typeParameterType(T), typeC, bottomType);
+    var T = typeParameter('T', bound: typeB);
+    _checkGreatestLowerBound(typeParameterTypeStar(T), typeC, neverStar);
   }
 
   void test_typeParam_interface_noBound() {
     // GLB(T, A) = ⊥
-    var T = _typeParameter('T');
-    var A = _class(name: 'A');
+    var T = typeParameter('T');
+    var A = class_(name: 'A');
     _checkGreatestLowerBound(
-      _typeParameterType(T),
-      _interfaceType(A),
-      bottomType,
+      typeParameterTypeStar(T),
+      interfaceType(A),
+      neverStar,
     );
   }
 
@@ -1751,7 +1940,7 @@
     var listOfIntType = listType(intType);
     var listOfDoubleType = listType(doubleType);
     // TODO(rnystrom): Can we do something better here?
-    _checkGreatestLowerBound(listOfIntType, listOfDoubleType, bottomType);
+    _checkGreatestLowerBound(listOfIntType, listOfDoubleType, neverStar);
   }
 
   void test_typeParameters_same() {
@@ -1760,29 +1949,160 @@
     _checkGreatestLowerBound(listOfIntType, listOfIntType, listOfIntType);
   }
 
+  void test_typeParameters_covariant_same() {
+    // class A<out T>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+
+    _checkLeastUpperBound(aNum, aNum, aNum);
+  }
+
+  void test_typeParameters_covariant_different() {
+    // class A<out T>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+    var aInt = interfaceType(A, typeArguments: [intType]);
+
+    _checkLeastUpperBound(aInt, aNum, aNum);
+  }
+
+  void test_typeParameters_contravariant_same() {
+    // class A<in T>
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+
+    _checkLeastUpperBound(aNum, aNum, aNum);
+  }
+
+  void test_typeParameters_contravariant_different() {
+    // class A<in T>
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+    var aInt = interfaceType(A, typeArguments: [intType]);
+
+    _checkLeastUpperBound(aInt, aNum, aInt);
+  }
+
+  void test_typeParameters_invariant_same() {
+    // class A<inout T>
+    var T = typeParameter('T', variance: Variance.invariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+
+    _checkLeastUpperBound(aNum, aNum, aNum);
+  }
+
+  void test_typeParameters_invariant_object() {
+    // class A<inout T>
+    var T = typeParameter('T', variance: Variance.invariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var aNum = interfaceType(A, typeArguments: [numType]);
+    var aInt = interfaceType(A, typeArguments: [intType]);
+
+    _checkLeastUpperBound(aNum, aInt, objectType);
+  }
+
+  void test_typeParameters_multi_basic() {
+    // class Multi<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // Multi<num, num, num>
+    // Multi<int, num, int>
+    var multiNumNumNum =
+        interfaceType(Multi, typeArguments: [numType, numType, numType]);
+    var multiIntNumInt =
+        interfaceType(Multi, typeArguments: [intType, numType, intType]);
+
+    // We expect Multi<num, num, int>
+    var multiNumNumInt =
+        interfaceType(Multi, typeArguments: [numType, numType, intType]);
+
+    _checkLeastUpperBound(multiNumNumNum, multiIntNumInt, multiNumNumInt);
+  }
+
+  void test_typeParameters_multi_objectInterface() {
+    // class Multi<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // Multi<num, String, num>
+    // Multi<int, num, int>
+    var multiNumStringNum =
+        interfaceType(Multi, typeArguments: [numType, stringType, numType]);
+    var multiIntNumInt =
+        interfaceType(Multi, typeArguments: [intType, numType, intType]);
+
+    _checkLeastUpperBound(multiNumStringNum, multiIntNumInt, objectType);
+  }
+
+  void test_typeParameters_multi_objectType() {
+    // class Multi<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // Multi<String, num, num>
+    // Multi<int, num, int>
+    var multiStringNumNum =
+        interfaceType(Multi, typeArguments: [stringType, numType, numType]);
+    var multiIntNumInt =
+        interfaceType(Multi, typeArguments: [intType, numType, intType]);
+
+    // We expect Multi<Object, num, int>
+    var multiObjectNumInt =
+        interfaceType(Multi, typeArguments: [objectType, numType, intType]);
+
+    _checkLeastUpperBound(multiStringNumNum, multiIntNumInt, multiObjectNumInt);
+  }
+
   void test_unrelatedClasses() {
     // class A
     // class B
     // class C
-    var A = _class(name: 'A');
-    var B = _class(name: 'B');
-    _checkGreatestLowerBound(_interfaceType(A), _interfaceType(B), bottomType);
+    var A = class_(name: 'A');
+    var B = class_(name: 'B');
+    _checkGreatestLowerBound(interfaceType(A), interfaceType(B), neverStar);
   }
 
   void test_void() {
-    var A = _class(name: 'A');
-    var T = _typeParameter('T');
+    var A = class_(name: 'A');
+    var T = typeParameter('T');
     List<DartType> types = [
-      bottomType,
-      _functionType(),
-      _interfaceType(A),
-      _typeParameterType(T),
+      neverStar,
+      functionTypeStar(returnType: voidType),
+      interfaceType(A),
+      typeParameterTypeStar(T),
     ];
     for (DartType type in types) {
       _checkGreatestLowerBound(
-        _functionType(returns: voidType),
-        _functionType(returns: type),
-        _functionType(returns: type),
+        functionTypeStar(returnType: voidType),
+        functionTypeStar(returnType: type),
+        functionTypeStar(returnType: type),
       );
     }
   }
@@ -1791,179 +2111,292 @@
 @reflectiveTest
 class LeastUpperBoundFunctionsTest extends BoundTestBase {
   void test_differentRequiredArity() {
-    var type1 = _functionType(required: [intType, intType]);
-    var type2 = _functionType(required: [intType, intType, intType]);
-    _checkLeastUpperBound(type1, type2, functionType);
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
+    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
   }
 
   void test_fuzzyArrows() {
-    var type1 = _functionType(required: [dynamicType]);
-    var type2 = _functionType(required: [intType]);
-    var expected = _functionType(required: [intType]);
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: dynamicType),
+      ],
+      returnType: voidType,
+    );
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
+    );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_glbNamedParams() {
-    var type1 = _functionType(
-      named: {'a': stringType, 'b': intType},
+    var type1 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: stringType),
+        namedParameter(name: 'b', type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      named: {'a': intType, 'b': numType},
+    var type2 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'b', type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      named: {'a': bottomType, 'b': intType},
+    var expected = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: neverStar),
+        namedParameter(name: 'b', type: intType),
+      ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_glbPositionalParams() {
-    var type1 = _functionType(
-      optional: [stringType, intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: stringType),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      optional: [intType, numType],
+    var type2 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+        positionalParameter(type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      optional: [bottomType, intType],
+    var expected = functionTypeStar(
+      parameters: [
+        positionalParameter(type: neverStar),
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_glbRequiredParams() {
-    var type1 = _functionType(
-      required: [stringType, intType, intType],
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      required: [intType, doubleType, numType],
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: intType),
+        requiredParameter(type: doubleType),
+        requiredParameter(type: numType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      required: [bottomType, bottomType, intType],
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: neverStar),
+        requiredParameter(type: neverStar),
+        requiredParameter(type: intType),
+      ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_ignoreExtraNamedParams() {
-    var type1 = _functionType(
-      named: {'a': intType, 'b': intType},
+    var type1 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'b', type: intType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      named: {'a': intType, 'c': intType},
+    var type2 = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+        namedParameter(name: 'c', type: intType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      named: {'a': intType},
+    var expected = functionTypeStar(
+      parameters: [
+        namedParameter(name: 'a', type: intType),
+      ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_ignoreExtraPositionalParams() {
-    var type1 = _functionType(
-      optional: [intType, intType, stringType],
+    var type1 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+        positionalParameter(type: intType),
+        positionalParameter(type: stringType),
+      ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      optional: [intType],
+    var type2 = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      optional: [intType],
+    var expected = functionTypeStar(
+      parameters: [
+        positionalParameter(type: intType),
+      ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_lubReturnType() {
-    var type1 = _functionType(returns: intType);
-    var type2 = _functionType(returns: doubleType);
-    var expected = _functionType(returns: numType);
+    var type1 = functionTypeStar(returnType: intType);
+    var type2 = functionTypeStar(returnType: doubleType);
+    var expected = functionTypeStar(returnType: numType);
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_sameType_withNamed() {
-    var type1 = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
-    var type2 = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
-    var expected = _functionType(
-      required: [stringType, intType, numType],
-      named: {'n': numType},
-      returns: intType,
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        namedParameter(name: 'n', type: numType),
+      ],
+      returnType: intType,
     );
 
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_sameType_withOptional() {
-    var type1 = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
-    var type2 = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
-    var expected = _functionType(
-      required: [stringType, intType, numType],
-      optional: [doubleType],
-      returns: intType,
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(type: stringType),
+        requiredParameter(type: intType),
+        requiredParameter(type: numType),
+        positionalParameter(type: doubleType),
+      ],
+      returnType: intType,
     );
 
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_typeFormals_differentBounds() {
-    var T1 = _typeParameter('T1', bound: intType);
-    var type1 = _functionType(
+    var T1 = typeParameter('T1', bound: intType);
+    var type1 = functionTypeStar(
       typeFormals: [T1],
-      returns: _typeParameterType(T1),
+      returnType: typeParameterTypeStar(T1),
     );
 
-    var T2 = _typeParameter('T2', bound: doubleType);
-    var type2 = _functionType(
+    var T2 = typeParameter('T2', bound: doubleType);
+    var type2 = functionTypeStar(
       typeFormals: [T2],
-      returns: _typeParameterType(T2),
+      returnType: typeParameterTypeStar(T2),
     );
 
-    _checkLeastUpperBound(type1, type2, functionType);
+    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
   }
 
   void test_typeFormals_differentNumber() {
-    var T1 = _typeParameter('T1', bound: numType);
-    var type1 = _functionType(
+    var T1 = typeParameter('T1', bound: numType);
+    var type1 = functionTypeStar(
       typeFormals: [T1],
-      returns: _typeParameterType(T1),
+      returnType: typeParameterTypeStar(T1),
     );
 
-    var type2 = _functionType(returns: intType);
+    var type2 = functionTypeStar(returnType: intType);
 
-    _checkLeastUpperBound(type1, type2, functionType);
+    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
   }
 
   void test_typeFormals_sameBounds() {
-    var T1 = _typeParameter('T1', bound: numType);
-    var type1 = _functionType(
+    var T1 = typeParameter('T1', bound: numType);
+    var type1 = functionTypeStar(
       typeFormals: [T1],
-      returns: _typeParameterType(T1),
+      returnType: typeParameterTypeStar(T1),
     );
 
-    var T2 = _typeParameter('T2', bound: numType);
-    var type2 = _functionType(
+    var T2 = typeParameter('T2', bound: numType);
+    var type2 = functionTypeStar(
       typeFormals: [T2],
-      returns: _typeParameterType(T2),
+      returnType: typeParameterTypeStar(T2),
     );
 
-    var TE = _typeParameter('T', bound: numType);
-    var expected = _functionType(
+    var TE = typeParameter('T', bound: numType);
+    var expected = functionTypeStar(
       typeFormals: [TE],
-      returns: _typeParameterType(TE),
+      returnType: typeParameterTypeStar(TE),
     );
 
     _checkLeastUpperBound(type1, type2, expected);
@@ -1973,19 +2406,20 @@
 @reflectiveTest
 class LeastUpperBoundTest extends BoundTestBase {
   void test_bottom_function() {
-    _checkLeastUpperBound(bottomType, _functionType(), _functionType());
+    _checkLeastUpperBound(neverStar, functionTypeStar(returnType: voidType),
+        functionTypeStar(returnType: voidType));
   }
 
   void test_bottom_interface() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
-    _checkLeastUpperBound(bottomType, typeA, typeA);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
+    _checkLeastUpperBound(neverStar, typeA, typeA);
   }
 
   void test_bottom_typeParam() {
-    var T = _typeParameter('T');
-    var typeT = _typeParameterType(T);
-    _checkLeastUpperBound(bottomType, typeT, typeT);
+    var T = typeParameter('T');
+    var typeT = typeParameterTypeStar(T);
+    _checkLeastUpperBound(neverStar, typeT, typeT);
   }
 
   void test_directInterfaceCase() {
@@ -1993,14 +2427,14 @@
     // class B implements A
     // class C implements B
 
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', interfaces: [typeA]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', interfaces: [typeA]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', interfaces: [typeB]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', interfaces: [typeB]);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeB);
   }
@@ -2010,45 +2444,45 @@
     // class B extends A
     // class C extends B
 
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeB);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeB);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeB);
   }
 
   void test_directSuperclass_nullability() {
-    var aElement = _class(name: 'A');
-    var aQuestion = _interfaceType(
+    var aElement = class_(name: 'A');
+    var aQuestion = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.question,
     );
-    var aStar = _interfaceType(
+    var aStar = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.star,
     );
-    var aNone = _interfaceType(
+    var aNone = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.none,
     );
 
-    var bElementStar = _class(name: 'B', superType: aStar);
-    var bElementNone = _class(name: 'B', superType: aNone);
+    var bElementStar = class_(name: 'B', superType: aStar);
+    var bElementNone = class_(name: 'B', superType: aNone);
 
     InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         bElementStar,
         nullabilitySuffix: nullability,
       );
     }
 
     InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         bElementNone,
         nullabilitySuffix: nullability,
       );
@@ -2093,21 +2527,22 @@
   }
 
   void test_dynamic_bottom() {
-    _checkLeastUpperBound(dynamicType, bottomType, dynamicType);
+    _checkLeastUpperBound(dynamicType, neverStar, dynamicType);
   }
 
   void test_dynamic_function() {
-    _checkLeastUpperBound(dynamicType, _functionType(), dynamicType);
+    _checkLeastUpperBound(
+        dynamicType, functionTypeStar(returnType: voidType), dynamicType);
   }
 
   void test_dynamic_interface() {
-    var A = _class(name: 'A');
-    _checkLeastUpperBound(dynamicType, _interfaceType(A), dynamicType);
+    var A = class_(name: 'A');
+    _checkLeastUpperBound(dynamicType, interfaceType(A), dynamicType);
   }
 
   void test_dynamic_typeParam() {
-    var T = _typeParameter('T');
-    _checkLeastUpperBound(dynamicType, _typeParameterType(T), dynamicType);
+    var T = typeParameter('T');
+    _checkLeastUpperBound(dynamicType, typeParameterTypeStar(T), dynamicType);
   }
 
   void test_dynamic_void() {
@@ -2116,22 +2551,23 @@
   }
 
   void test_interface_function() {
-    var A = _class(name: 'A');
-    _checkLeastUpperBound(_interfaceType(A), _functionType(), objectType);
+    var A = class_(name: 'A');
+    _checkLeastUpperBound(
+        interfaceType(A), functionTypeStar(returnType: voidType), objectType);
   }
 
   void test_interface_sameElement_nullability() {
-    var aElement = _class(name: 'A');
+    var aElement = class_(name: 'A');
 
-    var aQuestion = _interfaceType(
+    var aQuestion = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.question,
     );
-    var aStar = _interfaceType(
+    var aStar = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.star,
     );
-    var aNone = _interfaceType(
+    var aNone = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.none,
     );
@@ -2155,10 +2591,10 @@
   }
 
   void test_mixinAndClass_constraintAndInterface() {
-    var classA = _class(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, []);
 
-    var classB = _class(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
@@ -2169,11 +2605,11 @@
     );
 
     _checkLeastUpperBound(
-      _interfaceType(
+      interfaceType(
         classB,
         nullabilitySuffix: NullabilitySuffix.star,
       ),
-      _interfaceType(
+      interfaceType(
         mixinM,
         nullabilitySuffix: NullabilitySuffix.star,
       ),
@@ -2182,21 +2618,21 @@
   }
 
   void test_mixinAndClass_object() {
-    var classA = _class(name: 'A');
+    var classA = class_(name: 'A');
     var mixinM = ElementFactory.mixinElement(name: 'M');
 
     _checkLeastUpperBound(
-      _interfaceType(classA),
-      _interfaceType(mixinM),
+      interfaceType(classA),
+      interfaceType(mixinM),
       objectType,
     );
   }
 
   void test_mixinAndClass_sharedInterface() {
-    var classA = _class(name: 'A');
+    var classA = class_(name: 'A');
     var instA = InstantiatedClass(classA, []);
 
-    var classB = _class(
+    var classB = class_(
       name: 'B',
       interfaces: [instA.withNullabilitySuffixNone],
     );
@@ -2207,11 +2643,11 @@
     );
 
     _checkLeastUpperBound(
-      _interfaceType(
+      interfaceType(
         classB,
         nullabilitySuffix: NullabilitySuffix.star,
       ),
-      _interfaceType(
+      interfaceType(
         mixinM,
         nullabilitySuffix: NullabilitySuffix.star,
       ),
@@ -2225,73 +2661,168 @@
     // class C extends A
     // class D extends B with M, N, O, P
 
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeA);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeA);
+    var typeC = interfaceType(C);
 
-    var D = _class(
+    var D = class_(
       name: 'D',
       superType: typeB,
       mixins: [
-        _interfaceType(_class(name: 'M')),
-        _interfaceType(_class(name: 'N')),
-        _interfaceType(_class(name: 'O')),
-        _interfaceType(_class(name: 'P')),
+        interfaceType(class_(name: 'M')),
+        interfaceType(class_(name: 'N')),
+        interfaceType(class_(name: 'O')),
+        interfaceType(class_(name: 'P')),
       ],
     );
-    var typeD = _interfaceType(D);
+    var typeD = interfaceType(D);
 
     _checkLeastUpperBound(typeD, typeC, typeA);
   }
 
   void test_nestedFunctionsLubInnerParamTypes() {
-    var type1 = _functionType(
-      required: [
-        _functionType(required: [stringType, intType, intType])
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: stringType),
+              requiredParameter(type: intType),
+              requiredParameter(type: intType),
+            ],
+            returnType: voidType,
+          ),
+        ),
       ],
+      returnType: voidType,
     );
-    var type2 = _functionType(
-      required: [
-        _functionType(required: [intType, doubleType, numType])
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: intType),
+              requiredParameter(type: doubleType),
+              requiredParameter(type: numType),
+            ],
+            returnType: voidType,
+          ),
+        ),
       ],
+      returnType: voidType,
     );
-    var expected = _functionType(
-      required: [
-        _functionType(required: [objectType, numType, numType])
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(type: objectType),
+              requiredParameter(type: numType),
+              requiredParameter(type: numType),
+            ],
+            returnType: voidType,
+          ),
+        ),
       ],
+      returnType: voidType,
     );
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_nestedNestedFunctionsGlbInnermostParamTypes() {
-    var type1 = _functionType(required: [
-      _functionType(required: [
-        _functionType(required: [stringType, intType, intType])
-      ])
-    ]);
-    var type2 = _functionType(required: [
-      _functionType(required: [
-        _functionType(required: [intType, doubleType, numType])
-      ])
-    ]);
-    var expected = _functionType(required: [
-      _functionType(required: [
-        _functionType(required: [bottomType, bottomType, intType])
-      ])
-    ]);
+    var type1 = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: functionTypeStar(
+                  parameters: [
+                    requiredParameter(type: stringType),
+                    requiredParameter(type: intType),
+                    requiredParameter(type: intType)
+                  ],
+                  returnType: voidType,
+                ),
+              ),
+            ],
+            returnType: voidType,
+          ),
+        ),
+      ],
+      returnType: voidType,
+    );
+    expect(
+      type1.toString(withNullability: true),
+      'void Function(void Function(void Function(String*, int*, int*)*)*)*',
+    );
+
+    var type2 = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: functionTypeStar(
+                  parameters: [
+                    requiredParameter(type: intType),
+                    requiredParameter(type: doubleType),
+                    requiredParameter(type: numType)
+                  ],
+                  returnType: voidType,
+                ),
+              ),
+            ],
+            returnType: voidType,
+          ),
+        ),
+      ],
+      returnType: voidType,
+    );
+    expect(
+      type2.toString(withNullability: true),
+      'void Function(void Function(void Function(int*, double*, num*)*)*)*',
+    );
+    var expected = functionTypeStar(
+      parameters: [
+        requiredParameter(
+          type: functionTypeStar(
+            parameters: [
+              requiredParameter(
+                type: functionTypeStar(
+                  parameters: [
+                    requiredParameter(type: neverStar),
+                    requiredParameter(type: neverStar),
+                    requiredParameter(type: intType)
+                  ],
+                  returnType: voidType,
+                ),
+              ),
+            ],
+            returnType: voidType,
+          ),
+        ),
+      ],
+      returnType: voidType,
+    );
+    expect(
+      expected.toString(withNullability: true),
+      'void Function(void Function(void Function(Never*, Never*, int*)*)*)*',
+    );
+
     _checkLeastUpperBound(type1, type2, expected);
   }
 
   void test_object() {
-    var A = _class(name: 'A');
-    var B = _class(name: 'B');
-    var typeA = _interfaceType(A);
-    var typeB = _interfaceType(B);
+    var A = class_(name: 'A');
+    var B = class_(name: 'B');
+    var typeA = interfaceType(A);
+    var typeB = interfaceType(B);
     var typeObject = typeA.element.supertype;
     // assert that object does not have a super type
     expect(typeObject.element.supertype, isNull);
@@ -2302,16 +2833,16 @@
   }
 
   void test_self() {
-    var T = _typeParameter('T');
-    var A = _class(name: 'A');
+    var T = typeParameter('T');
+    var A = class_(name: 'A');
 
     List<DartType> types = [
       dynamicType,
       voidType,
-      bottomType,
-      _typeParameterType(T),
-      _interfaceType(A),
-      _functionType()
+      neverStar,
+      typeParameterTypeStar(T),
+      interfaceType(A),
+      functionTypeStar(returnType: voidType)
     ];
 
     for (DartType type in types) {
@@ -2320,48 +2851,48 @@
   }
 
   void test_sharedSuperclass1() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeA);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeA);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeA);
   }
 
   void test_sharedSuperclass1_nullability() {
-    var aElement = _class(name: 'A');
-    var aQuestion = _interfaceType(
+    var aElement = class_(name: 'A');
+    var aQuestion = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.question,
     );
-    var aStar = _interfaceType(
+    var aStar = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.star,
     );
-    var aNone = _interfaceType(
+    var aNone = interfaceType(
       aElement,
       nullabilitySuffix: NullabilitySuffix.none,
     );
 
-    var bElementNone = _class(name: 'B', superType: aNone);
-    var bElementStar = _class(name: 'B', superType: aStar);
+    var bElementNone = class_(name: 'B', superType: aNone);
+    var bElementStar = class_(name: 'B', superType: aStar);
 
-    var cElementNone = _class(name: 'C', superType: aNone);
-    var cElementStar = _class(name: 'C', superType: aStar);
+    var cElementNone = class_(name: 'C', superType: aNone);
+    var cElementStar = class_(name: 'C', superType: aStar);
 
     InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         bElementNone,
         nullabilitySuffix: nullability,
       );
     }
 
     InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         bElementStar,
         nullabilitySuffix: nullability,
       );
@@ -2376,14 +2907,14 @@
     var bStarNone = bTypeElementStar(NullabilitySuffix.none);
 
     InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         cElementNone,
         nullabilitySuffix: nullability,
       );
     }
 
     InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
-      return _interfaceType(
+      return interfaceType(
         cElementStar,
         nullabilitySuffix: nullability,
       );
@@ -2446,116 +2977,116 @@
   }
 
   void test_sharedSuperclass2() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeA);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeA);
+    var typeC = interfaceType(C);
 
-    var D = _class(name: 'D', superType: typeC);
-    var typeD = _interfaceType(D);
+    var D = class_(name: 'D', superType: typeC);
+    var typeD = interfaceType(D);
 
     _checkLeastUpperBound(typeB, typeD, typeA);
   }
 
   void test_sharedSuperclass3() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeB);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeB);
+    var typeC = interfaceType(C);
 
-    var D = _class(name: 'D', superType: typeB);
-    var typeD = _interfaceType(D);
+    var D = class_(name: 'D', superType: typeB);
+    var typeD = interfaceType(D);
 
     _checkLeastUpperBound(typeC, typeD, typeB);
   }
 
   void test_sharedSuperclass4() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var A2 = _class(name: 'A2');
-    var typeA2 = _interfaceType(A2);
+    var A2 = class_(name: 'A2');
+    var typeA2 = interfaceType(A2);
 
-    var A3 = _class(name: 'A3');
-    var typeA3 = _interfaceType(A3);
+    var A3 = class_(name: 'A3');
+    var typeA3 = interfaceType(A3);
 
-    var B = _class(name: 'B', superType: typeA, interfaces: [typeA2]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA, interfaces: [typeA2]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeA, interfaces: [typeA3]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeA, interfaces: [typeA3]);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeA);
   }
 
   void test_sharedSuperinterface1() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', interfaces: [typeA]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', interfaces: [typeA]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', interfaces: [typeA]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', interfaces: [typeA]);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeA);
   }
 
   void test_sharedSuperinterface2() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', interfaces: [typeA]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', interfaces: [typeA]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', interfaces: [typeA]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', interfaces: [typeA]);
+    var typeC = interfaceType(C);
 
-    var D = _class(name: 'D', interfaces: [typeC]);
-    var typeD = _interfaceType(D);
+    var D = class_(name: 'D', interfaces: [typeC]);
+    var typeD = interfaceType(D);
 
     _checkLeastUpperBound(typeB, typeD, typeA);
   }
 
   void test_sharedSuperinterface3() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', interfaces: [typeA]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', interfaces: [typeA]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', interfaces: [typeB]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', interfaces: [typeB]);
+    var typeC = interfaceType(C);
 
-    var D = _class(name: 'D', interfaces: [typeB]);
-    var typeD = _interfaceType(D);
+    var D = class_(name: 'D', interfaces: [typeB]);
+    var typeD = interfaceType(D);
 
     _checkLeastUpperBound(typeC, typeD, typeB);
   }
 
   void test_sharedSuperinterface4() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var A2 = _class(name: 'A2');
-    var typeA2 = _interfaceType(A2);
+    var A2 = class_(name: 'A2');
+    var typeA2 = interfaceType(A2);
 
-    var A3 = _class(name: 'A3');
-    var typeA3 = _interfaceType(A3);
+    var A3 = class_(name: 'A3');
+    var typeA3 = interfaceType(A3);
 
-    var B = _class(name: 'B', interfaces: [typeA, typeA2]);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', interfaces: [typeA, typeA2]);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', interfaces: [typeA, typeA3]);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', interfaces: [typeA, typeA3]);
+    var typeC = interfaceType(C);
 
     _checkLeastUpperBound(typeB, typeC, typeA);
   }
@@ -2565,72 +3096,81 @@
   }
 
   void test_typeParam_boundedByParam() {
-    var S = _typeParameter('S');
-    var typeS = _typeParameterType(S);
+    var S = typeParameter('S');
+    var typeS = typeParameterTypeStar(S);
 
-    var T = _typeParameter('T', bound: typeS);
-    var typeT = _typeParameterType(T);
+    var T = typeParameter('T', bound: typeS);
+    var typeT = typeParameterTypeStar(T);
 
     _checkLeastUpperBound(typeT, typeS, typeS);
   }
 
   void test_typeParam_class_implements_Function_ignored() {
-    var A = _class(name: 'A', superType: functionType);
-    var T = _typeParameter('T', bound: _interfaceType(A));
-    _checkLeastUpperBound(_typeParameterType(T), _functionType(), objectType);
+    var A = class_(name: 'A', superType: typeProvider.functionType);
+    var T = typeParameter('T', bound: interfaceType(A));
+    _checkLeastUpperBound(typeParameterTypeStar(T),
+        functionTypeStar(returnType: voidType), objectType);
   }
 
   void test_typeParam_fBounded() {
-    var T = _typeParameter('Q');
-    var A = _class(name: 'A', typeParameters: [T]);
+    var T = typeParameter('Q');
+    var A = class_(name: 'A', typeParameters: [T]);
 
-    var S = _typeParameter('S');
-    var typeS = _typeParameterType(S);
-    S.bound = _interfaceType(A, typeArguments: [typeS]);
+    var S = typeParameter('S');
+    var typeS = typeParameterTypeStar(S);
+    S.bound = interfaceType(A, typeArguments: [typeS]);
 
-    var U = _typeParameter('U');
-    var typeU = _typeParameterType(U);
-    U.bound = _interfaceType(A, typeArguments: [typeU]);
+    var U = typeParameter('U');
+    var typeU = typeParameterTypeStar(U);
+    U.bound = interfaceType(A, typeArguments: [typeU]);
 
     _checkLeastUpperBound(
       typeS,
-      _typeParameterType(U),
-      _interfaceType(A, typeArguments: [objectType]),
+      typeParameterTypeStar(U),
+      interfaceType(A, typeArguments: [objectType]),
     );
   }
 
   void test_typeParam_function_bounded() {
-    var T = _typeParameter('T', bound: functionType);
-    _checkLeastUpperBound(_typeParameterType(T), _functionType(), functionType);
+    var T = typeParameter('T', bound: typeProvider.functionType);
+    _checkLeastUpperBound(
+      typeParameterTypeStar(T),
+      functionTypeStar(returnType: voidType),
+      typeProvider.functionType,
+    );
   }
 
   void test_typeParam_function_noBound() {
-    var T = _typeParameter('T');
-    _checkLeastUpperBound(_typeParameterType(T), _functionType(), objectType);
+    var T = typeParameter('T');
+    _checkLeastUpperBound(
+      typeParameterTypeStar(T),
+      functionTypeStar(returnType: voidType),
+      objectType,
+    );
   }
 
   void test_typeParam_interface_bounded() {
-    var A = _class(name: 'A');
-    var typeA = _interfaceType(A);
+    var A = class_(name: 'A');
+    var typeA = interfaceType(A);
 
-    var B = _class(name: 'B', superType: typeA);
-    var typeB = _interfaceType(B);
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceType(B);
 
-    var C = _class(name: 'C', superType: typeA);
-    var typeC = _interfaceType(C);
+    var C = class_(name: 'C', superType: typeA);
+    var typeC = interfaceType(C);
 
-    var T = _typeParameter('T', bound: typeB);
-    var typeT = _typeParameterType(T);
+    var T = typeParameter('T', bound: typeB);
+    var typeT = typeParameterTypeStar(T);
 
     _checkLeastUpperBound(typeT, typeC, typeA);
   }
 
   void test_typeParam_interface_noBound() {
-    var T = _typeParameter('T');
-    var A = _class(name: 'A');
+    var T = typeParameter('T');
+    var A = class_(name: 'A');
     _checkLeastUpperBound(
-      _typeParameterType(T),
-      _interfaceType(A),
+      typeParameterTypeStar(T),
+      interfaceType(A),
       objectType,
     );
   }
@@ -2664,22 +3204,41 @@
   }
 
   void test_void() {
+    var T = typeParameter('T');
+    var A = class_(name: 'A');
     List<DartType> types = [
-      bottomType,
-      _functionType(),
-      _interfaceType(_class(name: 'A')),
-      _typeParameterType(_typeParameter('T')),
+      neverStar,
+      functionTypeStar(returnType: voidType),
+      interfaceType(A),
+      typeParameterTypeStar(T),
     ];
     for (DartType type in types) {
       _checkLeastUpperBound(
-        _functionType(returns: voidType),
-        _functionType(returns: type),
-        _functionType(returns: voidType),
+        functionTypeStar(returnType: voidType),
+        functionTypeStar(returnType: type),
+        functionTypeStar(returnType: voidType),
       );
     }
   }
 }
 
+//class Mix with ElementsTypesMixin {
+//  TypeProvider typeProvider;
+//  Dart2TypeSystem typeSystem;
+//
+//  FeatureSet get testFeatureSet {
+//    return FeatureSet.forTesting();
+//  }
+//
+//  void setUp() {
+//    var analysisContext = TestAnalysisContext(
+//      featureSet: testFeatureSet,
+//    );
+//    typeProvider = analysisContext.typeProvider;
+//    typeSystem = analysisContext.typeSystem;
+//  }
+//}
+
 class SubtypingTestBase extends AbstractTypeSystemTest {
   void _checkEquivalent(DartType type1, DartType type2) {
     _checkIsSubtypeOf(type1, type2);
@@ -2763,21 +3322,21 @@
 @reflectiveTest
 class TypeSystemTest extends AbstractTypeSystemTest {
   InterfaceTypeImpl get functionClassTypeNone {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.functionType.element,
       nullabilitySuffix: NullabilitySuffix.none,
     );
   }
 
   InterfaceTypeImpl get functionClassTypeQuestion {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.functionType.element,
       nullabilitySuffix: NullabilitySuffix.question,
     );
   }
 
   InterfaceTypeImpl get functionClassTypeStar {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.functionType.element,
       nullabilitySuffix: NullabilitySuffix.star,
     );
@@ -2787,23 +3346,20 @@
       .withNullability(NullabilitySuffix.none);
 
   FunctionTypeImpl get nothingToVoidFunctionTypeNone {
-    return _functionType(
-      returns: voidType,
-      nullabilitySuffix: NullabilitySuffix.none,
+    return functionTypeNone(
+      returnType: voidType,
     );
   }
 
   FunctionTypeImpl get nothingToVoidFunctionTypeQuestion {
-    return _functionType(
-      returns: voidType,
-      nullabilitySuffix: NullabilitySuffix.question,
+    return functionTypeQuestion(
+      returnType: voidType,
     );
   }
 
   FunctionTypeImpl get nothingToVoidFunctionTypeStar {
-    return _functionType(
-      returns: voidType,
-      nullabilitySuffix: NullabilitySuffix.star,
+    return functionTypeStar(
+      returnType: voidType,
     );
   }
 
@@ -2823,21 +3379,21 @@
       .withNullability(NullabilitySuffix.star);
 
   InterfaceTypeImpl get stringClassTypeNone {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.stringType.element,
       nullabilitySuffix: NullabilitySuffix.none,
     );
   }
 
   InterfaceTypeImpl get stringClassTypeQuestion {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.stringType.element,
       nullabilitySuffix: NullabilitySuffix.question,
     );
   }
 
   InterfaceTypeImpl get stringClassTypeStar {
-    return _interfaceType(
+    return interfaceType(
       typeProvider.stringType.element,
       nullabilitySuffix: NullabilitySuffix.star,
     );
@@ -2845,7 +3401,7 @@
 
   InterfaceTypeImpl futureOrTypeNone({@required DartType argument}) {
     var element = typeProvider.futureOrElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.none,
@@ -2854,7 +3410,7 @@
 
   InterfaceTypeImpl futureOrTypeQuestion({@required DartType argument}) {
     var element = typeProvider.futureOrElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.question,
@@ -2863,7 +3419,7 @@
 
   InterfaceTypeImpl futureOrTypeStar({@required DartType argument}) {
     var element = typeProvider.futureOrElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.star,
@@ -2872,7 +3428,7 @@
 
   InterfaceTypeImpl listClassTypeNone(DartType argument) {
     var element = typeProvider.listElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.none,
@@ -2881,7 +3437,7 @@
 
   InterfaceTypeImpl listClassTypeQuestion(DartType argument) {
     var element = typeProvider.listElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.question,
@@ -2890,7 +3446,7 @@
 
   InterfaceTypeImpl listClassTypeStar(DartType argument) {
     var element = typeProvider.listElement;
-    return _interfaceType(
+    return interfaceType(
       element,
       typeArguments: <DartType>[argument],
       nullabilitySuffix: NullabilitySuffix.star,
@@ -3019,7 +3575,7 @@
   }
 
   test_isNonNullable_never() {
-    expect(typeSystem.isNonNullable(neverType), true);
+    expect(typeSystem.isNonNullable(neverNone), true);
   }
 
   test_isNonNullable_null() {
@@ -3029,7 +3585,7 @@
   test_isNonNullable_typeParameter_noneBound_none() {
     expect(
       typeSystem.isNonNullable(
-        typeParameterTypeNone(bound: noneType),
+        _typeParameterTypeNone(bound: noneType),
       ),
       true,
     );
@@ -3038,7 +3594,7 @@
   test_isNonNullable_typeParameter_noneBound_question() {
     expect(
       typeSystem.isNonNullable(
-        typeParameterTypeQuestion(bound: noneType),
+        _typeParameterTypeQuestion(bound: noneType),
       ),
       false,
     );
@@ -3047,7 +3603,7 @@
   test_isNonNullable_typeParameter_questionBound_none() {
     expect(
       typeSystem.isNonNullable(
-        typeParameterTypeNone(bound: questionType),
+        _typeParameterTypeNone(bound: questionType),
       ),
       false,
     );
@@ -3056,7 +3612,7 @@
   test_isNonNullable_typeParameter_questionBound_question() {
     expect(
       typeSystem.isNonNullable(
-        typeParameterTypeQuestion(bound: questionType),
+        _typeParameterTypeQuestion(bound: questionType),
       ),
       false,
     );
@@ -3065,7 +3621,7 @@
   test_isNonNullable_typeParameter_starBound_star() {
     expect(
       typeSystem.isNonNullable(
-        typeParameterTypeStar(bound: starType),
+        _typeParameterTypeStar(bound: starType),
       ),
       true,
     );
@@ -3197,11 +3753,11 @@
   }
 
   test_isNullable_Never() {
-    expect(typeSystem.isNullable(neverType), false);
+    expect(typeSystem.isNullable(neverNone), false);
   }
 
   test_isNullable_never() {
-    expect(typeSystem.isNullable(neverType), false);
+    expect(typeSystem.isNullable(neverNone), false);
   }
 
   test_isNullable_null() {
@@ -3211,7 +3767,7 @@
   test_isNullable_typeParameter_noneBound_none() {
     expect(
       typeSystem.isNullable(
-        typeParameterTypeNone(bound: noneType),
+        _typeParameterTypeNone(bound: noneType),
       ),
       false,
     );
@@ -3220,7 +3776,7 @@
   test_isNullable_typeParameter_noneBound_question() {
     expect(
       typeSystem.isNullable(
-        typeParameterTypeQuestion(bound: noneType),
+        _typeParameterTypeQuestion(bound: noneType),
       ),
       true,
     );
@@ -3229,7 +3785,7 @@
   test_isNullable_typeParameter_questionBound_none() {
     expect(
       typeSystem.isNullable(
-        typeParameterTypeNone(bound: questionType),
+        _typeParameterTypeNone(bound: questionType),
       ),
       false,
     );
@@ -3238,7 +3794,7 @@
   test_isNullable_typeParameter_questionBound_question() {
     expect(
       typeSystem.isNullable(
-        typeParameterTypeQuestion(bound: questionType),
+        _typeParameterTypeQuestion(bound: questionType),
       ),
       true,
     );
@@ -3247,7 +3803,7 @@
   test_isNullable_typeParameter_starBound_star() {
     expect(
       typeSystem.isNullable(
-        typeParameterTypeStar(bound: starType),
+        _typeParameterTypeStar(bound: starType),
       ),
       false,
     );
@@ -3289,7 +3845,7 @@
   }
 
   test_isPotentiallyNonNullable_never() {
-    expect(typeSystem.isPotentiallyNonNullable(neverType), true);
+    expect(typeSystem.isPotentiallyNonNullable(neverNone), true);
   }
 
   test_isPotentiallyNonNullable_none() {
@@ -3344,7 +3900,7 @@
   }
 
   test_isPotentiallyNullable_never() {
-    expect(typeSystem.isPotentiallyNullable(neverType), false);
+    expect(typeSystem.isPotentiallyNullable(neverNone), false);
   }
 
   test_isPotentiallyNullable_none() {
@@ -3432,28 +3988,22 @@
   }
 
   test_promoteToNonNull_never() {
-    expect(typeSystem.promoteToNonNull(neverType), neverType);
+    expect(typeSystem.promoteToNonNull(neverNone), neverNone);
   }
 
   test_promoteToNonNull_null() {
-    expect(typeSystem.promoteToNonNull(nullType), neverType);
+    expect(typeSystem.promoteToNonNull(nullType), neverNone);
   }
 
   test_promoteToNonNull_typeParameter_noneBound_none() {
-    var element = _typeParameter('T', bound: noneType);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.none,
-    );
+    var element = typeParameter('T', bound: noneType);
+    var type = typeParameterTypeNone(element);
     expect(typeSystem.promoteToNonNull(type), same(type));
   }
 
   test_promoteToNonNull_typeParameter_noneBound_question() {
-    var element = _typeParameter('T', bound: stringClassTypeNone);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.question,
-    );
+    var element = typeParameter('T', bound: stringClassTypeNone);
+    var type = typeParameterTypeQuestion(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3462,11 +4012,8 @@
   }
 
   test_promoteToNonNull_typeParameter_nullBound_none() {
-    var element = _typeParameter('T', bound: null);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.none,
-    );
+    var element = typeParameter('T', bound: null);
+    var type = typeParameterTypeNone(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3476,11 +4023,8 @@
   }
 
   test_promoteToNonNull_typeParameter_questionBound_none() {
-    var element = _typeParameter('T', bound: stringClassTypeQuestion);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.none,
-    );
+    var element = typeParameter('T', bound: stringClassTypeQuestion);
+    var type = typeParameterTypeNone(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3490,11 +4034,8 @@
   }
 
   test_promoteToNonNull_typeParameter_questionBound_question() {
-    var element = _typeParameter('T', bound: stringClassTypeQuestion);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.question,
-    );
+    var element = typeParameter('T', bound: stringClassTypeQuestion);
+    var type = typeParameterTypeQuestion(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3504,11 +4045,8 @@
   }
 
   test_promoteToNonNull_typeParameter_questionBound_star() {
-    var element = _typeParameter('T', bound: stringClassTypeQuestion);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
+    var element = typeParameter('T', bound: stringClassTypeQuestion);
+    var type = typeParameterTypeStar(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3518,11 +4056,8 @@
   }
 
   test_promoteToNonNull_typeParameter_starBound_none() {
-    var element = _typeParameter('T', bound: stringClassTypeStar);
-    var type = _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.none,
-    );
+    var element = typeParameter('T', bound: stringClassTypeStar);
+    var type = typeParameterTypeNone(element);
     _assertPromotedTypeParameterType(
       typeSystem.promoteToNonNull(type),
       baseElement: element,
@@ -3538,30 +4073,6 @@
     );
   }
 
-  DartType typeParameterTypeNone({@required DartType bound}) {
-    var element = _typeParameter('T', bound: bound);
-    return _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.none,
-    );
-  }
-
-  DartType typeParameterTypeQuestion({@required DartType bound}) {
-    var element = _typeParameter('T', bound: bound);
-    return _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.question,
-    );
-  }
-
-  DartType typeParameterTypeStar({@required DartType bound}) {
-    var element = _typeParameter('T', bound: bound);
-    return _typeParameterType(
-      element,
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-  }
-
   /// If [expectedBound] is `null`, the element of [actual] must be the same
   /// as the [baseElement].  Otherwise the element of [actual] must be a
   /// [TypeParameterMember] with the [baseElement] and the [expectedBound].
@@ -3573,11 +4084,26 @@
   }) {
     if (expectedBound != null) {
       var actualMember = actual.element as TypeParameterMember;
-      expect(actualMember.baseElement, same(baseElement));
+      expect(actualMember.declaration, same(baseElement));
       expect(actualMember.bound, expectedBound);
     } else {
       expect(actual.element, same(baseElement));
     }
     expect(actual.nullabilitySuffix, expectedNullabilitySuffix);
   }
+
+  DartType _typeParameterTypeNone({@required DartType bound}) {
+    var element = typeParameter('T', bound: bound);
+    return typeParameterTypeNone(element);
+  }
+
+  DartType _typeParameterTypeQuestion({@required DartType bound}) {
+    var element = typeParameter('T', bound: bound);
+    return typeParameterTypeQuestion(element);
+  }
+
+  DartType _typeParameterTypeStar({@required DartType bound}) {
+    var element = typeParameter('T', bound: bound);
+    return typeParameterTypeStar(element);
+  }
 }
diff --git a/pkg/analyzer/test/instrumentation/instrumentation_test.dart b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
index c4b408e..dd56b5e 100644
--- a/pkg/analyzer/test/instrumentation/instrumentation_test.dart
+++ b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -16,57 +14,47 @@
 @reflectiveTest
 class InstrumentationServiceTest {
   void assertNormal(
-      TestInstrumentationServer server, String tag, String message) {
-    String sent = server.normalChannel.toString();
+      TestInstrumentationLogger logger, String tag, String message) {
+    String sent = logger.logged.toString();
     if (!sent.endsWith(':$tag:$message\n')) {
       fail('Expected "...:$tag:$message", found "$sent"');
     }
   }
 
   void test_logError_withColon() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     service.logError('Error:message');
-    assertNormal(server, InstrumentationService.TAG_ERROR, 'Error::message');
+    assertNormal(logger, InstrumentationLogAdapter.TAG_ERROR, 'Error::message');
   }
 
   void test_logError_withLeadingColon() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     service.logError(':a:bb');
-    assertNormal(server, InstrumentationService.TAG_ERROR, '::a::bb');
+    assertNormal(logger, InstrumentationLogAdapter.TAG_ERROR, '::a::bb');
   }
 
   void test_logError_withoutColon() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String message = 'Error message';
     service.logError(message);
-    assertNormal(server, InstrumentationService.TAG_ERROR, message);
+    assertNormal(logger, InstrumentationLogAdapter.TAG_ERROR, message);
   }
 
   void test_logException_noTrace() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String message = 'exceptionMessage';
     service.logException(message);
-    assertNormal(server, InstrumentationService.TAG_EXCEPTION, '$message:null');
-  }
-
-  void test_logFileRead() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
-    String path = '/file/path';
-    int time = 978336000000;
-    String content = 'class C {\n}\n';
-    service.logFileRead(path, time, content);
     assertNormal(
-        server, InstrumentationService.TAG_FILE_READ, '$path:$time:$content');
+        logger, InstrumentationLogAdapter.TAG_EXCEPTION, '$message:null');
   }
 
   void test_logLogEntry() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String level = 'level';
     DateTime time = new DateTime(2001);
     String message = 'message';
@@ -74,113 +62,112 @@
     String stackTraceText = 'stackTrace';
     StackTrace stackTrace = new StackTrace.fromString(stackTraceText);
     service.logLogEntry(level, time, message, exception, stackTrace);
-    assertNormal(server, InstrumentationService.TAG_LOG_ENTRY,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_LOG_ENTRY,
         '$level:${time.millisecondsSinceEpoch}:$message:$exception:$stackTraceText');
   }
 
   void test_logNotification() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String message = 'notificationText';
     service.logNotification(message);
-    assertNormal(server, InstrumentationService.TAG_NOTIFICATION, message);
+    assertNormal(logger, InstrumentationLogAdapter.TAG_NOTIFICATION, message);
   }
 
   void test_logPluginError() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     PluginData plugin = new PluginData('path', 'name', 'version');
     String code = 'code';
     String message = 'exceptionMessage';
     String stackTraceText = 'stackTrace';
     service.logPluginError(plugin, code, message, stackTraceText);
-    assertNormal(server, InstrumentationService.TAG_PLUGIN_ERROR,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_ERROR,
         '$code:$message:$stackTraceText:path:name:version');
   }
 
   void test_logPluginException_noTrace() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     PluginData plugin = new PluginData('path', 'name', 'version');
     String message = 'exceptionMessage';
     service.logPluginException(plugin, message, null);
-    assertNormal(server, InstrumentationService.TAG_PLUGIN_EXCEPTION,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_EXCEPTION,
         '$message:null:path:name:version');
   }
 
   void test_logPluginException_withTrace() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     PluginData plugin = new PluginData('path', 'name', 'version');
     String message = 'exceptionMessage';
     String stackTraceText = 'stackTrace';
     StackTrace stackTrace = new StackTrace.fromString(stackTraceText);
     service.logPluginException(plugin, message, stackTrace);
-    assertNormal(server, InstrumentationService.TAG_PLUGIN_EXCEPTION,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_EXCEPTION,
         '$message:$stackTraceText:path:name:version');
   }
 
   void test_logPluginNotification() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String notification = 'notification';
     service.logPluginNotification('path', notification);
-    assertNormal(server, InstrumentationService.TAG_PLUGIN_NOTIFICATION,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_NOTIFICATION,
         '$notification:path::');
   }
 
   void test_logPluginRequest() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String request = 'request';
     service.logPluginRequest('path', request);
-    assertNormal(
-        server, InstrumentationService.TAG_PLUGIN_REQUEST, '$request:path::');
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_REQUEST,
+        '$request:path::');
   }
 
   void test_logPluginResponse() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String response = 'response';
     service.logPluginResponse('path', response);
-    assertNormal(
-        server, InstrumentationService.TAG_PLUGIN_RESPONSE, '$response:path::');
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_RESPONSE,
+        '$response:path::');
   }
 
   void test_logPluginTimeout() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     PluginData plugin = new PluginData('path', 'name', 'version');
     String request = 'request';
     service.logPluginTimeout(plugin, request);
-    assertNormal(server, InstrumentationService.TAG_PLUGIN_TIMEOUT,
+    assertNormal(logger, InstrumentationLogAdapter.TAG_PLUGIN_TIMEOUT,
         '$request:path:name:version');
   }
 
   void test_logRequest() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String message = 'requestText';
     service.logRequest(message);
-    assertNormal(server, InstrumentationService.TAG_REQUEST, message);
+    assertNormal(logger, InstrumentationLogAdapter.TAG_REQUEST, message);
   }
 
   void test_logResponse() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     String message = 'responseText';
     service.logResponse(message);
-    assertNormal(server, InstrumentationService.TAG_RESPONSE, message);
+    assertNormal(logger, InstrumentationLogAdapter.TAG_RESPONSE, message);
   }
 
   void test_logVersion() {
-    TestInstrumentationServer server = new TestInstrumentationServer();
-    InstrumentationService service = new InstrumentationService(server);
+    TestInstrumentationLogger logger = new TestInstrumentationLogger();
+    InstrumentationService service = new InstrumentationLogAdapter(logger);
     service.logVersion('myUuid', 'someClientId', 'someClientVersion',
         'aServerVersion', 'anSdkVersion');
-    expect(server.normalChannel.toString(), '');
     expect(
-        server.priorityChannel.toString(),
+        logger.logged.toString(),
         endsWith(
             ':myUuid:someClientId:someClientVersion:aServerVersion:anSdkVersion\n'));
   }
@@ -188,67 +175,38 @@
 
 @reflectiveTest
 class MulticastInstrumentationServerTest {
-  TestInstrumentationServer serverA = new TestInstrumentationServer();
-  TestInstrumentationServer serverB = new TestInstrumentationServer();
-  MulticastInstrumentationServer server;
+  TestInstrumentationLogger loggerA = new TestInstrumentationLogger();
+  TestInstrumentationLogger loggerB = new TestInstrumentationLogger();
+  MulticastInstrumentationService logger;
 
   void setUp() {
-    server = new MulticastInstrumentationServer([serverA, serverB]);
+    logger = new MulticastInstrumentationService([
+      InstrumentationLogAdapter(loggerA),
+      InstrumentationLogAdapter(loggerB)
+    ]);
   }
 
   void test_log() {
-    server.log('foo bar');
-    _assertNormal(serverA, 'foo bar');
-    _assertNormal(serverB, 'foo bar');
+    logger.logInfo('foo bar');
+    _assertLogged(loggerA, 'foo bar');
+    _assertLogged(loggerB, 'foo bar');
   }
 
-  void test_logWithPriority() {
-    server.logWithPriority('foo bar');
-    _assertPriority(serverA, 'foo bar');
-    _assertPriority(serverB, 'foo bar');
-  }
-
-  void test_shutdown() {
-    server.shutdown();
-  }
-
-  void _assertNormal(TestInstrumentationServer server, String message) {
-    String sent = server.normalChannel.toString();
-    if (!sent.endsWith('$message\n')) {
-      fail('Expected "...$message", found "$sent"');
-    }
-  }
-
-  void _assertPriority(TestInstrumentationServer server, String message) {
-    String sent = server.priorityChannel.toString();
+  void _assertLogged(TestInstrumentationLogger logger, String message) {
+    String sent = logger.logged.toString();
     if (!sent.endsWith('$message\n')) {
       fail('Expected "...$message", found "$sent"');
     }
   }
 }
 
-class TestInstrumentationServer implements InstrumentationServer {
-  StringBuffer normalChannel = new StringBuffer();
-  StringBuffer priorityChannel = new StringBuffer();
-
-  @override
-  String get describe => 'test instrumentation';
-
-  @override
-  String get sessionId => '';
+class TestInstrumentationLogger implements InstrumentationLogger {
+  StringBuffer logged = new StringBuffer();
 
   @override
   void log(String message) {
-    normalChannel.writeln(message);
+    logged.writeln(message);
   }
 
-  @override
-  void logWithPriority(String message) {
-    priorityChannel.writeln(message);
-  }
-
-  @override
-  Future shutdown() async {
-    // Ignored
-  }
+  Future<void> shutdown() async {}
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index b97a484..2bba18a 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -33,10 +33,10 @@
   });
 }
 
-final isBottomType = new TypeMatcher<BottomTypeImpl>();
-
 final isDynamicType = new TypeMatcher<DynamicTypeImpl>();
 
+final isNeverType = new TypeMatcher<NeverTypeImpl>();
+
 final isVoidType = new TypeMatcher<VoidTypeImpl>();
 
 /**
@@ -132,7 +132,7 @@
     Element expectedBase,
     Map<String, String> expectedSubstitution,
   ) {
-    expect(actual.baseElement, same(expectedBase));
+    expect(actual.declaration, same(expectedBase));
 
     var actualMapString = actual.substitution.map.map(
       (k, v) => MapEntry(k.name, '$v'),
@@ -2188,7 +2188,7 @@
     MethodMember actualElement = indexExpression.staticElement;
     MethodMember expectedElement = listIntType.getMethod('[]');
     expect(actualElement.name, '[]');
-    expect(actualElement.baseElement, same(expectedElement.baseElement));
+    expect(actualElement.declaration, same(expectedElement.declaration));
     expect(actualElement.returnType, intType);
     expect(actualElement.parameters[0].type, intType);
   }
@@ -2826,7 +2826,7 @@
     expect(result.errors, isNotEmpty);
 
     var throwExpression = findNode.throw_('throw 42;');
-    expect(throwExpression.staticType, isBottomType);
+    expect(throwExpression.staticType, isNeverType);
     assertType(throwExpression.expression, 'int');
   }
 
@@ -2838,7 +2838,7 @@
     expect(result.errors, isNotEmpty);
 
     var throwExpression = findNode.throw_('throw 42;');
-    expect(throwExpression.staticType, isBottomType);
+    expect(throwExpression.staticType, isNeverType);
     assertType(throwExpression.expression, 'int');
   }
 
@@ -3891,7 +3891,7 @@
     expect(result.errors, isNotEmpty);
 
     var rethrowExpression = findNode.rethrow_('rethrow;');
-    expect(rethrowExpression.staticType, isBottomType);
+    expect(rethrowExpression.staticType, isNeverType);
   }
 
   test_invalid_tryCatch_1() async {
@@ -4253,7 +4253,7 @@
     FunctionElement fElement = fNode.declaredElement;
 
     expect(fElement.type.toString(),
-        'void Function<T extends U,U,V extends U>(T, U, V)');
+        'void Function<T extends U, U, V extends U>(T, U, V)');
     var tElement = fElement.typeParameters[0];
     var uElement = fElement.typeParameters[1];
     var vElement = fElement.typeParameters[2];
@@ -8700,18 +8700,7 @@
       expect(actual.type, memberType);
     }
 
-    ParameterElement base = actual;
-    if (actual is ParameterMember) {
-      base = actual.baseElement;
-      // Unwrap ParameterMember one more time.
-      // By some reason we wrap in twice.
-      if (base is ParameterMember) {
-        ParameterMember member = base;
-        base = member.baseElement;
-      }
-    }
-    ParameterElement baseActual = base;
-    expect(baseActual, same(expected));
+    expect(actual.declaration, same(expected));
 
     if (argument is NamedExpression) {
       SimpleIdentifier name = argument.name.label;
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 13e4a36..f29e8ab 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -776,6 +776,34 @@
 ''');
   }
 
+  test_featureSet_add() async {
+    assertNotSameSignature(r'''
+class A {}
+''', r'''
+// @dart = 2.5
+class A {}
+''');
+  }
+
+  test_featureSet_change() async {
+    assertNotSameSignature(r'''
+// @dart = 2.6
+class A {}
+''', r'''
+// @dart = 2.5
+class A {}
+''');
+  }
+
+  test_featureSet_remove() async {
+    assertNotSameSignature(r'''
+// @dart = 2.5
+class A {}
+''', r'''
+class A {}
+''');
+  }
+
   test_function_annotation() {
     assertNotSameSignature(r'''
 const a = 0;
diff --git a/pkg/analyzer/test/src/dart/ast/parse_base.dart b/pkg/analyzer/test/src/dart/ast/parse_base.dart
index 2dd3de6..107a20e 100644
--- a/pkg/analyzer/test/src/dart/ast/parse_base.dart
+++ b/pkg/analyzer/test/src/dart/ast/parse_base.dart
@@ -31,6 +31,7 @@
       ..configureFeatures(featureSet);
 
     var token = scanner.tokenize();
+    featureSet = scanner.featureSet;
 
     var useFasta = analysisOptions.useFastaParser;
     var parser = Parser(source, errorListener,
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 3af77e7..bee0bbf 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -25,14 +24,6 @@
 
 VoidTypeImpl get voidType => VoidTypeImpl.instance;
 
-Element getBaseElement(Element e) {
-  if (e is Member) {
-    return e.baseElement;
-  } else {
-    return e;
-  }
-}
-
 @reflectiveTest
 class FunctionTypeTest with ElementsTypesMixin {
   final TypeProvider typeProvider = TestTypeProvider();
@@ -111,9 +102,195 @@
         nullabilitySuffix: NullabilitySuffix.star,
       );
 
+  test_equality_leftRequired_rightPositional() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        positionalParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_differentName() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'b', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_differentType() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.doubleType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_equal() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+        namedParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+        namedParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    expect(f1, f2);
+  }
+
+  test_equality_namedParameters_extraLeft() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+        namedParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_extraRight() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+        namedParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_required_left() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedRequiredParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_namedParameters_required_right() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        namedRequiredParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_requiredParameters_extraLeft() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+        requiredParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_equality_requiredParameters_extraRight() {
+    var f1 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+      ],
+    );
+    var f2 = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+        requiredParameter(name: 'b', type: typeProvider.doubleType),
+      ],
+    );
+    expect(f1, isNot(equals(f2)));
+  }
+
+  test_new_sortsNamedParameters() {
+    var f = functionTypeNone(
+      returnType: typeProvider.voidType,
+      parameters: [
+        requiredParameter(name: 'a', type: typeProvider.intType),
+        namedParameter(name: 'c', type: typeProvider.intType),
+        namedParameter(name: 'b', type: typeProvider.intType),
+      ],
+    );
+    var parameters = f.parameters;
+    expect(parameters, hasLength(3));
+    expect(parameters[0].name, 'a');
+    expect(parameters[1].name, 'b');
+    expect(parameters[2].name, 'c');
+  }
+
   test_synthetic() {
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: const [],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f, element: isNull);
   }
 
@@ -121,9 +298,12 @@
     // T Function<T>(T x)
     var t = typeParameter('T');
     var x = requiredParameter(name: 'x', type: typeParameterType(t));
-    FunctionType f = new FunctionTypeImpl.synthetic(
-        typeParameterType(t), [t], [x],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: [t],
+      parameters: [x],
+      returnType: typeParameterType(t),
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     FunctionType instantiated = f.instantiate([objectType]);
     basicChecks(instantiated,
         element: isNull,
@@ -137,14 +317,22 @@
   test_synthetic_instantiate_argument_length_mismatch() {
     // dynamic Function<T>()
     var t = typeParameter('T');
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [t], [],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: [t],
+      parameters: const [],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     expect(() => f.instantiate([]), throwsA(new TypeMatcher<ArgumentError>()));
   }
 
   test_synthetic_instantiate_no_type_formals() {
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: const [],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     expect(f.instantiate([]), same(f));
   }
 
@@ -152,9 +340,12 @@
     // T Function<T>(int x)
     var t = typeParameter('T');
     var x = requiredParameter(name: 'x', type: intType);
-    FunctionType f = new FunctionTypeImpl.synthetic(
-        typeParameterType(t), [t], [x],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: [t],
+      parameters: [x],
+      returnType: typeParameterType(t),
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     FunctionType instantiated = f.instantiate([objectType]);
     basicChecks(instantiated,
         element: isNull,
@@ -167,8 +358,12 @@
 
   test_synthetic_namedParameter() {
     var p = namedParameter(name: 'x', type: objectType);
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: [p],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f,
         element: isNull,
         displayName: 'dynamic Function({x: Object})',
@@ -181,8 +376,12 @@
 
   test_synthetic_normalParameter() {
     var p = requiredParameter(name: 'x', type: objectType);
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: [p],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f,
         element: isNull,
         displayName: 'dynamic Function(Object)',
@@ -196,8 +395,12 @@
 
   test_synthetic_optionalParameter() {
     var p = positionalParameter(name: 'x', type: objectType);
-    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: [p],
+      returnType: dynamicType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f,
         element: isNull,
         displayName: 'dynamic Function([Object])',
@@ -210,8 +413,12 @@
   }
 
   test_synthetic_returnType() {
-    FunctionType f = new FunctionTypeImpl.synthetic(objectType, [], [],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: const [],
+      parameters: const [],
+      returnType: objectType,
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f,
         element: isNull,
         displayName: 'Object Function()',
@@ -269,9 +476,12 @@
 
   test_synthetic_typeFormals() {
     var t = typeParameter('T');
-    FunctionType f = new FunctionTypeImpl.synthetic(
-        typeParameterType(t), [t], [],
-        nullabilitySuffix: NullabilitySuffix.star);
+    FunctionType f = new FunctionTypeImpl(
+      typeFormals: [t],
+      parameters: const [],
+      returnType: typeParameterType(t),
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     basicChecks(f,
         element: isNull,
         displayName: 'T Function<T>()',
diff --git a/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart b/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart
new file mode 100644
index 0000000..b0b9091
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart
@@ -0,0 +1,316 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/nullability_eliminator.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/test_analysis_context.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullabilityEliminatorTest);
+  });
+}
+
+@reflectiveTest
+class NullabilityEliminatorTest with ElementsTypesMixin, TypeProviderTypes {
+  @override
+  TypeProvider typeProvider;
+
+  void setUp() {
+    var analysisContext = TestAnalysisContext(
+      featureSet: FeatureSet.forTesting(
+        sdkVersion: '2.6.0',
+        additionalFeatures: [Feature.non_nullable],
+      ),
+    );
+    typeProvider = analysisContext.typeProvider;
+  }
+
+  test_dynamicType() {
+    _verifySame(typeProvider.dynamicType);
+  }
+
+  test_functionType() {
+    _verify(
+      functionTypeNone(returnType: voidType),
+      functionTypeStar(returnType: voidType),
+    );
+
+    _verify(
+      functionTypeQuestion(returnType: voidType),
+      functionTypeStar(returnType: voidType),
+    );
+
+    _verifySame(
+      functionTypeStar(returnType: voidType),
+    );
+  }
+
+  test_functionType_parameters() {
+    _verify(
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intNone),
+        ],
+        returnType: voidType,
+      ),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intStar),
+        ],
+        returnType: voidType,
+      ),
+    );
+
+    _verify(
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intQuestion),
+        ],
+        returnType: voidType,
+      ),
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intStar),
+        ],
+        returnType: voidType,
+      ),
+    );
+
+    _verifySame(
+      functionTypeStar(
+        parameters: [
+          requiredParameter(type: intStar),
+        ],
+        returnType: voidType,
+      ),
+    );
+  }
+
+  test_functionType_returnType() {
+    _verify(
+      functionTypeStar(returnType: intNone),
+      functionTypeStar(returnType: intStar),
+    );
+
+    _verify(
+      functionTypeStar(returnType: intQuestion),
+      functionTypeStar(returnType: intStar),
+    );
+
+    _verifySame(
+      functionTypeStar(returnType: intStar),
+    );
+  }
+
+  test_functionType_typeParameters() {
+    var T = typeParameter('T');
+
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeNone(T),
+      ),
+      'T Function<T>()',
+      'T* Function<T>()*',
+    );
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeQuestion(T),
+      ),
+      'T? Function<T>()',
+      'T* Function<T>()*',
+    );
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeStar(T),
+      ),
+      'T* Function<T>()',
+      'T* Function<T>()*',
+    );
+
+    _verifySame(
+      functionTypeStar(
+        typeFormals: [T],
+        returnType: typeParameterTypeStar(T),
+      ),
+    );
+  }
+
+  test_functionType_typeParameters_bound_none() {
+    var T = typeParameter('T', bound: intNone);
+
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeNone(T),
+      ),
+      'T Function<T extends int>()',
+      'T* Function<T extends int*>()*',
+    );
+  }
+
+  test_functionType_typeParameters_bound_question() {
+    var T = typeParameter('T', bound: intQuestion);
+
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeNone(T),
+      ),
+      'T Function<T extends int?>()',
+      'T* Function<T extends int*>()*',
+    );
+  }
+
+  test_functionType_typeParameters_bound_star() {
+    var T = typeParameter('T', bound: intStar);
+
+    _verifyStr(
+      functionTypeNone(
+        typeFormals: [T],
+        returnType: typeParameterTypeNone(T),
+      ),
+      'T Function<T extends int*>()',
+      'T* Function<T extends int*>()*',
+    );
+
+    _verifySame(
+      functionTypeStar(
+        typeFormals: [T],
+        returnType: typeParameterTypeStar(T),
+      ),
+    );
+  }
+
+  test_interfaceType_int() {
+    _verify(intNone, intStar);
+    _verify(intQuestion, intStar);
+    _verifySame(intStar);
+  }
+
+  test_interfaceType_list() {
+    var expected = listStar(intStar);
+
+    _verify(listNone(intNone), expected);
+    _verify(listNone(intQuestion), expected);
+    _verify(listNone(intStar), expected);
+
+    _verify(listQuestion(intNone), expected);
+    _verify(listQuestion(intQuestion), expected);
+    _verify(listQuestion(intStar), expected);
+
+    _verify(listStar(intNone), expected);
+    _verify(listStar(intQuestion), expected);
+    _verifySame(listStar(intStar));
+  }
+
+  test_neverType() {
+    _verify(neverNone, neverStar);
+    _verify(neverQuestion, neverStar);
+    _verifySame(neverStar);
+  }
+
+  test_typeParameterType() {
+    var T = typeParameter('T');
+    _verify(
+      typeParameterTypeNone(T),
+      typeParameterTypeStar(T),
+    );
+    _verify(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeStar(T),
+    );
+    _verifySame(
+      typeParameterTypeStar(T),
+    );
+  }
+
+  test_voidType() {
+    _verifySame(typeProvider.voidType);
+  }
+
+  String _typeToString(TypeImpl type) {
+    return type.toString(withNullability: true);
+  }
+
+  void _verify(DartType input, DartType expected) {
+    var result = NullabilityEliminator.perform(input);
+    expect(result, isNot(same(input)));
+    expect(result, expected);
+  }
+
+  void _verifySame(DartType input) {
+    var result = NullabilityEliminator.perform(input);
+    expect(result, same(input));
+  }
+
+  void _verifyStr(DartType input, String inputStr, String expectedStr) {
+    expect(_typeToString(input), inputStr);
+
+    var result = NullabilityEliminator.perform(input);
+    expect(result, isNot(same(input)));
+    expect(_typeToString(result), expectedStr);
+  }
+}
+
+mixin TypeProviderTypes {
+  DynamicTypeImpl get dynamicType => typeProvider.dynamicType;
+
+  InterfaceType get intNone {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  InterfaceType get intQuestion {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
+  InterfaceType get intStar {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
+  TypeProvider get typeProvider;
+
+  VoidTypeImpl get voidType => typeProvider.voidType;
+
+  InterfaceType listNone(DartType type) {
+    return typeProvider.listElement.instantiate(
+      typeArguments: [type],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  InterfaceType listQuestion(DartType type) {
+    return typeProvider.listElement.instantiate(
+      typeArguments: [type],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
+  InterfaceType listStar(DartType type) {
+    return typeProvider.listElement.instantiate(
+      typeArguments: [type],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/subtype_test.dart b/pkg/analyzer/test/src/dart/element/subtype_test.dart
index 4def2d5..354f34e 100644
--- a/pkg/analyzer/test/src/dart/element/subtype_test.dart
+++ b/pkg/analyzer/test/src/dart/element/subtype_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_visitor.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -41,7 +42,7 @@
     ];
 
     var subtypes = <DartType>[
-      bottomNone,
+      neverNone,
       nullNone,
       objectNone,
     ];
@@ -96,7 +97,7 @@
     ];
 
     var subtypes = <DartType>[
-      bottomNone,
+      neverNone,
     ];
 
     var supertypes = <DartType>[
@@ -110,7 +111,7 @@
       nullNone,
       nullStar,
       nullQuestion,
-      bottomQuestion,
+      neverQuestion,
     ];
 
     _checkGroups(
@@ -133,9 +134,9 @@
       nullNone,
       nullQuestion,
       nullStar,
-      bottomNone,
-      bottomQuestion,
-      bottomStar,
+      neverNone,
+      neverQuestion,
+      neverStar,
     ];
 
     var supertypes = <DartType>[
@@ -171,9 +172,9 @@
       nullNone,
       nullStar,
       nullQuestion,
-      bottomNone,
-      bottomStar,
-      bottomQuestion,
+      neverNone,
+      neverStar,
+      neverQuestion,
     ];
 
     var supertypes = <DartType>[
@@ -202,7 +203,7 @@
       nullNone,
       nullQuestion,
       nullStar,
-      bottomQuestion,
+      neverQuestion,
     ];
 
     var supertypes = <DartType>[
@@ -215,7 +216,7 @@
     ];
 
     var subtypes = <DartType>[
-      bottomNone,
+      neverNone,
     ];
 
     var unrelated = <DartType>[
@@ -248,7 +249,7 @@
     ];
 
     var subtypes = <DartType>[
-      bottomNone,
+      neverNone,
     ];
 
     var unrelated = <DartType>[
@@ -280,9 +281,22 @@
       DartTypeVisitor.visit(type, typeParameterCollector);
       for (var typeParameter in typeParameterCollector.typeParameters) {
         if (typeParameter is TypeParameterMember) {
-          var boundTypeImpl = typeParameter.bound as TypeImpl;
-          var boundTypeStr = boundTypeImpl.toString(withNullability: true);
-          typeStr += ', ${typeParameter.name} & ' + boundTypeStr;
+          var base = typeParameter.declaration;
+          var baseBound = base.bound as TypeImpl;
+          if (baseBound != null) {
+            var baseBoundStr = baseBound.toString(withNullability: true);
+            typeStr += ', ${typeParameter.name} extends ' + baseBoundStr;
+          }
+
+          var bound = typeParameter.bound as TypeImpl;
+          var boundStr = bound.toString(withNullability: true);
+          typeStr += ', ${typeParameter.name} & ' + boundStr;
+        } else {
+          var bound = typeParameter.bound as TypeImpl;
+          if (bound != null) {
+            var boundStr = bound.toString(withNullability: true);
+            typeStr += ', ${typeParameter.name} extends ' + boundStr;
+          }
         }
       }
 
@@ -351,13 +365,6 @@
     expect(typeSystem.isSubtypeOf(T0, T1), isTrue);
   }
 
-  void isSubtype3({
-    String strT0,
-    String strT1,
-  }) {
-    isSubtype2(strT0, strT1);
-  }
-
   InterfaceType iterableStar(DartType type) {
     return typeProvider.iterableElement.instantiate(
       typeArguments: [type],
@@ -400,30 +407,6 @@
     _defineTypes();
   }
 
-  test_bottom_01() {
-    isSubtype(bottomNone, numNone, strT0: 'Never', strT1: 'num');
-  }
-
-  test_bottom_02() {
-    isSubtype(bottomNone, numStar, strT0: 'Never', strT1: 'num*');
-  }
-
-  test_bottom_03() {
-    isSubtype(bottomNone, numQuestion, strT0: 'Never', strT1: 'num?');
-  }
-
-  test_bottom_04() {
-    isSubtype(bottomNone, nullQuestion, strT0: 'Never', strT1: 'Null?');
-  }
-
-  test_bottom_05() {
-    isSubtype(bottomNone, bottomNone, strT0: 'Never', strT1: 'Never');
-  }
-
-  test_bottom_06() {
-    isSubtype(bottomNone, neverNone, strT0: 'Never', strT1: 'Never');
-  }
-
   test_functionType_01() {
     var E0 = typeParameter('E0');
     var E1 = typeParameter('E1', bound: numStar);
@@ -636,7 +619,7 @@
         ],
         returnType: intStar,
       ),
-      strT0: 'int* Function<E0,F0>(int*)*',
+      strT0: 'int* Function<E0, F0>(int*)*',
       strT1: 'int* Function<E1>(int*)*',
     );
   }
@@ -1714,28 +1697,6 @@
     );
   }
 
-  test_functionType_65() {
-    isSubtype(
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'c', type: intStar),
-          namedParameter(name: 'b', type: intStar),
-          namedParameter(name: 'a', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'a', type: intStar),
-          namedParameter(name: 'c', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      strT0: 'void Function({c: int*, b: int*, a: int*})*',
-      strT1: 'void Function({a: int*, c: int*})*',
-    );
-  }
-
   test_functionType_66() {
     isSubtype(
       functionTypeStar(
@@ -1758,28 +1719,6 @@
     );
   }
 
-  test_functionType_67() {
-    isSubtype(
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'c', type: intStar),
-          namedParameter(name: 'b', type: intStar),
-          namedParameter(name: 'a', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'b', type: intStar),
-          namedParameter(name: 'c', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      strT0: 'void Function({c: int*, b: int*, a: int*})*',
-      strT1: 'void Function({b: int*, c: int*})*',
-    );
-  }
-
   test_functionType_68() {
     isSubtype(
       functionTypeStar(
@@ -1801,27 +1740,6 @@
     );
   }
 
-  test_functionType_69() {
-    isSubtype(
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'c', type: intStar),
-          namedParameter(name: 'b', type: intStar),
-          namedParameter(name: 'a', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      functionTypeStar(
-        parameters: [
-          namedParameter(name: 'c', type: intStar),
-        ],
-        returnType: voidNone,
-      ),
-      strT0: 'void Function({c: int*, b: int*, a: int*})*',
-      strT1: 'void Function({c: int*})*',
-    );
-  }
-
   test_functionType_70() {
     isSubtype(
       functionTypeNone(
@@ -1962,7 +1880,7 @@
           returnType: typeParameterTypeNone(E1),
         ),
       ),
-      strT0: 'E0 Function(F0)* Function<E0,F0>(E0)*',
+      strT0: 'E0 Function(F0)* Function<E0, F0>(E0)*',
       strT1: 'E1 Function<F1>(F1)* Function<E1>(E1)*',
     );
 
@@ -1991,8 +1909,8 @@
           returnType: typeParameterTypeNone(E1),
         ),
       ),
-      strT0: 'E0 Function(F0)* Function<E0,F0>(E0)*',
-      strT1: 'E1 Function(F1)* Function<F1,E1>(E1)*',
+      strT0: 'E0 Function(F0)* Function<E0, F0>(E0)*',
+      strT1: 'E1 Function(F1)* Function<F1, E1>(E1)*',
     );
   }
 
@@ -2291,6 +2209,36 @@
     );
   }
 
+  test_functionType_requiredNamedParameter() {
+    var F0 = functionTypeNone(
+      returnType: voidNone,
+      parameters: [
+        namedRequiredParameter(name: 'a', type: intNone),
+      ],
+    );
+
+    var F1 = functionTypeNone(
+      returnType: voidNone,
+      parameters: [
+        namedParameter(name: 'a', type: intNone),
+      ],
+    );
+
+    isSubtype(
+      F1,
+      F0,
+      strT0: 'void Function({a: int})',
+      strT1: 'void Function({required a: int})',
+    );
+
+    isNotSubtype(
+      F0,
+      F1,
+      strT0: 'void Function({required a: int})',
+      strT1: 'void Function({a: int})',
+    );
+  }
+
   test_futureOr_01() {
     isSubtype(
       intStar,
@@ -2480,12 +2428,12 @@
   test_futureOr_21() {
     isSubtype(
       functionTypeStar(
-        parameters: [],
+        parameters: const [],
         returnType: stringStar,
       ),
       futureOrStar(
         functionTypeStar(
-          parameters: [],
+          parameters: const [],
           returnType: voidNone,
         ),
       ),
@@ -2497,12 +2445,12 @@
   test_futureOr_22() {
     isNotSubtype(
       functionTypeStar(
-        parameters: [],
+        parameters: const [],
         returnType: voidNone,
       ),
       futureOrStar(
         functionTypeStar(
-          parameters: [],
+          parameters: const [],
           returnType: stringStar,
         ),
       ),
@@ -2876,8 +2824,8 @@
       listNone(
         typeParameterTypeNone(T),
       ),
-      strT0: 'List<T>, T & int',
-      strT1: 'List<T>',
+      strT0: 'List<T>, T extends Object?, T & int',
+      strT1: 'List<T>, T extends Object?',
     );
   }
 
@@ -2893,11 +2841,90 @@
       listNone(
         typeParameterTypeNone(T),
       ),
-      strT0: 'List<T>, T & int?',
-      strT1: 'List<T>',
+      strT0: 'List<T>, T extends Object?, T & int?',
+      strT1: 'List<T>, T extends Object?',
     );
   }
 
+  test_interfaceType_covariant_01() {
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    var A_num = A.instantiate(
+      typeArguments: [numNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    var A_int = A.instantiate(
+      typeArguments: [intNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    isSubtype(A_int, A_num, strT0: "A<int>", strT1: "A<num>");
+    isNotSubtype(A_num, A_int, strT0: "A<num>", strT1: "A<int>");
+  }
+
+  test_interfaceType_covariant_02() {
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    var A_num = A.instantiate(
+      typeArguments: [numNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    isSubtype(A_num, A_num, strT0: "A<num>", strT1: "A<num>");
+  }
+
+  test_interfaceType_contravariant_01() {
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    var A_num = A.instantiate(
+      typeArguments: [numNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    var A_int = A.instantiate(
+      typeArguments: [intNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    isSubtype(A_num, A_int, strT0: "A<num>", strT1: "A<int>");
+    isNotSubtype(A_int, A_num, strT0: "A<int>", strT1: "A<num>");
+  }
+
+  test_interfaceType_contravariant_02() {
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    var A_num = A.instantiate(
+      typeArguments: [numNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    isSubtype(A_num, A_num, strT0: "A<num>", strT1: "A<num>");
+  }
+
+  test_interfaceType_invariant() {
+    var T = typeParameter('T', variance: Variance.invariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    var A_num = A.instantiate(
+      typeArguments: [numNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    var A_int = A.instantiate(
+      typeArguments: [intNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+
+    isSubtype(A_num, A_num, strT0: "A<num>", strT1: "A<num>");
+    isNotSubtype(A_int, A_num, strT0: "A<int>", strT1: "A<num>");
+    isNotSubtype(A_num, A_int, strT0: "A<num>", strT1: "A<int>");
+  }
+
   test_multi_function_nonGeneric_oneArgument() {
     isSubtype2('num* Function(num*)*', 'num* Function(int*)*');
     isSubtype2('int* Function(num*)*', 'num* Function(num*)*');
@@ -2913,6 +2940,34 @@
     isNotSubtype2('num* Function(num*)?', 'Object');
     isNotSubtype2('Null?', 'num* Function(int*)');
     isNotSubtype2('num* Function(int*)', 'Never');
+
+    isNotSubtype2('num', 'num Function(num)');
+    isNotSubtype2('Object', 'num Function(num)');
+    isNotSubtype2('Object*', 'num Function(num)');
+    isNotSubtype2('Object?', 'num Function(num)');
+    isNotSubtype2('dynamic', 'num Function(num)');
+
+    isSubtype2('num Function(num)', 'num Function(num)*');
+    isSubtype2('num Function(num)*', 'num Function(num)');
+    isSubtype2('num Function(num)?', 'num Function(num)*');
+    isSubtype2('num Function(num)*', 'num Function(num)?');
+    isSubtype2('num Function(num)', 'num Function(num)?');
+    isNotSubtype2('num Function(num)?', 'num Function(num)');
+
+    isSubtype2('num Function(num)', 'num? Function(num)');
+    isSubtype2('num Function(num?)', 'num Function(num)');
+    isSubtype2('num Function(num?)', 'num? Function(num)');
+    isNotSubtype2('num Function(num)', 'num? Function(num?)');
+
+    isSubtype2('num Function({num x})', 'num? Function({num x})');
+    isSubtype2('num Function({num? x})', 'num Function({num x})');
+    isSubtype2('num Function({num? x})', 'num? Function({num x})');
+    isNotSubtype2('num Function({num x})', 'num? Function({num? x})');
+
+    isSubtype2('num Function([num])', 'num? Function([num])');
+    isSubtype2('num Function([num?])', 'num Function([num])');
+    isSubtype2('num Function([num?])', 'num? Function([num])');
+    isNotSubtype2('num Function([num])', 'num? Function([num?])');
   }
 
   test_multi_function_nonGeneric_zeroArguments() {
@@ -2942,6 +2997,63 @@
   }
 
   test_multi_futureOr() {
+    isSubtype2('int*', 'FutureOr<int*>*');
+    isSubtype2('int*', 'FutureOr<num*>*');
+    isSubtype2('Future<int*>*', 'FutureOr<int*>*');
+    isSubtype2('Future<int*>*', 'FutureOr<num*>*');
+    isSubtype2('Future<int*>*', 'FutureOr<Object*>*');
+    isSubtype2('FutureOr<int*>*', 'FutureOr<int*>*');
+    isSubtype2('FutureOr<int*>*', 'FutureOr<num*>*');
+    isSubtype2('FutureOr<int*>*', 'Object*');
+    isSubtype2('Null?', 'FutureOr<num?>');
+    isSubtype2('Null?', 'FutureOr<num>?');
+    isSubtype2('num?', 'FutureOr<num?>');
+    isSubtype2('num?', 'FutureOr<num>?');
+    isSubtype2('Future<num>', 'FutureOr<num?>');
+    isSubtype2('Future<num>', 'FutureOr<num>?');
+    isSubtype2('Future<num>', 'FutureOr<num?>?');
+    isSubtype2('Future<num?>', 'FutureOr<num?>');
+    isNotSubtype2('Future<num?>', 'FutureOr<num>?');
+    isSubtype2('Future<num?>', 'FutureOr<num?>?');
+
+    isSubtype2('num?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype2('Future<num>?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype2('Future<Future<num>>?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype2(
+      'Future<Future<Future<num>>>?',
+      'FutureOr<FutureOr<FutureOr<num>>?>',
+    );
+    isSubtype2('Future<num>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype2('Future<Future<num>>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype2(
+      'Future<Future<Future<num>>>?',
+      'FutureOr<FutureOr<FutureOr<num?>>>',
+    );
+    isSubtype2('Future<num?>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype2('Future<Future<num?>?>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype2(
+      'Future<Future<Future<num?>?>?>?',
+      'FutureOr<FutureOr<FutureOr<num?>>>',
+    );
+
+    isSubtype2('FutureOr<num>?', 'FutureOr<num?>');
+    isNotSubtype2('FutureOr<num?>', 'FutureOr<num>?');
+
+    isSubtype2('dynamic', 'FutureOr<Object?>');
+    isSubtype2('dynamic', 'FutureOr<Object>?');
+    isSubtype2('void', 'FutureOr<Object?>');
+    isSubtype2('void', 'FutureOr<Object>?');
+    isSubtype2('Object*', 'FutureOr<Object?>');
+    isSubtype2('Object*', 'FutureOr<Object>?');
+    isSubtype2('Object?', 'FutureOr<Object?>');
+    isSubtype2('Object?', 'FutureOr<Object>?');
+    isSubtype2('Object', 'FutureOr<Object?>');
+    isSubtype2('Object', 'FutureOr<Object>?');
+    isNotSubtype2('dynamic', 'FutureOr<Object>');
+    isNotSubtype2('void', 'FutureOr<Object>');
+    isNotSubtype2('Object?', 'FutureOr<Object>');
+    isSubtype2('Object', 'FutureOr<Object>');
+
     isSubtype2('FutureOr<int>', 'Object');
     isSubtype2('FutureOr<int>', 'Object*');
     isSubtype2('FutureOr<int>', 'Object?');
@@ -2972,6 +3084,467 @@
     isNotSubtype2('FutureOr<num>?', 'Object');
   }
 
+  test_multi_futureOr_functionType() {
+    isSubtype(
+      functionTypeStar(
+        returnType: stringStar,
+      ),
+      futureOrStar(
+        functionTypeStar(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String* Function()*',
+      strT1: 'FutureOr<void Function()*>*',
+    );
+
+    isSubtype(
+      functionTypeNone(
+        returnType: stringNone,
+      ),
+      futureOrNone(
+        functionTypeNone(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()',
+      strT1: 'FutureOr<void Function()>',
+    );
+
+    isSubtype(
+      functionTypeNone(
+        returnType: stringNone,
+      ),
+      futureOrNone(
+        functionTypeQuestion(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()',
+      strT1: 'FutureOr<void Function()?>',
+    );
+
+    isSubtype(
+      functionTypeNone(
+        returnType: stringNone,
+      ),
+      futureOrQuestion(
+        functionTypeNone(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()',
+      strT1: 'FutureOr<void Function()>?',
+    );
+
+    isSubtype(
+      functionTypeQuestion(
+        returnType: stringNone,
+      ),
+      futureOrNone(
+        functionTypeQuestion(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()?',
+      strT1: 'FutureOr<void Function()?>',
+    );
+
+    isSubtype(
+      functionTypeQuestion(
+        returnType: stringNone,
+      ),
+      futureOrQuestion(
+        functionTypeNone(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()?',
+      strT1: 'FutureOr<void Function()>?',
+    );
+
+    isNotSubtype(
+      functionTypeQuestion(
+        returnType: stringNone,
+      ),
+      futureOrNone(
+        functionTypeNone(
+          returnType: voidNone,
+        ),
+      ),
+      strT0: 'String Function()?',
+      strT1: 'FutureOr<void Function()>',
+    );
+
+    isNotSubtype(
+      functionTypeStar(
+        returnType: voidNone,
+      ),
+      futureOrStar(
+        functionTypeStar(
+          returnType: stringNone,
+        ),
+      ),
+      strT0: 'void Function()*',
+      strT1: 'FutureOr<String Function()*>*',
+    );
+  }
+
+  test_multi_futureOr_typeParameter() {
+    TypeParameterElement E;
+
+    E = typeParameter('E', bound: objectStar);
+    isSubtype(
+      typeParameterTypeStar(E),
+      futureOrStar(
+        typeParameterTypeStar(E),
+      ),
+      strT0: 'E*, E extends Object*',
+      strT1: 'FutureOr<E*>*, E extends Object*',
+    );
+
+    E = typeParameter('E', bound: objectNone);
+    isSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrQuestion(
+        typeParameterTypeNone(E),
+      ),
+      strT0: 'E?, E extends Object',
+      strT1: 'FutureOr<E>?, E extends Object',
+    );
+    isSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrNone(
+        typeParameterTypeQuestion(E),
+      ),
+      strT0: 'E?, E extends Object',
+      strT1: 'FutureOr<E?>, E extends Object',
+    );
+    isNotSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrNone(
+        typeParameterTypeNone(E),
+      ),
+      strT0: 'E?, E extends Object',
+      strT1: 'FutureOr<E>, E extends Object',
+    );
+
+    E = typeParameter('E', bound: objectQuestion);
+    isSubtype(
+      typeParameterTypeNone(E),
+      futureOrQuestion(
+        typeParameterTypeNone(E),
+      ),
+      strT0: 'E, E extends Object?',
+      strT1: 'FutureOr<E>?, E extends Object?',
+    );
+    isSubtype(
+      typeParameterTypeNone(E),
+      futureOrNone(
+        typeParameterTypeQuestion(E),
+      ),
+      strT0: 'E, E extends Object?',
+      strT1: 'FutureOr<E?>, E extends Object?',
+    );
+    isSubtype(
+      typeParameterTypeNone(E),
+      futureOrNone(
+        typeParameterTypeNone(E),
+      ),
+      strT0: 'E, E extends Object?',
+      strT1: 'FutureOr<E>, E extends Object?',
+    );
+
+    E = typeParameter('E', bound: objectStar);
+    isNotSubtype(
+      typeParameterTypeStar(E),
+      futureOrStar(stringStar),
+      strT0: 'E*, E extends Object*',
+      strT1: 'FutureOr<String*>*',
+    );
+
+    E = typeParameter('E', bound: stringNone);
+    isSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrQuestion(stringNone),
+      strT0: 'E?, E extends String',
+      strT1: 'FutureOr<String>?',
+    );
+    isSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrNone(stringQuestion),
+      strT0: 'E?, E extends String',
+      strT1: 'FutureOr<String?>',
+    );
+    isNotSubtype(
+      typeParameterTypeQuestion(E),
+      futureOrNone(stringNone),
+      strT0: 'E?, E extends String',
+      strT1: 'FutureOr<String>',
+    );
+
+    E = typeParameter('E', bound: stringQuestion);
+    isSubtype(
+      typeParameterTypeNone(E),
+      futureOrQuestion(stringNone),
+      strT0: 'E, E extends String?',
+      strT1: 'FutureOr<String>?',
+    );
+    isSubtype(
+      typeParameterTypeNone(E),
+      futureOrNone(stringQuestion),
+      strT0: 'E, E extends String?',
+      strT1: 'FutureOr<String?>',
+    );
+    isNotSubtype(
+      typeParameterTypeNone(E),
+      futureOrNone(stringNone),
+      strT0: 'E, E extends String?',
+      strT1: 'FutureOr<String>',
+    );
+  }
+
+  test_multi_futureOr_typeParameter_promotion() {
+    TypeParameterElement S;
+    TypeParameterElement T;
+
+    T = typeParameter('T', bound: objectStar);
+    isSubtype(
+      typeParameterTypeStar(
+        promoteTypeParameter(T, intStar),
+      ),
+      futureOrStar(numStar),
+      strT0: 'T*, T extends Object*, T & int*',
+      strT1: 'FutureOr<num*>*',
+    );
+
+    T = typeParameter('T', bound: objectNone);
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object, T & int',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object, T & int',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object, T & int',
+      strT1: 'FutureOr<num>?',
+    );
+
+    T = typeParameter('T', bound: objectQuestion);
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object?, T & int',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object?, T & int',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object?, T & int',
+      strT1: 'FutureOr<num>?',
+    );
+
+    T = typeParameter('T', bound: objectQuestion);
+    isNotSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intQuestion),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object?, T & int?',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intQuestion),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object?, T & int?',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intQuestion),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object?, T & int?',
+      strT1: 'FutureOr<num>?',
+    );
+
+    T = typeParameter('T', bound: objectQuestion);
+    S = typeParameter('S', bound: typeParameterTypeNone(T));
+    isNotSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, typeParameterTypeNone(S)),
+      ),
+      futureOrNone(objectNone),
+      strT0: 'T, T extends Object?, T & S',
+      strT1: 'FutureOr<Object>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, typeParameterTypeNone(S)),
+      ),
+      futureOrNone(objectQuestion),
+      strT0: 'T, T extends Object?, T & S',
+      strT1: 'FutureOr<Object?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, typeParameterTypeNone(S)),
+      ),
+      futureOrQuestion(objectNone),
+      strT0: 'T, T extends Object?, T & S',
+      strT1: 'FutureOr<Object>?',
+    );
+
+    T = typeParameter('T', bound: objectStar);
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureStar(numStar)),
+      ),
+      futureOrStar(numStar),
+      strT0: 'T, T extends Object*, T & Future<num*>*',
+      strT1: 'FutureOr<num*>*',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureStar(intStar)),
+      ),
+      futureOrStar(numStar),
+      strT0: 'T, T extends Object*, T & Future<int*>*',
+      strT1: 'FutureOr<num*>*',
+    );
+
+    T = typeParameter('T', bound: objectNone);
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object, T & Future<int>',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object, T & Future<int>',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object, T & Future<int>',
+      strT1: 'FutureOr<num>?',
+    );
+
+    T = typeParameter('T', bound: objectQuestion);
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object?, T & Future<int>',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object?, T & Future<int>',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intNone)),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object?, T & Future<int>',
+      strT1: 'FutureOr<num>?',
+    );
+
+    isNotSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureQuestion(intNone)),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object?, T & Future<int>?',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureQuestion(intNone)),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object?, T & Future<int>?',
+      strT1: 'FutureOr<num?>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureQuestion(intNone)),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object?, T & Future<int>?',
+      strT1: 'FutureOr<num>?',
+    );
+
+    T = typeParameter('T', bound: objectNone);
+    isNotSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intQuestion)),
+      ),
+      futureOrNone(numNone),
+      strT0: 'T, T extends Object, T & Future<int?>',
+      strT1: 'FutureOr<num>',
+    );
+    isSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intQuestion)),
+      ),
+      futureOrNone(numQuestion),
+      strT0: 'T, T extends Object, T & Future<int?>',
+      strT1: 'FutureOr<num?>',
+    );
+    isNotSubtype(
+      typeParameterTypeNone(
+        promoteTypeParameter(T, futureNone(intQuestion)),
+      ),
+      futureOrQuestion(numNone),
+      strT0: 'T, T extends Object, T & Future<int?>',
+      strT1: 'FutureOr<num>?',
+    );
+  }
+
   test_multi_list_subTypes_superTypes() {
     isSubtype2('List<int*>*', 'List<int*>*');
     isSubtype2('List<int*>*', 'Iterable<int*>*');
@@ -3033,9 +3606,6 @@
     isSubtype2('Never', 'num');
     isSubtype2('Never', 'num*');
     isSubtype2('Never', 'num?');
-    isSubtype2('bottom', 'num');
-    isSubtype2('bottom', 'num*');
-    isSubtype2('bottom', 'num?');
 
     isNotSubtype2('int*', 'double*');
     isNotSubtype2('int*', 'Comparable<int*>*');
@@ -3047,7 +3617,6 @@
   }
 
   test_multi_object_topAndBottom() {
-    isSubtype2('bottom', 'Object');
     isSubtype2('Never', 'Object');
     isSubtype2('Object', 'dynamic');
     isSubtype2('Object', 'void');
@@ -3055,9 +3624,8 @@
     isSubtype2('Object', 'Object*');
     isSubtype2('Object*', 'Object');
 
-    isNotSubtype2('Object', 'bottom');
-    isNotSubtype2('Object', 'Null?');
     isNotSubtype2('Object', 'Never');
+    isNotSubtype2('Object', 'Null?');
     isNotSubtype2('dynamic', 'Object');
     isNotSubtype2('void', 'Object');
     isNotSubtype2('Object?', 'Object');
@@ -3089,14 +3657,9 @@
 
   test_multi_topAndBottom() {
     isSubtype2('Null?', 'Null?');
-    isNotSubtype2('Null?', 'bottom');
-    isNotSubtype2('Null?', 'Never');
-    isSubtype2('bottom', 'Null?');
-    isSubtype2('bottom', 'bottom');
-    isSubtype2('bottom', 'Never');
     isSubtype2('Never', 'Null?');
-//    isNotSubtype2('Never', 'bottom');
     isSubtype2('Never', 'Never');
+    isNotSubtype2('Null?', 'Never');
 
     isSubtype2('Null?', 'Never?');
     isSubtype2('Never?', 'Null?');
@@ -3124,29 +3687,115 @@
     isSubtype2('Never', 'Object*');
     isSubtype2('Never', 'dynamic');
     isSubtype2('Never', 'void');
-    isSubtype2('bottom', 'Object?');
-    isSubtype2('bottom', 'Object*');
-    isSubtype2('bottom', 'dynamic');
-    isSubtype2('bottom', 'void');
     isSubtype2('Null?', 'Object?');
     isSubtype2('Null?', 'Object*');
     isSubtype2('Null?', 'dynamic');
     isSubtype2('Null?', 'void');
 
     isNotSubtype2('Object?', 'Never');
-    isNotSubtype2('Object?', 'bottom');
     isNotSubtype2('Object?', 'Null?');
     isNotSubtype2('Object*', 'Never');
-    isNotSubtype2('Object*', 'bottom');
     isNotSubtype2('Object*', 'Null?');
     isNotSubtype2('dynamic', 'Never');
-    isNotSubtype2('dynamic', 'bottom');
     isNotSubtype2('dynamic', 'Null?');
     isNotSubtype2('void', 'Never');
-    isNotSubtype2('void', 'bottom');
     isNotSubtype2('void', 'Null?');
   }
 
+  test_multi_typeParameter_promotion() {
+    TypeParameterElement T;
+
+    T = typeParameter('T', bound: intStar);
+    isSubtype(
+      typeParameterTypeStar(T),
+      typeParameterTypeStar(
+        promoteTypeParameter(T, intStar),
+      ),
+      strT0: 'T*, T extends int*',
+      strT1: 'T*, T extends int*, T & int*',
+    );
+
+    T = typeParameter('T', bound: intNone);
+    isSubtype(
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      strT0: 'T, T extends int',
+      strT1: 'T, T extends int, T & int',
+    );
+    isNotSubtype(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      strT0: 'T?, T extends int',
+      strT1: 'T, T extends int, T & int',
+    );
+
+    T = typeParameter('T', bound: intQuestion);
+    isNotSubtype(
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intNone),
+      ),
+      strT0: 'T, T extends int?',
+      strT1: 'T, T extends int?, T & int',
+    );
+    isSubtype(
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intQuestion),
+      ),
+      strT0: 'T, T extends int?',
+      strT1: 'T, T extends int?, T & int?',
+    );
+    isNotSubtype(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeNone(
+        promoteTypeParameter(T, intQuestion),
+      ),
+      strT0: 'T?, T extends int?',
+      strT1: 'T, T extends int?, T & int?',
+    );
+
+    T = typeParameter('T', bound: numStar);
+    isSubtype(
+      typeParameterTypeStar(T),
+      typeParameterTypeStar(T),
+      strT0: 'T*, T extends num*',
+      strT1: 'T*, T extends num*',
+    );
+
+    T = typeParameter('T', bound: numNone);
+    isSubtype(
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(T),
+      strT0: 'T, T extends num',
+      strT1: 'T, T extends num',
+    );
+    isSubtype(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeQuestion(T),
+      strT0: 'T?, T extends num',
+      strT1: 'T?, T extends num',
+    );
+
+    T = typeParameter('T', bound: numQuestion);
+    isSubtype(
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(T),
+      strT0: 'T, T extends num?',
+      strT1: 'T, T extends num?',
+    );
+    isSubtype(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeQuestion(T),
+      strT0: 'T?, T extends num?',
+      strT1: 'T?, T extends num?',
+    );
+  }
+
   test_never_01() {
     isSubtype(
       neverNone,
@@ -3199,7 +3848,7 @@
         promoteTypeParameter(T, numStar),
       ),
       strT0: 'Never',
-      strT1: 'T*, T & num*',
+      strT1: 'T*, T extends Object*, T & num*',
     );
   }
 
@@ -3211,7 +3860,7 @@
         promoteTypeParameter(T, numStar),
       ),
       neverNone,
-      strT0: 'T*, T & num*',
+      strT0: 'T*, T extends Object*, T & num*',
       strT1: 'Never',
     );
   }
@@ -3222,7 +3871,7 @@
     isSubtype(
       typeParameterTypeNone(T),
       neverNone,
-      strT0: 'T',
+      strT0: 'T, T extends Never',
       strT1: 'Never',
     );
   }
@@ -3235,7 +3884,7 @@
         promoteTypeParameter(T, neverNone),
       ),
       neverNone,
-      strT0: 'T, T & Never',
+      strT0: 'T, T extends Object, T & Never',
       strT1: 'Never',
     );
   }
@@ -3247,7 +3896,7 @@
       neverNone,
       typeParameterTypeQuestion(T),
       strT0: 'Never',
-      strT1: 'T?',
+      strT1: 'T?, T extends Object',
     );
   }
 
@@ -3258,7 +3907,7 @@
       neverNone,
       typeParameterTypeQuestion(T),
       strT0: 'Never',
-      strT1: 'T?',
+      strT1: 'T?, T extends Object?',
     );
   }
 
@@ -3269,7 +3918,7 @@
       neverNone,
       typeParameterTypeNone(T),
       strT0: 'Never',
-      strT1: 'T',
+      strT1: 'T, T extends Object',
     );
   }
 
@@ -3280,7 +3929,7 @@
       neverNone,
       typeParameterTypeNone(T),
       strT0: 'Never',
-      strT1: 'T',
+      strT1: 'T, T extends Object?',
     );
   }
 
@@ -3290,7 +3939,7 @@
     isSubtype(
       typeParameterTypeNone(T),
       neverNone,
-      strT0: 'T',
+      strT0: 'T, T extends Never',
       strT1: 'Never',
     );
   }
@@ -3301,7 +3950,7 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       neverNone,
-      strT0: 'T',
+      strT0: 'T, T extends Never?',
       strT1: 'Never',
     );
   }
@@ -3312,7 +3961,7 @@
     isNotSubtype(
       typeParameterTypeQuestion(T),
       neverNone,
-      strT0: 'T?',
+      strT0: 'T?, T extends Never',
       strT1: 'Never',
     );
   }
@@ -3323,7 +3972,7 @@
     isNotSubtype(
       typeParameterTypeQuestion(T),
       neverNone,
-      strT0: 'T?',
+      strT0: 'T?, T extends Never?',
       strT1: 'Never',
     );
   }
@@ -3334,7 +3983,7 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       neverNone,
-      strT0: 'T',
+      strT0: 'T, T extends Object',
       strT1: 'Never',
     );
   }
@@ -3345,13 +3994,13 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       neverNone,
-      strT0: 'T',
+      strT0: 'T, T extends Object?',
       strT1: 'Never',
     );
   }
 
   test_never_29() {
-    isSubtype(bottomNone, nullQuestion, strT0: 'Never', strT1: 'Null?');
+    isSubtype(neverNone, nullQuestion, strT0: 'Never', strT1: 'Null?');
   }
 
   test_null_01() {
@@ -3424,7 +4073,7 @@
       nullQuestion,
       typeParameterTypeNone(T),
       strT0: 'Null?',
-      strT1: 'T',
+      strT1: 'T, T extends Object*',
     );
   }
 
@@ -3497,7 +4146,7 @@
         promoteTypeParameter(T, numStar),
       ),
       strT0: 'Null?',
-      strT1: 'T*, T & num*',
+      strT1: 'T*, T extends Object*, T & num*',
     );
   }
 
@@ -3510,7 +4159,7 @@
         promoteTypeParameter(T, numNone),
       ),
       strT0: 'Null?',
-      strT1: 'T, T & num',
+      strT1: 'T, T extends Object?, T & num',
     );
   }
 
@@ -3523,7 +4172,7 @@
         promoteTypeParameter(T, numQuestion),
       ),
       strT0: 'Null?',
-      strT1: 'T, T & num?',
+      strT1: 'T, T extends Object?, T & num?',
     );
   }
 
@@ -3536,7 +4185,7 @@
         promoteTypeParameter(T, numNone),
       ),
       strT0: 'Null?',
-      strT1: 'T, T & num',
+      strT1: 'T, T extends Object, T & num',
     );
   }
 
@@ -3553,7 +4202,7 @@
         ),
       ),
       strT0: 'Null?',
-      strT1: 'T, T & S',
+      strT1: 'T, T extends Object?, T & S',
     );
   }
 
@@ -3564,7 +4213,7 @@
       nullQuestion,
       typeParameterTypeQuestion(T),
       strT0: 'Null?',
-      strT1: 'T?',
+      strT1: 'T?, T extends Object',
     );
   }
 
@@ -3575,7 +4224,7 @@
       nullQuestion,
       typeParameterTypeQuestion(T),
       strT0: 'Null?',
-      strT1: 'T?',
+      strT1: 'T?, T extends Object?',
     );
   }
 
@@ -3586,7 +4235,7 @@
       nullQuestion,
       typeParameterTypeNone(T),
       strT0: 'Null?',
-      strT1: 'T',
+      strT1: 'T, T extends Object',
     );
   }
 
@@ -3597,7 +4246,7 @@
       nullQuestion,
       typeParameterTypeNone(T),
       strT0: 'Null?',
-      strT1: 'T',
+      strT1: 'T, T extends Object?',
     );
   }
 
@@ -3607,7 +4256,7 @@
     isSubtype(
       typeParameterTypeNone(T),
       nullQuestion,
-      strT0: 'T',
+      strT0: 'T, T extends Null?',
       strT1: 'Null?',
     );
   }
@@ -3618,7 +4267,7 @@
     isSubtype(
       typeParameterTypeQuestion(T),
       nullQuestion,
-      strT0: 'T?',
+      strT0: 'T?, T extends Null?',
       strT1: 'Null?',
     );
   }
@@ -3629,7 +4278,7 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       nullQuestion,
-      strT0: 'T',
+      strT0: 'T, T extends Object',
       strT1: 'Null?',
     );
   }
@@ -3640,7 +4289,7 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       nullQuestion,
-      strT0: 'T',
+      strT0: 'T, T extends Object?',
       strT1: 'Null?',
     );
   }
@@ -3779,8 +4428,8 @@
     isSubtype(
       type,
       type,
-      strT0: 'T, T & int?',
-      strT1: 'T, T & int?',
+      strT0: 'T, T extends Object*, T & int?',
+      strT1: 'T, T extends Object*, T & int?',
     );
   }
 
@@ -3792,8 +4441,8 @@
     isSubtype(
       type,
       type,
-      strT0: 'T?, T & int?',
-      strT1: 'T?, T & int?',
+      strT0: 'T?, T extends Object, T & int?',
+      strT1: 'T?, T extends Object, T & int?',
     );
   }
 
@@ -3952,8 +4601,8 @@
         ],
         returnType: voidNone,
       ),
-      strT0: 'void Function<S extends Object*,T extends void>(S, T)*',
-      strT1: 'void Function<U extends dynamic,V extends Object*>(U, V)*',
+      strT0: 'void Function<S extends Object*, T extends void>(S, T)*',
+      strT1: 'void Function<U extends dynamic, V extends Object*>(U, V)*',
     );
   }
 
@@ -4269,7 +4918,7 @@
       functionTypeStar(
         returnType: voidNone,
       ),
-      strT0: 'T*',
+      strT0: 'T*, T extends void Function()*',
       strT1: 'void Function()*',
     );
   }
@@ -4381,7 +5030,7 @@
         promoteTypeParameter(T, voidNone),
       ),
       strT0: 'void',
-      strT1: 'T, T & void',
+      strT1: 'T, T extends void, T & void',
     );
   }
 
@@ -4466,8 +5115,8 @@
         promoteTypeParameter(T, intStar),
       ),
       typeParameterTypeStar(T),
-      strT0: 'T*, T & int*',
-      strT1: 'T*',
+      strT0: 'T*, T extends int*, T & int*',
+      strT1: 'T*, T extends int*',
     );
   }
 
@@ -4479,8 +5128,8 @@
         promoteTypeParameter(T, intStar),
       ),
       typeParameterTypeStar(T),
-      strT0: 'T*, T & int*',
-      strT1: 'T*',
+      strT0: 'T*, T extends num*, T & int*',
+      strT1: 'T*, T extends num*',
     );
   }
 
@@ -4492,8 +5141,8 @@
         promoteTypeParameter(T, numStar),
       ),
       typeParameterTypeStar(T),
-      strT0: 'T*, T & num*',
-      strT1: 'T*',
+      strT0: 'T*, T extends num*, T & num*',
+      strT1: 'T*, T extends num*',
     );
   }
 
@@ -4505,8 +5154,8 @@
       typeParameterTypeStar(
         promoteTypeParameter(T, intStar),
       ),
-      strT0: 'T*',
-      strT1: 'T*, T & int*',
+      strT0: 'T*, T extends int*',
+      strT1: 'T*, T extends int*, T & int*',
     );
   }
 
@@ -4518,8 +5167,8 @@
       typeParameterTypeStar(
         promoteTypeParameter(T, numStar),
       ),
-      strT0: 'T*',
-      strT1: 'T*, T & num*',
+      strT0: 'T*, T extends int*',
+      strT1: 'T*, T extends int*, T & num*',
     );
   }
 
@@ -4531,8 +5180,8 @@
       typeParameterTypeStar(
         promoteTypeParameter(T, intStar),
       ),
-      strT0: 'T*',
-      strT1: 'T*, T & int*',
+      strT0: 'T*, T extends num*',
+      strT1: 'T*, T extends num*, T & int*',
     );
   }
 
@@ -4542,8 +5191,8 @@
     isSubtype(
       typeParameterTypeStar(T),
       typeParameterTypeStar(T),
-      strT0: 'T*',
-      strT1: 'T*',
+      strT0: 'T*, T extends num*',
+      strT1: 'T*, T extends num*',
     );
   }
 
@@ -4576,8 +5225,8 @@
     isSubtype(
       typeParameterTypeStar(T),
       typeParameterTypeStar(T),
-      strT0: 'T*',
-      strT1: 'T*',
+      strT0: 'T*, T extends Object*',
+      strT1: 'T*, T extends Object*',
     );
   }
 
@@ -4588,8 +5237,8 @@
     isNotSubtype(
       typeParameterTypeNone(S),
       typeParameterTypeNone(T),
-      strT0: 'S',
-      strT1: 'T',
+      strT0: 'S, S extends Object*',
+      strT1: 'T, T extends Object*',
     );
   }
 
@@ -4599,8 +5248,8 @@
     isSubtype(
       typeParameterTypeStar(T),
       typeParameterTypeStar(T),
-      strT0: 'T*',
-      strT1: 'T*',
+      strT0: 'T*, T extends dynamic',
+      strT1: 'T*, T extends dynamic',
     );
   }
 
@@ -4611,8 +5260,8 @@
     isNotSubtype(
       typeParameterTypeNone(S),
       typeParameterTypeNone(T),
-      strT0: 'S',
-      strT1: 'T',
+      strT0: 'S, S extends dynamic',
+      strT1: 'T, T extends dynamic',
     );
   }
 
@@ -4624,13 +5273,13 @@
       typeParameterTypeNone(S),
       typeParameterTypeNone(T),
       strT0: 'S',
-      strT1: 'T',
+      strT1: 'T, T extends S',
     );
 
     isSubtype(
       typeParameterTypeNone(T),
       typeParameterTypeNone(S),
-      strT0: 'T',
+      strT0: 'T, T extends S',
       strT1: 'S',
     );
   }
@@ -4723,7 +5372,7 @@
     isSubtype(
       typeParameterTypeStar(S),
       intStar,
-      strT0: 'S*',
+      strT0: 'S*, S extends int*',
       strT1: 'int*',
     );
   }
@@ -4734,7 +5383,7 @@
     isSubtype(
       typeParameterTypeStar(S),
       numStar,
-      strT0: 'S*',
+      strT0: 'S*, S extends int*',
       strT1: 'num*',
     );
   }
@@ -4745,7 +5394,7 @@
     isSubtype(
       typeParameterTypeStar(S),
       numStar,
-      strT0: 'S*',
+      strT0: 'S*, S extends num*',
       strT1: 'num*',
     );
   }
@@ -4756,7 +5405,7 @@
     isNotSubtype(
       typeParameterTypeStar(S),
       intStar,
-      strT0: 'S*',
+      strT0: 'S*, S extends num*',
       strT1: 'int*',
     );
   }
@@ -4768,7 +5417,7 @@
     isNotSubtype(
       typeParameterTypeStar(S),
       typeParameterTypeNone(T),
-      strT0: 'S*',
+      strT0: 'S*, S extends num*',
       strT1: 'T',
     );
   }
@@ -4782,7 +5431,7 @@
       typeParameterTypeNone(
         promoteTypeParameter(T, numStar),
       ),
-      strT0: 'S*',
+      strT0: 'S*, S extends num*',
       strT1: 'T, T & num*',
     );
   }
@@ -4796,7 +5445,7 @@
         promoteTypeParameter(T, dynamicNone),
       ),
       strT0: 'dynamic',
-      strT1: 'T, T & dynamic',
+      strT1: 'T, T extends dynamic, T & dynamic',
     );
   }
 
@@ -4854,7 +5503,7 @@
     isSubtype(
       typeParameterTypeNone(T),
       numNone,
-      strT0: 'T',
+      strT0: 'T, T extends num',
       strT1: 'num',
     );
   }
@@ -4866,9 +5515,24 @@
       promoteTypeParameter(T, numQuestion),
     );
 
-    isNotSubtype(type, numNone, strT0: 'T, T & num?', strT1: 'num');
-    isSubtype(type, numQuestion, strT0: 'T, T & num?', strT1: 'num?');
-    isSubtype(type, numStar, strT0: 'T, T & num?', strT1: 'num*');
+    isNotSubtype(
+      type,
+      numNone,
+      strT0: 'T, T extends Object?, T & num?',
+      strT1: 'num',
+    );
+    isSubtype(
+      type,
+      numQuestion,
+      strT0: 'T, T extends Object?, T & num?',
+      strT1: 'num?',
+    );
+    isSubtype(
+      type,
+      numStar,
+      strT0: 'T, T extends Object?, T & num?',
+      strT1: 'num*',
+    );
   }
 
   test_typeParameter_38() {
@@ -4877,7 +5541,7 @@
     isSubtype(
       typeParameterTypeStar(T),
       objectNone,
-      strT0: 'T*',
+      strT0: 'T*, T extends num*',
       strT1: 'Object',
     );
   }
@@ -4888,7 +5552,7 @@
     isSubtype(
       typeParameterTypeNone(T),
       objectNone,
-      strT0: 'T',
+      strT0: 'T, T extends num',
       strT1: 'Object',
     );
   }
@@ -4899,7 +5563,7 @@
     isNotSubtype(
       typeParameterTypeQuestion(T),
       objectNone,
-      strT0: 'T?',
+      strT0: 'T?, T extends num',
       strT1: 'Object',
     );
   }
@@ -4910,7 +5574,7 @@
     isNotSubtype(
       typeParameterTypeNone(T),
       objectNone,
-      strT0: 'T',
+      strT0: 'T, T extends num?',
       strT1: 'Object',
     );
   }
@@ -4921,24 +5585,11 @@
     isNotSubtype(
       typeParameterTypeQuestion(T),
       objectNone,
-      strT0: 'T?',
+      strT0: 'T?, T extends num?',
       strT1: 'Object',
     );
   }
 
-  TypeParameterTypeImpl typeParameterTypeNone(TypeParameterElement element) {
-    return element.instantiate(nullabilitySuffix: NullabilitySuffix.none);
-  }
-
-  TypeParameterTypeImpl typeParameterTypeQuestion(
-      TypeParameterElement element) {
-    return element.instantiate(nullabilitySuffix: NullabilitySuffix.question);
-  }
-
-  TypeParameterTypeImpl typeParameterTypeStar(TypeParameterElement element) {
-    return element.instantiate(nullabilitySuffix: NullabilitySuffix.star);
-  }
-
   void _defineType(String str, DartType type) {
     for (var key in _types.keys) {
       if (key == 'Never' || _typeStr(type) == 'Never') {
@@ -4957,11 +5608,13 @@
   }
 
   void _defineTypes() {
-    _defineType('bottom', bottomNone);
     _defineType('dynamic', dynamicNone);
     _defineType('void', voidNone);
+
     _defineType('Never', neverNone);
+    _defineType('Never*', neverStar);
     _defineType('Never?', neverQuestion);
+
     _defineType('Null?', nullQuestion);
 
     _defineType('Object', objectNone);
@@ -5023,12 +5676,29 @@
     _defineType('Function*', functionStar);
     _defineType('Function?', functionQuestion);
 
-    _defineType('FutureOr<int>', futureOrNone(intNone));
-    _defineType('FutureOr<int>*', futureOrStar(intNone));
-    _defineType('FutureOr<int>?', futureOrQuestion(intNone));
+    _defineType('FutureOr<Object*>*', futureOrStar(objectStar));
+    _defineType('FutureOr<num*>*', futureOrStar(numStar));
+    _defineType('FutureOr<int*>*', futureOrStar(intStar));
+    _defineType('FutureOr<num?>?', futureOrQuestion(numQuestion));
 
-    _defineType('FutureOr<int*>', futureOrNone(intStar));
+    _defineType('FutureOr<Object>', futureOrNone(objectNone));
+    _defineType('FutureOr<Object>?', futureOrQuestion(objectNone));
+    _defineType('FutureOr<Object?>', futureOrNone(objectQuestion));
+    _defineType('FutureOr<Object?>?', futureOrQuestion(objectQuestion));
+
+    _defineType('Future<num>', futureNone(numNone));
+    _defineType('Future<num>?', futureQuestion(numNone));
+    _defineType('Future<num?>', futureNone(numQuestion));
+    _defineType('Future<num?>?', futureQuestion(numQuestion));
+
+    _defineType('FutureOr<int>', futureOrNone(intNone));
+    _defineType('FutureOr<int>?', futureOrQuestion(intNone));
     _defineType('FutureOr<int?>', futureOrNone(intQuestion));
+    _defineType('FutureOr<int?>?', futureOrQuestion(intQuestion));
+
+    _defineType('FutureOr<int>*', futureOrStar(intNone));
+    _defineType('FutureOr<int*>', futureOrNone(intStar));
+    _defineType('Future<int*>*', futureStar(intStar));
 
     _defineType('FutureOr<num>', futureOrNone(numNone));
     _defineType('FutureOr<num>*', futureOrStar(numNone));
@@ -5064,6 +5734,53 @@
     );
 
     _defineType(
+      'Future<Future<num>>?',
+      futureQuestion(
+        futureNone(numNone),
+      ),
+    );
+    _defineType(
+      'Future<Future<num?>?>?',
+      futureQuestion(
+        futureQuestion(numQuestion),
+      ),
+    );
+
+    _defineType(
+      'Future<Future<Future<num>>>?',
+      futureQuestion(
+        futureNone(
+          futureNone(numNone),
+        ),
+      ),
+    );
+    _defineType(
+      'Future<Future<Future<num?>?>?>?',
+      futureQuestion(
+        futureQuestion(
+          futureQuestion(numQuestion),
+        ),
+      ),
+    );
+
+    _defineType(
+      'FutureOr<FutureOr<FutureOr<num>>?>',
+      futureOrNone(
+        futureOrQuestion(
+          futureOrNone(numNone),
+        ),
+      ),
+    );
+    _defineType(
+      'FutureOr<FutureOr<FutureOr<num?>>>',
+      futureOrNone(
+        futureOrNone(
+          futureOrNone(numQuestion),
+        ),
+      ),
+    );
+
+    _defineType(
       'int* Function()',
       functionTypeNone(
         returnType: intStar,
@@ -5083,6 +5800,28 @@
     );
 
     _defineType(
+      'num Function(num)',
+      functionTypeNone(
+        parameters: [requiredParameter(type: numNone)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num Function(num)?',
+      functionTypeQuestion(
+        parameters: [requiredParameter(type: numNone)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num Function(num)*',
+      functionTypeStar(
+        parameters: [requiredParameter(type: numNone)],
+        returnType: numNone,
+      ),
+    );
+
+    _defineType(
       'num* Function(num*)',
       functionTypeNone(
         parameters: [requiredParameter(type: numStar)],
@@ -5141,6 +5880,86 @@
         returnType: intStar,
       ),
     );
+
+    _defineType(
+      'num Function(num?)',
+      functionTypeNone(
+        parameters: [requiredParameter(type: numQuestion)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num? Function(num)',
+      functionTypeNone(
+        parameters: [requiredParameter(type: numNone)],
+        returnType: numQuestion,
+      ),
+    );
+    _defineType(
+      'num? Function(num?)',
+      functionTypeNone(
+        parameters: [requiredParameter(type: numQuestion)],
+        returnType: numQuestion,
+      ),
+    );
+
+    _defineType(
+      'num Function({num x})',
+      functionTypeNone(
+        parameters: [namedParameter(name: 'x', type: numNone)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num Function({num? x})',
+      functionTypeNone(
+        parameters: [namedParameter(name: 'x', type: numQuestion)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num? Function({num x})',
+      functionTypeNone(
+        parameters: [namedParameter(name: 'x', type: numNone)],
+        returnType: numQuestion,
+      ),
+    );
+    _defineType(
+      'num? Function({num? x})',
+      functionTypeNone(
+        parameters: [namedParameter(name: 'x', type: numQuestion)],
+        returnType: numQuestion,
+      ),
+    );
+
+    _defineType(
+      'num Function([num])',
+      functionTypeNone(
+        parameters: [positionalParameter(type: numNone)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num Function([num?])',
+      functionTypeNone(
+        parameters: [positionalParameter(type: numQuestion)],
+        returnType: numNone,
+      ),
+    );
+    _defineType(
+      'num? Function([num])',
+      functionTypeNone(
+        parameters: [positionalParameter(type: numNone)],
+        returnType: numQuestion,
+      ),
+    );
+    _defineType(
+      'num? Function([num?])',
+      functionTypeNone(
+        parameters: [positionalParameter(type: numQuestion)],
+        returnType: numQuestion,
+      ),
+    );
   }
 
   DartType _getTypeByStr(String str) {
@@ -5157,7 +5976,7 @@
 @reflectiveTest
 class SubtypingCompoundTest extends _SubtypingCompoundTestBase {
   test_bottom_isBottom() {
-    var equivalents = <DartType>[bottomStar];
+    var equivalents = <DartType>[neverStar];
 
     var supertypes = <DartType>[
       dynamicNone,
@@ -5170,7 +5989,7 @@
     ];
 
     _checkGroups(
-      bottomStar,
+      neverStar,
       equivalents: equivalents,
       supertypes: supertypes,
     );
@@ -5201,7 +6020,7 @@
       numStar,
       stringStar,
       functionStar,
-      bottomStar,
+      neverStar,
     ];
 
     _checkGroups(
@@ -5250,7 +6069,7 @@
       numStar,
       stringStar,
       functionStar,
-      bottomStar,
+      neverStar,
     ];
 
     _checkGroups(
@@ -5331,12 +6150,6 @@
 
   ClassElement _comparableElement;
 
-  BottomTypeImpl get bottomNone => BottomTypeImpl.instance;
-
-  BottomTypeImpl get bottomQuestion => BottomTypeImpl.instanceNullable;
-
-  BottomTypeImpl get bottomStar => BottomTypeImpl.instanceLegacy;
-
   ClassElement get comparableElement {
     return _comparableElement ??=
         typeProvider.intType.element.library.getType('Comparable');
@@ -5416,10 +6229,6 @@
     );
   }
 
-  BottomTypeImpl get neverNone => BottomTypeImpl.instance;
-
-  BottomTypeImpl get neverQuestion => BottomTypeImpl.instanceNullable;
-
   InterfaceType get nullNone {
     var element = typeProvider.nullType.element;
     return element.instantiate(
@@ -5492,6 +6301,22 @@
     );
   }
 
+  InterfaceType get stringNone {
+    var element = typeProvider.stringType.element;
+    return element.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  InterfaceType get stringQuestion {
+    var element = typeProvider.stringType.element;
+    return element.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
   InterfaceType get stringStar {
     var element = typeProvider.stringType.element;
     return element.instantiate(
@@ -5560,19 +6385,22 @@
 class _TypeParameterCollector extends DartTypeVisitor<void> {
   final Set<TypeParameterElement> typeParameters = Set();
 
+  /// We don't need to print bounds for these type parameters, because
+  /// they are already included into the function type itself, and cannot
+  /// be promoted.
+  final Set<TypeParameterElement> functionTypeParameters = Set();
+
   @override
   void defaultDartType(DartType type) {
     throw UnimplementedError('(${type.runtimeType}) $type');
   }
 
   @override
-  void visitBottomType(BottomTypeImpl type) {}
-
-  @override
   void visitDynamicType(DynamicTypeImpl type) {}
 
   @override
   void visitFunctionType(FunctionType type) {
+    functionTypeParameters.addAll(type.typeFormals);
     for (var typeParameter in type.typeFormals) {
       var bound = typeParameter.bound;
       if (bound != null) {
@@ -5593,8 +6421,13 @@
   }
 
   @override
+  void visitNeverType(NeverTypeImpl type) {}
+
+  @override
   void visitTypeParameterType(TypeParameterType type) {
-    typeParameters.add(type.element);
+    if (!functionTypeParameters.contains(type.element)) {
+      typeParameters.add(type.element);
+    }
   }
 
   @override
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index f24eff5..9cccdad 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -8,8 +8,10 @@
 import 'function_type_test.dart' as function_type;
 import 'inheritance_manager3_test.dart' as inheritance_manager3;
 import 'least_upper_bound_helper_test.dart' as least_upper_bound_helper;
+import 'nullability_eliminator_test.dart' as nullability_eliminator;
 import 'subtype_test.dart' as subtype;
 import 'type_algebra_test.dart' as type_algebra;
+import 'type_parameter_element_test.dart' as type_parameter_element;
 
 /// Utility for manually running all tests.
 main() {
@@ -18,7 +20,9 @@
     function_type.main();
     inheritance_manager3.main();
     least_upper_bound_helper.main();
+    nullability_eliminator.main();
     subtype.main();
     type_algebra.main();
+    type_parameter_element.main();
   }, name: 'element');
 }
diff --git a/pkg/analyzer/test/src/dart/element/type_algebra_test.dart b/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
index a1c1663..977b926 100644
--- a/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_algebra_test.dart
@@ -101,7 +101,7 @@
 
     var result = Substitution.fromUpperAndLowerBounds(
       {T: typeProvider.intType},
-      {T: BottomTypeImpl.instance},
+      {T: NeverTypeImpl.instance},
     ).substituteType(type);
     expect(result.toString(), 'int Function(Never)');
   }
@@ -200,13 +200,13 @@
 
     assertElementTypeString(
       type,
-      'bool Function<T extends Triple<T, U, V>,U>()',
+      'bool Function<T extends Triple<T, U, V>, U>()',
     );
 
     var result = substitute(type, {V: intType}) as FunctionType;
     assertElementTypeString(
       result,
-      'bool Function<T extends Triple<T, U, int>,U>()',
+      'bool Function<T extends Triple<T, U, int>, U>()',
     );
     var T2 = result.typeFormals[0];
     var U2 = result.typeFormals[1];
@@ -387,8 +387,9 @@
   final bool useNnbd;
 
   _Base({this.useNnbd = false})
-      : typeProvider = TestTypeProvider(null, null,
-            useNnbd ? NullabilitySuffix.none : NullabilitySuffix.question);
+      : typeProvider = TestTypeProvider(
+            nullabilitySuffix:
+                useNnbd ? NullabilitySuffix.none : NullabilitySuffix.question);
 
   InterfaceType get boolType => typeProvider.boolType;
 
diff --git a/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
new file mode 100644
index 0000000..707e370
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'element_test.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(TypeParameterElementTest);
+    defineReflectiveTests(TypeParameterTypeTest);
+  });
+}
+
+@reflectiveTest
+class TypeParameterElementTest extends _TypeParameterElementBase {
+  test_equal_elementElement_sameLocation() {
+    var T1 = typeParameter('T');
+    var T2 = typeParameter('T');
+    var U = typeParameter('U');
+
+    _setEnclosingElement(T1);
+    _setEnclosingElement(T2);
+    _setEnclosingElement(U);
+
+    expect(T1 == T1, isTrue);
+    expect(T2 == T2, isTrue);
+    expect(U == U, isTrue);
+
+    expect(T1 == T2, isTrue);
+    expect(T2 == T1, isTrue);
+
+    expect(U == T1, isFalse);
+    expect(T1 == U, isFalse);
+  }
+
+  test_equal_elementElement_synthetic() {
+    var T1 = typeParameter('T');
+    var T2 = typeParameter('T');
+    expect(T1 == T1, isTrue);
+    expect(T2 == T2, isTrue);
+    expect(T1 == T2, isFalse);
+    expect(T2 == T1, isFalse);
+  }
+
+  test_equal_elementMember_sameBase_differentBounds() {
+    var T = typeParameter('T');
+    _setEnclosingElement(T);
+
+    var M = TypeParameterMember(T, null, typeProvider.intType);
+
+    expect(_equal(T, M), isTrue);
+    expect(_equal(M, T), isTrue);
+  }
+
+  test_equal_elementMember_sameBase_equalBounds() {
+    var T = typeParameter('T', bound: typeProvider.intType);
+    _setEnclosingElement(T);
+
+    var M = TypeParameterMember(T, null, typeProvider.intType);
+
+    expect(_equal(T, M), isTrue);
+    expect(_equal(M, T), isTrue);
+  }
+
+  test_equal_memberMember_differentBase() {
+    var T1 = typeParameter('T1');
+    var T2 = typeParameter('T2');
+
+    _setEnclosingElement(T1);
+    _setEnclosingElement(T2);
+
+    var M1 = TypeParameterMember(T1, null, typeProvider.numType);
+    var M2 = TypeParameterMember(T2, null, typeProvider.numType);
+
+    expect(M1 == M2, isFalse);
+  }
+
+  test_equal_memberMember_sameBase_differentBounds() {
+    var T = typeParameter('T');
+    _setEnclosingElement(T);
+
+    var M1 = TypeParameterMember(T, null, typeProvider.intType);
+    var M2 = TypeParameterMember(T, null, typeProvider.doubleType);
+
+    expect(M1 == M2, isTrue);
+  }
+
+  test_equal_memberMember_sameBase_equalBounds() {
+    var T = typeParameter('T');
+    _setEnclosingElement(T);
+
+    var M1 = TypeParameterMember(T, null, typeProvider.numType);
+    var M2 = TypeParameterMember(T, null, typeProvider.numType);
+
+    expect(M1 == M2, isTrue);
+    expect(M2 == M1, isTrue);
+  }
+
+  /// We use this method to work around the lint for using `==` for values
+  /// that are not of the same type.
+  static bool _equal(a, b) {
+    return a == b;
+  }
+}
+
+@reflectiveTest
+class TypeParameterTypeTest extends _TypeParameterElementBase {
+  test_equal_equalElements() {
+    var T1 = typeParameter('T');
+    var T2 = typeParameter('T');
+
+    _setEnclosingElement(T1);
+    _setEnclosingElement(T2);
+
+    expect(typeParameterTypeNone(T1) == typeParameterTypeNone(T2), isTrue);
+    expect(typeParameterTypeNone(T2) == typeParameterTypeNone(T1), isTrue);
+
+    expect(typeParameterTypeNone(T1) == typeParameterTypeStar(T2), isFalse);
+    expect(typeParameterTypeStar(T1) == typeParameterTypeNone(T2), isFalse);
+  }
+
+  test_equal_sameElement_differentBounds() {
+    var T = typeParameter('T');
+    _setEnclosingElement(T);
+
+    var T1 = TypeParameterMember(T, null, typeProvider.intType);
+    var T2 = TypeParameterMember(T, null, typeProvider.doubleType);
+
+    expect(typeParameterTypeNone(T1) == typeParameterTypeNone(T1), isTrue);
+
+    expect(typeParameterTypeNone(T1) == typeParameterTypeNone(T2), isFalse);
+    expect(typeParameterTypeNone(T2) == typeParameterTypeNone(T1), isFalse);
+
+    expect(typeParameterTypeNone(T1) == typeParameterTypeNone(T), isFalse);
+    expect(typeParameterTypeNone(T) == typeParameterTypeNone(T1), isFalse);
+  }
+
+  test_equal_sameElements() {
+    var T = typeParameter('T');
+
+    expect(typeParameterTypeNone(T) == typeParameterTypeNone(T), isTrue);
+    expect(typeParameterTypeNone(T) == typeParameterTypeStar(T), isFalse);
+    expect(typeParameterTypeNone(T) == typeParameterTypeQuestion(T), isFalse);
+
+    expect(typeParameterTypeStar(T) == typeParameterTypeNone(T), isFalse);
+    expect(typeParameterTypeStar(T) == typeParameterTypeStar(T), isTrue);
+    expect(typeParameterTypeNone(T) == typeParameterTypeQuestion(T), isFalse);
+
+    expect(
+      typeParameterTypeQuestion(T) == typeParameterTypeNone(T),
+      isFalse,
+    );
+    expect(
+      typeParameterTypeQuestion(T) == typeParameterTypeStar(T),
+      isFalse,
+    );
+    expect(
+      typeParameterTypeQuestion(T) == typeParameterTypeQuestion(T),
+      isTrue,
+    );
+  }
+}
+
+class _TypeParameterElementBase extends AbstractTypeTest {
+  /// Ensure that the [element] has a location.
+  void _setEnclosingElement(TypeParameterElementImpl element) {
+    element.enclosingElement = method('foo', typeProvider.voidType);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/constructor_test.dart b/pkg/analyzer/test/src/dart/resolution/constructor_test.dart
index db7428a..984e3bd 100644
--- a/pkg/analyzer/test/src/dart/resolution/constructor_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constructor_test.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.
 
+import 'package:analyzer/dart/element/type.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'driver_resolution.dart';
@@ -14,14 +15,33 @@
 
 @reflectiveTest
 class ConstructorResolutionTest extends DriverResolutionTest {
-  test_initializer_field_functionExpression_expressionBody() async {
-    await resolveTestCode(r'''
-class C {
-  final int x;
-  C(int a) : x = (() => a + 1)();
+  test_factory_redirect_generic_instantiated() async {
+    await assertNoErrorsInCode(r'''
+class A<T> implements B<T> {
+  A(T a);
 }
+class B<U> {
+  factory B(U a) = A<U>;
+}
+
+B<int> b;
 ''');
-    assertElement(findNode.simple('a + 1'), findElement.parameter('a'));
+    var classB_constructor = findElement.class_('B').unnamedConstructor;
+    assertMember2(
+      classB_constructor.redirectedConstructor,
+      findElement.unnamedConstructor('A'),
+      {'T': 'U'},
+    );
+
+    InterfaceType B_int = findElement.topVar('b').type;
+    var B_int_constructor = B_int.constructors.single;
+    var B_int_redirect = B_int_constructor.redirectedConstructor;
+    assertMember2(
+      B_int_redirect,
+      findElement.unnamedConstructor('A'),
+      {'T': 'int'},
+    );
+    assertElementTypeString(B_int_redirect.returnType, 'A<int>');
   }
 
   test_initializer_field_functionExpression_blockBody() async {
@@ -33,4 +53,14 @@
 ''');
     assertElement(findNode.simple('a + 1'), findElement.parameter('a'));
   }
+
+  test_initializer_field_functionExpression_expressionBody() async {
+    await resolveTestCode(r'''
+class C {
+  final int x;
+  C(int a) : x = (() => a + 1)();
+}
+''');
+    assertElement(findNode.simple('a + 1'), findElement.parameter('a'));
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 00fd73a..a095591 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -302,15 +302,13 @@
   int get a => 1;
 }
 ''');
-    await assertErrorsInCode('''
+    await assertNoErrorsInCode('''
 import 'lib.dart' as p;
 
 f(p.C c) {
   c.a;
 }
-''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
-    ]);
+''');
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 9f09f96..efd4af8 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -22,10 +22,10 @@
 
 import '../../../generated/test_support.dart';
 
-final isBottomType = new TypeMatcher<BottomTypeImpl>();
-
 final isDynamicType = new TypeMatcher<DynamicTypeImpl>();
 
+final isNeverType = new TypeMatcher<NeverTypeImpl>();
+
 final isVoidType = new TypeMatcher<VoidTypeImpl>();
 
 /// Base for resolution tests.
@@ -82,7 +82,7 @@
   ) {
     var actual = getNodeAuxElements(node)?.staticElement as ExecutableMember;
 
-    expect(actual.baseElement, same(expectedBase));
+    expect(actual.declaration, same(expectedBase));
 
     var actualMapString = actual.substitution.map.map(
       (k, v) => MapEntry(k.name, '$v'),
@@ -103,7 +103,7 @@
   void assertConstructorElement(
       ConstructorElement expected, ConstructorElement actual) {
     if (expected is ConstructorMember && actual is ConstructorMember) {
-      expect(expected.baseElement, same(actual.baseElement));
+      expect(expected.declaration, same(actual.declaration));
       // TODO(brianwilkerson) Compare the type arguments of the two members.
     } else {
       expect(expected, same(actual));
@@ -296,8 +296,16 @@
     Map<String, String> expectedSubstitution,
   ) {
     Member actual = getNodeElement(node);
+    assertMember2(actual, expectedBase, expectedSubstitution);
+  }
 
-    expect(actual.baseElement, same(expectedBase));
+  void assertMember2(
+    Element actualElement,
+    Element expectedBase,
+    Map<String, String> expectedSubstitution,
+  ) {
+    var actual = actualElement as Member;
+    expect(actual.declaration, same(expectedBase));
 
     var actualMapString = actual.substitution.map.map(
       (k, v) => MapEntry(k.name, '$v'),
@@ -318,12 +326,7 @@
 
     // TODO(scheglov) Check for Member.
     var element = invocation.methodName.staticElement;
-    if (element is Member) {
-      element = (element as Member).baseElement;
-      expect(element, same(expectedElement));
-    } else {
-      assertElement(invocation.methodName, expectedElement);
-    }
+    expect(element?.declaration, same(expectedElement));
 
     // TODO(scheglov) Should we enforce this?
 //    if (expectedNameType == null) {
diff --git a/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
index b85f38b..1dfbedd 100644
--- a/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
@@ -34,7 +34,7 @@
   test_nullableUnit_expressionStaticType_bottom() async {
     var identifier = AstTestFactory.identifier3('foo');
     var unit = _wrapExpression(identifier);
-    identifier.staticType = BottomTypeImpl.instance;
+    identifier.staticType = NeverTypeImpl.instance;
     expect(() {
       LegacyTypeAsserter.assertLegacyTypes(unit);
     }, throwsStateError);
@@ -43,7 +43,7 @@
   test_nullableUnit_expressionStaticType_bottomQuestion() async {
     var identifier = AstTestFactory.identifier3('foo');
     var unit = _wrapExpression(identifier);
-    identifier.staticType = BottomTypeImpl.instanceNullable;
+    identifier.staticType = NeverTypeImpl.instanceNullable;
     LegacyTypeAsserter.assertLegacyTypes(unit);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
index 2a9c670..873f765 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
@@ -2,7 +2,9 @@
 // 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.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,19 +12,104 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AmbiguousSetOrMapLiteralBothTest);
+    defineReflectiveTests(AmbiguousSetOrMapLiteralBothWithNnbdTest);
     defineReflectiveTests(AmbiguousSetOrMapLiteralEitherTest);
+    defineReflectiveTests(AmbiguousSetOrMapLiteralEitherWithNnbdTest);
   });
 }
 
 @reflectiveTest
 class AmbiguousSetOrMapLiteralBothTest extends DriverResolutionTest {
+  test_map() async {
+    await assertNoErrorsInCode('''
+f(Map<int, int> map) {
+  return {...map};
+}
+''');
+  }
+
+  test_map_dynamic() async {
+    await assertNoErrorsInCode('''
+f(Map map) {
+  return {...map};
+}
+''');
+  }
+
+  test_set() async {
+    await assertNoErrorsInCode('''
+f(Set<int> set) {
+  return {...set};
+}
+''');
+  }
+
+  test_set_dynamic() async {
+    await assertNoErrorsInCode('''
+f(Set set) {
+  return {...set};
+}
+''');
+  }
+
   test_setAndMap() async {
     await assertErrorsInCode('''
-Map<int, int> map;
-Set<int> set;
-var c = {...set, ...map};
+f(Map<int, int> map, Set<int> set) {
+  return {...set, ...map};
+}
 ''', [
-      error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 41, 16),
+      error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 46, 16),
+    ]);
+  }
+}
+
+@reflectiveTest
+class AmbiguousSetOrMapLiteralBothWithNnbdTest
+    extends AmbiguousSetOrMapLiteralBothTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
+
+  test_map_keyNonNullable_valueNullable() async {
+    await assertNoErrorsInCode('''
+f(Map<int, int?> map) {
+  return {...map};
+}
+''');
+  }
+
+  test_map_keyNullable_valueNonNullable() async {
+    await assertNoErrorsInCode('''
+f(Map<int?, int> map) {
+  return {...map};
+}
+''');
+  }
+
+  test_map_keyNullable_valueNullable() async {
+    await assertNoErrorsInCode('''
+f(Map<int?, int?> map) {
+  return {...map};
+}
+''');
+  }
+
+  test_set_elementNullable() async {
+    await assertNoErrorsInCode('''
+f(Set<int?> set) {
+  return {...set};
+}
+''');
+  }
+
+  test_setAndMap_nullable() async {
+    await assertErrorsInCode('''
+f(Map<int?, int> map, Set<int?> set) {
+  return {...set, ...map};
+}
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 48, 16),
     ]);
   }
 }
@@ -48,3 +135,12 @@
     ]);
   }
 }
+
+@reflectiveTest
+class AmbiguousSetOrMapLiteralEitherWithNnbdTest
+    extends AmbiguousSetOrMapLiteralEitherTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
+}
diff --git a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
index 5e19d96..0ed9acc 100644
--- a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
@@ -51,6 +51,9 @@
 ''');
   }
 
+  @FailingTest(
+    reason: 'The type of the parameterElement for `3` is non-nullable',
+  )
   test_optOut() async {
     await assertNoErrorsInCode('''
 // @dart = 2.2
diff --git a/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart b/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart
new file mode 100644
index 0000000..39ae942
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeferredImportOfExtensionTest);
+  });
+}
+
+@reflectiveTest
+class DeferredImportOfExtensionTest extends DriverResolutionTest {
+  test_deferredImport_withExtensions() {
+    newFile('/test/lib/foo.dart', content: '''
+extension E on C {}
+class C {}
+''');
+    assertErrorsInCode('''
+import 'foo.dart' deferred as foo;
+
+void f() {
+  foo.C();
+}
+''', [
+      error(CompileTimeErrorCode.DEFERRED_IMPORT_OF_EXTENSION, 7, 10),
+    ]);
+  }
+
+  test_deferredImport_withHiddenExtensions() {
+    newFile('/test/lib/foo.dart', content: '''
+extension E on C {}
+class C {}
+''');
+    assertNoErrorsInCode('''
+import 'foo.dart' deferred as foo hide E;
+
+void f() {
+  foo.C();
+}
+''');
+  }
+
+  test_deferredImport_withoutExtensions() {
+    newFile('/test/lib/foo.dart', content: '''
+class C {}
+''');
+    assertNoErrorsInCode('''
+import 'foo.dart' deferred as foo;
+
+void f() {
+  foo.C();
+}
+''');
+  }
+
+  test_deferredImport_withShownNonExtensions() {
+    newFile('/test/lib/foo.dart', content: '''
+extension E on C {}
+class C {}
+''');
+    assertNoErrorsInCode('''
+import 'foo.dart' deferred as foo show C;
+
+void f() {
+  foo.C();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index e6cf43b..0c5caf1 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -518,6 +518,38 @@
 ''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
   }
 
+  test_fieldGet_implicitGetter() async {
+    resetWithFooLibrary(r'''
+class A {
+  @Deprecated('0.9')
+  bool bob = true;
+}
+''');
+
+    newPubPackage('/pkg1');
+    await assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+void main() { var b = A().bob; }
+''', [HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE],
+        sourceName: '/pkg1/lib/lib1.dart');
+  }
+
+  test_fieldSet_implicitSetter() async {
+    resetWithFooLibrary(r'''
+class A {
+  @Deprecated('0.9')
+  bool bob = true;
+}
+''');
+
+    newPubPackage('/pkg1');
+    await assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+void main() { A().bob = false; }
+''', [HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE],
+        sourceName: '/pkg1/lib/lib1.dart');
+  }
+
   test_gnWorkspace() async {
     resetWithFooLibrary(r'''
 @deprecated
@@ -602,7 +634,7 @@
 ''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
   }
 
-  test_methodInvocation_contructor() async {
+  test_methodInvocation_constructor() async {
     resetWithFooLibrary(r'''
 class A {
   @Deprecated('0.9')
@@ -634,4 +666,20 @@
         [HintCode.DEPRECATED_MEMBER_USE],
         sourceName: '/workspace/package/lib/lib1.dart');
   }
+
+  test_setterInvocation_constructor() async {
+    resetWithFooLibrary(r'''
+class A {
+  @Deprecated('0.9')
+  set bob(bool b) { }
+}
+''');
+
+    newPubPackage('/pkg1');
+    await assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+void main() { A().bob = false; }
+''', [HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE],
+        sourceName: '/pkg1/lib/lib1.dart');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart
new file mode 100644
index 0000000..4b6905f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtendsDisallowedClassTest);
+  });
+}
+
+@reflectiveTest
+class ExtendsDisallowedClassTest extends DriverResolutionTest {
+  test_class_bool() async {
+    await assertErrorsInCode('''
+class A extends bool {}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 4),
+    ]);
+  }
+
+  test_class_double() async {
+    await assertErrorsInCode('''
+class A extends double {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 6),
+    ]);
+  }
+
+  test_class_FutureOr() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A extends FutureOr {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 37, 8),
+    ]);
+  }
+
+  test_class_FutureOr_typeArgument() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A extends FutureOr<int> {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 37, 13),
+    ]);
+  }
+
+  test_class_FutureOr_typeVariable() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A<T> extends FutureOr<T> {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 40, 11),
+    ]);
+  }
+
+  test_class_int() async {
+    await assertErrorsInCode('''
+class A extends int {}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 3),
+    ]);
+  }
+
+  test_class_Null() async {
+    await assertErrorsInCode('''
+class A extends Null {}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 4),
+    ]);
+  }
+
+  test_class_num() async {
+    await assertErrorsInCode('''
+class A extends num {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 3),
+    ]);
+  }
+
+  test_class_String() async {
+    await assertErrorsInCode('''
+class A extends String {}
+''', [
+      error(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 6, 1),
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 16, 6),
+    ]);
+  }
+
+  test_classTypeAlias_bool() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = bool with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 4),
+    ]);
+  }
+
+  test_classTypeAlias_double() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = double with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 6),
+    ]);
+  }
+
+  test_classTypeAlias_FutureOr() async {
+    await assertErrorsInCode(r'''
+import 'dart:async';
+class M {}
+class C = FutureOr with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 42, 8),
+    ]);
+  }
+
+  test_classTypeAlias_int() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = int with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 3),
+    ]);
+  }
+
+  test_classTypeAlias_Null() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = Null with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 4),
+    ]);
+  }
+
+  test_classTypeAlias_num() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = num with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 3),
+    ]);
+  }
+
+  test_classTypeAlias_String() async {
+    await assertErrorsInCode(r'''
+class M {}
+class C = String with M;
+''', [
+      error(CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, 21, 6),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
new file mode 100644
index 0000000..f106f37
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImplementsDisallowedClassTest);
+  });
+}
+
+@reflectiveTest
+class ImplementsDisallowedClassTest extends DriverResolutionTest {
+  test_class_bool() async {
+    await assertErrorsInCode('''
+class A implements bool {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 4),
+    ]);
+  }
+
+  test_class_double() async {
+    await assertErrorsInCode('''
+class A implements double {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
+    ]);
+  }
+
+  test_class_FutureOr() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A implements FutureOr {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 40, 8),
+    ]);
+  }
+
+  test_class_FutureOr_typeArgument() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A implements FutureOr<int> {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 40, 13),
+    ]);
+  }
+
+  test_class_FutureOr_typeVariable() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A<T> implements FutureOr<T> {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 43, 11),
+    ]);
+  }
+
+  test_class_int() async {
+    await assertErrorsInCode('''
+class A implements int {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
+    ]);
+  }
+
+  test_class_Null() async {
+    await assertErrorsInCode('''
+class A implements Null {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 4),
+    ]);
+  }
+
+  test_class_num() async {
+    await assertErrorsInCode('''
+class A implements num {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
+    ]);
+  }
+
+  test_class_String() async {
+    await assertErrorsInCode('''
+class A implements String {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
+    ]);
+  }
+
+  test_class_String_num() async {
+    await assertErrorsInCode('''
+class A implements String, num {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 6),
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 27, 3),
+    ]);
+  }
+
+  test_classTypeAlias_bool() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements bool;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 4),
+    ]);
+  }
+
+  test_classTypeAlias_double() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements double;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
+    ]);
+  }
+
+  test_classTypeAlias_FutureOr() async {
+    await assertErrorsInCode(r'''
+import 'dart:async';
+class A {}
+class M {}
+class C = A with M implements FutureOr;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 73, 8),
+    ]);
+  }
+
+  test_classTypeAlias_int() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements int;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 3),
+    ]);
+  }
+
+  test_classTypeAlias_Null() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements Null;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 4),
+    ]);
+  }
+
+  test_classTypeAlias_num() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements num;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 3),
+    ]);
+  }
+
+  test_classTypeAlias_String() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements String;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
+    ]);
+  }
+
+  test_classTypeAlias_String_num() async {
+    await assertErrorsInCode(r'''
+class A {}
+class M {}
+class C = A with M implements String, num;
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 52, 6),
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 60, 3),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/inference_failure_on_function_return_type_test.dart b/pkg/analyzer/test/src/diagnostics/inference_failure_on_function_return_type_test.dart
index f8fe9c5..c04d1b0 100644
--- a/pkg/analyzer/test/src/diagnostics/inference_failure_on_function_return_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inference_failure_on_function_return_type_test.dart
@@ -190,6 +190,12 @@
 ''', [error(HintCode.INFERENCE_FAILURE_ON_FUNCTION_RETURN_TYPE, 12, 9)]);
   }
 
+  test_setter_topLevel() async {
+    await assertNoErrorsInCode(r'''
+set f(int x) => print(x);
+''');
+  }
+
   test_topLevelArrowFunction() async {
     await assertErrorsInCode(r'''
 f() => 7;
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index 397fc3f..35f8b17 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -34,7 +34,32 @@
 ''');
   }
 
-  test_constructor() async {
+  test_unnamedConstructor() async {
+    addAngularMetaPackage();
+    newFile('/lib1.dart', content: r'''
+import 'package:angular_meta/angular_meta.dart';
+class A {
+  int _x;
+
+  @visibleForTemplate
+  A(this._x);
+}
+''');
+    newFile('/lib2.dart', content: r'''
+import 'lib1.dart';
+
+void main() {
+  new A(0);
+}
+''');
+
+    await _resolveTestFile('/lib1.dart');
+    await _resolveTestFile('/lib2.dart');
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
+  }
+
+  test_namedConstructor() async {
     addAngularMetaPackage();
     newFile('/lib1.dart', content: r'''
 import 'package:angular_meta/angular_meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
index d61d928..97e5d82 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
@@ -25,7 +25,31 @@
     ..contextFeatures = new FeatureSet.forTesting(
         sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
 
-  test_constructor() async {
+  test_unnamedConstructor() async {
+    addMetaPackage();
+    newFile('/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+class A {
+  int _x;
+
+  @visibleForTesting
+  A(this._x);
+}
+''');
+    newFile('/lib2.dart', content: r'''
+import 'lib1.dart';
+void main() {
+  new A(0);
+}
+''');
+
+    await _resolveTestFile('/lib1.dart');
+    await _resolveTestFile('/lib2.dart');
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+  }
+
+  test_namedConstructor() async {
     addMetaPackage();
     newFile('/lib1.dart', content: r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_of_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_of_disallowed_class_test.dart
new file mode 100644
index 0000000..b22ce50
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_of_disallowed_class_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinOfDisallowedClassTest);
+  });
+}
+
+@reflectiveTest
+class MixinOfDisallowedClassTest extends DriverResolutionTest {
+  test_class_bool() async {
+    await assertErrorsInCode('''
+class A extends Object with bool {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
+    ]);
+  }
+
+  test_class_double() async {
+    await assertErrorsInCode('''
+class A extends Object with double {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
+    ]);
+  }
+
+  test_class_FutureOr() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A extends Object with FutureOr {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 49, 8),
+    ]);
+  }
+
+  test_class_FutureOr_typeArgument() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A extends Object with FutureOr<int> {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 49, 13),
+    ]);
+  }
+
+  test_class_FutureOr_typeVariable() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+class A<T> extends Object with FutureOr<T> {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 52, 11),
+    ]);
+  }
+
+  test_class_int() async {
+    await assertErrorsInCode('''
+class A extends Object with int {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
+    ]);
+  }
+
+  test_class_Null() async {
+    await assertErrorsInCode('''
+class A extends Object with Null {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
+    ]);
+  }
+
+  test_class_num() async {
+    await assertErrorsInCode('''
+class A extends Object with num {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
+    ]);
+  }
+
+  test_class_String() async {
+    await assertErrorsInCode('''
+class A extends Object with String {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
+    ]);
+  }
+
+  test_classTypeAlias_bool() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with bool;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
+    ]);
+  }
+
+  test_classTypeAlias_double() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with double;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
+    ]);
+  }
+
+  test_classTypeAlias_FutureOr() async {
+    await assertErrorsInCode(r'''
+import 'dart:async';
+class A {}
+class C = A with FutureOr;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 49, 8),
+    ]);
+  }
+
+  test_classTypeAlias_int() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with int;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
+    ]);
+  }
+
+  test_classTypeAlias_Null() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with Null;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 4),
+    ]);
+  }
+
+  test_classTypeAlias_num() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with num;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 3),
+    ]);
+  }
+
+  test_classTypeAlias_String() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with String;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
+    ]);
+  }
+
+  test_classTypeAlias_String_num() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C = A with String, num;
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 28, 6),
+      error(CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, 36, 3),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index f7fe172..d003c07 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -51,6 +51,7 @@
     as default_list_constructor_mismatch;
 import 'default_value_on_required_parameter_test.dart'
     as default_value_on_required_paramter;
+import 'deferred_import_of_extension_test.dart' as deferred_import_of_extension;
 import 'deprecated_extends_function_test.dart' as deprecated_extends_function;
 import 'deprecated_function_class_declaration_test.dart'
     as deprecated_function_class_declaration;
@@ -67,6 +68,7 @@
 import 'export_suplicated_library_named_test.dart'
     as export_suplicated_library_named;
 import 'expression_in_map_test.dart' as expression_in_map;
+import 'extends_disallowed_class_test.dart' as extends_disallowed_class;
 import 'extends_non_class_test.dart' as extends_non_class;
 import 'extension_as_expression_test.dart' as extension_as_expression;
 import 'extension_conflicting_static_and_instance_test.dart'
@@ -106,6 +108,7 @@
 import 'generic_struct_subclass_test.dart' as generic_struct_subclass;
 import 'if_element_condition_from_deferred_library_test.dart'
     as if_element_condition_from_deferred_library;
+import 'implements_disallowed_class_test.dart' as implements_disallowed_class;
 import 'implements_non_class_test.dart' as implements_non_class;
 import 'implicit_this_reference_in_initializer_test.dart'
     as implicit_this_reference_in_initializer;
@@ -191,6 +194,7 @@
 import 'missing_required_param_test.dart' as missing_required_param;
 import 'missing_return_test.dart' as missing_return;
 import 'mixed_return_types_test.dart' as mixed_return_types;
+import 'mixin_of_disallowed_class_test.dart' as mixin_of_disallowed_class;
 import 'mixin_of_non_class_test.dart' as mixin_of_non_class;
 import 'mixin_on_sealed_class_test.dart' as mixin_on_sealed_class;
 import 'mixin_super_class_constraint_non_interface_test.dart'
@@ -397,6 +401,7 @@
     dead_code.main();
     default_list_constructor_mismatch.main();
     default_value_on_required_paramter.main();
+    deferred_import_of_extension.main();
     deprecated_extends_function.main();
     deprecated_function_class_declaration.main();
     deprecated_member_use.main();
@@ -411,6 +416,7 @@
     equal_keys_in_const_map.main();
     export_suplicated_library_named.main();
     expression_in_map.main();
+    extends_disallowed_class.main();
     extends_non_class.main();
     extension_as_expression.main();
     extension_conflicting_static_and_instance.main();
@@ -434,6 +440,7 @@
     final_not_initialized.main();
     generic_struct_subclass.main();
     if_element_condition_from_deferred_library.main();
+    implements_disallowed_class.main();
     implements_non_class.main();
     implicit_this_reference_in_initializer.main();
     import_deferred_library_with_load_function.main();
@@ -491,6 +498,7 @@
     missing_required_param.main();
     missing_return.main();
     mixed_return_types.main();
+    mixin_of_disallowed_class.main();
     mixin_of_non_class.main();
     mixin_on_sealed_class.main();
     mixin_super_class_constraint_non_interface.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart
index 4dffd2a..a80bc83 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart
@@ -70,6 +70,25 @@
     ]);
   }
 
+  test_override_undefined_hasGetterAndNonExtensionSetter() async {
+    await assertErrorsInCode('''
+class C {
+  int get id => 0;
+  void set id(int v) {}
+}
+
+extension Ext on C {
+  int get id => 1;
+}
+
+f(C c) {
+  Ext(c).id++;
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER, 117, 2),
+    ]);
+  }
+
   test_static_undefined() async {
     await assertErrorsInCode('''
 extension E on int {}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 1ab09c0..8ecf7ea 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -285,6 +285,7 @@
     writeIf(e.isExternal, 'external ');
     writeIf(e.isConst, 'const ');
     writeIf(e.isFactory, 'factory ');
+    expect(e.isAbstract, isFalse);
 
     buffer.write(e.enclosingElement.name);
     if (e.name.isNotEmpty) {
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index faa8571..ed41fb1 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1689,7 +1689,7 @@
     } else if (element is Member) {
       _sink.writeln(_nameOfMemberClass(element));
       _withIndent(() {
-        _writeElement('base', element.baseElement);
+        _writeElement('base', element.declaration);
         _writelnWithIndent('substitution: ${element.substitution.map}');
       });
     } else {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 618e653..f9edcbf 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.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.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
@@ -31,10 +32,21 @@
 class ResynthesizeAst2Test extends ResynthesizeTestStrategyTwoPhase
     with ResynthesizeTestCases {
   /// The shared SDK bundle, computed once and shared among test invocations.
-  static LinkedNodeBundle _sdkBundle;
+  static LinkedNodeBundle _sdkBundleNnbd;
+
+  /// The shared SDK bundle, computed once and shared among test invocations.
+  static LinkedNodeBundle _sdkBundleLegacy;
 
   LinkedNodeBundle get sdkBundle {
-    if (_sdkBundle != null) return _sdkBundle;
+    if (featureSet.isEnabled(Feature.non_nullable)) {
+      if (_sdkBundleNnbd != null) {
+        return _sdkBundleNnbd;
+      }
+    } else {
+      if (_sdkBundleLegacy != null) {
+        return _sdkBundleLegacy;
+      }
+    }
 
     var inputLibraries = <LinkInputLibrary>[];
     for (var sdkLibrary in sdk.sdkLibraries) {
@@ -64,7 +76,12 @@
     var sdkLinkResult = link(elementFactory, inputLibraries);
 
     var bytes = sdkLinkResult.bundle.toBuffer();
-    return _sdkBundle = LinkedNodeBundle.fromBuffer(bytes);
+    var sdkBundle = LinkedNodeBundle.fromBuffer(bytes);
+    if (featureSet.isEnabled(Feature.non_nullable)) {
+      return _sdkBundleNnbd = sdkBundle;
+    } else {
+      return _sdkBundleLegacy = sdkBundle;
+    }
   }
 
   @override
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 4f81d47..41ac8c8 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -7512,6 +7512,75 @@
 ''');
   }
 
+  test_instanceInference_operator_equal_legacy() async {
+    var library = await checkLibrary(r'''
+class A1 {
+  bool operator==(other) => false;
+}
+class A2 {
+  bool operator==(int other) => false;
+}
+class B1 extends A1 {
+  bool operator==(other) => false;
+}
+class B2 extends A2 {
+  bool operator==(other) => false;
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class A1 {
+  bool* ==(dynamic other) {}
+}
+class A2 {
+  bool* ==(int* other) {}
+}
+class B1 extends A1* {
+  bool* ==(dynamic other) {}
+}
+class B2 extends A2* {
+  bool* ==(int* other) {}
+}
+''',
+        annotateNullability: true);
+  }
+
+  test_instanceInference_operator_equal_nnbd() async {
+    featureSet = enableNnbd;
+    var library = await checkLibrary(r'''
+class A1 {
+  bool operator==(other) => false;
+}
+class A2 {
+  bool operator==(int other) => false;
+}
+class B1 extends A1 {
+  bool operator==(other) => false;
+}
+class B2 extends A2 {
+  bool operator==(other) => false;
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class A1 {
+  bool ==(Object other) {}
+}
+class A2 {
+  bool ==(int other) {}
+}
+class B1 extends A1 {
+  bool ==(Object other) {}
+}
+class B2 extends A2 {
+  bool ==(int other) {}
+}
+''',
+        annotateNullability: true);
+  }
+
   test_instantiateToBounds_boundRefersToEarlierTypeArgument() async {
     var library = await checkLibrary('''
 class C<S extends num, T extends C<S, T>> {}
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 2ea4044..81f7eaa 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart' hide Annotation;
 import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
@@ -141,7 +142,12 @@
   var errors =
       result.errors.where((e) => e.severity == Severity.error).toList();
   if (errors.isNotEmpty) {
-    onFailure('Errors found:\n  ${errors.join('\n  ')}');
+    String _formatError(AnalysisError e) {
+      var locationInfo = result.unit.lineInfo.getLocation(e.offset);
+      return '$locationInfo: ${e.errorCode}: ${e.message}';
+    }
+
+    onFailure('Errors found:\n  ${errors.map(_formatError).join('\n  ')}');
     return true;
   }
   Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 5d333e2..cdbb435 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
-    show LocatedMessage, Message;
+    show LocatedMessage, Message, templateInternalProblemUnsupported;
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/problems.dart'
-    show internalProblem, unsupported;
-import 'package:front_end/src/fasta/source/stack_listener.dart';
 
 /// "Mini AST" representation of a declaration which can accept annotations.
 class AnnotatedNode {
@@ -189,6 +187,11 @@
   Uri get uri => null;
 
   @override
+  dynamic internalProblem(Message message, int charOffset, Uri uri) {
+    throw UnsupportedError(message.message);
+  }
+
+  @override
   void addProblem(Message message, int charOffset, int length,
       {bool wasHandled: false, List<LocatedMessage> context}) {
     internalProblem(message, charOffset, uri);
@@ -264,7 +267,10 @@
   void endConditionalUris(int count) {
     debugEvent("ConditionalUris");
     if (count != 0) {
-      unsupported("Conditional URIs", -1, null);
+      internalProblem(
+          templateInternalProblemUnsupported.withArguments("Conditional URIs"),
+          -1,
+          null);
     }
   }
 
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index e6a08d1..ff7b464 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -262,9 +262,7 @@
 
 /// This [InstrumentationService] prints out information comments to [outSink]
 /// and error messages to [errorSink].
-class StdInstrumentation extends InstrumentationService {
-  StdInstrumentation() : super(null);
-
+class StdInstrumentation extends NoopInstrumentationService {
   @override
   void logError(String message) {
     errorSink.writeln(message);
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 02197e3..59174f7 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -54,12 +54,8 @@
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
 import 'package:package_config/src/packages_impl.dart' show MapPackages;
 import 'package:path/path.dart' as path;
-import 'package:telemetry/crash_reporting.dart';
-import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:yaml/yaml.dart';
 
-const _analyticsID = 'UA-26406144-28';
-
 /// Shared IO sink for standard error reporting.
 @visibleForTesting
 StringSink errorSink = io.stderr;
@@ -68,30 +64,12 @@
 @visibleForTesting
 StringSink outSink = io.stdout;
 
-telemetry.Analytics _analytics;
-
-/// The analytics instance for analyzer-cli.
-telemetry.Analytics get analytics => (_analytics ??=
-    telemetry.createAnalyticsInstance(_analyticsID, 'analyzer-cli'));
-
 /// Test this option map to see if it specifies lint rules.
 bool containsLintRuleEntry(YamlMap options) {
   YamlNode linterNode = getValue(options, 'linter');
   return linterNode is YamlMap && getValue(linterNode, 'rules') != null;
 }
 
-/// Make sure that we create an analytics instance that doesn't send for this
-/// session.
-void disableAnalyticsForSession() {
-  _analytics = telemetry.createAnalyticsInstance(_analyticsID, 'analyzer-cli',
-      disableForSession: true);
-}
-
-@visibleForTesting
-void setAnalytics(telemetry.Analytics replacementAnalytics) {
-  _analytics = replacementAnalytics;
-}
-
 class Driver with HasContextMixin implements CommandLineStarter {
   static final PerformanceTag _analyzeAllTag =
       new PerformanceTag("Driver._analyzeAll");
@@ -127,24 +105,13 @@
   /// Collected analysis statistics.
   final AnalysisStats stats = new AnalysisStats();
 
-  CrashReportSender _crashReportSender;
-
   /// The [PathFilter] for excluded files with wildcards, etc.
   PathFilter pathFilter;
 
   /// Create a new Driver instance.
   ///
   /// [isTesting] is true if we're running in a test environment.
-  Driver({bool isTesting: false}) {
-    if (isTesting) {
-      disableAnalyticsForSession();
-    }
-  }
-
-  /// The crash reporting instance for analyzer-cli.
-  /// TODO(devoncarew): Replace with the real crash product ID.
-  CrashReportSender get crashReportSender => (_crashReportSender ??=
-      new CrashReportSender('Dart_analyzer_cli', analytics));
+  Driver({bool isTesting: false});
 
   /**
    * Converts the given [filePath] into absolute and normalized.
@@ -170,15 +137,6 @@
     // Parse commandline options.
     CommandLineOptions options = CommandLineOptions.parse(args);
 
-    if (options.batchMode || options.buildMode) {
-      disableAnalyticsForSession();
-    }
-
-    // Ping analytics with our initial call.
-    analytics.sendScreenView('home');
-
-    var timer = analytics.startTimer('analyze');
-
     // Do analysis.
     if (options.buildMode) {
       ErrorSeverity severity = await _buildModeAnalyze(options, sendPort);
@@ -222,21 +180,11 @@
       _analyzedFileCount += analysisDriver.knownFiles.length;
     }
 
-    // Send how long analysis took.
-    timer.finish();
-
-    // Send how many files were analyzed.
-    analytics.sendEvent('analyze', 'fileCount', value: _analyzedFileCount);
-
     if (options.perfReport != null) {
       String json = makePerfReport(
           startTime, currentTimeMillis, options, _analyzedFileCount, stats);
       new io.File(options.perfReport).writeAsStringSync(json);
     }
-
-    // Wait a brief time for any analytics calls to finish.
-    await analytics.waitForLastPing(timeout: new Duration(milliseconds: 200));
-    analytics.close();
   }
 
   Future<ErrorSeverity> _analyzeAll(CommandLineOptions options) async {
@@ -245,11 +193,6 @@
     PerformanceTag previous = _analyzeAllTag.makeCurrent();
     try {
       return await _analyzeAllImpl(options);
-    } catch (e, st) {
-      // Catch and ignore any exceptions when reporting exceptions (network
-      // errors or other).
-      crashReportSender.sendReport(e, stackTrace: st).catchError((_) {});
-      rethrow;
     } finally {
       previous.makeCurrent();
     }
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 4aa34fc..afb1457 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:args/args.dart';
-import 'package:telemetry/telemetry.dart' as telemetry;
 
 const _binaryName = 'dartanalyzer';
 
@@ -326,10 +325,6 @@
           help: 'Verbose output.',
           negatable: false);
 
-    parser.addFlag('analytics',
-        help: 'Enable or disable sending analytics information to Google.',
-        hide: !telemetry.SHOW_ANALYTICS_UI);
-
     // Build mode options.
     if (!hide) {
       parser.addSeparator('Build mode flags:');
@@ -503,27 +498,16 @@
 
       // Help requests.
       if (cast(results['help'])) {
-        _showUsage(parser, analytics, fromHelp: true);
+        _showUsage(parser, fromHelp: true);
         exitHandler(0);
         return null; // Only reachable in testing.
       }
 
-      // Enable / disable analytics.
-      if (telemetry.SHOW_ANALYTICS_UI) {
-        if (results.wasParsed('analytics')) {
-          analytics.enabled = cast(results['analytics']);
-          outSink.writeln(
-              telemetry.createAnalyticsStatusMessage(analytics.enabled));
-          exitHandler(0);
-          return null; // Only reachable in testing.
-        }
-      }
-
       // Batch mode and input files.
       if (cast(results['batch'])) {
         if (results.rest.isNotEmpty) {
           errorSink.writeln('No source files expected in the batch mode.');
-          _showUsage(parser, analytics);
+          _showUsage(parser);
           exitHandler(15);
           return null; // Only reachable in testing.
         }
@@ -531,7 +515,7 @@
         if (results.rest.isNotEmpty) {
           errorSink.writeln(
               'No source files expected in the persistent worker mode.');
-          _showUsage(parser, analytics);
+          _showUsage(parser);
           exitHandler(15);
           return null; // Only reachable in testing.
         }
@@ -541,7 +525,7 @@
         return null; // Only reachable in testing.
       } else {
         if (results.rest.isEmpty && !cast<bool>(results['build-mode'])) {
-          _showUsage(parser, analytics, fromHelp: true);
+          _showUsage(parser, fromHelp: true);
           exitHandler(15);
           return null; // Only reachable in testing.
         }
@@ -564,7 +548,7 @@
           errorSink.writeln('$kind: ${validationResult.message}');
         }
         if (errorFound) {
-          _showUsage(parser, null);
+          _showUsage(parser);
           exitHandler(15);
           return null; // Only reachable in testing.
         }
@@ -573,47 +557,19 @@
       return new CommandLineOptions._fromArgs(results);
     } on FormatException catch (e) {
       errorSink.writeln(e.message);
-      _showUsage(parser, null);
+      _showUsage(parser);
       exitHandler(15);
       return null; // Only reachable in testing.
     }
   }
 
-  static _showUsage(ArgParser parser, telemetry.Analytics analytics,
-      {bool fromHelp: false}) {
-    void printAnalyticsInfo() {
-      if (!telemetry.SHOW_ANALYTICS_UI) {
-        return;
-      }
-
-      if (fromHelp) {
-        errorSink.writeln('');
-        errorSink.writeln(telemetry.analyticsNotice);
-      }
-
-      if (analytics != null) {
-        errorSink.writeln('');
-        errorSink.writeln(telemetry.createAnalyticsStatusMessage(
-            analytics.enabled,
-            command: 'analytics'));
-      }
-    }
-
+  static _showUsage(ArgParser parser, {bool fromHelp: false}) {
     errorSink.writeln(
         'Usage: $_binaryName [options...] <directory or list of files>');
 
-    // If it's our first run, we display the analytics info more prominently.
-    if (analytics != null && analytics.firstRun) {
-      printAnalyticsInfo();
-    }
-
     errorSink.writeln('');
     errorSink.writeln(parser.usage);
 
-    if (analytics != null && !analytics.firstRun) {
-      printAnalyticsInfo();
-    }
-
     errorSink.writeln('');
     errorSink.writeln('''
 Run "dartanalyzer -h -v" for verbose help output, including less commonly used options.
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 2baf586..f7d53f2 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -9,7 +9,6 @@
   linter: ^0.1.16
   package_config: '>=0.1.5 <2.0.0'
   protobuf: ^0.13.0
-  telemetry: ^0.0.1
   yaml: ^2.1.2
 dev_dependencies:
   test_reflective_loader: ^0.1.8
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 489ff5e..3356456 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -9,10 +9,8 @@
     show overrideKnownFeatures;
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:analyzer_cli/src/options.dart';
-import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:usage/usage.dart';
 
 main() {
   group('CommandLineOptions', () {
@@ -261,28 +259,6 @@
         expect(failureMessage, equals('Invalid Dart SDK path: &&&&&'));
       });
 
-      if (telemetry.SHOW_ANALYTICS_UI) {
-        test('--analytics', () {
-          AnalyticsMock mock = new AnalyticsMock()..enabled = false;
-          setAnalytics(mock);
-          CommandLineOptions.parse(['--analytics']);
-          expect(mock.enabled, true);
-          expect(lastExitHandlerCode, 0);
-          expect(
-              outStringBuffer.toString(), contains('Analytics are currently'));
-        });
-
-        test('--no-analytics', () {
-          AnalyticsMock mock = new AnalyticsMock()..enabled = false;
-          setAnalytics(mock);
-          CommandLineOptions.parse(['--no-analytics']);
-          expect(mock.enabled, false);
-          expect(lastExitHandlerCode, 0);
-          expect(
-              outStringBuffer.toString(), contains('Analytics are currently'));
-        });
-      }
-
       test('--use-fasta-parser', () {
         CommandLineOptions options =
             CommandLineOptions.parse(['--use-fasta-parser', 'foo.dart']);
diff --git a/pkg/analyzer_plugin/README.md b/pkg/analyzer_plugin/README.md
index 42cf20a..0644f0b 100644
--- a/pkg/analyzer_plugin/README.md
+++ b/pkg/analyzer_plugin/README.md
@@ -31,4 +31,4 @@
 [LICENSE]: https://github.com/dart-lang/sdk/blob/master/pkg/analyzer/LICENSE
 [list]: https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss
 [pluginapi]: https://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analyzer_plugin/doc/api.html
-[tutorial]: doc/tutorial/tutorial.md
+[tutorial]: https://github.com/dart-lang/sdk/blob/master/pkg/analyzer_plugin/doc/tutorial/tutorial.md
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 386f4ed..4f135b3 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -2289,6 +2289,9 @@
   /// where the type arguments are the type variables of [cls].
   InterfaceType getThisType(ClassEntity cls);
 
+  /// Returns the instantiation of [cls] to bounds.
+  InterfaceType getClassInstantiationToBounds(ClassEntity cls);
+
   /// Returns `true` if [cls] is generic.
   bool isGenericClass(ClassEntity cls);
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 186623f..1c392c8 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -1511,6 +1511,20 @@
     return outputUnitTo._imports.containsAll(outputUnitFrom._imports);
   }
 
+  /// Returns `true` if class [to] is reachable from element [from] without
+  /// crossing a deferred import.
+  ///
+  /// For example, if we have two deferred libraries `A` and `B` that both
+  /// import a library `C`, then even though elements from `A` and `C` end up in
+  /// different output units, there is a non-deferred path between `A` and `C`.
+  bool hasOnlyNonDeferredImportPathsToClass(MemberEntity from, ClassEntity to) {
+    OutputUnit outputUnitFrom = outputUnitForMember(from);
+    OutputUnit outputUnitTo = outputUnitForClass(to);
+    if (outputUnitTo == mainOutputUnit) return true;
+    if (outputUnitFrom == mainOutputUnit) return false;
+    return outputUnitTo._imports.containsAll(outputUnitFrom._imports);
+  }
+
   /// Registers that a constant is used in the same deferred output unit as
   /// [field].
   void registerConstantDeferredUse(DeferredGlobalConstantValue constant) {
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 5445a80..ee278b1 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -35,6 +35,9 @@
   /// is the function type `(String) -> int`.
   DartType get unaliased => this;
 
+  /// Is `true` if this type is a top type.
+  bool get isTop => false;
+
   /// Is `true` if this type has no non-dynamic type arguments.
   bool get treatAsRaw => true;
 
@@ -181,6 +184,9 @@
       : assert(typeArguments.every((e) => e != null));
 
   @override
+  bool get isTop => isObject;
+
+  @override
   bool get isInterfaceType => true;
 
   @override
@@ -249,6 +255,9 @@
   TypedefType(this.element, this.typeArguments, this.unaliased);
 
   @override
+  bool get isTop => unaliased.isTop;
+
+  @override
   bool get isTypedef => true;
 
   @override
@@ -401,6 +410,9 @@
   factory VoidType() => const VoidType._();
 
   @override
+  bool get isTop => true;
+
+  @override
   bool get isVoid => true;
 
   @override
@@ -422,6 +434,9 @@
   factory DynamicType() => const DynamicType._();
 
   @override
+  bool get isTop => true;
+
+  @override
   bool get isDynamic => true;
 
   @override
@@ -446,6 +461,9 @@
   factory ErasedType() => const ErasedType._();
 
   @override
+  bool get isTop => true;
+
+  @override
   bool get treatAsDynamic => true;
 
   @override
@@ -480,6 +498,9 @@
   factory AnyType() => const AnyType._();
 
   @override
+  bool get isTop => true;
+
+  @override
   bool get isAny => true;
 
   @override
@@ -624,6 +645,9 @@
   FutureOrType(this.typeArgument);
 
   @override
+  bool get isTop => typeArgument.isTop;
+
+  @override
   bool get isFutureOr => true;
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index bf214c1..a4accab 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -223,6 +223,17 @@
   /// [NativeBehavior].
   TypeInformation typeOfNativeBehavior(NativeBehavior nativeBehavior);
 
+  /// For a given selector, return a shared dynamic call site that will be used
+  /// to combine the results of multiple dynamic calls in the program via
+  /// [IndirectDynamicCallSiteTypeInformation].
+  ///
+  /// This is used only for scalability reasons: if there are too many targets
+  /// and call sites, we may have a quadratic number of edges in the graph, so
+  /// we add a level of indirection to merge the information and keep the graph
+  /// smaller.
+  DynamicCallSiteTypeInformation typeOfSharedDynamicCall(
+      Selector selector, CallStructure structure);
+
   bool returnsListElementType(Selector selector, AbstractValue mask);
 
   bool returnsMapValueType(Selector selector, AbstractValue mask);
@@ -397,11 +408,14 @@
   void updateSelectorInMember(MemberEntity owner, CallType callType,
       ir.Node node, Selector selector, AbstractValue mask) {
     KernelGlobalTypeInferenceElementData data = dataOfMember(owner);
-    assert(validCallType(callType, node));
+    assert(validCallType(callType, node, selector));
     switch (callType) {
       case CallType.access:
         data.setTypeMask(node, mask);
         break;
+      case CallType.indirectAccess:
+        // indirect access is not diretly recorded in the result data.
+        break;
       case CallType.forIn:
         if (selector == Selectors.iterator) {
           data.setIteratorTypeMask(node, mask);
@@ -1142,19 +1156,40 @@
       updateSideEffects(sideEffectsBuilder, selector, callee);
     });
 
-    CallSiteTypeInformation info = new DynamicCallSiteTypeInformation(
-        abstractValueDomain,
-        types.currentMember,
-        callType,
-        node,
-        caller,
-        selector,
-        mask,
-        receiverType,
-        arguments,
-        inLoop,
-        isConditional);
+    CallSiteTypeInformation info;
 
+    // We force using indirection for `==` because it is a very common dynamic
+    // call site on many apps.
+    // TODO(sigmund): it would be even better if we could automatically detect
+    // when dynamic calls are growing too big and add the indirection at that
+    // point.
+    if (selector.name == '==') {
+      info = new IndirectDynamicCallSiteTypeInformation(
+          abstractValueDomain,
+          types.currentMember,
+          node,
+          typeOfSharedDynamicCall(selector, CallStructure.ONE_ARG),
+          caller,
+          selector,
+          mask,
+          receiverType,
+          arguments,
+          inLoop,
+          isConditional);
+    } else {
+      info = new DynamicCallSiteTypeInformation(
+          abstractValueDomain,
+          types.currentMember,
+          callType,
+          node,
+          caller,
+          selector,
+          mask,
+          receiverType,
+          arguments,
+          inLoop,
+          isConditional);
+    }
     info.addToGraph(this);
     types.allocatedCalls.add(info);
     return info;
@@ -1282,6 +1317,48 @@
     }
   }
 
+  /// Indirect calls share the same dynamic call site information node. This
+  /// cache holds that shared dynamic call node for a given selector.
+  Map<Selector, DynamicCallSiteTypeInformation> _sharedCalls = {};
+
+  @override
+  DynamicCallSiteTypeInformation typeOfSharedDynamicCall(
+      Selector selector, CallStructure structure) {
+    DynamicCallSiteTypeInformation info = _sharedCalls[selector];
+    if (info != null) return info;
+
+    TypeInformation receiverType =
+        new IndirectParameterTypeInformation(abstractValueDomain, 'receiver');
+    List<TypeInformation> positional = [];
+    for (int i = 0; i < structure.positionalArgumentCount; i++) {
+      positional
+          .add(new IndirectParameterTypeInformation(abstractValueDomain, '$i'));
+    }
+    Map<String, TypeInformation> named = {};
+    if (structure.namedArgumentCount > 0) {
+      for (var name in structure.namedArguments) {
+        named[name] =
+            new IndirectParameterTypeInformation(abstractValueDomain, name);
+      }
+    }
+
+    info = _sharedCalls[selector] = new DynamicCallSiteTypeInformation(
+        abstractValueDomain,
+        null,
+        CallType.indirectAccess,
+        null,
+        null,
+        selector,
+        null,
+        receiverType,
+        ArgumentsTypes(positional, named),
+        false,
+        false);
+    info.addToGraph(this);
+    types.allocatedCalls.add(info);
+    return info;
+  }
+
   @override
   bool canFieldBeUsedForGlobalOptimizations(FieldEntity element) {
     if (closedWorld.backendUsage.isFieldUsedByBackend(element)) {
diff --git a/pkg/compiler/lib/src/inferrer/node_tracer.dart b/pkg/compiler/lib/src/inferrer/node_tracer.dart
index 987cb11..4d4a4bd 100644
--- a/pkg/compiler/lib/src/inferrer/node_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/node_tracer.dart
@@ -270,6 +270,14 @@
     }
   }
 
+  @override
+  visitIndirectDynamicCallSiteTypeInformation(
+      IndirectDynamicCallSiteTypeInformation info) {
+    if (info.dynamicCall == currentUser) {
+      addNewEscapeInformation(info);
+    }
+  }
+
   void analyzeStoredIntoList(ListTypeInformation list) {
     inferrer.analyzeListAndEnqueue(list);
     if (list.bailedOut) {
@@ -547,4 +555,10 @@
     }
     addNewEscapeInformation(info);
   }
+
+  @override
+  void visitIndirectParameterTypeInformation(
+      IndirectParameterTypeInformation info) {
+    addNewEscapeInformation(info);
+  }
 }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 70d3fa0..a4ed3e3 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -411,6 +411,12 @@
   }
 
   @override
+  void visitIndirectDynamicCallSiteTypeInformation(
+      IndirectDynamicCallSiteTypeInformation info) {
+    handleCall(info, 'IndirectDynamicCallSite', {});
+  }
+
+  @override
   void visitDynamicCallSiteTypeInformation(
       DynamicCallSiteTypeInformation info) {
     handleCall(info, 'DynamicCallSite', {'obj': info.receiver});
@@ -427,6 +433,12 @@
   }
 
   @override
+  void visitIndirectParameterTypeInformation(
+      IndirectParameterTypeInformation info) {
+    addNode(info, 'IndirectParameter ${info.debugName}');
+  }
+
+  @override
   void visitClosureTypeInformation(ClosureTypeInformation info) {
     String text = shorten('${info.debugName}');
     addNode(info, 'Closure\n$text');
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 3a41951..a1e7c15 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -116,8 +116,7 @@
           returnType != null &&
               abstractValueDomain.isEmpty(returnType).isDefinitelyTrue;
 
-      bool isCalledOnce =
-          typeInformation.isCalledOnce(); //isMemberCalledOnce(member);
+      bool isCalledOnce = typeInformation.isCalledOnce();
 
       memberResults[member] = new GlobalTypeInferenceMemberResultImpl(
           data, returnType, type,
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index f3a949d..f674734 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -377,6 +377,10 @@
   // cleanup has been called.
   bool _isCalledOnce = null;
 
+  /// Whether this member is invoked via indirect dynamic calls. In that case
+  /// the exact number of call sites cannot be computed precisely.
+  bool _calledIndirectly = false;
+
   /// This map contains the callers of [element]. It stores all unique call
   /// sites to enable counting the global number of call sites of [element].
   ///
@@ -427,6 +431,7 @@
   }
 
   bool _computeIsCalledOnce() {
+    if (_calledIndirectly) return false;
     if (_callers == null) return false;
     int count = 0;
     for (var set in _callers.values) {
@@ -872,15 +877,40 @@
   }
 }
 
+/// A synthetic parameter used to model the entry points to a
+/// [IndirectDynamicCallSiteTypeInformation].
+class IndirectParameterTypeInformation extends TypeInformation {
+  final String debugName;
+
+  IndirectParameterTypeInformation(
+      AbstractValueDomain abstractValueDomain, this.debugName)
+      : super(abstractValueDomain.emptyType, null);
+
+  @override
+  AbstractValue computeType(InferrerEngine inferrer) =>
+      inferrer.types.computeTypeMask(assignments);
+
+  @override
+  accept(TypeInformationVisitor visitor) {
+    return visitor.visitIndirectParameterTypeInformation(this);
+  }
+
+  @override
+  String toString() => 'IndirectParameter $debugName $type';
+}
+
 enum CallType {
   access,
+  indirectAccess,
   forIn,
 }
 
-bool validCallType(CallType callType, Object call) {
+bool validCallType(CallType callType, Object call, Selector selector) {
   switch (callType) {
     case CallType.access:
       return call is ir.Node;
+    case CallType.indirectAccess:
+      return call == null && selector.name == '==';
     case CallType.forIn:
       return call is ir.ForInStatement;
   }
@@ -914,7 +944,7 @@
       this.arguments,
       this.inLoop)
       : super.noAssignments(abstractValueDomain.emptyType, context) {
-    assert(_call is ir.Node);
+    assert(_call is ir.Node || (_call == null && selector.name == '=='));
   }
 
   @override
@@ -1011,6 +1041,109 @@
   }
 }
 
+/// A call modeled with a level of indirection.
+///
+/// This kind of call is artificial and only exists to address scalability
+/// limitations of the inference algorithm. Any virtual, interface, or dynamic
+/// call is normally modeled via [DynamicCallSiteTypeInformation]. The main
+/// scalability concern of those calls is that we may get a quadratic number of
+/// edges to model all the argument and return values (an edge per dynamic call
+/// and target pair). Adding a level of indirection helps in that all these
+/// calls are funneled through a single [DynamicCallSiteTypeInformation] node,
+/// this in turn reduces the edges to be linear (an edge per indiret call to the
+/// dynamic call node, and an edge from the call to each target).
+class IndirectDynamicCallSiteTypeInformation extends CallSiteTypeInformation {
+  final DynamicCallSiteTypeInformation dynamicCall;
+  final bool isConditional;
+  final TypeInformation receiver;
+
+  IndirectDynamicCallSiteTypeInformation(
+      AbstractValueDomain abstractValueDomain,
+      MemberTypeInformation context,
+      Object call,
+      this.dynamicCall,
+      MemberEntity enclosing,
+      Selector selector,
+      AbstractValue mask,
+      this.receiver,
+      ArgumentsTypes arguments,
+      bool inLoop,
+      this.isConditional)
+      : super(abstractValueDomain, context, call, enclosing, selector, mask,
+            arguments, inLoop);
+
+  @override
+  void addToGraph(InferrerEngine inferrer) {
+    receiver.addUser(this);
+    dynamicCall.receiver.addAssignment(receiver);
+    List<TypeInformation> positional = arguments.positional;
+    for (int i = 0; i < positional.length; i++) {
+      positional[i].addUser(this);
+      dynamicCall.arguments.positional[i].addAssignment(positional[i]);
+    }
+    arguments.named.forEach((name, namedInfo) {
+      dynamicCall.arguments.named[name].addAssignment(namedInfo);
+    });
+    dynamicCall.addUser(this);
+  }
+
+  @override
+  AbstractValue computeType(InferrerEngine inferrer) {
+    AbstractValue typeMask = _computeTypedSelector(inferrer);
+    inferrer.updateSelectorInMember(
+        caller, CallType.access, _call, selector, typeMask);
+
+    AbstractValue result = dynamicCall.computeType(inferrer);
+    AbstractValueDomain abstractValueDomain =
+        inferrer.closedWorld.abstractValueDomain;
+    if (isConditional &&
+        abstractValueDomain.isNull(receiver.type).isPotentiallyTrue) {
+      // Conditional calls like `a?.b` may be null if the receiver is null.
+      result = abstractValueDomain.includeNull(result);
+    }
+    return result;
+  }
+
+  AbstractValue _computeTypedSelector(InferrerEngine inferrer) {
+    AbstractValue receiverType = receiver.type;
+    if (mask == receiverType) return mask;
+    return receiverType == inferrer.abstractValueDomain.dynamicType
+        ? null
+        : receiverType;
+  }
+
+  @override
+  void giveUp(InferrerEngine inferrer, {bool clearAssignments: true}) {
+    if (!abandonInferencing) {
+      inferrer.updateSelectorInMember(
+          caller, CallType.access, _call, selector, mask);
+    }
+    super.giveUp(inferrer, clearAssignments: clearAssignments);
+  }
+
+  @override
+  Iterable<MemberEntity> get callees => dynamicCall.callees;
+
+  @override
+  accept(TypeInformationVisitor visitor) {
+    return visitor.visitIndirectDynamicCallSiteTypeInformation(this);
+  }
+
+  @override
+  bool hasStableType(InferrerEngine inferrer) =>
+      dynamicCall.hasStableType(inferrer);
+
+  @override
+  void removeAndClearReferences(InferrerEngine inferrer) {
+    dynamicCall.removeUser(this);
+    receiver.removeUser(this);
+    if (arguments != null) {
+      arguments.forEach((info) => info.removeUser(this));
+    }
+    super.removeAndClearReferences(inferrer);
+  }
+}
+
 class DynamicCallSiteTypeInformation<T> extends CallSiteTypeInformation {
   final CallType _callType;
   final TypeInformation receiver;
@@ -1034,7 +1167,21 @@
       this.isConditional)
       : super(abstractValueDomain, context, call, enclosing, selector, mask,
             arguments, inLoop) {
-    assert(validCallType(_callType, _call));
+    assert(validCallType(_callType, _call, selector));
+  }
+
+  void _addCall(MemberTypeInformation callee) {
+    if (_callType == CallType.indirectAccess) {
+      callee._calledIndirectly = true;
+    } else {
+      callee.addCall(caller, _call);
+    }
+  }
+
+  void _removeCall(MemberTypeInformation callee) {
+    if (_callType != CallType.indirectAccess) {
+      callee.removeCall(caller, _call);
+    }
   }
 
   @override
@@ -1051,7 +1198,7 @@
     for (MemberEntity element in _concreteTargets) {
       MemberTypeInformation callee =
           inferrer.types.getInferredTypeOfMember(element);
-      callee.addCall(caller, _call);
+      _addCall(callee);
       callee.addUser(this);
       inferrer.updateParameterAssignments(
           this, element, arguments, selector, typeMask,
@@ -1072,7 +1219,6 @@
 
   AbstractValue computeTypedSelector(InferrerEngine inferrer) {
     AbstractValue receiverType = receiver.type;
-
     if (mask != receiverType) {
       return receiverType == inferrer.abstractValueDomain.dynamicType
           ? null
@@ -1216,7 +1362,7 @@
           .forEach((MemberEntity element) {
         MemberTypeInformation callee =
             inferrer.types.getInferredTypeOfMember(element);
-        callee.addCall(caller, _call);
+        _addCall(callee);
         callee.addUser(this);
         inferrer.updateParameterAssignments(
             this, element, arguments, selector, typeMask,
@@ -1229,7 +1375,7 @@
           .forEach((MemberEntity element) {
         MemberTypeInformation callee =
             inferrer.types.getInferredTypeOfMember(element);
-        callee.removeCall(caller, _call);
+        _removeCall(callee);
         callee.removeUser(this);
         inferrer.updateParameterAssignments(
             this, element, arguments, selector, typeMask,
@@ -2111,8 +2257,12 @@
   T visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info);
   T visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info);
   T visitDynamicCallSiteTypeInformation(DynamicCallSiteTypeInformation info);
+  T visitIndirectDynamicCallSiteTypeInformation(
+      IndirectDynamicCallSiteTypeInformation info);
   T visitMemberTypeInformation(MemberTypeInformation info);
   T visitParameterTypeInformation(ParameterTypeInformation info);
+  T visitIndirectParameterTypeInformation(
+      IndirectParameterTypeInformation info);
   T visitClosureTypeInformation(ClosureTypeInformation info);
   T visitAwaitTypeInformation(AwaitTypeInformation info);
   T visitYieldTypeInformation(YieldTypeInformation info);
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 3c39f11..0954db8 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -503,7 +503,8 @@
       // instantiated as int and String.
       registerNew(
           node.target,
-          new ir.InterfaceType(node.target.enclosingClass, typeArguments),
+          new ir.InterfaceType(
+              node.target.enclosingClass, ir.Nullability.legacy, typeArguments),
           positionArguments,
           namedArguments,
           node.arguments.types,
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index ea3559b..82402b7 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -311,7 +311,7 @@
   InitializerComplexity visitTypeParameter(ir.TypeParameter typeParameter) {
     ir.TreeNode context = _executableContext;
     TypeVariableTypeWithContext typeVariable = new TypeVariableTypeWithContext(
-        new ir.TypeParameterType(typeParameter),
+        new ir.TypeParameterType(typeParameter, ir.Nullability.legacy),
         // If this typeParameter is part of a typedef then its parent is
         // null because it has no context. Just pass in null for the
         // context in that case.
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index d686190..b54d98c 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1218,6 +1218,7 @@
       if (streamType != null) {
         iteratorType = new ir.InterfaceType(
             typeEnvironment.coreTypes.streamIteratorClass,
+            ir.Nullability.legacy,
             streamType.typeArguments);
       }
     } else {
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index c544cb0..f8f4999 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -22,7 +22,7 @@
 /// has precision of a this-expression.
 class ThisInterfaceType extends ir.InterfaceType {
   ThisInterfaceType(ir.Class classNode, [List<ir.DartType> typeArguments])
-      : super(classNode, typeArguments);
+      : super(classNode, ir.Nullability.legacy, typeArguments);
 
   factory ThisInterfaceType.from(ir.InterfaceType type) => type != null
       ? new ThisInterfaceType(type.classNode, type.typeArguments)
@@ -36,7 +36,7 @@
 /// is exact, i.e. the runtime type is not a subtype or subclass of the type.
 class ExactInterfaceType extends ir.InterfaceType {
   ExactInterfaceType(ir.Class classNode, [List<ir.DartType> typeArguments])
-      : super(classNode, typeArguments);
+      : super(classNode, ir.Nullability.legacy, typeArguments);
 
   factory ExactInterfaceType.from(ir.InterfaceType type) => type != null
       ? new ExactInterfaceType(type.classNode, type.typeArguments)
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c797e3b..fd7df4d 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -2571,6 +2571,8 @@
         return asName(fixedNames.deferredAction);
       case JsGetName.OPERATOR_AS_PREFIX:
         return asName(fixedNames.operatorAsPrefix);
+      case JsGetName.OPERATOR_IS_PREFIX:
+        return asName(fixedNames.operatorIsPrefix);
       case JsGetName.SIGNATURE_NAME:
         return asName(fixedNames.operatorSignature);
       case JsGetName.RTI_NAME:
diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
index 4aacd02..afb4661 100644
--- a/pkg/compiler/lib/src/js_backend/specialized_checks.dart
+++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
@@ -2,11 +2,88 @@
 // 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.
 
-import '../common_elements.dart' show JCommonElements;
+import '../common_elements.dart' show ElementEnvironment, JCommonElements;
+import '../deferred_load.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../js_backend/interceptor_data.dart' show InterceptorData;
+import '../ssa/nodes.dart' show HGraph;
+import '../universe/class_hierarchy.dart' show ClassHierarchy;
+import '../world.dart' show JClosedWorld;
+
+enum IsTestSpecialization {
+  null_,
+  string,
+  bool,
+  num,
+  int,
+  arrayTop,
+  instanceof,
+}
 
 class SpecializedChecks {
+  static IsTestSpecialization findIsTestSpecialization(
+      DartType dartType, HGraph graph, JClosedWorld closedWorld) {
+    if (dartType is InterfaceType) {
+      ClassEntity element = dartType.element;
+      JCommonElements commonElements = closedWorld.commonElements;
+
+      if (element == commonElements.nullClass ||
+          element == commonElements.jsNullClass) {
+        return IsTestSpecialization.null_;
+      }
+
+      if (element == commonElements.jsStringClass ||
+          element == commonElements.stringClass) {
+        return IsTestSpecialization.string;
+      }
+
+      if (element == commonElements.jsBoolClass ||
+          element == commonElements.boolClass) {
+        return IsTestSpecialization.bool;
+      }
+
+      if (element == commonElements.jsDoubleClass ||
+          element == commonElements.doubleClass ||
+          element == commonElements.jsNumberClass ||
+          element == commonElements.numClass) {
+        return IsTestSpecialization.num;
+      }
+
+      if (element == commonElements.jsIntClass ||
+          element == commonElements.intClass ||
+          element == commonElements.jsUInt32Class ||
+          element == commonElements.jsUInt31Class ||
+          element == commonElements.jsPositiveIntClass) {
+        return IsTestSpecialization.int;
+      }
+
+      DartTypes dartTypes = closedWorld.dartTypes;
+      ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+      if (!dartTypes.isSubtype(
+          elementEnvironment.getClassInstantiationToBounds(element),
+          dartType)) {
+        return null;
+      }
+
+      if (element == commonElements.jsArrayClass) {
+        return IsTestSpecialization.arrayTop;
+      }
+
+      ClassHierarchy classHierarchy = closedWorld.classHierarchy;
+      InterceptorData interceptorData = closedWorld.interceptorData;
+      OutputUnitData outputUnitData = closedWorld.outputUnitData;
+
+      if (classHierarchy.hasOnlySubclasses(element) &&
+          !interceptorData.isInterceptedClass(element) &&
+          outputUnitData.hasOnlyNonDeferredImportPathsToClass(
+              graph.element, element)) {
+        return IsTestSpecialization.instanceof;
+      }
+    }
+    return null;
+  }
+
   static MemberEntity findAsCheck(
       DartType dartType, bool isTypeError, JCommonElements commonElements) {
     if (dartType is InterfaceType) {
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index 2b7f88e..068fe60 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -65,7 +65,6 @@
     show $0, $9, $A, $Z, $_, $a, $z;
 
 import '../common_elements.dart' show CommonElements;
-import '../elements/entities.dart' show FunctionEntity;
 import '../elements/types.dart';
 import '../js/js.dart' as js;
 import '../js_emitter/code_emitter_task.dart' show Emitter;
@@ -261,19 +260,20 @@
   }
 
   void _updateReferences() {
-    js.Expression loadTypeCall(TypeRecipe recipe) {
-      FunctionEntity helperElement = _commonElements.findType;
+    js.Expression helperAccess =
+        _emitter.staticFunctionAccess(_commonElements.findType);
+
+    js.Expression loadTypeCall(TypeRecipe recipe, String helperLocal) {
       js.Expression recipeExpression =
           _recipeEncoder.encodeGroundRecipe(_emitter, recipe);
-      js.Expression helper = _emitter.staticFunctionAccess(helperElement);
-      return js.js(r'#(#)', [helper, recipeExpression]);
+      return js.js(r'#(#)', [helperLocal ?? helperAccess, recipeExpression]);
     }
 
     // Emit generate-at-use references.
     for (_ReferenceSet referenceSet in _referencesByRecipe.values) {
       if (referenceSet.generateAtUse) {
         TypeRecipe recipe = referenceSet.recipe;
-        js.Expression reference = loadTypeCall(recipe);
+        js.Expression reference = loadTypeCall(recipe, null);
         for (TypeReference ref in referenceSet._references) {
           ref.value = reference;
         }
@@ -287,23 +287,43 @@
     // are grouped together.
     referenceSetsUsingProperties.sort((a, b) => a.name.compareTo(b.name));
 
+    // We can generate a literal with calls to H.findType (minified to typically
+    // e.g. H.xy) or cache H.findType in a local in a scope created by an IIFE.
+    // Doing so saves 2-3 bytes per entry, but with an overhead of 30+ bytes for
+    // the IIFE.  So it is smaller to use the IIFE only for over 10 or so types.
+    const minUseIIFE = 10;
+    String helperLocal =
+        referenceSetsUsingProperties.length < minUseIIFE ? null : 'findType';
+
     List<js.Property> properties = [];
     for (_ReferenceSet referenceSet in referenceSetsUsingProperties) {
       TypeRecipe recipe = referenceSet.recipe;
       var propertyName = js.string(referenceSet.propertyName);
-      properties.add(js.Property(propertyName, loadTypeCall(recipe)));
+      properties
+          .add(js.Property(propertyName, loadTypeCall(recipe, helperLocal)));
       var access = js.js('#.#', [typesHolderLocalName, propertyName]);
       for (TypeReference ref in referenceSet._references) {
         ref.value = access;
       }
     }
-    var initializer = js.ObjectInitializer(properties, isOneLiner: false);
 
-    var function = js.js(r'function rtii(){return #}', initializer);
-    _resource.value = js.js(r'var # = #()', [
-      js.VariableDeclaration(typesHolderLocalName),
-      js.Parentheses(function)
-    ]);
+    if (properties.isEmpty) {
+      // We don't have a deferred statement sequence. "0;" is the smallest we
+      // can do with an expression statement.
+      // TODO(sra): Add deferred expression statement sequences.
+      _resource.value = js.js('0');
+    } else {
+      js.Expression initializer =
+          js.ObjectInitializer(properties, isOneLiner: false);
+      if (helperLocal != null) {
+        // A named IIFE helps attribute startup time in profiling.
+        var function = js.js(r'function rtii(){var # = #; return #}',
+            [js.VariableDeclaration(helperLocal), helperAccess, initializer]);
+        initializer = js.js('#()', js.Parentheses(function));
+      }
+      _resource.value = js.js(r'var # = #',
+          [js.VariableDeclaration(typesHolderLocalName), initializer]);
+    }
   }
 
   // This is a top-level local name in the generated JavaScript top-level
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 4c87632..61bb3c7 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -892,6 +892,9 @@
 
   @override
   InterfaceType get rawType => thisType;
+
+  @override
+  InterfaceType get instantiationToBounds => thisType;
 }
 
 /// A container for variables declared in a particular scope that are accessed
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 70d2510a..333b359 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -7,6 +7,8 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/src/bounds_checks.dart' as ir;
+
 import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
@@ -83,6 +85,7 @@
   DartTypeConverter _typeConverter;
   JsConstantEnvironment _constantEnvironment;
   KernelDartTypes _types;
+  ir.CoreTypes _coreTypes;
   ir.TypeEnvironment _typeEnvironment;
   ir.ClassHierarchy _classHierarchy;
   ConstantValuefier _constantValuefier;
@@ -728,6 +731,20 @@
     }
   }
 
+  void _ensureClassInstantiationToBounds(ClassEntity cls, JClassData data) {
+    assert(checkFamily(cls));
+    if (data is JClassDataImpl && data.instantiationToBounds == null) {
+      ir.Class node = data.cls;
+      if (node.typeParameters.isEmpty) {
+        _ensureThisAndRawType(cls, data);
+        data.instantiationToBounds = data.thisType;
+      } else {
+        data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
+            coreTypes.legacyRawType(node), coreTypes.objectClass));
+      }
+    }
+  }
+
   @override
   TypeVariableEntity getTypeVariable(ir.TypeParameter node) =>
       getTypeVariableInternal(node);
@@ -943,8 +960,8 @@
     if (node.typeParameters.isNotEmpty) {
       List<DartType> typeParameters = <DartType>[];
       for (ir.TypeParameter typeParameter in node.typeParameters) {
-        typeParameters
-            .add(getDartType(new ir.TypeParameterType(typeParameter)));
+        typeParameters.add(getDartType(
+            new ir.TypeParameterType(typeParameter, ir.Nullability.legacy)));
       }
       typeVariables = new List<FunctionTypeVariable>.generate(
           node.typeParameters.length,
@@ -1021,6 +1038,13 @@
     return data.rawType;
   }
 
+  InterfaceType _getClassInstantiationToBounds(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureClassInstantiationToBounds(cls, data);
+    return data.instantiationToBounds;
+  }
+
   FunctionType _getFunctionType(IndexedFunction function) {
     assert(checkFamily(function));
     FunctionData data = members.getData(function);
@@ -1178,20 +1202,14 @@
     return data.imports[node];
   }
 
-  ir.TypeEnvironment get typeEnvironment {
-    if (_typeEnvironment == null) {
-      _typeEnvironment ??= new ir.TypeEnvironment(
-          new ir.CoreTypes(programEnv.mainComponent), classHierarchy);
-    }
-    return _typeEnvironment;
-  }
+  ir.CoreTypes get coreTypes =>
+      _coreTypes ??= ir.CoreTypes(programEnv.mainComponent);
 
-  ir.ClassHierarchy get classHierarchy {
-    if (_classHierarchy == null) {
-      _classHierarchy ??= new ir.ClassHierarchy(programEnv.mainComponent);
-    }
-    return _classHierarchy;
-  }
+  ir.TypeEnvironment get typeEnvironment =>
+      _typeEnvironment ??= ir.TypeEnvironment(coreTypes, classHierarchy);
+
+  ir.ClassHierarchy get classHierarchy =>
+      _classHierarchy ??= ir.ClassHierarchy(programEnv.mainComponent);
 
   @override
   StaticTypeProvider getStaticTypeProvider(MemberEntity member) {
@@ -2212,6 +2230,10 @@
   }
 
   @override
+  InterfaceType getClassInstantiationToBounds(ClassEntity cls) =>
+      elementMap._getClassInstantiationToBounds(cls);
+
+  @override
   bool isGenericClass(ClassEntity cls) {
     return getThisType(cls).typeArguments.isNotEmpty;
   }
diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart
index 527a27b..1b92036 100644
--- a/pkg/compiler/lib/src/js_model/env.dart
+++ b/pkg/compiler/lib/src/js_model/env.dart
@@ -442,6 +442,7 @@
   InterfaceType get thisType;
   InterfaceType get jsInteropType;
   InterfaceType get rawType;
+  InterfaceType get instantiationToBounds;
   InterfaceType get supertype;
   InterfaceType get mixedInType;
   List<InterfaceType> get interfaces;
@@ -471,6 +472,8 @@
   @override
   InterfaceType rawType;
   @override
+  InterfaceType instantiationToBounds;
+  @override
   InterfaceType supertype;
   @override
   InterfaceType mixedInType;
@@ -609,8 +612,8 @@
         } else {
           _typeVariables = functionNode.typeParameters
               .map<TypeVariableType>((ir.TypeParameter typeParameter) {
-            return elementMap
-                .getDartType(new ir.TypeParameterType(typeParameter));
+            return elementMap.getDartType(
+                new ir.TypeParameterType(typeParameter, ir.Nullability.legacy));
           }).toList();
         }
       }
@@ -759,7 +762,8 @@
   List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap) {
     return typeParameters
         .map<TypeVariableType>((ir.TypeParameter typeParameter) {
-      return elementMap.getDartType(new ir.TypeParameterType(typeParameter));
+      return elementMap.getDartType(
+          new ir.TypeParameterType(typeParameter, ir.Nullability.legacy));
     }).toList();
   }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 9285a64..f0a3770 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
@@ -30,6 +31,9 @@
   /// Access to the [DartTypes] object.
   DartTypes get types;
 
+  /// Returns the core types for the underlying kernel model.
+  ir.CoreTypes get coreTypes;
+
   /// Returns the type environment for the underlying kernel model.
   ir.TypeEnvironment get typeEnvironment;
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 66e263e..cb01960 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/src/bounds_checks.dart' as ir;
 import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
@@ -74,6 +75,7 @@
   DartTypeConverter _typeConverter;
   KernelConstantEnvironment _constantEnvironment;
   KernelDartTypes _types;
+  ir.CoreTypes _coreTypes;
   ir.TypeEnvironment _typeEnvironment;
   ir.ClassHierarchy _classHierarchy;
   Dart2jsConstantEvaluator _constantEvaluator;
@@ -299,6 +301,20 @@
     }
   }
 
+  void _ensureClassInstantiationToBounds(ClassEntity cls, KClassData data) {
+    assert(checkFamily(cls));
+    if (data is KClassDataImpl && data.instantiationToBounds == null) {
+      ir.Class node = data.node;
+      if (node.typeParameters.isEmpty) {
+        _ensureThisAndRawType(cls, data);
+        data.instantiationToBounds = data.thisType;
+      } else {
+        data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
+            coreTypes.legacyRawType(node), coreTypes.objectClass));
+      }
+    }
+  }
+
   @override
   TypeVariableEntity getTypeVariable(ir.TypeParameter node) =>
       getTypeVariableInternal(node);
@@ -517,8 +533,8 @@
     if (node.typeParameters.isNotEmpty) {
       List<DartType> typeParameters = <DartType>[];
       for (ir.TypeParameter typeParameter in node.typeParameters) {
-        typeParameters
-            .add(getDartType(new ir.TypeParameterType(typeParameter)));
+        typeParameters.add(getDartType(
+            new ir.TypeParameterType(typeParameter, ir.Nullability.legacy)));
       }
       typeVariables = new List<FunctionTypeVariable>.generate(
           node.typeParameters.length,
@@ -595,6 +611,13 @@
     return data.rawType;
   }
 
+  InterfaceType _getClassInstantiationToBounds(IndexedClass cls) {
+    assert(checkFamily(cls));
+    KClassData data = classes.getData(cls);
+    _ensureClassInstantiationToBounds(cls, data);
+    return data.instantiationToBounds;
+  }
+
   DartType _getFieldType(IndexedField field) {
     assert(checkFamily(field));
     KFieldData data = members.getData(field);
@@ -767,15 +790,15 @@
   }
 
   @override
-  ir.TypeEnvironment get typeEnvironment {
-    return _typeEnvironment ??= new ir.TypeEnvironment(
-        new ir.CoreTypes(env.mainComponent), classHierarchy);
-  }
+  ir.CoreTypes get coreTypes => _coreTypes ??= ir.CoreTypes(env.mainComponent);
 
   @override
-  ir.ClassHierarchy get classHierarchy {
-    return _classHierarchy ??= new ir.ClassHierarchy(env.mainComponent);
-  }
+  ir.TypeEnvironment get typeEnvironment =>
+      _typeEnvironment ??= ir.TypeEnvironment(coreTypes, classHierarchy);
+
+  @override
+  ir.ClassHierarchy get classHierarchy =>
+      _classHierarchy ??= ir.ClassHierarchy(env.mainComponent);
 
   Dart2jsConstantEvaluator get constantEvaluator {
     return _constantEvaluator ??= new Dart2jsConstantEvaluator(typeEnvironment,
@@ -1678,6 +1701,10 @@
   }
 
   @override
+  InterfaceType getClassInstantiationToBounds(ClassEntity cls) =>
+      elementMap._getClassInstantiationToBounds(cls);
+
+  @override
   bool isGenericClass(ClassEntity cls) {
     return getThisType(cls).typeArguments.isNotEmpty;
   }
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 8dd1973..077aa0a 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -614,6 +614,7 @@
   InterfaceType get thisType;
   InterfaceType get jsInteropType;
   InterfaceType get rawType;
+  InterfaceType get instantiationToBounds;
   InterfaceType get supertype;
   InterfaceType get mixedInType;
   List<InterfaceType> get interfaces;
@@ -643,6 +644,8 @@
   @override
   InterfaceType rawType;
   @override
+  InterfaceType instantiationToBounds;
+  @override
   InterfaceType supertype;
   @override
   InterfaceType mixedInType;
@@ -744,8 +747,8 @@
         } else {
           _typeVariables = functionNode.typeParameters
               .map<TypeVariableType>((ir.TypeParameter typeParameter) {
-            return elementMap
-                .getDartType(new ir.TypeParameterType(typeParameter));
+            return elementMap.getDartType(
+                new ir.TypeParameterType(typeParameter, ir.Nullability.legacy));
           }).toList();
         }
       }
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index 63ac858..c98787d 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -271,13 +271,14 @@
       case DartTypeNodeKind.typeParameterType:
         ir.TypeParameter typeParameter = readTypeParameterNode();
         ir.DartType promotedBound = _readDartTypeNode(functionTypeVariables);
-        return new ir.TypeParameterType(typeParameter, promotedBound);
+        return new ir.TypeParameterType(
+            typeParameter, ir.Nullability.legacy, promotedBound);
       case DartTypeNodeKind.functionTypeVariable:
         int index = readInt();
         assert(0 <= index && index < functionTypeVariables.length);
         ir.DartType promotedBound = _readDartTypeNode(functionTypeVariables);
         return new ir.TypeParameterType(
-            functionTypeVariables[index], promotedBound);
+            functionTypeVariables[index], ir.Nullability.legacy, promotedBound);
       case DartTypeNodeKind.functionType:
         begin(functionTypeNodeTag);
         int typeParameterCount = readInt();
@@ -308,7 +309,8 @@
         }
         ir.TypedefType typedefType = _readDartTypeNode(functionTypeVariables);
         end(functionTypeNodeTag);
-        return new ir.FunctionType(positionalParameters, returnType,
+        return new ir.FunctionType(
+            positionalParameters, returnType, ir.Nullability.legacy,
             namedParameters: namedParameters,
             typeParameters: typeParameters,
             requiredParameterCount: requiredParameterCount,
@@ -318,7 +320,7 @@
         ir.Class cls = readClassNode();
         List<ir.DartType> typeArguments =
             _readDartTypeNodes(functionTypeVariables);
-        return new ir.InterfaceType(cls, typeArguments);
+        return new ir.InterfaceType(cls, ir.Nullability.legacy, typeArguments);
       case DartTypeNodeKind.thisInterfaceType:
         ir.Class cls = readClassNode();
         List<ir.DartType> typeArguments =
@@ -333,7 +335,8 @@
         ir.Typedef typedef = readTypedefNode();
         List<ir.DartType> typeArguments =
             _readDartTypeNodes(functionTypeVariables);
-        return new ir.TypedefType(typedef, typeArguments);
+        return new ir.TypedefType(
+            typedef, ir.Nullability.legacy, typeArguments);
       case DartTypeNodeKind.dynamicType:
         return const ir.DynamicType();
     }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 00f98df..0688ba9 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1484,7 +1484,8 @@
       ir.FunctionNode function = getFunctionNode(_elementMap, method);
       for (ir.TypeParameter typeParameter in function.typeParameters) {
         Local local = _localsMap.getLocalTypeVariable(
-            new ir.TypeParameterType(typeParameter), _elementMap);
+            new ir.TypeParameterType(typeParameter, ir.Nullability.legacy),
+            _elementMap);
         HInstruction newParameter = localsHandler.directLocals[local];
         DartType bound = _getDartTypeIfValid(typeParameter.bound);
         if (!bound.isDynamic &&
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 7779388..ee72ee8 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -29,6 +29,7 @@
 import '../js_backend/runtime_types_codegen.dart';
 import '../js_backend/runtime_types_new.dart'
     show RecipeEncoder, RecipeEncoding, indexTypeVariable;
+import '../js_backend/specialized_checks.dart' show IsTestSpecialization;
 import '../js_backend/type_reference.dart' show TypeReference;
 import '../js_emitter/code_emitter_task.dart' show ModularEmitter;
 import '../js_model/elements.dart' show JGeneratorBody;
@@ -2435,6 +2436,8 @@
         emitIs(input, '!==', sourceInformation);
       } else if (input is HIsViaInterceptor) {
         emitIsViaInterceptor(input, sourceInformation, negative: true);
+      } else if (input is HIsTestSimple) {
+        _emitIsTestSimple(input, negative: true);
       } else if (input is HNot) {
         use(input.inputs[0]);
       } else if (input is HIdentity) {
@@ -3367,6 +3370,66 @@
   }
 
   @override
+  visitIsTestSimple(HIsTestSimple node) {
+    _emitIsTestSimple(node);
+  }
+
+  _emitIsTestSimple(HIsTestSimple node, {bool negative: false}) {
+    use(node.checkedInput);
+    js.Expression value = pop();
+    String relation = negative ? '!=' : '==';
+
+    js.Expression handleNegative(js.Expression test) =>
+        negative ? js.Prefix('!', test) : test;
+
+    js.Expression typeof(String type) =>
+        js.Binary(relation, js.Prefix('typeof', value), js.string(type));
+
+    js.Expression isTest(MemberEntity helper) {
+      _registry.registerStaticUse(
+          StaticUse.staticInvoke(helper, CallStructure.ONE_ARG));
+      js.Expression test =
+          js.Call(_emitter.staticFunctionAccess(helper), [value]);
+      return handleNegative(test);
+    }
+
+    js.Expression test;
+    switch (node.specialization) {
+      case IsTestSpecialization.null_:
+        // This case should be lowered to [HIdentity] during optimization.
+        test = js.Binary(relation, value, js.LiteralNull());
+        break;
+
+      case IsTestSpecialization.string:
+        test = typeof("string");
+        break;
+
+      case IsTestSpecialization.bool:
+        test = isTest(_commonElements.specializedIsBool);
+        break;
+
+      case IsTestSpecialization.num:
+        test = typeof("number");
+        break;
+
+      case IsTestSpecialization.int:
+        test = isTest(_commonElements.specializedIsInt);
+        break;
+
+      case IsTestSpecialization.arrayTop:
+        test = handleNegative(js.js('Array.isArray(#)', [value]));
+        break;
+
+      case IsTestSpecialization.instanceof:
+        InterfaceType type = node.dartType;
+        _registry.registerTypeUse(TypeUse.instanceConstructor(type));
+        test = handleNegative(js.js('# instanceof #',
+            [value, _emitter.constructorAccess(type.element)]));
+    }
+    push(test.withSourceInformation(node.sourceInformation));
+  }
+
+  @override
   visitAsCheck(HAsCheck node) {
     use(node.typeInput);
     js.Expression first = pop();
@@ -3429,7 +3492,7 @@
     }
 
     // Try to use the 'rti' field, or a specialization of 'instanceType'.
-    AbstractValue receiverMask = input.instructionType;
+    AbstractValue receiverMask = node.codegenInputType;
 
     AbstractBool isArray = _abstractValueDomain.isInstanceOf(
         receiverMask, _commonElements.jsArrayClass);
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index d028d7a..a3c4af4 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -366,36 +366,36 @@
   }
 }
 
-/// Remove [HTypeKnown] instructions from the graph, to make codegen
-/// analysis easier.
+/// Remove [HTypeKnown] instructions from the graph, to make codegen analysis
+/// easier.
 class SsaTypeKnownRemover extends HBaseVisitor with CodegenPhase {
   @override
   void visitGraph(HGraph graph) {
-    visitDominatorTree(graph);
+    // Visit bottom-up to visit uses before instructions and capture refined
+    // input types.
+    visitPostDominatorTree(graph);
   }
 
   @override
   void visitBasicBlock(HBasicBlock block) {
-    HInstruction instruction = block.first;
+    HInstruction instruction = block.last;
     while (instruction != null) {
-      HInstruction next = instruction.next;
+      HInstruction previous = instruction.previous;
       instruction.accept(this);
-      instruction = next;
+      instruction = previous;
     }
   }
 
   @override
   void visitTypeKnown(HTypeKnown instruction) {
-    for (HInstruction user in instruction.usedBy) {
-      if (user is HTypeConversion) {
-        user.inputType = instruction.instructionType;
-      } else if (user is HPrimitiveCheck) {
-        user.inputType = instruction.instructionType;
-      }
-    }
     instruction.block.rewrite(instruction, instruction.checkedInput);
     instruction.block.remove(instruction);
   }
+
+  @override
+  void visitInstanceEnvironment(HInstanceEnvironment instruction) {
+    instruction.codegenInputType = instruction.inputs.single.instructionType;
+  }
 }
 
 /// Remove [HPrimitiveCheck] instructions from the graph in '--trust-primitives'
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 783485b..90297a2 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -6,6 +6,7 @@
 
 import '../closure.dart';
 import '../common.dart';
+import '../common_elements.dart';
 import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
@@ -14,6 +15,7 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
+import '../js_backend/specialized_checks.dart' show IsTestSpecialization;
 import '../js_model/type_recipe.dart'
     show TypeEnvironmentStructure, TypeRecipe, TypeExpressionRecipe;
 import '../native/behavior.dart';
@@ -108,6 +110,7 @@
 
   // Instructions for 'dart:_rti'.
   R visitIsTest(HIsTest node);
+  R visitIsTestSimple(HIsTestSimple node);
   R visitAsCheck(HAsCheck node);
   R visitAsCheckSimple(HAsCheckSimple node);
   R visitSubtypeCheck(HSubtypeCheck node);
@@ -215,8 +218,7 @@
 }
 
 class HGraph {
-  // TODO(johnniwinther): Maybe this should be [MemberLike].
-  Entity element; // Used for debug printing.
+  MemberEntity element; // Used for debug printing.
   HBasicBlock entry;
   HBasicBlock exit;
   HThis thisInstruction;
@@ -604,6 +606,8 @@
   @override
   visitIsTest(HIsTest node) => visitInstruction(node);
   @override
+  visitIsTestSimple(HIsTestSimple node) => visitInstruction(node);
+  @override
   visitAsCheck(HAsCheck node) => visitCheck(node);
   @override
   visitAsCheckSimple(HAsCheckSimple node) => visitCheck(node);
@@ -1096,13 +1100,14 @@
   static const int PRIMITIVE_CHECK_TYPECODE = 46;
 
   static const int IS_TEST_TYPECODE = 47;
-  static const int AS_CHECK_TYPECODE = 48;
-  static const int AS_CHECK_SIMPLE_TYPECODE = 49;
-  static const int SUBTYPE_CHECK_TYPECODE = 50;
-  static const int LOAD_TYPE_TYPECODE = 51;
-  static const int INSTANCE_ENVIRONMENT_TYPECODE = 52;
-  static const int TYPE_EVAL_TYPECODE = 53;
-  static const int TYPE_BIND_TYPECODE = 54;
+  static const int IS_TEST_SIMPLE_TYPECODE = 48;
+  static const int AS_CHECK_TYPECODE = 49;
+  static const int AS_CHECK_SIMPLE_TYPECODE = 50;
+  static const int SUBTYPE_CHECK_TYPECODE = 51;
+  static const int LOAD_TYPE_TYPECODE = 52;
+  static const int INSTANCE_ENVIRONMENT_TYPECODE = 53;
+  static const int TYPE_EVAL_TYPECODE = 54;
+  static const int TYPE_BIND_TYPECODE = 55;
 
   HInstruction(this.inputs, this.instructionType)
       : id = idCounter++,
@@ -3544,8 +3549,6 @@
   final int kind;
 
   AbstractValue checkedType; // Not final because we refine it.
-  AbstractValue
-      inputType; // Holds input type for codegen after HTypeKnown removal.
 
   HTypeConversion(this.typeExpression, this.kind, AbstractValue type,
       HInstruction input, SourceInformation sourceInformation)
@@ -3677,8 +3680,6 @@
   final Selector receiverTypeCheckSelector;
 
   AbstractValue checkedType; // Not final because we refine it.
-  AbstractValue
-      inputType; // Holds input type for codegen after HTypeKnown removal.
 
   HPrimitiveCheck(this.typeExpression, this.kind, AbstractValue type,
       HInstruction input, SourceInformation sourceInformation,
@@ -4367,6 +4368,9 @@
   HInstruction get typeInput => inputs[0];
   HInstruction get checkedInput => inputs[1];
 
+  AbstractBool evaluate(JClosedWorld closedWorld) =>
+      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld);
+
   @override
   accept(HVisitor visitor) => visitor.visitIsTest(this);
 
@@ -4383,6 +4387,109 @@
   String toString() => 'HIsTest()';
 }
 
+/// Simple is-test for a known type that can be achieved without reference to an
+/// Rti describing the type.
+class HIsTestSimple extends HInstruction {
+  final DartType dartType;
+  final AbstractValueWithPrecision checkedAbstractValue;
+  final IsTestSpecialization specialization;
+
+  HIsTestSimple(this.dartType, this.checkedAbstractValue, this.specialization,
+      HInstruction checked, AbstractValue type)
+      : super([checked], type) {
+    setUseGvn();
+  }
+
+  HInstruction get checkedInput => inputs[0];
+
+  AbstractBool evaluate(JClosedWorld closedWorld) =>
+      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld);
+
+  @override
+  accept(HVisitor visitor) => visitor.visitIsTestSimple(this);
+
+  @override
+  int typeCode() => HInstruction.IS_TEST_SIMPLE_TYPECODE;
+
+  @override
+  bool typeEquals(HInstruction other) => other is HIsTestSimple;
+
+  @override
+  bool dataEquals(HIsTestSimple other) => dartType == other.dartType;
+
+  @override
+  String toString() => 'HIsTestSimple()';
+}
+
+AbstractBool _isTestResult(HInstruction expression, DartType dartType,
+    AbstractValueWithPrecision checkedAbstractValue, JClosedWorld closedWorld) {
+  AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+  AbstractValue subsetType = expression.instructionType;
+  AbstractValue supersetType = checkedAbstractValue.abstractValue;
+  if (checkedAbstractValue.isPrecise &&
+      abstractValueDomain.isIn(subsetType, supersetType).isDefinitelyTrue) {
+    return AbstractBool.True;
+  }
+
+  // TODO(39287): Let the abstract value domain fully handle this.
+  // Currently, the abstract value domain cannot (soundly) state that an is-test
+  // is definitely false, so we reuse some of the case-by-case logic from the
+  // old [HIs] optimization.
+  if (dartType.isTop) return AbstractBool.True;
+  if (dartType is! InterfaceType) return AbstractBool.Maybe;
+  InterfaceType type = dartType;
+  ClassEntity element = type.element;
+  if (type.typeArguments.isNotEmpty) return AbstractBool.Maybe;
+  JCommonElements commonElements = closedWorld.commonElements;
+  if (expression.isInteger(abstractValueDomain).isDefinitelyTrue) {
+    if (element == commonElements.intClass ||
+        element == commonElements.numClass ||
+        commonElements.isNumberOrStringSupertype(element)) {
+      return AbstractBool.True;
+    }
+    if (element == commonElements.doubleClass) {
+      // We let the JS semantics decide for that check. Currently the code we
+      // emit will always return true.
+      return AbstractBool.Maybe;
+    }
+    return AbstractBool.False;
+  }
+  if (expression.isDouble(abstractValueDomain).isDefinitelyTrue) {
+    if (element == commonElements.doubleClass ||
+        element == commonElements.numClass ||
+        commonElements.isNumberOrStringSupertype(element)) {
+      return AbstractBool.True;
+    }
+    if (element == commonElements.intClass) {
+      // We let the JS semantics decide for that check. Currently the code we
+      // emit will return true for a double that can be represented as a 31-bit
+      // integer and for -0.0.
+      return AbstractBool.Maybe;
+    }
+    return AbstractBool.False;
+  }
+  if (expression.isNumber(abstractValueDomain).isDefinitelyTrue) {
+    if (element == commonElements.numClass) {
+      return AbstractBool.True;
+    }
+    // We cannot just return false, because the expression may be of type int or
+    // double.
+    return AbstractBool.Maybe;
+  }
+  if (expression.isPrimitiveNumber(abstractValueDomain).isPotentiallyTrue &&
+      element == commonElements.intClass) {
+    // We let the JS semantics decide for that check.
+    return AbstractBool.Maybe;
+  }
+  // We need the raw check because we don't have the notion of generics in the
+  // backend. For example, `this` in a class `A<T>` is currently always
+  // considered to have the raw type.
+  if (type.treatAsRaw) {
+    return abstractValueDomain.isInstanceOf(subsetType, element);
+  }
+  return AbstractBool.Maybe;
+}
+
 /// Type cast or type check using Rti form of type expression.
 class HAsCheck extends HCheck {
   final AbstractValueWithPrecision checkedType;
@@ -4482,7 +4589,7 @@
   @override
   String toString() {
     String error = isTypeError ? 'TypeError' : 'CastError';
-    return 'HAsCheck($error)';
+    return 'HAsCheckSimple($error)';
   }
 }
 
@@ -4554,6 +4661,8 @@
 /// instance. The reified environment is typically stored as the instance type,
 /// e.g. "UnmodifiableListView<int>".
 class HInstanceEnvironment extends HRtiInstruction {
+  AbstractValue codegenInputType; // Assigned in SsaTypeKnownRemover
+
   HInstanceEnvironment(HInstruction instance, AbstractValue type)
       : super([instance], type) {
     setUseGvn();
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index d28f385..2f69165 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2027,7 +2027,7 @@
         return HAsCheckSimple(node.checkedInput, dartType, checkedType,
             node.isTypeError, specializedCheck, node.instructionType);
       }
-      if (dartType is DynamicType) {
+      if (dartType.isTop) {
         return node.checkedInput;
       }
     }
@@ -2042,22 +2042,59 @@
 
   @override
   HInstruction visitIsTest(HIsTest node) {
-    AbstractValueWithPrecision checkedAbstractValue = node.checkedAbstractValue;
-    HInstruction checkedInput = node.checkedInput;
-    AbstractValue inputType = checkedInput.instructionType;
-
-    AbstractBool isIn = _abstractValueDomain.isIn(
-        inputType, checkedAbstractValue.abstractValue);
-
-    if (isIn.isDefinitelyFalse) {
+    AbstractBool result = node.evaluate(_closedWorld);
+    if (result.isDefinitelyFalse) {
       return _graph.addConstantBool(false, _closedWorld);
     }
-    if (!checkedAbstractValue.isPrecise) return node;
-
-    if (isIn.isDefinitelyTrue) {
+    if (result.isDefinitelyTrue) {
       return _graph.addConstantBool(true, _closedWorld);
     }
 
+    HInstruction typeInput = node.typeInput;
+    if (typeInput is HLoadType) {
+      TypeExpressionRecipe recipe = typeInput.typeExpression;
+      DartType dartType = recipe.type;
+      if (dartType.isTop) {
+        return _graph.addConstantBool(true, _closedWorld);
+      }
+
+      IsTestSpecialization specialization =
+          SpecializedChecks.findIsTestSpecialization(
+              dartType, _graph, _closedWorld);
+
+      if (specialization == IsTestSpecialization.null_) {
+        return HIdentity(
+            node.checkedInput,
+            _graph.addConstantNull(_closedWorld),
+            null,
+            _abstractValueDomain.boolType);
+      }
+
+      if (specialization != null) {
+        AbstractValueWithPrecision checkedType =
+            _abstractValueDomain.createFromStaticType(dartType,
+                nullable: _abstractValueDomain
+                    .isNull(node.checkedAbstractValue.abstractValue)
+                    .isPotentiallyTrue);
+        return HIsTestSimple(dartType, checkedType, specialization,
+            node.checkedInput, _abstractValueDomain.boolType);
+      }
+    }
+
+    // TODO(fishythefish): Prune now-unneeded is-tests from the metadata.
+
+    return node;
+  }
+
+  @override
+  HInstruction visitIsTestSimple(HIsTestSimple node) {
+    AbstractBool result = node.evaluate(_closedWorld);
+    if (result.isDefinitelyFalse) {
+      return _graph.addConstantBool(false, _closedWorld);
+    }
+    if (result.isDefinitelyTrue) {
+      return _graph.addConstantBool(true, _closedWorld);
+    }
     return node;
   }
 
@@ -3166,6 +3203,27 @@
   }
 
   @override
+  void visitIsTestSimple(HIsTestSimple instruction) {
+    List<HBasicBlock> trueTargets = [];
+    List<HBasicBlock> falseTargets = [];
+
+    collectTargets(instruction, trueTargets, falseTargets);
+
+    if (trueTargets.isEmpty && falseTargets.isEmpty) return;
+
+    AbstractValue convertedType =
+        instruction.checkedAbstractValue.abstractValue;
+    HInstruction input = instruction.checkedInput;
+
+    for (HBasicBlock block in trueTargets) {
+      insertTypePropagationForDominatedUsers(block, input, convertedType);
+    }
+    // TODO(sra): Also strengthen uses for when the condition is precise and
+    // known false (e.g. int? x; ... if (x is! int) use(x)). Avoid strengthening
+    // to `null`.
+  }
+
+  @override
   void visitIdentity(HIdentity instruction) {
     // At HIf(HIdentity(x, null)) strengthens x to non-null on else branch.
     HInstruction left = instruction.left;
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 72086bf..9108a15 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -681,6 +681,12 @@
   }
 
   @override
+  String visitIsTestSimple(HIsTestSimple node) {
+    var inputs = node.inputs.map(temporaryId).join(', ');
+    return "IsTestSimple: ${node.dartType} $inputs";
+  }
+
+  @override
   String visitAsCheck(HAsCheck node) {
     var inputs = node.inputs.map(temporaryId).join(', ');
     String error = node.isTypeError ? 'TypeError' : 'CastError';
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index ee93476..807a1ef 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -128,13 +128,21 @@
     if (options.pedanticFixes) {
       params.includePedanticFixes = true;
     }
-    String dir = options.outputDir;
-    if (dir != null) {
-      if (!path.isAbsolute(dir)) {
-        dir = path.absolute(dir);
+    String previewDir = options.previewDir;
+    if (previewDir != null) {
+      if (!path.isAbsolute(previewDir)) {
+        previewDir = path.absolute(previewDir);
       }
-      dir = path.canonicalize(dir);
-      params.outputDir = dir;
+      previewDir = path.canonicalize(previewDir);
+      params.outputDir = previewDir;
+    }
+    String previewPort = options.previewPort;
+    if (previewPort != null) {
+      try {
+        params.port = int.parse(previewPort);
+      } on FormatException {
+        logger.stderr('Invalid port number: ignored');
+      }
     }
     Map<String, dynamic> json =
         await server.send(EDIT_REQUEST_DARTFIX, params.toJson());
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
index 32e9b91..9b645c0 100644
--- a/pkg/dartfix/lib/src/options.dart
+++ b/pkg/dartfix/lib/src/options.dart
@@ -9,13 +9,16 @@
 import 'package:dartfix/src/context.dart';
 import 'package:path/path.dart' as path;
 
+// TODO(brianwilkerson) Deprecate 'excludeFix' and replace it with 'exclude-fix'
 const excludeFixOption = 'excludeFix';
 const forceOption = 'force';
 const includeFixOption = 'fix';
-const outputDirOption = 'outputDir';
 const overwriteOption = 'overwrite';
 const pedanticOption = 'pedantic';
+const previewDirOption = 'preview-dir';
+const previewPortOption = 'preview-port';
 const requiredOption = 'required';
+const sdkOption = 'sdk';
 
 const _binaryName = 'dartfix';
 const _colorOption = 'color';
@@ -41,8 +44,9 @@
 
   final bool force;
   final bool showHelp;
-  final String outputDir;
   final bool overwrite;
+  final String previewDir;
+  final String previewPort;
   final bool useColor;
   final bool verbose;
 
@@ -50,11 +54,12 @@
       : force = results[forceOption] as bool,
         includeFixes = (results[includeFixOption] as List ?? []).cast<String>(),
         excludeFixes = (results[excludeFixOption] as List ?? []).cast<String>(),
-        outputDir = results[outputDirOption] as String,
         overwrite = results[overwriteOption] as bool,
         pedanticFixes = results[pedanticOption] as bool,
+        previewDir = results[previewDirOption] as String,
+        previewPort = results[previewPortOption] as String,
         requiredFixes = results[requiredOption] as bool,
-        sdkPath = _getSdkPath(),
+        sdkPath = results[sdkOption] as String ?? _getSdkPath(),
         serverSnapshot = results[_serverSnapshot] as String,
         showHelp = results[_helpOption] as bool || results.arguments.isEmpty,
         targets = results.rest,
@@ -98,6 +103,10 @@
           help: 'Display this help message.',
           defaultsTo: false,
           negatable: false)
+      ..addOption(sdkOption,
+          help: 'Path to the SDK to analyze against.',
+          valueHelp: 'path',
+          hide: true)
       ..addOption(_serverSnapshot,
           help: 'Path to the analysis server snapshot file.',
           valueHelp: 'path',
@@ -113,8 +122,10 @@
       //
       // Hidden options.
       //
-      ..addOption(outputDirOption,
-          help: 'Path to the output directory', hide: true);
+      ..addOption(previewDirOption,
+          help: 'Path to the preview directory', hide: true)
+      ..addOption(previewPortOption,
+          help: 'The port used by the preview tool', hide: true);
 
     context ??= Context();
 
diff --git a/pkg/dartfix/test/all.dart b/pkg/dartfix/test/all.dart
deleted file mode 100644
index f06cf57..0000000
--- a/pkg/dartfix/test/all.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:test/test.dart';
-
-import 'src/client_version_test.dart' as client_version_test;
-import 'src/driver_exclude_test.dart' as driver_exclude_test;
-import 'src/driver_help_test.dart' as driver_list_test;
-import 'src/driver_include_test.dart' as driver_include_test;
-import 'src/driver_required_test.dart' as driver_required_test;
-import 'src/driver_test.dart' as driver_test;
-import 'src/options_test.dart' as options_test;
-
-main() {
-  client_version_test.main();
-  group('driver', driver_exclude_test.main);
-  group('driver', driver_include_test.main);
-  group('driver', driver_list_test.main);
-  group('driver', driver_required_test.main);
-  group('driver', driver_test.main);
-  group('options', options_test.main);
-}
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
index beb90d0..9848954 100644
--- a/pkg/dartfix/test/src/options_test.dart
+++ b/pkg/dartfix/test/src/options_test.dart
@@ -29,8 +29,9 @@
     bool showHelp = false,
     String normalOut,
     bool pedanticFixes = false,
+    String previewDir,
+    String previewPort,
     bool requiredFixes = false,
-    String outputDir,
     bool overwrite = false,
     String serverSnapshot,
     List<String> targetSuffixes,
@@ -55,8 +56,9 @@
     }
     expect(options.force, force);
     expect(options.pedanticFixes, pedanticFixes);
+    expect(options.previewDir, previewDir);
+    expect(options.previewPort, previewPort);
     expect(options.requiredFixes, requiredFixes);
-    expect(options.outputDir, outputDir);
     expect(options.overwrite, overwrite);
     expect(options.serverSnapshot, serverSnapshot);
     expect(options.showHelp, showHelp);
@@ -117,10 +119,6 @@
         errorOut: 'Expected directory, but found', exitCode: 21);
   });
 
-  test('outputDir', () {
-    parse(['--outputDir=bar', 'foo'], outputDir: 'bar');
-  });
-
   test('overwrite', () {
     parse(['--overwrite', 'foo'], overwrite: true, targetSuffixes: ['foo']);
   });
@@ -129,6 +127,14 @@
     parse(['--pedantic', 'foo'], pedanticFixes: true);
   });
 
+  test('previewDir', () {
+    parse(['--preview-dir=bar', 'foo'], previewDir: 'bar');
+  });
+
+  test('previewPort', () {
+    parse(['--preview-port=8080', 'foo'], previewPort: '8080');
+  });
+
   test('required fixes', () {
     parse(['--required', 'foo'], requiredFixes: true);
   });
diff --git a/pkg/dartfix/test/test_all.dart b/pkg/dartfix/test/test_all.dart
new file mode 100644
index 0000000..5b2a0f6
--- /dev/null
+++ b/pkg/dartfix/test/test_all.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import 'src/client_version_test.dart' as client_version;
+import 'src/driver_example_test.dart' as driver_example;
+import 'src/driver_exclude_test.dart' as driver_exclude;
+import 'src/driver_help_test.dart' as driver_help;
+import 'src/driver_include_test.dart' as driver_include;
+import 'src/driver_pedantic_test.dart' as driver_pedantic;
+import 'src/driver_prefer_is_empty_test.dart' as driver_prefer_is_empty;
+import 'src/driver_required_test.dart' as driver_required;
+import 'src/driver_test.dart' as driver;
+import 'src/options_test.dart' as options_test;
+
+main() {
+  group('version', client_version.main);
+  group('driver', driver_example.main);
+  group('driver', driver_exclude.main);
+  group('driver', driver_help.main);
+  group('driver', driver_include.main);
+  group('driver', driver_pedantic.main);
+  group('driver', driver_prefer_is_empty.main);
+  group('driver', driver_required.main);
+  group('driver', driver.main);
+  group('options', options_test.main);
+}
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 075aaae..75ce561 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -133,12 +133,12 @@
   final ClassElement functionClass;
   final ClassElement internalSymbolClass;
   final ClassElement privateSymbolClass;
-  final InterfaceType linkedHashMapImplType;
-  final InterfaceType identityHashMapImplType;
-  final InterfaceType linkedHashSetImplType;
-  final InterfaceType identityHashSetImplType;
-  final InterfaceType syncIterableType;
-  final InterfaceType asyncStarImplType;
+  final ClassElement linkedHashMapImplElement;
+  final ClassElement identityHashMapImplElement;
+  final ClassElement linkedHashSetImplElement;
+  final ClassElement identityHashSetImplElement;
+  final ClassElement syncIterableElement;
+  final ClassElement asyncStarImplElement;
 
   ConstFieldVisitor _constants;
 
@@ -218,18 +218,17 @@
         internalSymbolClass = driver.getClass('dart:_internal', 'Symbol'),
         privateSymbolClass =
             driver.getClass('dart:_js_helper', 'PrivateSymbol'),
-        linkedHashMapImplType = getLegacyRawClassType(
-            driver.getClass('dart:_js_helper', 'LinkedMap')),
-        identityHashMapImplType = getLegacyRawClassType(
-            driver.getClass('dart:_js_helper', 'IdentityMap')),
-        linkedHashSetImplType = getLegacyRawClassType(
-            driver.getClass('dart:collection', '_HashSet')),
-        identityHashSetImplType = getLegacyRawClassType(
-            driver.getClass('dart:collection', '_IdentityHashSet')),
-        syncIterableType = getLegacyRawClassType(
-            driver.getClass('dart:_js_helper', 'SyncIterable')),
-        asyncStarImplType = getLegacyRawClassType(
-            driver.getClass('dart:async', '_AsyncStarImpl')),
+        linkedHashMapImplElement =
+            driver.getClass('dart:_js_helper', 'LinkedMap'),
+        identityHashMapImplElement =
+            driver.getClass('dart:_js_helper', 'IdentityMap'),
+        linkedHashSetImplElement =
+            driver.getClass('dart:collection', '_HashSet'),
+        identityHashSetImplElement =
+            driver.getClass('dart:collection', '_IdentityHashSet'),
+        syncIterableElement =
+            driver.getClass('dart:_js_helper', 'SyncIterable'),
+        asyncStarImplElement = driver.getClass('dart:async', '_AsyncStarImpl'),
         dartJSLibrary = driver.getLibrary('dart:js') {
     jsTypeRep = JSTypeRep(rules, driver);
   }
@@ -881,131 +880,53 @@
       if (prop != null) markSubtypeOf(prop);
     }
 
-    if (classElem.library.isDartCore) {
-      if (classElem == objectClass) {
-        // Everything is an Object.
-        body.add(js.statement(
-            '#.is = function is_Object(o) { return true; }', [className]));
-        body.add(js.statement(
-            '#.as = function as_Object(o) { return o; }', [className]));
-        body.add(js.statement(
-            '#._check = function check_Object(o) { return o; }', [className]));
-        return null;
-      }
-      if (classElem == stringClass) {
-        body.add(js.statement(
-            '#.is = function is_String(o) { return typeof o == "string"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_String(o) {'
-            '  if (typeof o == "string" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_String(o) {'
-            '  if (typeof o == "string" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (classElem == functionClass) {
-        body.add(js.statement(
-            '#.is = function is_Function(o) { return typeof o == "function"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_Function(o) {'
-            '  if (typeof o == "function" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_Function(o) {'
-            '  if (typeof o == "function" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (classElem == intClass) {
-        body.add(js.statement(
-            '#.is = function is_int(o) {'
-            '  return typeof o == "number" && Math.floor(o) == o;'
-            '}',
-            className));
-        body.add(js.statement(
-            '#.as = function as_int(o) {'
-            '  if ((typeof o == "number" && Math.floor(o) == o) || o == null)'
-            '    return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_int(o) {'
-            '  if ((typeof o == "number" && Math.floor(o) == o) || o == null)'
-            '    return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (classElem == nullClass) {
-        body.add(js.statement(
-            '#.is = function is_Null(o) { return o == null; }', className));
-        body.add(js.statement(
-            '#.as = function as_Null(o) {'
-            '  if (o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_Null(o) {'
-            '  if (o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (classElem == numClass || classElem == doubleClass) {
-        body.add(js.statement(
-            '#.is = function is_num(o) { return typeof o == "number"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_num(o) {'
-            '  if (typeof o == "number" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_num(o) {'
-            '  if (typeof o == "number" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (classElem == boolClass) {
-        body.add(js.statement(
-            '#.is = function is_bool(o) { return o === true || o === false; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_bool(o) {'
-            '  if (o === true || o === false || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_bool(o) {'
-            '  if (o === true || o === false || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
+    if (classElem.library.isDartCore &&
+        (classElem == objectClass ||
+            classElem == stringClass ||
+            classElem == functionClass ||
+            classElem == intClass ||
+            classElem == nullClass ||
+            classElem == numClass ||
+            classElem == doubleClass ||
+            classElem == boolClass)) {
+      // Custom type tests for these types are in the patch files.
+      return null;
     }
-    if (classElem.library.isDartAsync) {
-      if (classElem == types.futureOrElement) {
+    if (classElem.library.isDartAsync && classElem == types.futureOrElement) {
+      // These methods are difficult to place in the runtime or patch files.
+      // * They need to be callable from the class but they can't be static
+      //   methods on the FutureOr class in Dart because they reference the
+      //   generic type parameter.
+      // * There isn't an obvious place in dart:_runtime were we could place a
+      //   method that adds these type tests (similar to addTypeTests()) because
+      //   in the bootstrap ordering the Future class hasn't been defined yet.
+      if (options.nonNullableEnabled) {
+        // TODO(nshahan) Update FutureOr type tests for NNBD.
+        var typeParamT =
+            getLegacyTypeParameterType(classElem.typeParameters[0]);
+        var typeT = _emitType(typeParamT);
+        var futureOfT = _emitType(types.futureType2(typeParamT));
+        body.add(js.statement('''
+            #.is = function is_FutureOr(o) {
+              return #.is(o) || #.is(o);
+            }
+            ''', [className, typeT, futureOfT]));
+        // TODO(jmesserly): remove the fallback to `dart.as`. It's only for the
+        // _ignoreTypeFailure logic.
+        body.add(js.statement('''
+            #.as = function as_FutureOr(o) {
+              if (o == null || #.is(o) || #.is(o)) return o;
+              return #.as(o, this, false);
+            }
+            ''', [className, typeT, futureOfT, runtimeModule]));
+        body.add(js.statement('''
+            #._check = function check_FutureOr(o) {
+              if (o == null || #.is(o) || #.is(o)) return o;
+              return #.as(o, this, true);
+            }
+            ''', [className, typeT, futureOfT, runtimeModule]));
+        return null;
+      } else {
         var typeParamT =
             getLegacyTypeParameterType(classElem.typeParameters[0]);
         var typeT = _emitType(typeParamT);
@@ -2272,6 +2193,7 @@
       element.returnType,
       element.typeParameters,
       parameters,
+      nullabilitySuffix: NullabilitySuffix.star,
     );
   }
 
@@ -2942,7 +2864,12 @@
       var gen = emitGeneratorFn(jsParams);
       if (jsParams.isNotEmpty) gen = js.call('() => #(#)', [gen, jsParams]);
 
-      var syncIterable = _emitType(syncIterableType.instantiate([returnType]));
+      var syncIterable = _emitType(
+        syncIterableElement.instantiate(
+          typeArguments: [returnType],
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
+      );
       return js.call('new #.new(#)', [syncIterable, gen]);
     }
 
@@ -2957,7 +2884,10 @@
       var asyncStarParam = js_ast.TemporaryId('stream');
       var gen = emitGeneratorFn([asyncStarParam], asyncStarParam);
 
-      var asyncStarImpl = asyncStarImplType.instantiate([returnType]);
+      var asyncStarImpl = asyncStarImplElement.instantiate(
+        typeArguments: [returnType],
+        nullabilitySuffix: NullabilitySuffix.star,
+      );
       return js.call('new #.new(#).stream', [_emitType(asyncStarImpl), gen]);
     }
 
@@ -5735,7 +5665,10 @@
     if (itemType.isDynamic) return list;
 
     // Call `new JSArray<E>.of(list)`
-    var arrayType = getLegacyRawClassType(_jsArray).instantiate([itemType]);
+    var arrayType = _jsArray.instantiate(
+      typeArguments: [itemType],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
     return js.call('#.of(#)', [_emitType(arrayType), list]);
   }
 
@@ -5764,8 +5697,14 @@
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= jsTypeRep.isPrimitive(typeArgs[0]);
-    type = identity ? identityHashMapImplType : linkedHashMapImplType;
-    return _emitType(type.instantiate(typeArgs));
+    var element =
+        identity ? identityHashMapImplElement : linkedHashMapImplElement;
+    return _emitType(
+      element.instantiate(
+        typeArguments: typeArgs,
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+    );
   }
 
   js_ast.Expression _emitConstSet(
@@ -5778,8 +5717,14 @@
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= jsTypeRep.isPrimitive(typeArgs[0]);
-    type = identity ? identityHashSetImplType : linkedHashSetImplType;
-    return _emitType(type.instantiate(typeArgs));
+    var element =
+        identity ? identityHashSetImplElement : linkedHashSetImplElement;
+    return _emitType(
+      element.instantiate(
+        typeArguments: typeArgs,
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+    );
   }
 
   @override
@@ -5893,8 +5838,10 @@
       if (_isUiAsCodeElement(node)) {
         // Create a temporary variable to build a new collection from.
         var previousCollectionVariable = _currentCollectionVariable;
-        var arrayType =
-            getLegacyRawClassType(_jsArray).instantiate([elementType]);
+        var arrayType = _jsArray.instantiate(
+          typeArguments: [elementType],
+          nullabilitySuffix: NullabilitySuffix.star,
+        );
         var temporaryIdentifier = _createTemporary('items', arrayType);
         _currentCollectionVariable = _emitSimpleIdentifier(temporaryIdentifier);
         var items = js.statement('let # = #',
@@ -6160,10 +6107,16 @@
   /// available. If the element is `external`, the element is used to statically
   /// resolve the JS interop/dart:html static member. Otherwise it is ignored.
   js_ast.Expression _emitStaticMemberName(String name, [Element element]) {
-    if (element != null && _isExternal(element)) {
-      var newName = getAnnotationName(element, isJSName) ??
-          _getJSInteropStaticMemberName(element);
-      if (newName != null) return js.escapedString(newName, "'");
+    if (element != null) {
+      if (_isExternal(element)) {
+        var newName = getAnnotationName(element, isJSName) ??
+            _getJSInteropStaticMemberName(element);
+        if (newName != null) return js.escapedString(newName, "'");
+      }
+      // Allow the Dart SDK to assign names to statics with the @JSExportName
+      // annotation.
+      var exportName = getJSExportName(element);
+      if (exportName != null) return propertyName(exportName);
     }
 
     switch (name) {
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 74d485c..09374d2 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -196,6 +196,9 @@
     // that build systems do not depend on passing windows-style paths here.
     return p.toUri(moduleName).toString();
   }
+
+  // TODO(nshahan) Cleanup when NNBD graduates experimental status.
+  bool get nonNullableEnabled => experiments['non-nullable'] ?? false;
 }
 
 /// Finds explicit module names of the form `path=name` in [summaryPaths],
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 9a92ecd..4fa082c 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -30,6 +30,8 @@
 
 const _binaryName = 'dartdevc -k';
 
+// ignore_for_file: DEPRECATED_MEMBER_USE
+
 /// Invoke the compiler with [args].
 ///
 /// Returns `true` if the program compiled without any fatal errors.
@@ -313,18 +315,8 @@
     compilerState.options.onDiagnostic = diagnosticMessageHandler;
     Component incrementalComponent = await incrementalCompiler.computeDelta(
         entryPoints: inputs, fullComponent: true);
-    result = fe.DdcResult(incrementalComponent, doneInputSummaries,
-        incrementalCompiler.userCode.loader.hierarchy);
-
-    // Workaround for DDC relying on isExternal being set to true.
-    for (var lib in cachedSdkInput.component.libraries) {
-      lib.isExternal = true;
-    }
-    for (Component c in doneInputSummaries) {
-      for (Library lib in c.libraries) {
-        lib.isExternal = true;
-      }
-    }
+    result = fe.DdcResult(incrementalComponent, cachedSdkInput.component,
+        doneInputSummaries, incrementalCompiler.userCode.loader.hierarchy);
   }
   compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
 
@@ -333,7 +325,14 @@
   }
 
   var component = result.component;
-  if (!options.emitMetadata && _checkForDartMirrorsImport(component)) {
+  Set<Library> librariesFromDill = result.computeLibrariesFromDill();
+  Component compiledLibraries =
+      Component(nameRoot: component.root, uriToSource: component.uriToSource);
+  for (Library lib in component.libraries) {
+    if (!librariesFromDill.contains(lib)) compiledLibraries.libraries.add(lib);
+  }
+
+  if (!options.emitMetadata && _checkForDartMirrorsImport(compiledLibraries)) {
     return CompilerResult(1, kernelState: compilerState);
   }
 
@@ -376,7 +375,7 @@
   var compiler = ProgramCompiler(component, result.classHierarchy, options);
 
   var jsModule = compiler.emitModule(
-      component, result.inputSummaries, inputSummaries, summaryModules);
+      compiledLibraries, result.inputSummaries, inputSummaries, summaryModules);
 
   // Also the old Analyzer backend had some code to make debugging better when
   // --single-out-file is used, but that option does not appear to be used by
@@ -532,7 +531,7 @@
 
 bool _checkForDartMirrorsImport(Component component) {
   for (var library in component.libraries) {
-    if (library.isExternal || library.importUri.scheme == 'dart') continue;
+    if (library.importUri.scheme == 'dart') continue;
     for (var dep in library.dependencies) {
       var uri = dep.targetLibrary.importUri;
       if (uri.scheme == 'dart' && uri.path == 'mirrors') {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 3493030..939ee1b 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -288,7 +288,7 @@
       }
     }
 
-    var libraries = component.libraries.where((l) => !l.isExternal);
+    var libraries = component.libraries;
 
     // Initialize our library variables.
     var items = startModule(libraries);
@@ -968,138 +968,61 @@
       if (prop != null) markSubtypeOf(prop);
     }
 
-    // TODO(jmesserly): share these hand coded type checks with the old back
-    // end, perhaps by factoring them into a common file, or move them to be
-    // static methdos in the SDK. (Or wait until we delete the old back end.)
-    if (c.enclosingLibrary == _coreTypes.coreLibrary) {
-      if (c == _coreTypes.objectClass) {
-        // Everything is an Object.
-        body.add(js.statement(
-            '#.is = function is_Object(o) { return true; }', [className]));
-        body.add(js.statement(
-            '#.as = function as_Object(o) { return o; }', [className]));
-        body.add(js.statement(
-            '#._check = function check_Object(o) { return o; }', [className]));
-        return null;
-      }
-      if (c == _coreTypes.stringClass) {
-        body.add(js.statement(
-            '#.is = function is_String(o) { return typeof o == "string"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_String(o) {'
-            '  if (typeof o == "string" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_String(o) {'
-            '  if (typeof o == "string" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (c == _coreTypes.functionClass) {
-        body.add(js.statement(
-            '#.is = function is_Function(o) { return typeof o == "function"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_Function(o) {'
-            '  if (typeof o == "function" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_String(o) {'
-            '  if (typeof o == "function" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (c == _coreTypes.intClass) {
-        body.add(js.statement(
-            '#.is = function is_int(o) {'
-            '  return typeof o == "number" && Math.floor(o) == o;'
-            '}',
-            className));
-        body.add(js.statement(
-            '#.as = function as_int(o) {'
-            '  if ((typeof o == "number" && Math.floor(o) == o) || o == null)'
-            '    return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_int(o) {'
-            '  if ((typeof o == "number" && Math.floor(o) == o) || o == null)'
-            '    return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (c == _coreTypes.nullClass) {
-        body.add(js.statement(
-            '#.is = function is_Null(o) { return o == null; }', className));
-        body.add(js.statement(
-            '#.as = function as_Null(o) {'
-            '  if (o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_Null(o) {'
-            '  if (o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (c == _coreTypes.numClass || c == _coreTypes.doubleClass) {
-        body.add(js.statement(
-            '#.is = function is_num(o) { return typeof o == "number"; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_num(o) {'
-            '  if (typeof o == "number" || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_num(o) {'
-            '  if (typeof o == "number" || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
-      if (c == _coreTypes.boolClass) {
-        body.add(js.statement(
-            '#.is = function is_bool(o) { return o === true || o === false; }',
-            className));
-        body.add(js.statement(
-            '#.as = function as_bool(o) {'
-            '  if (o === true || o === false || o == null) return o;'
-            '  return #.as(o, #, false);'
-            '}',
-            [className, runtimeModule, className]));
-        body.add(js.statement(
-            '#._check = function check_bool(o) {'
-            '  if (o === true || o === false || o == null) return o;'
-            '  return #.as(o, #, true);'
-            '}',
-            [className, runtimeModule, className]));
-        return null;
-      }
+    if (c.enclosingLibrary == _coreTypes.coreLibrary &&
+        (c == _coreTypes.objectClass ||
+            c == _coreTypes.stringClass ||
+            c == _coreTypes.functionClass ||
+            c == _coreTypes.intClass ||
+            c == _coreTypes.nullClass ||
+            c == _coreTypes.numClass ||
+            c == _coreTypes.doubleClass ||
+            c == _coreTypes.boolClass)) {
+      // Custom type tests for these types are in the patch files.
+      return null;
     }
-    if (c.enclosingLibrary == _coreTypes.asyncLibrary) {
-      if (c == _coreTypes.futureOrClass) {
-        var typeParam = TypeParameterType(c.typeParameters[0]);
+
+    if (c.enclosingLibrary == _coreTypes.asyncLibrary &&
+        c == _coreTypes.futureOrClass) {
+      // These methods are difficult to place in the runtime or patch files.
+      // * They need to be callable from the class but they can't be static
+      //   methods on the FutureOr class in Dart because they reference the
+      //   generic type parameter.
+      // * There isn't an obvious place in dart:_runtime were we could place a
+      //   method that adds these type tests (similar to addTypeTests()) because
+      //   in the bootstrap ordering the Future class hasn't been defined yet.
+      if (_options.nonNullableEnabled) {
+        // TODO(nshahan) Update FutureOr type tests for NNBD
+        var typeParam =
+            TypeParameterType(c.typeParameters[0], Nullability.legacy);
         var typeT = visitTypeParameterType(typeParam);
-        var futureOfT = visitInterfaceType(
-            InterfaceType(_coreTypes.futureClass, [typeParam]));
+        var futureOfT = visitInterfaceType(InterfaceType(
+            _coreTypes.futureClass, Nullability.legacy, [typeParam]));
+        body.add(js.statement('''
+            #.is = function is_FutureOr(o) {
+              return #.is(o) || #.is(o);
+            }
+            ''', [className, typeT, futureOfT]));
+        // TODO(jmesserly): remove the fallback to `dart.as`. It's only for the
+        // _ignoreTypeFailure logic.
+        body.add(js.statement('''
+            #.as = function as_FutureOr(o) {
+              if (o == null || #.is(o) || #.is(o)) return o;
+              return #.as(o, this, false);
+            }
+            ''', [className, typeT, futureOfT, runtimeModule]));
+        body.add(js.statement('''
+            #._check = function check_FutureOr(o) {
+              if (o == null || #.is(o) || #.is(o)) return o;
+              return #.as(o, this, true);
+            }
+            ''', [className, typeT, futureOfT, runtimeModule]));
+        return null;
+      } else {
+        var typeParam =
+            TypeParameterType(c.typeParameters[0], Nullability.legacy);
+        var typeT = visitTypeParameterType(typeParam);
+        var futureOfT = visitInterfaceType(InterfaceType(
+            _coreTypes.futureClass, Nullability.legacy, [typeParam]));
         body.add(js.statement('''
             #.is = function is_FutureOr(o) {
               return #.is(o) || #.is(o);
@@ -1304,7 +1227,7 @@
       if (!_options.emitMetadata && member.isStatic) continue;
 
       var name = member.name.name;
-      var reifiedType = _getMemberRuntimeType(member, c) as FunctionType;
+      var reifiedType = _memberRuntimeType(member, c) as FunctionType;
 
       // Don't add redundant signatures for inherited methods whose signature
       // did not change.  If we are not overriding, or if the thing we are
@@ -1317,7 +1240,7 @@
           : null;
 
       var needsSignature = memberOverride == null ||
-          reifiedType != _getMemberRuntimeType(memberOverride, c);
+          reifiedType != _memberRuntimeType(memberOverride, c);
 
       if (needsSignature) {
         js_ast.Expression type;
@@ -1396,7 +1319,7 @@
   }
 
   js_ast.Expression _emitFieldSignature(Field field, Class fromClass) {
-    var type = _getTypeFromClass(field.type, field.enclosingClass, fromClass);
+    var type = _typeFromClass(field.type, field.enclosingClass, fromClass);
     var args = [_emitType(type)];
     var annotations = field.annotations;
     if (_options.emitMetadata &&
@@ -1412,7 +1335,7 @@
         field.isFinal ? 'finalFieldType(#)' : 'fieldType(#)', [args]);
   }
 
-  DartType _getMemberRuntimeType(Member member, Class fromClass) {
+  DartType _memberRuntimeType(Member member, Class fromClass) {
     var f = member.function;
     if (f == null) {
       return (member as Field).type;
@@ -1429,18 +1352,18 @@
 
       // TODO(jmesserly): do covariant type parameter bounds also need to be
       // reified as `Object`?
-      result = FunctionType(
-          f.positionalParameters.map(reifyParameter).toList(), f.returnType,
+      result = FunctionType(f.positionalParameters.map(reifyParameter).toList(),
+          f.returnType, Nullability.legacy,
           namedParameters: f.namedParameters.map(reifyNamedParameter).toList()
             ..sort(),
           typeParameters: f.thisFunctionType.typeParameters,
           requiredParameterCount: f.requiredParameterCount);
     }
-    return _getTypeFromClass(result, member.enclosingClass, fromClass)
+    return _typeFromClass(result, member.enclosingClass, fromClass)
         as FunctionType;
   }
 
-  DartType _getTypeFromClass(DartType type, Class superclass, Class subclass) {
+  DartType _typeFromClass(DartType type, Class superclass, Class subclass) {
     if (identical(superclass, subclass)) return type;
     return Substitution.fromSupertype(
             _hierarchy.getClassAsInstanceOf(subclass, superclass))
@@ -1848,7 +1771,7 @@
     if (superMember == null) return const [];
 
     substituteType(DartType t) {
-      return _getTypeFromClass(t, superMember.enclosingClass, enclosingClass);
+      return _typeFromClass(t, superMember.enclosingClass, enclosingClass);
     }
 
     var name = _declareMemberName(member);
@@ -2352,8 +2275,12 @@
     if (member != null) {
       var jsName = _emitJSInteropStaticMemberName(member);
       if (jsName != null) return jsName;
-    }
 
+      // Allow the Dart SDK to assign names to statics with the @JSExportName
+      // annotation.
+      var exportName = _jsExportName(member);
+      if (exportName != null) return propertyName(exportName);
+    }
     switch (name) {
       // Reserved for the compiler to do `x as T`.
       case 'as':
@@ -2450,7 +2377,7 @@
     return false;
   }
 
-  String _getJSNameWithoutGlobal(NamedNode n) {
+  String _jsNameWithoutGlobal(NamedNode n) {
     if (!usesJSInterop(n)) return null;
     var libraryJSName = _annotationName(getLibrary(n), isPublicJSAnnotation);
     var jsName = _annotationName(n, isPublicJSAnnotation) ?? getTopLevelName(n);
@@ -2458,7 +2385,7 @@
   }
 
   js_ast.PropertyAccess _emitJSInterop(NamedNode n) {
-    var jsName = _getJSNameWithoutGlobal(n);
+    var jsName = _jsNameWithoutGlobal(n);
     if (jsName == null) return null;
     return _emitJSInteropForGlobal(jsName);
   }
@@ -2625,7 +2552,7 @@
       return runtimeCall(
           'anonymousJSType(#)', [js.escapedString(getLocalClassName(c))]);
     }
-    var jsName = _getJSNameWithoutGlobal(c);
+    var jsName = _jsNameWithoutGlobal(c);
     if (jsName != null) {
       return runtimeCall('lazyJSType(() => #, #)',
           [_emitJSInteropForGlobal(jsName), js.escapedString(jsName)]);
@@ -2969,10 +2896,9 @@
         gen = js.call('() => #(#)', [gen, mutatedParams]);
       }
 
-      var returnType =
-          _getExpectedReturnType(function, _coreTypes.iterableClass);
-      var syncIterable =
-          _emitType(InterfaceType(_syncIterableClass, [returnType]));
+      var returnType = _expectedReturnType(function, _coreTypes.iterableClass);
+      var syncIterable = _emitType(
+          InterfaceType(_syncIterableClass, Nullability.legacy, [returnType]));
       return js.call('new #.new(#)', [syncIterable, gen]);
     }
 
@@ -2986,8 +2912,9 @@
       // _AsyncStarImpl has an example of the generated code.
       var gen = emitGeneratorFn((_) => [_asyncStarController]);
 
-      var returnType = _getExpectedReturnType(function, _coreTypes.streamClass);
-      var asyncStarImpl = InterfaceType(_asyncStarImplClass, [returnType]);
+      var returnType = _expectedReturnType(function, _coreTypes.streamClass);
+      var asyncStarImpl =
+          InterfaceType(_asyncStarImplClass, Nullability.legacy, [returnType]);
       return js.call('new #.new(#).stream', [_emitType(asyncStarImpl), gen]);
     }
 
@@ -3011,7 +2938,7 @@
   }
 
   /// Gets the expected return type of a `sync*` or `async*` body.
-  DartType _getExpectedReturnType(FunctionNode f, Class expected) {
+  DartType _expectedReturnType(FunctionNode f, Class expected) {
     var type = f.thisFunctionType.returnType;
     if (type is InterfaceType) {
       var match = _hierarchy.getTypeAsInstanceOf(type, expected);
@@ -3169,7 +3096,7 @@
     for (var t in typeFormals) {
       if (t.isGenericCovariantImpl && !_types.isTop(t.bound)) {
         body.add(runtimeStatement('checkTypeBound(#, #, #)', [
-          _emitType(TypeParameterType(t)),
+          _emitType(TypeParameterType(t, Nullability.legacy)),
           _emitType(t.bound),
           propertyName(t.name)
         ]));
@@ -3259,7 +3186,8 @@
   ///
   /// This is the most common kind of marking, and is used for most expressions
   /// and statements.
-  SourceLocation _nodeStart(TreeNode node) => _getLocation(node.fileOffset);
+  SourceLocation _nodeStart(TreeNode node) =>
+      _toSourceLocation(node.fileOffset);
 
   /// Gets the end position of [node] for use in source mapping.
   ///
@@ -3270,7 +3198,7 @@
   /// has already been emitted. For example, `foo.bar` we only need to mark the
   /// end of `.bar` to ensure `foo.bar` has a hover tooltip.
   NodeEnd _nodeEnd(int endOffset) {
-    var loc = _getLocation(endOffset);
+    var loc = _toSourceLocation(endOffset);
     return loc != null ? NodeEnd(loc) : null;
   }
 
@@ -3279,12 +3207,12 @@
   //
   // TODO(jmesserly): we need a lot more nodes to support hover.
   NodeSpan _variableSpan(int offset, int nameLength) {
-    var start = _getLocation(offset);
-    var end = _getLocation(offset + nameLength);
+    var start = _toSourceLocation(offset);
+    var end = _toSourceLocation(offset + nameLength);
     return start != null && end != null ? NodeSpan(start, end) : null;
   }
 
-  SourceLocation _getLocation(int offset) {
+  SourceLocation _toSourceLocation(int offset) {
     if (offset == -1) return null;
     var fileUri = _currentUri;
     if (fileUri == null) return null;
@@ -3310,8 +3238,8 @@
   /// source code.
   HoverComment _hoverComment(
       js_ast.Expression expr, int offset, int nameLength) {
-    var start = _getLocation(offset);
-    var end = _getLocation(offset + nameLength);
+    var start = _toSourceLocation(offset);
+    var end = _toSourceLocation(offset + nameLength);
     return start != null && end != null ? HoverComment(expr, start, end) : null;
   }
 
@@ -3376,11 +3304,12 @@
       jsCondition = runtimeCall('test(#)', [jsCondition]);
     }
 
-    var encodedConditionSource = node
-        .enclosingComponent.uriToSource[node.location.file].source
-        .sublist(node.conditionStartOffset, node.conditionEndOffset);
-    var conditionSource = utf8.decode(encodedConditionSource);
-    var location = _getLocation(node.conditionStartOffset);
+    var encodedSource =
+        node.enclosingComponent.uriToSource[node.location.file].source;
+    var source = utf8.decode(encodedSource, allowMalformed: true);
+    var conditionSource =
+        source.substring(node.conditionStartOffset, node.conditionEndOffset);
+    var location = _toSourceLocation(node.conditionStartOffset);
     return js.statement(' if (!#) #.assertFailed(#, #, #, #, #);', [
       jsCondition,
       runtimeModule,
@@ -4166,7 +4095,7 @@
     if (target is Field || target is Procedure && target.isAccessor) {
       var fromType = target.getterType;
       if (fromType is InterfaceType) {
-        var callName = _getImplicitCallTarget(fromType);
+        var callName = _implicitCallTarget(fromType);
         if (callName != null) {
           return js.call('#.#.#(#)', [jsReceiver, jsName, callName, args]);
         }
@@ -4214,9 +4143,9 @@
   }
 
   bool _isDirectCallable(DartType t) =>
-      t is FunctionType || t is InterfaceType && usesJSInterop(t.classNode);
+      t is FunctionType || (t is InterfaceType && usesJSInterop(t.classNode));
 
-  js_ast.Expression _getImplicitCallTarget(InterfaceType from) {
+  js_ast.Expression _implicitCallTarget(InterfaceType from) {
     var c = from.classNode;
     var member = _hierarchy.getInterfaceMember(c, Name("call"));
     if (member is Procedure && !member.isAccessor && !usesJSInterop(c)) {
@@ -4881,7 +4810,7 @@
 
     var type = ctorClass.typeParameters.isEmpty
         ? _coreTypes.legacyRawType(ctorClass)
-        : InterfaceType(ctorClass, args.types);
+        : InterfaceType(ctorClass, Nullability.legacy, args.types);
 
     if (isFromEnvironmentInvocation(_coreTypes, node)) {
       var value = _constants.evaluate(node);
@@ -4942,7 +4871,7 @@
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? _identityHashMapImplClass : _linkedHashMapImplClass;
-    return _emitType(InterfaceType(c, typeArgs));
+    return _emitType(InterfaceType(c, Nullability.legacy, typeArgs));
   }
 
   js_ast.Expression _emitSetImplType(InterfaceType type, {bool identity}) {
@@ -4950,7 +4879,7 @@
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? _identityHashSetImplClass : _linkedHashSetImplClass;
-    return _emitType(InterfaceType(c, typeArgs));
+    return _emitType(InterfaceType(c, Nullability.legacy, typeArgs));
   }
 
   js_ast.Expression _emitObjectLiteral(Arguments node) {
@@ -5171,7 +5100,8 @@
     if (itemType == const DynamicType()) return list;
 
     // Call `new JSArray<E>.of(list)`
-    var arrayType = InterfaceType(_jsArrayClass, [itemType]);
+    var arrayType =
+        InterfaceType(_jsArrayClass, Nullability.legacy, [itemType]);
     return js.call('#.of(#)', [_emitType(arrayType), list]);
   }
 
@@ -5187,8 +5117,8 @@
   js_ast.Expression visitSetLiteral(SetLiteral node) {
     // TODO(markzipan): remove const check when we use front-end const eval
     if (!node.isConst) {
-      var setType = visitInterfaceType(
-          InterfaceType(_linkedHashSetClass, [node.typeArgument]));
+      var setType = visitInterfaceType(InterfaceType(
+          _linkedHashSetClass, Nullability.legacy, [node.typeArgument]));
       if (node.expressions.isEmpty) {
         return js.call('#.new()', [setType]);
       }
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index d79ce0b..c7f7e28 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -489,9 +489,9 @@
 /// to be produced in the set of expressions that cannot be null by DDC's null
 /// inference.
 Future expectNotNull(String code, String expectedNotNull) async {
-  var component = await kernelCompile(code);
-  var collector = NotNullCollector();
-  component.accept(collector);
+  var result = await kernelCompile(code);
+  var collector = NotNullCollector(result.librariesFromDill);
+  result.component.accept(collector);
   var actualNotNull = collector.notNullExpressions
       // ConstantExpressions print the table offset - we want to compare
       // against the underlying constant value instead.
@@ -517,15 +517,19 @@
 
 /// Given the Dart [code], expects all the expressions inferred to be not-null.
 Future expectAllNotNull(String code) async {
-  (await kernelCompile(code)).accept(ExpectAllNotNull());
+  var result = (await kernelCompile(code));
+  result.component.accept(ExpectAllNotNull(result.librariesFromDill));
 }
 
 bool useAnnotations = false;
 NullableInference inference;
 
 class _TestRecursiveVisitor extends RecursiveVisitor<void> {
+  final Set<Library> librariesFromDill;
   int _functionNesting = 0;
 
+  _TestRecursiveVisitor(this.librariesFromDill);
+
   @override
   visitComponent(Component node) {
     var hierarchy = ClassHierarchy(node);
@@ -543,7 +547,7 @@
 
   @override
   visitLibrary(Library node) {
-    if (node.isExternal ||
+    if (librariesFromDill.contains(node) ||
         node.importUri.scheme == 'package' &&
             node.importUri.pathSegments[0] == 'meta') {
       return;
@@ -564,6 +568,8 @@
 class NotNullCollector extends _TestRecursiveVisitor {
   final notNullExpressions = <Expression>[];
 
+  NotNullCollector(Set<Library> librariesFromDill) : super(librariesFromDill);
+
   @override
   defaultExpression(Expression node) {
     if (!inference.isNullable(node)) {
@@ -574,6 +580,8 @@
 }
 
 class ExpectAllNotNull extends _TestRecursiveVisitor {
+  ExpectAllNotNull(Set<Library> librariesFromDill) : super(librariesFromDill);
+
   @override
   defaultExpression(Expression node) {
     expect(inference.isNullable(node), false,
@@ -585,7 +593,14 @@
 fe.InitializedCompilerState _compilerState;
 final _fileSystem = fe.MemoryFileSystem(Uri.file('/memory/'));
 
-Future<Component> kernelCompile(String code) async {
+class CompileResult {
+  final Component component;
+  final Set<Library> librariesFromDill;
+
+  CompileResult(this.component, this.librariesFromDill);
+}
+
+Future<CompileResult> kernelCompile(String code) async {
   var succeeded = true;
   void diagnosticMessageHandler(fe.DiagnosticMessage message) {
     if (message.severity == fe.Severity.error) {
@@ -625,5 +640,7 @@
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
   expect(succeeded, true);
-  return result.component;
+
+  Set<Library> librariesFromDill = result.computeLibrariesFromDill();
+  return CompileResult(result.component, librariesFromDill);
 }
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index 2f5193b..783bee2 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -50,7 +50,8 @@
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [entryPoint])),
         component,
-        outlineOnly);
+        outlineOnly,
+        incrementalSerializer);
   }
 
   /// Returns a component whose libraries are the recompiled libraries,
diff --git a/pkg/front_end/lib/src/api_unstable/compiler_state.dart b/pkg/front_end/lib/src/api_unstable/compiler_state.dart
index 06998b7..9baa0b7 100644
--- a/pkg/front_end/lib/src/api_unstable/compiler_state.dart
+++ b/pkg/front_end/lib/src/api_unstable/compiler_state.dart
@@ -38,12 +38,7 @@
 class WorkerInputComponent {
   final List<int> digest;
   final Component component;
-  final Set<Uri> externalLibs;
-  WorkerInputComponent(this.digest, this.component)
-      : externalLibs = component.libraries
-            .where((lib) => lib.isExternal)
-            .map((lib) => lib.importUri)
-            .toSet();
+  WorkerInputComponent(this.digest, this.component);
 }
 
 bool digestsEqual(List<int> a, List<int> b) {
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 9560262..1f39033 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -9,7 +9,7 @@
 
 import 'package:kernel/class_hierarchy.dart';
 
-import 'package:kernel/kernel.dart' show Component;
+import 'package:kernel/kernel.dart' show Component, Library;
 
 import 'package:kernel/target/targets.dart' show Target;
 
@@ -71,11 +71,30 @@
 
 class DdcResult {
   final Component component;
+  final Component sdkSummary;
   final List<Component> inputSummaries;
   final ClassHierarchy classHierarchy;
 
-  DdcResult(this.component, this.inputSummaries, this.classHierarchy)
+  DdcResult(
+      this.component, this.sdkSummary, this.inputSummaries, this.classHierarchy)
       : assert(classHierarchy != null);
+
+  Set<Library> computeLibrariesFromDill() {
+    Set<Library> librariesFromDill = new Set<Library>();
+
+    for (Component c in inputSummaries) {
+      for (Library lib in c.libraries) {
+        librariesFromDill.add(lib);
+      }
+    }
+    if (sdkSummary != null) {
+      for (Library lib in sdkSummary.libraries) {
+        librariesFromDill.add(lib);
+      }
+    }
+
+    return librariesFromDill;
+  }
 }
 
 Future<InitializedCompilerState> initializeCompiler(
@@ -108,8 +127,10 @@
     // as external.
     (await oldState.processedOpts.loadSdkSummary(null))
         .libraries
+        // ignore: DEPRECATED_MEMBER_USE
         .forEach((lib) => lib.isExternal = false);
     (await oldState.processedOpts.loadInputSummaries(null))
+        // ignore: DEPRECATED_MEMBER_USE
         .forEach((p) => p.libraries.forEach((lib) => lib.isExternal = false));
 
     return oldState;
@@ -188,7 +209,9 @@
   Component component = compilerResult?.component;
   if (component == null) return null;
 
-  // This should be cached.
+  // These should be cached.
+  Component sdkSummary = await processedOpts.loadSdkSummary(null);
   List<Component> summaries = await processedOpts.loadInputSummaries(null);
-  return new DdcResult(component, summaries, compilerResult.classHierarchy);
+  return new DdcResult(
+      component, sdkSummary, summaries, compilerResult.classHierarchy);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index d7a4797..3916c39 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -120,10 +120,6 @@
         options = oldState.options;
         processedOpts = oldState.processedOpts;
         Component sdkComponent = cachedSdkInput.component;
-        // Reset the state of the component.
-        for (Library lib in sdkComponent.libraries) {
-          lib.isExternal = cachedSdkInput.externalLibs.contains(lib.importUri);
-        }
 
         // Make sure the canonical name root knows about the sdk - otherwise we
         // won't be able to link to it when loading more outlines.
@@ -185,9 +181,8 @@
         } else {
           // Need to reset cached components so they are usable again.
           Component component = cachedInput.component;
-          for (Library lib in component.libraries) {
-            lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
-            if (trackNeededDillLibraries) {
+          if (trackNeededDillLibraries) {
+            for (Library lib in component.libraries) {
               libraryToInputDill[lib.importUri] = summaryUri;
             }
           }
diff --git a/pkg/front_end/lib/src/compute_platform_binaries_location.dart b/pkg/front_end/lib/src/compute_platform_binaries_location.dart
index ad98f28..2c36d10 100644
--- a/pkg/front_end/lib/src/compute_platform_binaries_location.dart
+++ b/pkg/front_end/lib/src/compute_platform_binaries_location.dart
@@ -14,9 +14,11 @@
 /// of the platform libraries that are used to avoid recompiling those
 /// libraries.
 Uri computePlatformBinariesLocation({bool forceBuildDir: false}) {
+  String resolvedExecutable = Platform.environment['resolvedExecutable'];
   // The directory of the Dart VM executable.
   Uri vmDirectory = Uri.base
-      .resolveUri(new Uri.file(Platform.resolvedExecutable))
+      .resolveUri(
+          new Uri.file(resolvedExecutable ?? Platform.resolvedExecutable))
       .resolve(".");
   if (vmDirectory.path.endsWith("/bin/")) {
     // Looks like the VM is in a `/bin/` directory, so this is running from a
diff --git a/pkg/front_end/lib/src/external_state_snapshot.dart b/pkg/front_end/lib/src/external_state_snapshot.dart
index 0484dc0..c49ce26 100644
--- a/pkg/front_end/lib/src/external_state_snapshot.dart
+++ b/pkg/front_end/lib/src/external_state_snapshot.dart
@@ -12,6 +12,7 @@
 
   ExternalStateSnapshot(Component component)
       : snapshots = new List<ExternalState>.from(
+            // ignore: DEPRECATED_MEMBER_USE
             component.libraries.map((l) => new ExternalState(l, l.isExternal)));
 
   void restore() {
@@ -28,6 +29,7 @@
   ExternalState(this.library, this.isExternal);
 
   void restore() {
+    // ignore: DEPRECATED_MEMBER_USE
     library.isExternal = isExternal;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index e47b4a1..98f0245 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -617,19 +617,15 @@
   @override
   InterfaceType get legacyRawType {
     // TODO(dmitryas): Use computeBound instead of DynamicType here?
-    return _legacyRawType ??= new InterfaceType(
-        cls,
-        new List<DartType>.filled(typeVariablesCount, const DynamicType()),
-        Nullability.legacy);
+    return _legacyRawType ??= new InterfaceType(cls, Nullability.legacy,
+        new List<DartType>.filled(typeVariablesCount, const DynamicType()));
   }
 
   @override
   InterfaceType get nullableRawType {
     // TODO(dmitryas): Use computeBound instead of DynamicType here?
-    return _nullableRawType ??= new InterfaceType(
-        cls,
-        new List<DartType>.filled(typeVariablesCount, const DynamicType()),
-        Nullability.nullable);
+    return _nullableRawType ??= new InterfaceType(cls, Nullability.nullable,
+        new List<DartType>.filled(typeVariablesCount, const DynamicType()));
   }
 
   @override
@@ -637,8 +633,8 @@
     // TODO(dmitryas): Use computeBound instead of DynamicType here?
     return _nonNullableRawType ??= new InterfaceType(
         cls,
-        new List<DartType>.filled(typeVariablesCount, const DynamicType()),
-        Nullability.nonNullable);
+        Nullability.nonNullable,
+        new List<DartType>.filled(typeVariablesCount, const DynamicType()));
   }
 
   @override
@@ -665,7 +661,7 @@
     }
     return arguments == null
         ? rawType(nullability)
-        : new InterfaceType(cls, arguments, nullability);
+        : new InterfaceType(cls, nullability, arguments);
   }
 
   @override
@@ -807,7 +803,8 @@
     SourceLibraryBuilder library = this.library;
 
     List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        new InterfaceType(supertype.classNode, supertype.typeArguments),
+        new InterfaceType(
+            supertype.classNode, Nullability.legacy, supertype.typeArguments),
         typeEnvironment,
         allowSuperBounded: false);
     if (issues != null) {
@@ -1411,7 +1408,8 @@
           <TypeParameter, DartType>{};
       for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
         substitutionMap[interfaceFunction.typeParameters[i]] =
-            new TypeParameterType(declaredFunction.typeParameters[i]);
+            new TypeParameterType(
+                declaredFunction.typeParameters[i], Nullability.legacy);
       }
       Substitution substitution = Substitution.fromMap(substitutionMap);
       for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index 07565c4..8c730f3 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 
 import '../constant_context.dart' show ConstantContext;
 
@@ -35,6 +35,7 @@
 import 'formal_parameter_builder.dart';
 import 'function_builder.dart';
 import 'library_builder.dart';
+import 'member_builder.dart';
 import 'metadata_builder.dart';
 import 'type_builder.dart';
 import 'type_variable_builder.dart';
@@ -64,10 +65,6 @@
 
   bool get isEligibleForTopLevelInference;
 
-  Constructor build(SourceLibraryBuilder libraryBuilder);
-
-  FunctionNode buildFunction(LibraryBuilder library);
-
   /// The [Constructor] built by this builder.
   Constructor get constructor;
 
@@ -126,6 +123,15 @@
             compilationUnit, charOffset, nativeMethodName);
 
   @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => constructor;
+
+  @override
   ConstructorBuilder get origin => actualOrigin ?? this;
 
   @override
@@ -162,6 +168,13 @@
   }
 
   @override
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
+    Member member = build(library);
+    f(member, BuiltMemberKind.Constructor);
+  }
+
+  @override
   Constructor build(SourceLibraryBuilder libraryBuilder) {
     if (_constructor.name == null) {
       _constructor.function = buildFunction(libraryBuilder);
@@ -213,10 +226,11 @@
     List<DartType> typeParameterTypes = new List<DartType>();
     for (int i = 0; i < enclosingClass.typeParameters.length; i++) {
       TypeParameter typeParameter = enclosingClass.typeParameters[i];
-      typeParameterTypes.add(new TypeParameterType(typeParameter));
+      typeParameterTypes
+          .add(new TypeParameterType(typeParameter, Nullability.legacy));
     }
-    functionNode.returnType =
-        new InterfaceType(enclosingClass, typeParameterTypes);
+    functionNode.returnType = new InterfaceType(
+        enclosingClass, Nullability.legacy, typeParameterTypes);
     return functionNode;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 4cc11c3..2a17bdcb 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -273,9 +273,9 @@
         coreLibrary.scope, charOffset, fileUri, libraryBuilder);
     listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
 
-    FieldBuilder indexFieldBuilder = firstMemberNamed("index");
+    FieldBuilderImpl indexFieldBuilder = firstMemberNamed("index");
     Field indexField = indexFieldBuilder.build(libraryBuilder);
-    FieldBuilder nameFieldBuilder = firstMemberNamed("_name");
+    FieldBuilderImpl nameFieldBuilder = firstMemberNamed("_name");
     Field nameField = nameFieldBuilder.build(libraryBuilder);
     ProcedureBuilder toStringBuilder = firstMemberNamed("toString");
     toStringBuilder.body = new ReturnStatement(
@@ -286,17 +286,17 @@
         if (enumConstantInfo != null) {
           Builder declaration = firstMemberNamed(enumConstantInfo.name);
           if (declaration.isField) {
-            FieldBuilder field = declaration;
+            FieldBuilderImpl field = declaration;
             values.add(new StaticGet(field.build(libraryBuilder)));
           }
         }
       }
     }
-    FieldBuilder valuesBuilder = firstMemberNamed("values");
+    FieldBuilderImpl valuesBuilder = firstMemberNamed("values");
     valuesBuilder.build(libraryBuilder);
     valuesBuilder.initializer = new ListLiteral(values,
         typeArgument: rawType(library.nonNullable), isConst: true);
-    ConstructorBuilder constructorBuilder = constructorScopeBuilder[""];
+    ConstructorBuilderImpl constructorBuilder = constructorScopeBuilder[""];
     Constructor constructor = constructorBuilder.build(libraryBuilder);
     constructor.initializers.insert(
         0,
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 75a5060..941904a 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
-import 'package:kernel/ast.dart' hide MapEntry, Variance;
+import 'package:kernel/ast.dart' hide MapEntry;
 
 import '../constant_context.dart' show ConstantContext;
 
@@ -30,7 +30,7 @@
 import '../source/source_loader.dart' show SourceLoader;
 
 import '../type_inference/type_inference_engine.dart'
-    show IncludesTypeParametersNonCovariantly, Variance;
+    show IncludesTypeParametersNonCovariantly;
 
 import '../type_inference/type_inferrer.dart'
     show ExpressionInferenceResult, TypeInferrerImpl;
@@ -66,8 +66,6 @@
 
   bool get isEligibleForInference;
 
-  Field build(SourceLibraryBuilder libraryBuilder);
-
   DartType get builtType;
 }
 
@@ -138,6 +136,26 @@
     return true;
   }
 
+  @override
+  Member get readTarget => field;
+
+  @override
+  Member get writeTarget => isAssignable ? field : null;
+
+  @override
+  Member get invokeTarget => field;
+
+  @override
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
+    Member member = build(library);
+    f(
+        member,
+        isExtensionMember
+            ? BuiltMemberKind.ExtensionField
+            : BuiltMemberKind.Field);
+  }
+
   Field build(SourceLibraryBuilder libraryBuilder) {
     field
       ..isCovariant = isCovariant
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 2ddba04..bd2d60d 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -7,7 +7,7 @@
 import 'dart:core' hide MapEntry;
 
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/type_algebra.dart';
 
@@ -34,7 +34,7 @@
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import '../type_inference/type_inference_engine.dart'
-    show IncludesTypeParametersNonCovariantly, Variance;
+    show IncludesTypeParametersNonCovariantly;
 
 import 'builder.dart';
 import 'class_builder.dart';
@@ -103,8 +103,6 @@
 
   bool get isNative;
 
-  FunctionNode buildFunction(LibraryBuilder library);
-
   /// Returns the [index]th parameter of this function.
   ///
   /// The index is the syntactical index, including both positional and named
@@ -128,8 +126,6 @@
   /// members.
   List<TypeParameter> get extensionTypeParameters;
 
-  Member build(SourceLibraryBuilder library);
-
   void becomeNative(Loader loader);
 
   bool checkPatch(FunctionBuilder patch);
@@ -339,7 +335,6 @@
   @override
   bool get isNative => nativeMethodName != null;
 
-  @override
   FunctionNode buildFunction(LibraryBuilder library) {
     assert(function == null);
     FunctionNode result = new FunctionNode(body, asyncMarker: asyncModifier);
@@ -497,6 +492,8 @@
     }
   }
 
+  Member build(SourceLibraryBuilder library);
+
   @override
   void becomeNative(Loader loader) {
     MemberBuilder constructor = loader.getNativeAnnotation();
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index dde5a40..c1aa78c1 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -101,11 +101,11 @@
       }
     }
     return new FunctionType(positionalParameters, builtReturnType,
+        nullabilityBuilder.build(library),
         namedParameters: namedParameters ?? const <NamedType>[],
         typeParameters: typeParameters ?? const <TypeParameter>[],
         requiredParameterCount: requiredParameterCount,
-        typedefType: origin,
-        nullability: nullabilityBuilder.build(library));
+        typedefType: origin);
   }
 
   Supertype buildSupertype(
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index c4475da..6e0219e 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -30,11 +30,25 @@
   /// The [Member] built by this builder;
   Member get member;
 
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  Member get extensionTearOff;
+  /// The [Member] to use when reading from this member builder.
+  ///
+  /// For a field, a getter or a regular method this is the [member] itself.
+  /// For an instance extension method this is special tear-off function. For
+  /// a constructor, an operator, a factory or a setter this is `null`.
+  Member get readTarget;
 
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  Procedure get procedure;
+  /// The [Member] to use when write to this member builder.
+  ///
+  /// For an assignable field or a setter this is the [member] itself. For
+  /// a constructor, a non-assignable field, a getter, an operator or a regular
+  /// method this is `null`.
+  Member get writeTarget;
+
+  /// The [Member] to use when invoking this member builder.
+  ///
+  /// For a constructor, a field, a regular method, a getter an operator or
+  /// a factory this is the [member] itself. For a setter this is `null`.
+  Member get invokeTarget;
 
   // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
   ProcedureKind get kind;
@@ -106,20 +120,14 @@
 
   // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
   @override
-  Member get extensionTearOff =>
-      unsupported("extensionTearOff", charOffset, fileUri);
-
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  @override
-  Procedure get procedure => unsupported("procedure", charOffset, fileUri);
-
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  @override
   ProcedureKind get kind => unsupported("kind", charOffset, fileUri);
 
   @override
   void buildOutlineExpressions(LibraryBuilder library) {}
 
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f);
+
   @override
   String get fullNameForErrors => name;
 
@@ -135,6 +143,19 @@
   ClassBuilder get classBuilder => parent is ClassBuilder ? parent : null;
 }
 
+enum BuiltMemberKind {
+  Constructor,
+  RedirectingFactory,
+  Field,
+  Method,
+  ExtensionField,
+  ExtensionMethod,
+  ExtensionGetter,
+  ExtensionSetter,
+  ExtensionOperator,
+  ExtensionTearOff,
+}
+
 class MemberDataForTesting {
   final InferenceDataForTesting inferenceData = new InferenceDataForTesting();
 
diff --git a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
index 16686fb..4fe2571 100644
--- a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
@@ -8,9 +8,12 @@
 
 import '../kernel/load_library_builder.dart' show LoadLibraryBuilder;
 
+import '../fasta_codes.dart';
+
 import '../scope.dart';
 
 import 'builder.dart';
+import 'extension_builder.dart';
 import 'library_builder.dart';
 
 class PrefixBuilder extends BuilderImpl {
@@ -47,6 +50,11 @@
   }
 
   void addToExportScope(String name, Builder member, int charOffset) {
+    if (deferred && member is ExtensionBuilder) {
+      parent.addProblem(templateDeferredExtensionImport.withArguments(name),
+          charOffset, noLength, fileUri);
+    }
+
     Builder existing =
         exportScope.lookupLocalMember(name, setter: member.isSetter);
     Builder result;
@@ -58,6 +66,9 @@
       result = member;
     }
     exportScope.addLocalMember(name, result, setter: member.isSetter);
+    if (result is ExtensionBuilder) {
+      exportScope.addExtension(result);
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 4823b32..766bb6d 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -5,7 +5,7 @@
 import 'dart:core' hide MapEntry;
 
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/type_algebra.dart';
 
@@ -16,7 +16,7 @@
 import '../messages.dart'
     show messageConstFactoryRedirectionToNonConst, noLength;
 
-import '../problems.dart' show unexpected;
+import '../problems.dart' show unexpected, unhandled;
 
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
@@ -25,7 +25,9 @@
 import 'extension_builder.dart';
 import 'formal_parameter_builder.dart';
 import 'function_builder.dart';
+import 'member_builder.dart';
 import 'metadata_builder.dart';
+import 'library_builder.dart';
 import 'type_builder.dart';
 import 'type_variable_builder.dart';
 
@@ -36,6 +38,10 @@
 
   AsyncMarker actualAsyncModifier;
 
+  Procedure get procedure;
+
+  ProcedureKind get kind;
+
   Procedure get actualProcedure;
 
   bool hadTypesInferred;
@@ -49,8 +55,6 @@
 
   /// Returns `true` if this procedure is declared in an extension declaration.
   bool get isExtensionMethod;
-
-  Procedure build(SourceLibraryBuilder libraryBuilder);
 }
 
 class ProcedureBuilderImpl extends FunctionBuilderImpl
@@ -110,6 +114,49 @@
             compilationUnit, charOffset, nativeMethodName);
 
   @override
+  Member get readTarget {
+    switch (kind) {
+      case ProcedureKind.Method:
+        return extensionTearOff ?? procedure;
+      case ProcedureKind.Getter:
+        return procedure;
+      case ProcedureKind.Operator:
+      case ProcedureKind.Setter:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get writeTarget {
+    switch (kind) {
+      case ProcedureKind.Setter:
+        return procedure;
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get invokeTarget {
+    switch (kind) {
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return procedure;
+      case ProcedureKind.Setter:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
   ProcedureBuilder get origin => actualOrigin ?? this;
 
   @override
@@ -155,6 +202,36 @@
   }
 
   @override
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
+    Member member = build(library);
+    if (isExtensionMethod) {
+      switch (kind) {
+        case ProcedureKind.Method:
+          f(member, BuiltMemberKind.ExtensionMethod);
+          break;
+        case ProcedureKind.Getter:
+          f(member, BuiltMemberKind.ExtensionGetter);
+          break;
+        case ProcedureKind.Setter:
+          f(member, BuiltMemberKind.ExtensionSetter);
+          break;
+        case ProcedureKind.Operator:
+          f(member, BuiltMemberKind.ExtensionOperator);
+          break;
+        case ProcedureKind.Factory:
+          throw new UnsupportedError(
+              'Unexpected extension method kind ${kind}');
+      }
+      if (extensionTearOff != null) {
+        f(extensionTearOff, BuiltMemberKind.ExtensionTearOff);
+      }
+    } else {
+      f(member, BuiltMemberKind.Method);
+    }
+  }
+
+  @override
   Procedure build(SourceLibraryBuilder libraryBuilder) {
     // TODO(ahe): I think we may call this twice on parts. Investigate.
     if (_procedure.name == null) {
@@ -244,7 +321,7 @@
       TypeParameter newTypeParameter = new TypeParameter(typeParameter.name);
       typeParameters.add(newTypeParameter);
       typeArguments.add(substitutionMap[typeParameter] =
-          new TypeParameterType(newTypeParameter));
+          new TypeParameterType(newTypeParameter, Nullability.legacy));
     }
 
     List<TypeParameter> tearOffTypeParameters = <TypeParameter>[];
@@ -354,7 +431,6 @@
   @override
   Procedure get procedure => isPatch ? origin.procedure : _procedure;
 
-  @override
   Procedure get extensionTearOff {
     if (isExtensionInstanceMember && kind == ProcedureKind.Method) {
       _extensionTearOff ??= new Procedure(null, ProcedureKind.Method, null,
@@ -460,8 +536,8 @@
       if (function.typeParameters != null) {
         Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
         for (int i = 0; i < function.typeParameters.length; i++) {
-          substitution[function.typeParameters[i]] =
-              new TypeParameterType(actualOrigin.function.typeParameters[i]);
+          substitution[function.typeParameters[i]] = new TypeParameterType(
+              actualOrigin.function.typeParameters[i], Nullability.legacy);
         }
         List<DartType> newTypeArguments =
             new List<DartType>(typeArguments.length);
@@ -475,6 +551,13 @@
   }
 
   @override
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
+    Member member = build(library);
+    f(member, BuiltMemberKind.RedirectingFactory);
+  }
+
+  @override
   Procedure build(SourceLibraryBuilder library) {
     Procedure result = super.build(library);
     result.isRedirectingFactoryConstructor = true;
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index eda4189..4e7da64 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -124,7 +124,7 @@
           name.length,
           fileUri);
     }
-    return new TypeParameterType(parameter, null, nullability);
+    return new TypeParameterType(parameter, nullability);
   }
 
   TypeBuilder asTypeBuilder() {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
index 3992966..707eea5 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
@@ -15,11 +15,10 @@
 class DillExtensionMemberBuilder extends DillMemberBuilder {
   final ExtensionMemberDescriptor _descriptor;
 
-  @override
-  final Member extensionTearOff;
+  final Member _extensionTearOff;
 
   DillExtensionMemberBuilder(Member member, this._descriptor, Builder parent,
-      [this.extensionTearOff])
+      [this._extensionTearOff])
       : super(member, parent);
 
   @override
@@ -28,20 +27,6 @@
   bool get isExternal => member.isExternal;
 
   @override
-  Procedure get procedure {
-    switch (_descriptor.kind) {
-      case ExtensionMemberKind.Method:
-      case ExtensionMemberKind.Getter:
-      case ExtensionMemberKind.Operator:
-      case ExtensionMemberKind.Setter:
-        return member;
-      case ExtensionMemberKind.TearOff:
-      case ExtensionMemberKind.Field:
-    }
-    return unsupported("procedure", charOffset, fileUri);
-  }
-
-  @override
   ProcedureKind get kind {
     switch (_descriptor.kind) {
       case ExtensionMemberKind.Method:
@@ -59,5 +44,57 @@
   }
 
   @override
+  Member get readTarget {
+    if (isField) {
+      return member;
+    }
+    switch (kind) {
+      case ProcedureKind.Method:
+        return _extensionTearOff ?? member;
+      case ProcedureKind.Getter:
+        return member;
+      case ProcedureKind.Operator:
+      case ProcedureKind.Setter:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get writeTarget {
+    if (isField) {
+      return isAssignable ? member : null;
+    }
+    switch (kind) {
+      case ProcedureKind.Setter:
+        return member;
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get invokeTarget {
+    if (isField) {
+      return member;
+    }
+    switch (kind) {
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return member;
+      case ProcedureKind.Setter:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
   bool get isAssignable => member is Field && member.hasSetter;
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 4e3f3ef..d384778 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -9,6 +9,7 @@
 
 import '../builder/builder.dart';
 import '../builder/member_builder.dart';
+import '../builder/library_builder.dart';
 
 import '../kernel/kernel_builder.dart'
     show isRedirectingGenerativeConstructorImplementation;
@@ -63,6 +64,69 @@
 
   @override
   bool get isAssignable => member is Field && member.hasSetter;
+
+  @override
+  Member get readTarget {
+    if (isField) {
+      return member;
+    } else if (isConstructor) {
+      return null;
+    }
+    switch (kind) {
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+        return member;
+      case ProcedureKind.Operator:
+      case ProcedureKind.Setter:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get writeTarget {
+    if (isField) {
+      return isAssignable ? member : null;
+    } else if (isConstructor) {
+      return null;
+    }
+    switch (kind) {
+      case ProcedureKind.Setter:
+        return member;
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  Member get invokeTarget {
+    if (isField) {
+      return member;
+    } else if (isConstructor) {
+      return member;
+    }
+    switch (kind) {
+      case ProcedureKind.Method:
+      case ProcedureKind.Getter:
+      case ProcedureKind.Operator:
+      case ProcedureKind.Factory:
+        return member;
+      case ProcedureKind.Setter:
+        return null;
+    }
+    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
+  }
+
+  @override
+  void buildMembers(
+      LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
+    throw new UnsupportedError('DillMemberBuilder.buildMembers');
+  }
 }
 
 int computeModifiers(Member member) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index a815e0d..377f607 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -22,6 +22,17 @@
         lengthOfSpan,
         optional;
 
+import 'package:_fe_analyzer_shared/src/parser/quote.dart'
+    show
+        Quote,
+        analyzeQuote,
+        unescape,
+        unescapeFirstStringPart,
+        unescapeLastStringPart,
+        unescapeString;
+
+import 'package:_fe_analyzer_shared/src/parser/value_kind.dart';
+
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
 import 'package:_fe_analyzer_shared/src/scanner/token_impl.dart'
@@ -81,15 +92,6 @@
 import '../problems.dart'
     show internalProblem, unexpected, unhandled, unsupported;
 
-import '../quote.dart'
-    show
-        Quote,
-        analyzeQuote,
-        unescape,
-        unescapeFirstStringPart,
-        unescapeLastStringPart,
-        unescapeString;
-
 import '../scope.dart';
 
 import '../source/scope_listener.dart'
@@ -103,7 +105,7 @@
 
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
-import '../source/stack_listener.dart' show offsetForToken;
+import '../source/stack_listener_impl.dart' show offsetForToken;
 
 import '../source/value_kinds.dart';
 
@@ -872,9 +874,8 @@
         }
       }
     }
-
-    typeInferrer?.inferFunctionBody(
-        this, _computeReturnTypeContext(member), asyncModifier, body);
+    typeInferrer?.inferFunctionBody(this, _computeReturnTypeContext(member),
+        asyncModifier, builder.member.function, body);
     if (body != null) {
       libraryBuilder.loader.transformPostInference(
           body, transformSetLiterals, transformCollections);
@@ -1256,7 +1257,7 @@
     ReturnStatementImpl fakeReturn = new ReturnStatementImpl(true, expression);
 
     typeInferrer?.inferFunctionBody(
-        this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
+        this, const DynamicType(), AsyncMarker.Sync, null, fakeReturn);
 
     return fakeReturn.expression;
   }
@@ -1421,14 +1422,14 @@
   @override
   void handleSend(Token beginToken, Token endToken) {
     assert(checkState(beginToken, [
-      ValueKind.ArgumentsOrNull,
-      ValueKind.TypeArgumentsOrNull,
+      ValueKinds.ArgumentsOrNull,
+      ValueKinds.TypeArgumentsOrNull,
       unionOfKinds([
-        ValueKind.Expression,
-        ValueKind.Generator,
-        ValueKind.Identifier,
-        ValueKind.ParserRecovery,
-        ValueKind.ProblemBuilder
+        ValueKinds.Expression,
+        ValueKinds.Generator,
+        ValueKinds.Identifier,
+        ValueKinds.ParserRecovery,
+        ValueKinds.ProblemBuilder
       ])
     ]));
     debugEvent("Send");
@@ -1539,59 +1540,39 @@
 
   void doBinaryExpression(Token token) {
     assert(checkState(token, <ValueKind>[
-      unionOfKinds([ValueKind.Expression, ValueKind.Generator]),
-      unionOfKinds([ValueKind.Expression, ValueKind.Generator]),
+      unionOfKinds([ValueKinds.Expression, ValueKinds.Generator]),
+      unionOfKinds([ValueKinds.Expression, ValueKinds.Generator]),
     ]));
     Expression right = popForValue();
     Object left = pop();
-    bool negate = false;
-    String operator = token.stringValue;
-    if (identical("!=", operator)) {
-      operator = "==";
-      negate = true;
-    }
     int fileOffset = offsetForToken(token);
-    Name name = new Name(operator);
-    if (!isBinaryOperator(operator) && !isMinusOperator(operator)) {
-      if (isUserDefinableOperator(operator)) {
-        push(buildProblem(fasta.templateNotBinaryOperator.withArguments(token),
-            token.charOffset, token.length));
+    String operator = token.stringValue;
+    bool isNot = identical("!=", operator);
+    if (isNot || identical("==", operator)) {
+      if (left is Generator) {
+        push(left.buildEqualsOperation(token, right, isNot: isNot));
       } else {
-        push(buildProblem(fasta.templateInvalidOperator.withArguments(token),
-            token.charOffset, token.length));
+        assert(left is Expression);
+        push(forest.createEquals(fileOffset, left, right, isNot: isNot));
       }
-    } else if (left is ExplicitExtensionAccessGenerator) {
-      // TODO(johnniwinther): Use this code path for all generators. Currently
-      // TypeUseGenerator starts complaining about `Map<` not being a method
-      // instead of `<` not defined on `Type`.
-      Object result = left.buildPropertyAccess(
-          new SendAccessGenerator(this, token, name,
-              forest.createArguments(fileOffset, <Expression>[right]),
-              isPotentiallyConstant: true),
-          fileOffset,
-          false);
-      push(negate ? forest.createNot(fileOffset, toValue(result)) : result);
     } else {
-      bool isSuper = false;
-      Expression leftValue;
-      if (left is ThisAccessGenerator && left.isSuper) {
-        ThisAccessGenerator thisAccessorReceiver = left;
-        isSuper = true;
-        leftValue =
-            forest.createThisExpression(thisAccessorReceiver.fileOffset);
+      Name name = new Name(operator);
+      if (!isBinaryOperator(operator) && !isMinusOperator(operator)) {
+        if (isUserDefinableOperator(operator)) {
+          push(buildProblem(
+              fasta.templateNotBinaryOperator.withArguments(token),
+              token.charOffset,
+              token.length));
+        } else {
+          push(buildProblem(fasta.templateInvalidOperator.withArguments(token),
+              token.charOffset, token.length));
+        }
+      } else if (left is Generator) {
+        push(left.buildBinaryOperation(token, name, right));
       } else {
-        leftValue = toValue(left);
+        assert(left is Expression);
+        push(forest.createBinary(fileOffset, left, name, right));
       }
-      Expression result = buildMethodInvocation(
-          leftValue,
-          name,
-          forest.createArguments(fileOffset, <Expression>[right]),
-          token.charOffset,
-          // This *could* be a constant expression, we can't know without
-          // evaluating [left] and [right].
-          isConstantExpression: !isSuper,
-          isSuper: isSuper);
-      push(negate ? forest.createNot(fileOffset, result) : result);
     }
   }
 
@@ -1852,9 +1833,6 @@
       return new ParserErrorGenerator(this, token, fasta.messageSyntheticToken);
     }
     Builder declaration = scope.lookup(name, charOffset, uri);
-    if (declaration is UnlinkedDeclaration) {
-      return new UnlinkedGenerator(this, token, declaration);
-    }
     if (declaration == null &&
         prefix == null &&
         (classBuilder?.isPatch ?? false)) {
@@ -2566,11 +2544,11 @@
   @override
   void endForStatement(Token endToken) {
     assert(checkState(endToken, <ValueKind>[
-      /* body */ ValueKind.Statement,
-      /* expression count */ ValueKind.Integer,
-      /* left separator */ ValueKind.Token,
-      /* left parenthesis */ ValueKind.Token,
-      /* for keyword */ ValueKind.Token,
+      /* body */ ValueKinds.Statement,
+      /* expression count */ ValueKinds.Integer,
+      /* left separator */ ValueKinds.Token,
+      /* left parenthesis */ ValueKinds.Token,
+      /* for keyword */ ValueKinds.Token,
     ]));
     debugEvent("ForStatement");
     Statement body = popStatement();
@@ -2582,15 +2560,16 @@
 
     assert(checkState(endToken, <ValueKind>[
       /* expressions */ ...repeatedKinds(
-          unionOfKinds(<ValueKind>[ValueKind.Expression, ValueKind.Generator]),
+          unionOfKinds(
+              <ValueKind>[ValueKinds.Expression, ValueKinds.Generator]),
           updateExpressionCount),
-      /* condition */ ValueKind.Statement,
+      /* condition */ ValueKinds.Statement,
       /* variable or expression */ unionOfKinds(<ValueKind>[
-        ValueKind.Generator,
-        ValueKind.ExpressionOrNull,
-        ValueKind.Statement,
-        ValueKind.ObjectList,
-        ValueKind.ParserRecovery,
+        ValueKinds.Generator,
+        ValueKinds.ExpressionOrNull,
+        ValueKinds.Statement,
+        ValueKinds.ObjectList,
+        ValueKinds.ParserRecovery,
       ]),
     ]));
 
@@ -2919,7 +2898,7 @@
   @override
   void handleNonNullAssertExpression(Token bang) {
     assert(checkState(bang, [
-      unionOfKinds([ValueKind.Expression, ValueKind.Generator])
+      unionOfKinds([ValueKinds.Expression, ValueKinds.Generator])
     ]));
     if (!libraryBuilder.isNonNullableByDefault) {
       reportNonNullAssertExpressionNotEnabled(bang);
@@ -3438,9 +3417,9 @@
   void handleIndexedExpression(
       Token openSquareBracket, Token closeSquareBracket) {
     assert(checkState(openSquareBracket, [
-      unionOfKinds([ValueKind.Expression, ValueKind.Generator]),
+      unionOfKinds([ValueKinds.Expression, ValueKinds.Generator]),
       unionOfKinds(
-          [ValueKind.Expression, ValueKind.Generator, ValueKind.Initializer])
+          [ValueKinds.Expression, ValueKinds.Generator, ValueKinds.Initializer])
     ]));
     debugEvent("IndexedExpression");
     Expression index = popForValue();
@@ -3449,11 +3428,11 @@
       push(receiver.buildIndexedAccess(index, openSquareBracket));
     } else if (receiver is Expression) {
       push(IndexedAccessGenerator.make(
-          this, openSquareBracket, receiver, index, null, null));
+          this, openSquareBracket, receiver, index));
     } else {
       assert(receiver is Initializer);
       push(IndexedAccessGenerator.make(
-          this, openSquareBracket, toValue(receiver), index, null, null));
+          this, openSquareBracket, toValue(receiver), index));
     }
   }
 
@@ -3461,8 +3440,8 @@
   void handleUnaryPrefixExpression(Token token) {
     assert(checkState(token, <ValueKind>[
       unionOfKinds(<ValueKind>[
-        ValueKind.Expression,
-        ValueKind.Generator,
+        ValueKinds.Expression,
+        ValueKinds.Generator,
       ]),
     ]));
     debugEvent("UnaryPrefixExpression");
@@ -3476,33 +3455,11 @@
       }
       int fileOffset = offsetForToken(token);
       Name name = new Name(operator);
-      if (receiver is ExplicitExtensionAccessGenerator) {
-        // TODO(johnniwinther): Use this code path for all generators. Currently
-        // TypeUseGenerator starts complaining about `-Map` not being a method
-        // instead of `unary-` not defined on `Type`.
-        push(receiver.buildPropertyAccess(
-            new SendAccessGenerator(
-                this, token, name, forest.createArgumentsEmpty(fileOffset),
-                isPotentiallyConstant: true),
-            fileOffset,
-            false));
+      if (receiver is Generator) {
+        push(receiver.buildUnaryOperation(token, name));
       } else {
-        bool isSuper = false;
-        Expression receiverValue;
-        if (receiver is ThisAccessGenerator && receiver.isSuper) {
-          ThisAccessGenerator thisAccessorReceiver = receiver;
-          isSuper = true;
-          receiverValue =
-              forest.createThisExpression(thisAccessorReceiver.fileOffset);
-        } else {
-          receiverValue = toValue(receiver);
-        }
-        push(buildMethodInvocation(receiverValue, name,
-            forest.createArgumentsEmpty(fileOffset), fileOffset,
-            // This *could* be a constant expression, we can't know without
-            // evaluating [receiver].
-            isConstantExpression: !isSuper,
-            isSuper: isSuper));
+        assert(receiver is Expression);
+        push(forest.createUnary(fileOffset, name, receiver));
       }
     }
   }
@@ -3581,13 +3538,13 @@
   /// name.
   void pushQualifiedReference(Token start, Token periodBeforeName) {
     assert(checkState(start, [
-      /*suffix*/ if (periodBeforeName != null) ValueKind.Identifier,
-      /*type arguments*/ ValueKind.TypeArgumentsOrNull,
+      /*suffix*/ if (periodBeforeName != null) ValueKinds.Identifier,
+      /*type arguments*/ ValueKinds.TypeArgumentsOrNull,
       /*type*/ unionOfKinds([
-        ValueKind.Generator,
-        ValueKind.QualifiedName,
-        ValueKind.ProblemBuilder,
-        ValueKind.ParserRecovery
+        ValueKinds.Generator,
+        ValueKinds.QualifiedName,
+        ValueKinds.ProblemBuilder,
+        ValueKinds.ParserRecovery
       ])
     ]));
     Identifier suffix = popIfNotNull(periodBeforeName);
@@ -3600,7 +3557,7 @@
       Object qualifier = qualified.qualifier;
       assert(checkValue(
           start,
-          unionOfKinds([ValueKind.Generator, ValueKind.ProblemBuilder]),
+          unionOfKinds([ValueKinds.Generator, ValueKinds.ProblemBuilder]),
           qualifier));
       if (qualifier is TypeUseGenerator) {
         type = qualifier;
@@ -3635,13 +3592,13 @@
     push(suffix ?? identifier ?? NullValue.Identifier);
 
     assert(checkState(start, [
-      /*constructor name identifier*/ ValueKind.IdentifierOrNull,
-      /*constructor name*/ ValueKind.Name,
-      /*type arguments*/ ValueKind.TypeArgumentsOrNull,
+      /*constructor name identifier*/ ValueKinds.IdentifierOrNull,
+      /*constructor name*/ ValueKinds.Name,
+      /*type arguments*/ ValueKinds.TypeArgumentsOrNull,
       /*class*/ unionOfKinds([
-        ValueKind.Generator,
-        ValueKind.ProblemBuilder,
-        ValueKind.ParserRecovery
+        ValueKinds.Generator,
+        ValueKinds.ProblemBuilder,
+        ValueKinds.ParserRecovery
       ]),
     ]));
   }
@@ -3871,14 +3828,14 @@
   void _buildConstructorReferenceInvocation(
       Token nameToken, int offset, Constness constness) {
     assert(checkState(nameToken, [
-      /*arguments*/ ValueKind.Arguments,
-      /*constructor name identifier*/ ValueKind.IdentifierOrNull,
-      /*constructor name*/ ValueKind.Name,
-      /*type arguments*/ ValueKind.TypeArgumentsOrNull,
+      /*arguments*/ ValueKinds.Arguments,
+      /*constructor name identifier*/ ValueKinds.IdentifierOrNull,
+      /*constructor name*/ ValueKinds.Name,
+      /*type arguments*/ ValueKinds.TypeArgumentsOrNull,
       /*class*/ unionOfKinds([
-        ValueKind.Generator,
-        ValueKind.ProblemBuilder,
-        ValueKind.ParserRecovery
+        ValueKinds.Generator,
+        ValueKinds.ProblemBuilder,
+        ValueKinds.ParserRecovery
       ]),
     ]));
     Arguments arguments = pop();
@@ -4293,6 +4250,9 @@
           ..parent = variable
           ..fileOffset = formals.charOffset;
         exitLocalScope();
+        // This is matched by the call to [beginNode] in [enterFunction].
+        typeInferrer?.assignedVariables
+            ?.endNode(variable.initializer, isClosure: true);
         Expression expression = new NamedFunctionExpressionJudgment(variable);
         if (oldInitializer != null) {
           // This must have been a compile-time error.
@@ -4322,9 +4282,9 @@
         } else {
           push(declaration);
         }
+        // This is matched by the call to [beginNode] in [enterFunction].
+        typeInferrer?.assignedVariables?.endNode(declaration, isClosure: true);
       }
-      // This is matched by the call to [beginNode] in [enterFunction].
-      typeInferrer?.assignedVariables?.endNode(declaration, isClosure: true);
     } else {
       return unhandled("${declaration.runtimeType}", "pushNamedFunction",
           token.charOffset, uri);
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 42703d9..76a4af6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -159,7 +159,7 @@
   if (typeParameterCount != 0) {
     List<DartType> types = new List<DartType>(typeParameterCount);
     for (int i = 0; i < typeParameterCount; i++) {
-      types[i] = new TypeParameterType(aTypeParameters[i]);
+      types[i] = new TypeParameterType(aTypeParameters[i], Nullability.legacy);
     }
     substitution = Substitution.fromPairs(bTypeParameters, types);
     for (int i = 0; i < typeParameterCount; i++) {
@@ -299,6 +299,7 @@
         // faster to check for `Null` before calling this method.
         return new InterfaceType(
             superclass,
+            Nullability.legacy,
             new List<DartType>.filled(
                 superclass.typeParameters.length, coreTypes.nullType));
       }
@@ -658,7 +659,8 @@
       }
       List<DartType> types = new List<DartType>(typeParameterCount);
       for (int i = 0; i < typeParameterCount; i++) {
-        types[i] = new TypeParameterType(aTypeParameters[i]);
+        types[i] =
+            new TypeParameterType(aTypeParameters[i], Nullability.legacy);
       }
       substitution = Substitution.fromPairs(bTypeParameters, types);
       for (int i = 0; i < typeParameterCount; i++) {
@@ -2018,7 +2020,7 @@
   @override
   InterfaceType futureType(DartType type, Nullability nullability) {
     return new InterfaceType(
-        hierarchy.futureClass, <DartType>[type], nullability);
+        hierarchy.futureClass, nullability, <DartType>[type]);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index cdede9d..fe48a98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -100,7 +100,6 @@
     TypeEnvironment typeEnvironment,
     ErrorReporter errorReporter,
     {bool keepFields: true,
-    bool keepVariables: false,
     bool evaluateAnnotations: true,
     bool desugarSets: false,
     bool enableTripleShift: false,
@@ -109,7 +108,6 @@
       backend,
       environmentDefines,
       keepFields,
-      keepVariables,
       evaluateAnnotations,
       desugarSets,
       enableTripleShift,
@@ -128,7 +126,6 @@
 
   /// Whether to preserve constant [Field]s.  All use-sites will be rewritten.
   final bool keepFields;
-  final bool keepVariables;
   final bool evaluateAnnotations;
   final bool desugarSets;
   final bool enableTripleShift;
@@ -138,7 +135,6 @@
       this.backend,
       Map<String, String> environmentDefines,
       this.keepFields,
-      this.keepVariables,
       this.evaluateAnnotations,
       this.desugarSets,
       this.enableTripleShift,
@@ -269,6 +265,7 @@
 
   @override
   FunctionNode visitFunctionNode(FunctionNode node) {
+    transformList(node.typeParameters, this, node);
     final int positionalParameterCount = node.positionalParameters.length;
     for (int i = 0; i < positionalParameterCount; ++i) {
       final VariableDeclaration variable = node.positionalParameters[i];
@@ -305,7 +302,7 @@
           ..parent = node;
 
         // If this constant is inlined, remove it.
-        if (!keepVariables && shouldInline(node.initializer)) {
+        if (shouldInline(node.initializer)) {
           if (constant is! UnevaluatedConstant) {
             // If the constant is unevaluated we need to keep the expression,
             // so that, in the case the constant contains error but the local
@@ -2253,6 +2250,9 @@
   bool visitTypedefType(TypedefType node) {
     return node.unalias.accept(this);
   }
+
+  @override
+  bool visitNeverType(NeverType node) => true;
 }
 
 bool _isFormalParameter(VariableDeclaration variable) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 0c2f81f..3fac4c1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -55,7 +55,7 @@
 
 import '../scope.dart';
 
-import '../source/stack_listener.dart' show offsetForToken;
+import '../source/stack_listener_impl.dart' show offsetForToken;
 
 import 'body_builder.dart' show noLocation;
 
@@ -79,7 +79,7 @@
         Procedure,
         VariableDeclaration;
 
-import 'kernel_builder.dart' show LoadLibraryBuilder, UnlinkedDeclaration;
+import 'kernel_builder.dart' show LoadLibraryBuilder;
 
 import 'kernel_shadow_ast.dart';
 
@@ -247,6 +247,24 @@
     }
   }
 
+  /*Expression | Generator*/ buildEqualsOperation(Token token, Expression right,
+      {bool isNot}) {
+    assert(isNot != null);
+    return _forest.createEquals(offsetForToken(token), buildSimpleRead(), right,
+        isNot: isNot);
+  }
+
+  /*Expression | Generator*/ buildBinaryOperation(
+      Token token, Name binaryName, Expression right) {
+    return _forest.createBinary(
+        offsetForToken(token), buildSimpleRead(), binaryName, right);
+  }
+
+  /*Expression | Generator*/ buildUnaryOperation(Token token, Name unaryName) {
+    return _forest.createUnary(
+        offsetForToken(token), unaryName, buildSimpleRead());
+  }
+
   /// Returns a [TypeBuilder] for this subexpression instantiated with the
   /// type [arguments]. If no type arguments are provided [arguments] is `null`.
   ///
@@ -412,8 +430,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -550,8 +567,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   /// Creates a [Generator] for the access of property [name] on [receiver].
@@ -694,8 +710,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -796,8 +811,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -927,8 +941,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -948,12 +961,11 @@
 
   final Expression index;
 
-  final Procedure getter;
+  final bool isNullAware;
 
-  final Procedure setter;
-
-  IndexedAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.receiver, this.index, this.getter, this.setter)
+  IndexedAccessGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.receiver, this.index,
+      {this.isNullAware: false})
       : super(helper, token);
 
   @override
@@ -968,23 +980,14 @@
         receiver,
         indexGetName,
         _helper.forest.createArguments(fileOffset, <Expression>[index]),
-        fileOffset,
-        interfaceTarget: getter);
+        fileOffset);
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    if (voidContext) {
-      return _helper.buildMethodInvocation(
-          receiver,
-          indexSetName,
-          _helper.forest
-              .createArguments(fileOffset, <Expression>[index, value]),
-          fileOffset,
-          interfaceTarget: setter);
-    } else {
-      return new IndexSet(receiver, index, value)..fileOffset = fileOffset;
-    }
+    return new IndexSet(receiver, index, value,
+        forEffect: voidContext, readOnlyReceiver: false)
+      ..fileOffset = fileOffset;
   }
 
   @override
@@ -1034,8 +1037,8 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index,
+        isNullAware: false);
   }
 
   @override
@@ -1045,25 +1048,14 @@
     printNodeOn(receiver, sink, syntheticNames: syntheticNames);
     sink.write(", index: ");
     printNodeOn(index, sink, syntheticNames: syntheticNames);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
   }
 
-  static Generator make(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiver,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
+  static Generator make(ExpressionGeneratorHelper helper, Token token,
+      Expression receiver, Expression index) {
     if (helper.forest.isThisExpression(receiver)) {
-      return new ThisIndexedAccessGenerator(
-          helper, token, index, getter, setter);
+      return new ThisIndexedAccessGenerator(helper, token, index);
     } else {
-      return new IndexedAccessGenerator(
-          helper, token, receiver, index, getter, setter);
+      return new IndexedAccessGenerator(helper, token, receiver, index);
     }
   }
 }
@@ -1073,12 +1065,8 @@
 class ThisIndexedAccessGenerator extends Generator {
   final Expression index;
 
-  final Procedure getter;
-
-  final Procedure setter;
-
-  ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.index, this.getter, this.setter)
+  ThisIndexedAccessGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.index)
       : super(helper, token);
 
   @override
@@ -1094,24 +1082,15 @@
         receiver,
         indexGetName,
         _helper.forest.createArguments(fileOffset, <Expression>[index]),
-        fileOffset,
-        interfaceTarget: getter);
+        fileOffset);
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
     Expression receiver = _helper.forest.createThisExpression(fileOffset);
-    if (voidContext) {
-      return _helper.buildMethodInvocation(
-          receiver,
-          indexSetName,
-          _helper.forest
-              .createArguments(fileOffset, <Expression>[index, value]),
-          fileOffset,
-          interfaceTarget: setter);
-    } else {
-      return new IndexSet(receiver, index, value)..fileOffset = fileOffset;
-    }
+    return new IndexSet(receiver, index, value,
+        forEffect: voidContext, readOnlyReceiver: true)
+      ..fileOffset = fileOffset;
   }
 
   @override
@@ -1165,8 +1144,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -1174,10 +1152,6 @@
     NameSystem syntheticNames = new NameSystem();
     sink.write(", index: ");
     printNodeOn(index, sink, syntheticNames: syntheticNames);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
   }
 }
 
@@ -1273,8 +1247,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -1466,8 +1439,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -1569,21 +1541,21 @@
     if (getterBuilder != null) {
       if (getterBuilder.isGetter) {
         assert(!getterBuilder.isStatic);
-        readTarget = getterBuilder.member;
+        readTarget = getterBuilder.readTarget;
       } else if (getterBuilder.isRegularMethod) {
         assert(!getterBuilder.isStatic);
-        readTarget = getterBuilder.extensionTearOff;
-        invokeTarget = getterBuilder.procedure;
+        readTarget = getterBuilder.readTarget;
+        invokeTarget = getterBuilder.invokeTarget;
       } else if (getterBuilder is FunctionBuilder && getterBuilder.isOperator) {
         assert(!getterBuilder.isStatic);
-        invokeTarget = getterBuilder.member;
+        invokeTarget = getterBuilder.invokeTarget;
       }
     }
     Procedure writeTarget;
     if (setterBuilder != null) {
       if (setterBuilder.isSetter) {
         assert(!setterBuilder.isStatic);
-        writeTarget = setterBuilder.member;
+        writeTarget = setterBuilder.writeTarget;
         targetName ??= setterBuilder.name;
       } else {
         return unhandled(
@@ -1750,8 +1722,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -1880,16 +1851,16 @@
       } else if (getterBuilder.isGetter) {
         assert(!getterBuilder.isStatic);
         MemberBuilder memberBuilder = getterBuilder;
-        readTarget = memberBuilder.member;
+        readTarget = memberBuilder.readTarget;
       } else if (getterBuilder.isRegularMethod) {
         assert(!getterBuilder.isStatic);
         MemberBuilder procedureBuilder = getterBuilder;
-        readTarget = procedureBuilder.extensionTearOff;
-        invokeTarget = procedureBuilder.procedure;
+        readTarget = procedureBuilder.readTarget;
+        invokeTarget = procedureBuilder.invokeTarget;
       } else if (getterBuilder is FunctionBuilder && getterBuilder.isOperator) {
         assert(!getterBuilder.isStatic);
         MemberBuilder memberBuilder = getterBuilder;
-        invokeTarget = memberBuilder.member;
+        invokeTarget = memberBuilder.invokeTarget;
       } else {
         return unhandled(
             "${getterBuilder.runtimeType}",
@@ -1906,7 +1877,7 @@
       } else if (setterBuilder.isSetter) {
         assert(!setterBuilder.isStatic);
         MemberBuilder memberBuilder = setterBuilder;
-        writeTarget = memberBuilder.member;
+        writeTarget = memberBuilder.writeTarget;
       } else {
         return unhandled(
             "${setterBuilder.runtimeType}",
@@ -2169,8 +2140,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -2374,8 +2344,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -2467,7 +2436,8 @@
     return _makeInvalidRead();
   }
 
-  Generator _createInstanceAccess(Token token, Name name, {bool isNullAware}) {
+  Generator _createInstanceAccess(Token token, Name name,
+      {bool isNullAware: false}) {
     Builder getter = extensionBuilder.lookupLocalMemberByName(name);
     if (getter != null && (getter.isStatic || getter.isField)) {
       getter = null;
@@ -2513,9 +2483,24 @@
   }
 
   @override
+  buildBinaryOperation(Token token, Name binaryName, Expression right) {
+    int fileOffset = offsetForToken(token);
+    Generator generator = _createInstanceAccess(token, binaryName);
+    return generator.doInvocation(
+        fileOffset, _forest.createArguments(fileOffset, <Expression>[right]));
+  }
+
+  @override
+  buildUnaryOperation(Token token, Name unaryName) {
+    int fileOffset = offsetForToken(token);
+    Generator generator = _createInstanceAccess(token, unaryName);
+    return generator.doInvocation(
+        fileOffset, _forest.createArgumentsEmpty(fileOffset));
+  }
+
+  @override
   doInvocation(int offset, Arguments arguments) {
-    Generator generator =
-        _createInstanceAccess(token, callName, isNullAware: false);
+    Generator generator = _createInstanceAccess(token, callName);
     return generator.doInvocation(offset, arguments);
   }
 
@@ -2641,8 +2626,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -2770,11 +2754,15 @@
   }
 
   @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return _helper.wrapInDeferredCheck(
-        suffixGenerator.doInvocation(offset, arguments),
-        prefixGenerator.prefix,
-        token.charOffset);
+  doInvocation(int offset, Arguments arguments) {
+    Object suffix = suffixGenerator.doInvocation(offset, arguments);
+    if (suffix is Expression) {
+      return _helper.wrapInDeferredCheck(
+          suffix, prefixGenerator.prefix, fileOffset);
+    } else {
+      return new DeferredAccessGenerator(
+          _helper, token, prefixGenerator, suffix);
+    }
   }
 
   @override
@@ -2794,8 +2782,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -3071,7 +3058,9 @@
   String get _plainNameForRead => targetName;
 
   @override
-  Expression buildSimpleRead() => expression;
+  Expression buildSimpleRead() => _createRead();
+
+  Expression _createRead() => expression;
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
@@ -3081,7 +3070,7 @@
   @override
   Expression buildIfNullAssignment(Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    Expression read = buildSimpleRead();
+    Expression read = _createRead();
     Expression write = _makeInvalidWrite(value);
     return new IfNullSet(read, write, forEffect: voidContext)
       ..fileOffset = offset;
@@ -3096,7 +3085,7 @@
       bool isPostIncDec: false}) {
     MethodInvocation binary = _helper.forest.createMethodInvocation(
         offset,
-        buildSimpleRead(),
+        _createRead(),
         binaryOperator,
         _helper.forest.createArguments(offset, <Expression>[value]),
         interfaceTarget: interfaceTarget);
@@ -3118,7 +3107,7 @@
 
   @override
   doInvocation(int offset, Arguments arguments) {
-    return _helper.buildMethodInvocation(buildSimpleRead(), callName, arguments,
+    return _helper.buildMethodInvocation(_createRead(), callName, arguments,
         adjustForImplicitCall(targetName, offset),
         isImplicitCall: true);
   }
@@ -3127,8 +3116,7 @@
   Generator buildIndexedAccess(Expression index, Token token) {
     // TODO(johnniwinther): The read-only quality of the variable should be
     // passed on to the generator.
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, _createRead(), index);
   }
 
   @override
@@ -3256,8 +3244,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 }
 
@@ -3334,121 +3321,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
-  }
-}
-
-class UnlinkedGenerator extends Generator {
-  final UnlinkedDeclaration declaration;
-
-  final Expression receiver;
-
-  final Name name;
-
-  UnlinkedGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.declaration)
-      : name = new Name(declaration.name, helper.libraryBuilder.library),
-        receiver = new InvalidExpression(declaration.name)
-          ..fileOffset = offsetForToken(token),
-        super(helper, token);
-
-  @override
-  String get _plainNameForRead => declaration.name;
-
-  @override
-  String get _debugName => "UnlinkedGenerator";
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(declaration.name);
-  }
-
-  @override
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return _helper.forest.createPropertySet(fileOffset, receiver, name, value,
-        forEffect: voidContext);
-  }
-
-  @override
-  Expression buildSimpleRead() {
-    return _forest.createPropertyGet(fileOffset, receiver, name);
-  }
-
-  @override
-  Expression buildIfNullAssignment(Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    VariableDeclaration variable =
-        _helper.forest.createVariableDeclarationForValue(receiver);
-    PropertyGet read = _forest.createPropertyGet(fileOffset,
-        _helper.createVariableGet(variable, receiver.fileOffset), name);
-    PropertySet write = _helper.forest.createPropertySet(fileOffset,
-        _helper.createVariableGet(variable, receiver.fileOffset), name, value,
-        forEffect: voidContext);
-    return new IfNullPropertySet(variable, read, write, forEffect: voidContext)
-      ..fileOffset = offset;
-  }
-
-  @override
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    return new CompoundPropertySet(receiver, name, binaryOperator, value,
-        forEffect: voidContext,
-        readOnlyReceiver: false,
-        readOffset: fileOffset,
-        binaryOffset: offset,
-        writeOffset: fileOffset)
-      ..fileOffset = offset;
-  }
-
-  @override
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset = TreeNode.noOffset,
-      bool voidContext = false,
-      Procedure interfaceTarget}) {
-    Expression value = _forest.createIntLiteral(offset, 1);
-    if (voidContext) {
-      return buildCompoundAssignment(binaryOperator, value,
-          offset: offset,
-          voidContext: voidContext,
-          interfaceTarget: interfaceTarget,
-          isPostIncDec: true);
-    }
-    VariableDeclaration variable =
-        _helper.forest.createVariableDeclarationForValue(receiver);
-    VariableDeclaration read = _helper.forest.createVariableDeclarationForValue(
-        _forest.createPropertyGet(fileOffset,
-            _helper.createVariableGet(variable, receiver.fileOffset), name));
-    MethodInvocation binary = _helper.forest.createMethodInvocation(
-        offset,
-        _helper.createVariableGet(read, fileOffset),
-        binaryOperator,
-        _helper.forest.createArguments(offset, <Expression>[value]),
-        interfaceTarget: interfaceTarget);
-    VariableDeclaration write = _helper.forest
-        .createVariableDeclarationForValue(_helper.forest.createPropertySet(
-            fileOffset,
-            _helper.createVariableGet(variable, receiver.fileOffset),
-            name,
-            binary,
-            forEffect: true));
-    return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, _uri);
-  }
-
-  @override
-  Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 }
 
@@ -3515,8 +3388,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 }
 
@@ -3760,8 +3632,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -3851,8 +3722,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 
   @override
@@ -3960,8 +3830,7 @@
 
   @override
   Generator buildIndexedAccess(Expression index, Token token) {
-    return new IndexedAccessGenerator(
-        _helper, token, buildSimpleRead(), index, null, null);
+    return new IndexedAccessGenerator(_helper, token, buildSimpleRead(), index);
   }
 }
 
@@ -4122,6 +3991,56 @@
     }
   }
 
+  @override
+  buildEqualsOperation(Token token, Expression right, {bool isNot}) {
+    assert(isNot != null);
+    if (isSuper) {
+      int offset = offsetForToken(token);
+      Expression result = _helper.buildMethodInvocation(
+          _forest.createThisExpression(fileOffset),
+          equalsName,
+          _forest.createArguments(offset, <Expression>[right]),
+          offset,
+          isSuper: true,
+          isImplicitCall: false);
+      if (isNot) {
+        result = _forest.createNot(offset, result);
+      }
+      return result;
+    }
+    return super.buildEqualsOperation(token, right, isNot: isNot);
+  }
+
+  @override
+  buildBinaryOperation(Token token, Name binaryName, Expression right) {
+    if (isSuper) {
+      int offset = offsetForToken(token);
+      return _helper.buildMethodInvocation(
+          _forest.createThisExpression(fileOffset),
+          binaryName,
+          _forest.createArguments(offset, <Expression>[right]),
+          offset,
+          isSuper: true,
+          isImplicitCall: false);
+    }
+    return super.buildBinaryOperation(token, binaryName, right);
+  }
+
+  @override
+  buildUnaryOperation(Token token, Name unaryName) {
+    if (isSuper) {
+      int offset = offsetForToken(token);
+      return _helper.buildMethodInvocation(
+          _forest.createThisExpression(fileOffset),
+          unaryName,
+          _forest.createArgumentsEmpty(offset),
+          offset,
+          isSuper: true,
+          isImplicitCall: false);
+    }
+    return super.buildUnaryOperation(token, unaryName);
+  }
+
   Initializer buildConstructorInitializer(
       int offset, Name name, Arguments arguments) {
     Constructor constructor = _helper.lookupConstructor(name, isSuper: isSuper);
@@ -4200,7 +4119,7 @@
           _helper.lookupInstanceMember(indexGetName, isSuper: true),
           _helper.lookupInstanceMember(indexSetName, isSuper: true));
     } else {
-      return new ThisIndexedAccessGenerator(_helper, token, index, null, null);
+      return new ThisIndexedAccessGenerator(_helper, token, index);
     }
   }
 
@@ -4434,17 +4353,57 @@
   }
 }
 
+/// [ParenthesizedExpressionGenerator] represents the subexpression whose prefix
+/// is a parenthesized expression.
+///
+/// For instance:
+///
+///   method(final a) {
+///     final b = null;
+///     (a);           // this generator is created for `(a)`.
+///     (a)[];         // this generator is created for `(a)`.
+///     (b)();         // this generator is created for `(b)`.
+///     (b).c = (a.d); // this generator is created for `(a.d)` and `(b)`.
+///   }
+///
+// TODO(johnniwinther): Remove this in favor of [ParenthesizedExpression] when
+// the [TypePromoter] is replaced by [FlowAnalysis].
 class ParenthesizedExpressionGenerator extends ReadOnlyAccessGenerator {
   ParenthesizedExpressionGenerator(
       ExpressionGeneratorHelper helper, Token token, Expression expression)
       : super(helper, token, expression, null);
 
+  @override
+  Expression buildSimpleRead() => expression;
+
+  @override
+  Expression _createRead() =>
+      _helper.forest.createParenthesized(fileOffset, expression);
+
   String get _debugName => "ParenthesizedExpressionGenerator";
 
   Expression _makeInvalidWrite(Expression value) {
     return _helper.buildProblem(messageCannotAssignToParenthesizedExpression,
         fileOffset, lengthForToken(token));
   }
+
+  /* Expression | Generator */ buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    if (send is SendAccessGenerator) {
+      return _helper.buildMethodInvocation(
+          _createRead(), send.name, send.arguments, offsetForToken(send.token),
+          isNullAware: isNullAware,
+          isConstantExpression: send.isPotentiallyConstant);
+    } else {
+      if (_helper.constantContext != ConstantContext.none &&
+          send.name != lengthName) {
+        _helper.addProblem(
+            messageNotAConstantExpression, fileOffset, token.length);
+      }
+      return PropertyAccessGenerator.make(
+          _helper, send.token, _createRead(), send.name, isNullAware);
+    }
+  }
 }
 
 Expression makeLet(VariableDeclaration variable, Expression body) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 6d4a8a5..0b0b77f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -608,7 +608,7 @@
   }
 
   TypeParameterType createTypeParameterType(TypeParameter typeParameter) {
-    return new TypeParameterType(typeParameter);
+    return new TypeParameterType(typeParameter, Nullability.legacy);
   }
 
   FunctionExpression createFunctionExpression(
@@ -675,6 +675,34 @@
         readOnlyReceiver: readOnlyReceiver)
       ..fileOffset = fileOffset;
   }
+
+  EqualsExpression createEquals(
+      int fileOffset, Expression left, Expression right,
+      {bool isNot}) {
+    assert(fileOffset != null);
+    assert(isNot != null);
+    return new EqualsExpression(left, right, isNot: isNot)
+      ..fileOffset = fileOffset;
+  }
+
+  BinaryExpression createBinary(
+      int fileOffset, Expression left, Name binaryName, Expression right) {
+    assert(fileOffset != null);
+    return new BinaryExpression(left, binaryName, right)
+      ..fileOffset = fileOffset;
+  }
+
+  UnaryExpression createUnary(
+      int fileOffset, Name unaryName, Expression expression) {
+    assert(fileOffset != null);
+    return new UnaryExpression(unaryName, expression)..fileOffset = fileOffset;
+  }
+
+  ParenthesizedExpression createParenthesized(
+      int fileOffset, Expression expression) {
+    assert(fileOffset != null);
+    return new ParenthesizedExpression(expression)..fileOffset = fileOffset;
+  }
 }
 
 class _VariablesDeclaration extends Statement {
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index 3c9d8f2c..958b6c0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -13,6 +13,7 @@
         Member,
         Name,
         NamedExpression,
+        Nullability,
         Procedure,
         ProcedureKind,
         ReturnStatement,
@@ -23,6 +24,7 @@
         TypeParameterType,
         VariableDeclaration,
         VariableGet,
+        Variance,
         VoidType;
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
@@ -34,7 +36,7 @@
 import "../problems.dart" show unhandled;
 
 import "../type_inference/type_inference_engine.dart"
-    show IncludesTypeParametersNonCovariantly, Variance;
+    show IncludesTypeParametersNonCovariantly;
 
 import "../type_inference/type_inferrer.dart" show getNamedFormal;
 
@@ -269,7 +271,8 @@
             new NamedExpression(parameter.name, new VariableGet(parameter)))
         .toList();
     List<DartType> typeArguments = function.typeParameters
-        .map<DartType>((typeParameter) => new TypeParameterType(typeParameter))
+        .map<DartType>((typeParameter) =>
+            new TypeParameterType(typeParameter, Nullability.legacy))
         .toList();
     Arguments arguments = new Arguments(positionalArguments,
         types: typeArguments, named: namedArguments);
@@ -319,7 +322,7 @@
           ..isGenericCovariantImpl = targetTypeParameter.isGenericCovariantImpl;
         typeParameters[i] = typeParameter;
         additionalSubstitution[targetTypeParameter] =
-            new TypeParameterType(typeParameter);
+            new TypeParameterType(typeParameter, Nullability.legacy);
       }
       substitution = Substitution.combine(
           substitution, Substitution.fromMap(additionalSubstitution));
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index b411490..f1f9283 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -37,68 +37,6 @@
   @override
   ExpressionInferenceResult defaultExpression(
       Expression node, DartType typeContext) {
-    if (node is InternalExpression) {
-      switch (node.kind) {
-        case InternalExpressionKind.Cascade:
-          return visitCascade(node, typeContext);
-        case InternalExpressionKind.CompoundExtensionIndexSet:
-          return visitCompoundExtensionIndexSet(node, typeContext);
-        case InternalExpressionKind.CompoundExtensionSet:
-          return visitCompoundExtensionSet(node, typeContext);
-        case InternalExpressionKind.CompoundIndexSet:
-          return visitCompoundIndexSet(node, typeContext);
-        case InternalExpressionKind.CompoundPropertySet:
-          return visitCompoundPropertySet(node, typeContext);
-        case InternalExpressionKind.CompoundSuperIndexSet:
-          return visitCompoundSuperIndexSet(node, typeContext);
-        case InternalExpressionKind.DeferredCheck:
-          return visitDeferredCheck(node, typeContext);
-        case InternalExpressionKind.ExtensionIndexSet:
-          return visitExtensionIndexSet(node, typeContext);
-        case InternalExpressionKind.ExtensionTearOff:
-          return visitExtensionTearOff(node, typeContext);
-        case InternalExpressionKind.ExtensionSet:
-          return visitExtensionSet(node, typeContext);
-        case InternalExpressionKind.IfNull:
-          return visitIfNullExpression(node, typeContext);
-        case InternalExpressionKind.IfNullExtensionIndexSet:
-          return visitIfNullExtensionIndexSet(node, typeContext);
-        case InternalExpressionKind.IfNullIndexSet:
-          return visitIfNullIndexSet(node, typeContext);
-        case InternalExpressionKind.IfNullPropertySet:
-          return visitIfNullPropertySet(node, typeContext);
-        case InternalExpressionKind.IfNullSet:
-          return visitIfNullSet(node, typeContext);
-        case InternalExpressionKind.IfNullSuperIndexSet:
-          return visitIfNullSuperIndexSet(node, typeContext);
-        case InternalExpressionKind.IndexSet:
-          return visitIndexSet(node, typeContext);
-        case InternalExpressionKind.LoadLibraryTearOff:
-          return visitLoadLibraryTearOff(node, typeContext);
-        case InternalExpressionKind.LocalPostIncDec:
-          return visitLocalPostIncDec(node, typeContext);
-        case InternalExpressionKind.NullAwareCompoundSet:
-          return visitNullAwareCompoundSet(node, typeContext);
-        case InternalExpressionKind.NullAwareExtension:
-          return visitNullAwareExtension(node, typeContext);
-        case InternalExpressionKind.NullAwareIfNullSet:
-          return visitNullAwareIfNullSet(node, typeContext);
-        case InternalExpressionKind.NullAwareMethodInvocation:
-          return visitNullAwareMethodInvocation(node, typeContext);
-        case InternalExpressionKind.NullAwarePropertyGet:
-          return visitNullAwarePropertyGet(node, typeContext);
-        case InternalExpressionKind.NullAwarePropertySet:
-          return visitNullAwarePropertySet(node, typeContext);
-        case InternalExpressionKind.PropertyPostIncDec:
-          return visitPropertyPostIncDec(node, typeContext);
-        case InternalExpressionKind.StaticPostIncDec:
-          return visitStaticPostIncDec(node, typeContext);
-        case InternalExpressionKind.SuperIndexSet:
-          return visitSuperIndexSet(node, typeContext);
-        case InternalExpressionKind.SuperPostIncDec:
-          return visitSuperPostIncDec(node, typeContext);
-      }
-    }
     return _unhandledExpression(node, typeContext);
   }
 
@@ -231,6 +169,7 @@
         node.operand, const UnknownType(), !inferrer.isTopLevel,
         isVoidAllowed: true);
     node.operand = operandResult.expression..parent = node;
+    inferrer.flowAnalysis.asExpression_end(node.operand, node.type);
     return new ExpressionInferenceResult(node.type, node);
   }
 
@@ -241,9 +180,9 @@
 
   @override
   void visitAssertStatement(AssertStatement node) {
+    inferrer.flowAnalysis.assert_begin();
     InterfaceType expectedType =
         inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
-    inferrer.flowAnalysis.assert_begin();
     ExpressionInferenceResult conditionResult = inferrer.inferExpression(
         node.condition, expectedType, !inferrer.isTopLevel,
         isVoidAllowed: true);
@@ -293,7 +232,8 @@
 
   @override
   void visitBreakStatement(BreakStatement node) {
-    // No inference needs to be done.
+    // TODO(johnniwinther): Refactor break/continue encoding.
+    inferrer.flowAnalysis.handleBreak(node.target);
   }
 
   ExpressionInferenceResult visitCascade(Cascade node, DartType typeContext) {
@@ -421,7 +361,7 @@
       ExtensionTearOff node, DartType typeContext) {
     FunctionType calleeType = node.target != null
         ? node.target.function.functionType
-        : new FunctionType([], const DynamicType());
+        : new FunctionType([], const DynamicType(), Nullability.legacy);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
     DartType inferredType = inferrer.inferInvocation(
         typeContext, node.fileOffset, calleeType, node.arguments);
@@ -980,6 +920,7 @@
 
   @override
   void visitFunctionDeclaration(covariant FunctionDeclarationImpl node) {
+    inferrer.flowAnalysis.functionExpression_begin(node);
     inferrer.inferMetadataKeepingHelper(
         node.variable, node.variable.annotations);
     DartType returnContext =
@@ -987,13 +928,16 @@
     DartType inferredType =
         visitFunctionNode(node.function, null, returnContext, node.fileOffset);
     node.variable.type = inferredType;
+    inferrer.flowAnalysis.functionExpression_end();
   }
 
   @override
   ExpressionInferenceResult visitFunctionExpression(
       FunctionExpression node, DartType typeContext) {
+    inferrer.flowAnalysis.functionExpression_begin(node);
     DartType inferredType =
         visitFunctionNode(node.function, typeContext, null, node.fileOffset);
+    inferrer.flowAnalysis.functionExpression_end();
     return new ExpressionInferenceResult(inferredType, node);
   }
 
@@ -1024,6 +968,7 @@
             lhsResult.inferredType, equalsName, node.fileOffset)
         .member;
 
+    inferrer.flowAnalysis.ifNullExpression_rightBegin(node.left);
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
     ExpressionInferenceResult rhsResult;
@@ -1035,6 +980,8 @@
       rhsResult = inferrer.inferExpression(node.right, typeContext, true,
           isVoidAllowed: true);
     }
+    inferrer.flowAnalysis.ifNullExpression_end();
+
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
@@ -1146,6 +1093,8 @@
         node.operand, const UnknownType(), !inferrer.isTopLevel,
         isVoidAllowed: false);
     node.operand = operandResult.expression..parent = node;
+    inferrer.flowAnalysis
+        .isExpression_end(node, node.operand, /*isNot:*/ false, node.type);
     return new ExpressionInferenceResult(
         inferrer.coreTypes.boolRawType(inferrer.library.nonNullable), node);
   }
@@ -1180,7 +1129,7 @@
       ExpressionInferenceResult spreadResult = inferrer.inferExpression(
           element.expression,
           new InterfaceType(inferrer.coreTypes.iterableClass,
-              <DartType>[inferredTypeArgument]),
+              Nullability.legacy, <DartType>[inferredTypeArgument]),
           inferenceNeeded || typeChecksNeeded,
           isVoidAllowed: true);
       element.expression = spreadResult.expression..parent = element;
@@ -1460,8 +1409,8 @@
             inferredSpreadTypes, inferredConditionTypes);
       }
     }
-    DartType inferredType =
-        new InterfaceType(listClass, [inferredTypeArgument]);
+    DartType inferredType = new InterfaceType(
+        listClass, Nullability.legacy, [inferredTypeArgument]);
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
@@ -1482,13 +1431,17 @@
     ExpressionInferenceResult leftResult = inferrer.inferExpression(
         node.left, boolType, !inferrer.isTopLevel,
         isVoidAllowed: false);
+    Expression left = inferrer.ensureAssignableResult(boolType, leftResult);
+    node.left = left..parent = node;
+    inferrer.flowAnalysis
+        .logicalBinaryOp_rightBegin(node.left, isAnd: node.operator == '&&');
     ExpressionInferenceResult rightResult = inferrer.inferExpression(
         node.right, boolType, !inferrer.isTopLevel,
         isVoidAllowed: false);
-    Expression left = inferrer.ensureAssignableResult(boolType, leftResult);
-    node.left = left..parent = node;
     Expression right = inferrer.ensureAssignableResult(boolType, rightResult);
     node.right = right..parent = node;
+    inferrer.flowAnalysis
+        .logicalBinaryOp_end(node, node.right, isAnd: node.operator == '&&');
     return new ExpressionInferenceResult(boolType, node);
   }
 
@@ -1611,8 +1564,8 @@
       mapEntryClass ??=
           inferrer.coreTypes.index.getClass('dart:core', 'MapEntry');
       // TODO(dmitryas):  Handle the case of an ambiguous Set.
-      entry.entryType = new InterfaceType(
-          mapEntryClass, <DartType>[actualKeyType, actualValueType]);
+      entry.entryType = new InterfaceType(mapEntryClass, Nullability.legacy,
+          <DartType>[actualKeyType, actualValueType]);
 
       bool isMap = inferrer.typeSchemaEnvironment.isSubtypeOf(
           spreadType,
@@ -1936,7 +1889,7 @@
             .getTypeAsInstanceOf(typeContext, inferrer.coreTypes.iterableClass);
       } else if (!typeContextIsIterable && typeContextIsMap) {
         spreadTypeContext = new InterfaceType(inferrer.coreTypes.mapClass,
-            <DartType>[inferredKeyType, inferredValueType]);
+            Nullability.legacy, <DartType>[inferredKeyType, inferredValueType]);
       }
       for (int index = 0; index < node.entries.length; ++index) {
         MapEntry entry = node.entries[index];
@@ -2012,8 +1965,8 @@
           }
         }
 
-        DartType inferredType =
-            new InterfaceType(inferrer.coreTypes.setClass, inferredTypesForSet);
+        DartType inferredType = new InterfaceType(inferrer.coreTypes.setClass,
+            Nullability.legacy, inferredTypesForSet);
         return new ExpressionInferenceResult(inferredType, setLiteral);
       }
       if (canBeSet && canBeMap && node.entries.isNotEmpty) {
@@ -2054,8 +2007,8 @@
         node.entries[index] = entry..parent = node;
       }
     }
-    DartType inferredType =
-        new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
+    DartType inferredType = new InterfaceType(
+        mapClass, Nullability.legacy, [inferredKeyType, inferredValueType]);
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.library;
       // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
@@ -2160,6 +2113,7 @@
         boolType, operandResult,
         fileOffset: node.fileOffset);
     node.operand = operand..parent = node;
+    inferrer.flowAnalysis.logicalNot_end(node, node.operand);
     return new ExpressionInferenceResult(boolType, node);
   }
 
@@ -2173,6 +2127,7 @@
     node.operand = operandResult.expression..parent = node;
     // TODO(johnniwinther): Check that the inferred type is potentially
     //  nullable.
+    inferrer.flowAnalysis.nonNullAssert_end(node.operand);
     // TODO(johnniwinther): Return `NonNull(inferredType)`.
     return new ExpressionInferenceResult(operandResult.inferredType, node);
   }
@@ -2467,8 +2422,11 @@
       receiver = receiverResult.expression;
     }
     DartType receiverType = receiverResult.inferredType;
-    VariableDeclaration receiverVariable =
-        createVariable(receiver, receiverType);
+    VariableDeclaration receiverVariable;
+    if (!node.forEffect && !node.readOnlyReceiver) {
+      receiverVariable = createVariable(receiver, receiverType);
+      receiver = createVariableGet(receiverVariable);
+    }
 
     ObjectAccessTarget indexSetTarget = inferrer.findInterfaceMember(
         receiverType, indexSetName, node.fileOffset,
@@ -2483,38 +2441,46 @@
 
     Expression index = inferrer.ensureAssignableResult(indexType, indexResult);
 
-    VariableDeclaration indexVariable =
-        createVariable(index, indexResult.inferredType);
+    VariableDeclaration indexVariable;
+    if (!node.forEffect) {
+      indexVariable = createVariable(index, indexResult.inferredType);
+      index = createVariableGet(indexVariable);
+    }
 
     ExpressionInferenceResult valueResult = inferrer
         .inferExpression(node.value, valueType, true, isVoidAllowed: true);
     Expression value = inferrer.ensureAssignableResult(valueType, valueResult);
-    VariableDeclaration valueVariable =
-        createVariable(value, valueResult.inferredType);
+
+    VariableDeclaration valueVariable;
+    if (!node.forEffect) {
+      valueVariable = createVariable(value, valueResult.inferredType);
+      value = createVariableGet(valueVariable);
+    }
 
     // The inferred type is that inferred type of the value expression and not
     // the type of the value parameter.
     DartType inferredType = valueResult.inferredType;
 
     Expression assignment = _computeIndexSet(
-        node.fileOffset,
-        createVariableGet(receiverVariable),
-        receiverType,
-        indexSetTarget,
-        createVariableGet(indexVariable),
-        createVariableGet(valueVariable));
+        node.fileOffset, receiver, receiverType, indexSetTarget, index, value);
 
-    VariableDeclaration assignmentVariable =
-        createVariable(assignment, const VoidType());
-    Expression replacement = new Let(
-        receiverVariable,
-        createLet(
-            indexVariable,
-            createLet(
-                valueVariable,
-                createLet(
-                    assignmentVariable, createVariableGet(valueVariable))))
-          ..fileOffset = node.fileOffset);
+    Expression replacement;
+    if (node.forEffect) {
+      replacement = assignment;
+    } else {
+      assert(indexVariable != null);
+      assert(valueVariable != null);
+      VariableDeclaration assignmentVariable =
+          createVariable(assignment, const VoidType());
+      replacement = createLet(
+          indexVariable,
+          createLet(valueVariable,
+              createLet(assignmentVariable, createVariableGet(valueVariable))));
+      if (receiverVariable != null) {
+        replacement = createLet(receiverVariable, replacement);
+      }
+    }
+    replacement..fileOffset = node.fileOffset;
     return new ExpressionInferenceResult.nullAware(
         inferredType, replacement, nullAwareGuard);
   }
@@ -3076,6 +3042,53 @@
     return new ExpressionInferenceResult(inferredType, replacement);
   }
 
+  /// Creates an equals expression of using [left] and [right] as operands.
+  ///
+  /// [fileOffset] is used as the file offset for created nodes. [leftType] is
+  /// the already inferred type of the [left] expression. The inferred type of
+  /// [right] is computed by this method. If [isNot] is `true` the result is
+  /// negated to perform a != operation.
+  ExpressionInferenceResult _computeEqualsExpression(
+      int fileOffset, Expression left, DartType leftType, Expression right,
+      {bool isNot}) {
+    assert(isNot != null);
+    inferrer.flowAnalysis.equalityOp_rightBegin(left);
+    ObjectAccessTarget equalsTarget = inferrer.findInterfaceMember(
+        leftType, equalsName, fileOffset,
+        includeExtensionMethods: true);
+
+    bool typeNeeded = !inferrer.isTopLevel;
+    ExpressionInferenceResult rightResult = inferrer.inferExpression(
+        right, const UnknownType(), typeNeeded,
+        isVoidAllowed: false);
+    right = rightResult.expression;
+
+    assert(equalsTarget.isInstanceMember);
+    if (inferrer.instrumentation != null && leftType == const DynamicType()) {
+      inferrer.instrumentation.record(
+          inferrer.uriForInstrumentation,
+          fileOffset,
+          'target',
+          new InstrumentationValueForMember(equalsTarget.member));
+    }
+
+    Expression equals = new MethodInvocation(
+        left,
+        equalsName,
+        new Arguments(<Expression>[
+          right,
+        ])
+          ..fileOffset = fileOffset,
+        equalsTarget.member)
+      ..fileOffset = fileOffset;
+    if (isNot) {
+      equals = new Not(equals)..fileOffset = fileOffset;
+    }
+    inferrer.flowAnalysis.equalityOp_end(equals, right, notEqual: isNot);
+    return new ExpressionInferenceResult(
+        inferrer.coreTypes.boolRawType(inferrer.library.nonNullable), equals);
+  }
+
   /// Creates a binary expression of the binary operator with [binaryName] using
   /// [left] and [right] as operands.
   ///
@@ -3084,6 +3097,8 @@
   /// [right] is computed by this method.
   ExpressionInferenceResult _computeBinaryExpression(int fileOffset,
       Expression left, DartType leftType, Name binaryName, Expression right) {
+    assert(binaryName != equalsName);
+
     ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
         leftType, binaryName, fileOffset,
         includeExtensionMethods: true);
@@ -3096,12 +3111,25 @@
     DartType rightType =
         inferrer.getPositionalParameterTypeForTarget(binaryTarget, leftType, 0);
 
-    ExpressionInferenceResult rightResult =
-        inferrer.inferExpression(right, rightType, true, isVoidAllowed: true);
+    bool isOverloadedArithmeticOperatorAndType =
+        inferrer.isOverloadedArithmeticOperatorAndType(binaryTarget, leftType);
+
+    bool typeNeeded =
+        !inferrer.isTopLevel || isOverloadedArithmeticOperatorAndType;
+    ExpressionInferenceResult rightResult = inferrer
+        .inferExpression(right, rightType, typeNeeded, isVoidAllowed: true);
+    if (rightResult.inferredType == null) {
+      assert(!typeNeeded,
+          "Missing right type for overloaded arithmetic operator.");
+      return new ExpressionInferenceResult(
+          binaryType,
+          inferrer.engine.forest
+              .createBinary(fileOffset, left, binaryName, right));
+    }
+
     right = inferrer.ensureAssignableResult(rightType, rightResult);
 
-    if (inferrer.isOverloadedArithmeticOperatorAndType(
-        binaryTarget, leftType)) {
+    if (isOverloadedArithmeticOperatorAndType) {
       binaryType = inferrer.typeSchemaEnvironment
           .getTypeOfOverloadedArithmetic(leftType, rightResult.inferredType);
     }
@@ -3121,6 +3149,16 @@
             ..fileOffset = fileOffset)
         ..fileOffset = fileOffset;
     } else {
+      if (binaryTarget.isInstanceMember &&
+          inferrer.instrumentation != null &&
+          leftType == const DynamicType()) {
+        inferrer.instrumentation.record(
+            inferrer.uriForInstrumentation,
+            fileOffset,
+            'target',
+            new InstrumentationValueForMember(binaryTarget.member));
+      }
+
       binary = new MethodInvocation(
           left,
           binaryName,
@@ -3147,6 +3185,70 @@
     return new ExpressionInferenceResult(binaryType, binary);
   }
 
+  /// Creates a unary expression of the unary operator with [unaryName] using
+  /// [expression] as the operand.
+  ///
+  /// [fileOffset] is used as the file offset for created nodes.
+  /// [expressionType] is the already inferred type of the [expression].
+  ExpressionInferenceResult _computeUnaryExpression(int fileOffset,
+      Expression expression, DartType expressionType, Name unaryName) {
+    ObjectAccessTarget unaryTarget = inferrer.findInterfaceMember(
+        expressionType, unaryName, fileOffset,
+        includeExtensionMethods: true);
+
+    MethodContravarianceCheckKind unaryCheckKind =
+        inferrer.preCheckInvocationContravariance(expressionType, unaryTarget,
+            isThisReceiver: false);
+
+    DartType unaryType = inferrer.getReturnType(unaryTarget, expressionType);
+
+    Expression unary;
+    if (unaryTarget.isMissing) {
+      unary = inferrer.createMissingUnary(
+          fileOffset, expression, expressionType, unaryName);
+    } else if (unaryTarget.isExtensionMember) {
+      assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
+      unary = new StaticInvocation(
+          unaryTarget.member,
+          new Arguments(<Expression>[
+            expression,
+          ], types: unaryTarget.inferredExtensionTypeArguments)
+            ..fileOffset = fileOffset)
+        ..fileOffset = fileOffset;
+    } else {
+      if (unaryTarget.isInstanceMember &&
+          inferrer.instrumentation != null &&
+          expressionType == const DynamicType()) {
+        inferrer.instrumentation.record(
+            inferrer.uriForInstrumentation,
+            fileOffset,
+            'target',
+            new InstrumentationValueForMember(unaryTarget.member));
+      }
+
+      unary = new MethodInvocation(
+          expression,
+          unaryName,
+          new Arguments(<Expression>[])..fileOffset = fileOffset,
+          unaryTarget.member)
+        ..fileOffset = fileOffset;
+
+      if (unaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
+        if (inferrer.instrumentation != null) {
+          inferrer.instrumentation.record(
+              inferrer.uriForInstrumentation,
+              fileOffset,
+              'checkReturn',
+              new InstrumentationValueForType(expressionType));
+        }
+        unary = new AsExpression(unary, unaryType)
+          ..isTypeError = true
+          ..fileOffset = fileOffset;
+      }
+    }
+    return new ExpressionInferenceResult(unaryType, unary);
+  }
+
   /// Creates an index operation of [readTarget] on [receiver] using [index] as
   /// the argument.
   ///
@@ -3964,6 +4066,7 @@
   @override
   ExpressionInferenceResult visitNullLiteral(
       NullLiteral node, DartType typeContext) {
+    inferrer.flowAnalysis.nullLiteral(node);
     return new ExpressionInferenceResult(inferrer.coreTypes.nullType, node);
   }
 
@@ -4162,7 +4265,8 @@
     List<DartType> typeArguments =
         new List<DartType>(classTypeParameters.length);
     for (int i = 0; i < typeArguments.length; i++) {
-      typeArguments[i] = new TypeParameterType(classTypeParameters[i]);
+      typeArguments[i] =
+          new TypeParameterType(classTypeParameters[i], Nullability.legacy);
     }
     ArgumentsImpl.setNonInferrableArgumentTypes(node.arguments, typeArguments);
     inferrer.inferInvocation(null, node.fileOffset,
@@ -4264,7 +4368,8 @@
             inferredSpreadTypes, inferredConditionTypes);
       }
     }
-    DartType inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
+    DartType inferredType =
+        new InterfaceType(setClass, Nullability.legacy, [inferredTypeArgument]);
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
@@ -4314,7 +4419,7 @@
       StaticInvocation node, DartType typeContext) {
     FunctionType calleeType = node.target != null
         ? node.target.function.functionType
-        : new FunctionType([], const DynamicType());
+        : new FunctionType([], const DynamicType(), Nullability.legacy);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
     DartType inferredType = inferrer.inferInvocation(
         typeContext, node.fileOffset, calleeType, node.arguments);
@@ -4491,6 +4596,12 @@
   }
 
   void visitCatch(Catch node) {
+    if (node.exception != null) {
+      inferrer.flowAnalysis.initialize(node.exception);
+    }
+    if (node.stackTrace != null) {
+      inferrer.flowAnalysis.initialize(node.stackTrace);
+    }
     inferrer.inferStatement(node.body);
   }
 
@@ -4537,6 +4648,7 @@
     Expression rhs = inferrer.ensureAssignableResult(writeContext, rhsResult,
         fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
     node.value = rhs..parent = node;
+    inferrer.flowAnalysis.write(node.variable, rhsResult.inferredType);
     return new ExpressionInferenceResult(rhsResult.inferredType, node);
   }
 
@@ -4552,6 +4664,7 @@
           isVoidAllowed: true);
       inferredType =
           inferrer.inferDeclarationType(initializerResult.inferredType);
+      inferrer.flowAnalysis.initialize(node);
     } else {
       inferredType = const DynamicType();
     }
@@ -4583,11 +4696,20 @@
   ExpressionInferenceResult visitVariableGet(
       covariant VariableGetImpl node, DartType typeContext) {
     VariableDeclarationImpl variable = node.variable;
-    bool mutatedInClosure = variable._mutatedInClosure;
-    DartType declaredOrInferredType = variable.type;
+    bool isUnassigned = !inferrer.flowAnalysis.isAssigned(variable);
+    if (isUnassigned) {
+      inferrer.dataForTesting?.flowAnalysisResult?.unassignedNodes?.add(node);
+    }
 
-    DartType promotedType = inferrer.typePromoter
-        .computePromotedType(node._fact, node._scope, mutatedInClosure);
+    DartType promotedType;
+    DartType declaredOrInferredType = variable.type;
+    if (inferrer.isNonNullableByDefault) {
+      promotedType = inferrer.flowAnalysis.variableRead(node, variable);
+    } else {
+      bool mutatedInClosure = variable._mutatedInClosure;
+      promotedType = inferrer.typePromoter
+          .computePromotedType(node._fact, node._scope, mutatedInClosure);
+    }
     if (promotedType != null) {
       inferrer.instrumentation?.record(
           inferrer.uriForInstrumentation,
@@ -4647,7 +4769,8 @@
     DartType inferredType = inferrer.typeSchemaEnvironment
         .futureType(const DynamicType(), Nullability.legacy);
     if (node.arguments != null) {
-      FunctionType calleeType = new FunctionType([], inferredType);
+      FunctionType calleeType =
+          new FunctionType([], inferredType, Nullability.legacy);
       inferrer.inferInvocation(
           typeContext, node.fileOffset, calleeType, node.arguments);
     }
@@ -4659,7 +4782,8 @@
     DartType inferredType = new FunctionType(
         [],
         inferrer.typeSchemaEnvironment
-            .futureType(const DynamicType(), Nullability.legacy));
+            .futureType(const DynamicType(), Nullability.legacy),
+        Nullability.legacy);
     Expression replacement = new StaticGet(node.target)
       ..fileOffset = node.fileOffset;
     return new ExpressionInferenceResult(inferredType, replacement);
@@ -4672,6 +4796,106 @@
     return new ExpressionInferenceResult(
         inferrer.coreTypes.objectRawType(inferrer.library.nullable), node);
   }
+
+  ExpressionInferenceResult visitEquals(
+      EqualsExpression node, DartType typeContext) {
+    ExpressionInferenceResult leftResult =
+        inferrer.inferExpression(node.left, const UnknownType(), true);
+    return _computeEqualsExpression(node.fileOffset, leftResult.expression,
+        leftResult.inferredType, node.right,
+        isNot: node.isNot);
+  }
+
+  ExpressionInferenceResult visitBinary(
+      BinaryExpression node, DartType typeContext) {
+    ExpressionInferenceResult leftResult =
+        inferrer.inferExpression(node.left, const UnknownType(), true);
+    return _computeBinaryExpression(node.fileOffset, leftResult.expression,
+        leftResult.inferredType, node.binaryName, node.right);
+  }
+
+  ExpressionInferenceResult visitUnary(
+      UnaryExpression node, DartType typeContext) {
+    ExpressionInferenceResult expressionResult;
+    if (node.unaryName.name == 'unary-') {
+      // Replace integer literals in a double context with the corresponding
+      // double literal if it's exact.  For double literals, the negation is
+      // folded away.  In any non-double context, or if there is no exact
+      // double value, then the corresponding integer literal is left.  The
+      // negation is not folded away so that platforms with web literals can
+      // distinguish between (non-negated) 0x8000000000000000 represented as
+      // integer literal -9223372036854775808 which should be a positive number,
+      // and negated 9223372036854775808 represented as
+      // -9223372036854775808.unary-() which should be a negative number.
+      if (node.expression is IntJudgment) {
+        IntJudgment receiver = node.expression;
+        if (inferrer.isDoubleContext(typeContext)) {
+          double doubleValue = receiver.asDouble(negated: true);
+          if (doubleValue != null) {
+            Expression replacement = new DoubleLiteral(doubleValue)
+              ..fileOffset = node.fileOffset;
+            DartType inferredType =
+                inferrer.coreTypes.doubleRawType(inferrer.library.nonNullable);
+            return new ExpressionInferenceResult(inferredType, replacement);
+          }
+        }
+        Expression error = checkWebIntLiteralsErrorIfUnexact(
+            inferrer, receiver.value, receiver.literal, receiver.fileOffset);
+        if (error != null) {
+          return new ExpressionInferenceResult(const DynamicType(), error);
+        }
+      } else if (node.expression is ShadowLargeIntLiteral) {
+        ShadowLargeIntLiteral receiver = node.expression;
+        if (!receiver.isParenthesized) {
+          if (inferrer.isDoubleContext(typeContext)) {
+            double doubleValue = receiver.asDouble(negated: true);
+            if (doubleValue != null) {
+              Expression replacement = new DoubleLiteral(doubleValue)
+                ..fileOffset = node.fileOffset;
+              DartType inferredType = inferrer.coreTypes
+                  .doubleRawType(inferrer.library.nonNullable);
+              return new ExpressionInferenceResult(inferredType, replacement);
+            }
+          }
+          int intValue = receiver.asInt64(negated: true);
+          if (intValue == null) {
+            Expression error = inferrer.helper.buildProblem(
+                templateIntegerLiteralIsOutOfRange
+                    .withArguments(receiver.literal),
+                receiver.fileOffset,
+                receiver.literal.length);
+            return new ExpressionInferenceResult(const DynamicType(), error);
+          }
+          if (intValue != null) {
+            Expression error = checkWebIntLiteralsErrorIfUnexact(
+                inferrer, intValue, receiver.literal, receiver.fileOffset);
+            if (error != null) {
+              return new ExpressionInferenceResult(const DynamicType(), error);
+            }
+            expressionResult = new ExpressionInferenceResult(
+                inferrer.coreTypes.intRawType(inferrer.library.nonNullable),
+                new IntLiteral(-intValue)
+                  ..fileOffset = node.expression.fileOffset);
+          }
+        }
+      }
+    }
+    if (expressionResult == null) {
+      expressionResult =
+          inferrer.inferExpression(node.expression, const UnknownType(), true);
+    }
+    return _computeUnaryExpression(node.fileOffset, expressionResult.expression,
+        expressionResult.inferredType, node.unaryName);
+  }
+
+  ExpressionInferenceResult visitParenthesized(
+      ParenthesizedExpression node, DartType typeContext) {
+    ExpressionInferenceResult result = inferrer.inferExpression(
+        node.expression, typeContext, true,
+        isVoidAllowed: true);
+    return new ExpressionInferenceResult(
+        result.inferredType, result.expression);
+  }
 }
 
 class ForInResult {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index ebbb736..b70d248 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -23,8 +23,6 @@
 
 export 'load_library_builder.dart' show LoadLibraryBuilder;
 
-export 'unlinked_scope.dart' show UnlinkedDeclaration;
-
 int compareProcedures(Procedure a, Procedure b) {
   int i = "${a.fileUri}".compareTo("${b.fileUri}");
   if (i != 0) return i;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 5a7862b..ae75f53 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -20,7 +20,7 @@
 
 import 'dart:core' hide MapEntry;
 
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
@@ -243,6 +243,7 @@
 }
 
 enum InternalExpressionKind {
+  Binary,
   Cascade,
   CompoundExtensionIndexSet,
   CompoundExtensionSet,
@@ -250,6 +251,7 @@
   CompoundPropertySet,
   CompoundSuperIndexSet,
   DeferredCheck,
+  Equals,
   ExtensionIndexSet,
   ExtensionTearOff,
   ExtensionSet,
@@ -268,10 +270,12 @@
   NullAwareMethodInvocation,
   NullAwarePropertyGet,
   NullAwarePropertySet,
+  Parenthesized,
   PropertyPostIncDec,
   StaticPostIncDec,
   SuperIndexSet,
   SuperPostIncDec,
+  Unary,
 }
 
 /// Common base class for internal expressions.
@@ -279,15 +283,19 @@
   InternalExpressionKind get kind;
 
   @override
-  R accept<R>(ExpressionVisitor<R> visitor) => visitor.defaultExpression(this);
+  R accept<R>(ExpressionVisitor<R> visitor) =>
+      unsupported("${runtimeType}.accept", -1, null);
 
   @override
   R accept1<R, A>(ExpressionVisitor1<R, A> visitor, A arg) =>
-      visitor.defaultExpression(this, arg);
+      unsupported("${runtimeType}.accept1", -1, null);
 
   @override
   DartType getStaticType(types) =>
       unsupported("${runtimeType}.getStaticType", -1, null);
+
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext);
 }
 
 /// Front end specific implementation of [Argument].
@@ -384,6 +392,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCascade(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.Cascade;
 
   /// Adds [expression] to the list of [expressions] performed on [variable].
@@ -420,6 +434,12 @@
     expression?.parent = this;
   }
 
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitDeferredCheck(this, typeContext);
+  }
+
   InternalExpressionKind get kind => InternalExpressionKind.DeferredCheck;
 
   @override
@@ -514,6 +534,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullExpression(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IfNull;
 
   @override
@@ -692,6 +718,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwareMethodInvocation(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.NullAwareMethodInvocation;
 
@@ -733,6 +765,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwarePropertyGet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.NullAwarePropertyGet;
 
@@ -774,6 +812,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwarePropertySet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.NullAwarePropertySet;
 
@@ -974,6 +1018,12 @@
   LoadLibraryTearOff(this.import, this.target);
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitLoadLibraryTearOff(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.LoadLibraryTearOff;
 
   @override
@@ -1025,6 +1075,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullPropertySet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IfNullPropertySet;
 
   @override
@@ -1079,6 +1135,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IfNullSet;
 
   @override
@@ -1189,6 +1251,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCompoundExtensionSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.CompoundExtensionSet;
 
@@ -1268,6 +1336,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCompoundPropertySet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.CompoundPropertySet;
 
   @override
@@ -1321,6 +1395,12 @@
       : this(null, read, write);
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitPropertyPostIncDec(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.PropertyPostIncDec;
 
   @override
@@ -1364,6 +1444,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitLocalPostIncDec(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.LocalPostIncDec;
 
   @override
@@ -1406,6 +1492,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitStaticPostIncDec(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.StaticPostIncDec;
 
   @override
@@ -1448,6 +1540,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitSuperPostIncDec(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.SuperPostIncDec;
 
   @override
@@ -1492,14 +1590,26 @@
   /// The value expression of the operation.
   Expression value;
 
-  // TODO(johnniwinther): Add `readOnlyReceiver` capability.
-  IndexSet(this.receiver, this.index, this.value) {
+  final bool forEffect;
+
+  final bool readOnlyReceiver;
+
+  IndexSet(this.receiver, this.index, this.value,
+      {this.forEffect, this.readOnlyReceiver})
+      : assert(forEffect != null),
+        assert(readOnlyReceiver != null) {
     receiver?.parent = this;
     index?.parent = this;
     value?.parent = this;
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IndexSet;
 
   @override
@@ -1555,6 +1665,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitSuperIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.SuperIndexSet;
 
   @override
@@ -1624,6 +1740,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitExtensionIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.ExtensionIndexSet;
 
   @override
@@ -1715,6 +1837,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IfNullIndexSet;
 
   @override
@@ -1796,6 +1924,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullSuperIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.IfNullSuperIndexSet;
 
   @override
@@ -1883,6 +2017,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitIfNullExtensionIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.IfNullExtensionIndexSet;
 
@@ -1971,6 +2111,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCompoundIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.CompoundIndexSet;
 
   @override
@@ -2076,6 +2222,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwareCompoundSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.NullAwareCompoundSet;
 
@@ -2153,6 +2305,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwareIfNullSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.NullAwareIfNullSet;
 
   @override
@@ -2232,6 +2390,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCompoundSuperIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.CompoundSuperIndexSet;
 
@@ -2338,6 +2502,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitCompoundExtensionIndexSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind =>
       InternalExpressionKind.CompoundExtensionIndexSet;
 
@@ -2420,6 +2590,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitExtensionSet(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.ExtensionSet;
 
   @override
@@ -2460,6 +2636,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitNullAwareExtension(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.NullAwareExtension;
 
   @override
@@ -2520,6 +2702,12 @@
   }
 
   @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitExtensionTearOff(this, typeContext);
+  }
+
+  @override
   InternalExpressionKind get kind => InternalExpressionKind.ExtensionTearOff;
 
   @override
@@ -2536,6 +2724,148 @@
   }
 }
 
+/// Internal expression for an equals or not-equals expression.
+class EqualsExpression extends InternalExpression {
+  Expression left;
+  Expression right;
+  bool isNot;
+
+  EqualsExpression(this.left, this.right, {this.isNot})
+      : assert(isNot != null) {
+    left?.parent = this;
+    right?.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitEquals(this, typeContext);
+  }
+
+  @override
+  InternalExpressionKind get kind => InternalExpressionKind.Equals;
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    left?.accept(v);
+    right?.accept(v);
+  }
+
+  @override
+  void transformChildren(Transformer v) {
+    if (left != null) {
+      left = left.accept<TreeNode>(v);
+      left?.parent = this;
+    }
+    if (right != null) {
+      right = right.accept<TreeNode>(v);
+      right?.parent = this;
+    }
+  }
+}
+
+/// Internal expression for a binary expression.
+class BinaryExpression extends InternalExpression {
+  Expression left;
+  Name binaryName;
+  Expression right;
+
+  BinaryExpression(this.left, this.binaryName, this.right) {
+    left?.parent = this;
+    right?.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitBinary(this, typeContext);
+  }
+
+  @override
+  InternalExpressionKind get kind => InternalExpressionKind.Binary;
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    left?.accept(v);
+    right?.accept(v);
+  }
+
+  @override
+  void transformChildren(Transformer v) {
+    if (left != null) {
+      left = left.accept<TreeNode>(v);
+      left?.parent = this;
+    }
+    if (right != null) {
+      right = right.accept<TreeNode>(v);
+      right?.parent = this;
+    }
+  }
+}
+
+/// Internal expression for a unary expression.
+class UnaryExpression extends InternalExpression {
+  Name unaryName;
+  Expression expression;
+
+  UnaryExpression(this.unaryName, this.expression) {
+    expression?.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitUnary(this, typeContext);
+  }
+
+  @override
+  InternalExpressionKind get kind => InternalExpressionKind.Unary;
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    expression?.accept(v);
+  }
+
+  @override
+  void transformChildren(Transformer v) {
+    if (expression != null) {
+      expression = expression.accept<TreeNode>(v);
+      expression?.parent = this;
+    }
+  }
+}
+
+/// Internal expression for a parenthesized expression.
+class ParenthesizedExpression extends InternalExpression {
+  Expression expression;
+
+  ParenthesizedExpression(this.expression) {
+    expression?.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitor visitor, DartType typeContext) {
+    return visitor.visitParenthesized(this, typeContext);
+  }
+
+  @override
+  InternalExpressionKind get kind => InternalExpressionKind.Parenthesized;
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    expression?.accept(v);
+  }
+
+  @override
+  void transformChildren(Transformer v) {
+    if (expression != null) {
+      expression = expression.accept<TreeNode>(v);
+      expression?.parent = this;
+    }
+  }
+}
+
 /// Creates a [Let] of [variable] with the given [body] using
 /// `variable.fileOffset` as the file offset for the let.
 ///
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 22369f8..0a6001d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -25,6 +25,7 @@
         Library,
         Name,
         NamedExpression,
+        Nullability,
         NullLiteral,
         Procedure,
         RedirectingInitializer,
@@ -558,9 +559,11 @@
     List<DartType> typeParameterTypes = new List<DartType>();
     for (int i = 0; i < enclosingClass.typeParameters.length; i++) {
       TypeParameter typeParameter = enclosingClass.typeParameters[i];
-      typeParameterTypes.add(new TypeParameterType(typeParameter));
+      typeParameterTypes
+          .add(new TypeParameterType(typeParameter, Nullability.legacy));
     }
-    return new InterfaceType(enclosingClass, typeParameterTypes);
+    return new InterfaceType(
+        enclosingClass, Nullability.legacy, typeParameterTypes);
   }
 
   void setupTopAndBottomTypes() {
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 4d053bd..e209c0b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -13,6 +13,7 @@
         LoadLibrary,
         Member,
         Name,
+        Nullability,
         Procedure,
         ProcedureKind,
         ReturnStatement;
@@ -54,7 +55,7 @@
         ProcedureKind.Method,
         new FunctionNode(new ReturnStatement(expression),
             returnType: new InterfaceType(parent.loader.coreTypes.futureClass,
-                <DartType>[const DynamicType()])),
+                Nullability.legacy, <DartType>[const DynamicType()])),
         fileUri: parent.library.fileUri,
         isStatic: true)
       ..startFileOffset = charOffset
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index ff2b557..e56558a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -14,6 +14,7 @@
         Let,
         Member,
         NullLiteral,
+        Nullability,
         Procedure,
         StaticGet,
         StringLiteral,
@@ -135,7 +136,8 @@
   List<DartType> typeArguments = <DartType>[]..length =
       member.function.typeParameters.length;
   for (int i = 0; i < typeArguments.length; i++) {
-    typeArguments[i] = new TypeParameterType(member.function.typeParameters[i]);
+    typeArguments[i] = new TypeParameterType(
+        member.function.typeParameters[i], Nullability.legacy);
   }
 
   // We use the [tortoise and hare algorithm]
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index d210b0c..369a2d3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -32,6 +32,7 @@
         MethodInvocation,
         Name,
         Not,
+        Nullability,
         NullLiteral,
         Procedure,
         PropertyGet,
@@ -130,12 +131,14 @@
       result = new VariableDeclaration.forValue(
           new StaticInvocation(
               setFactory, new Arguments([], types: [elementType])),
-          type: new InterfaceType(coreTypes.setClass, [elementType]),
+          type: new InterfaceType(
+              coreTypes.setClass, Nullability.legacy, [elementType]),
           isFinal: true);
     } else {
       result = new VariableDeclaration.forValue(
           new ListLiteral([], typeArgument: elementType),
-          type: new InterfaceType(coreTypes.listClass, [elementType]),
+          type: new InterfaceType(
+              coreTypes.listClass, Nullability.legacy, [elementType]),
           isFinal: true);
     }
     List<Statement> body = [result];
@@ -332,8 +335,8 @@
     // Build a block expression and create an empty map.
     VariableDeclaration result = new VariableDeclaration.forValue(
         new MapLiteral([], keyType: node.keyType, valueType: node.valueType),
-        type: new InterfaceType(
-            coreTypes.mapClass, [node.keyType, node.valueType]),
+        type: new InterfaceType(coreTypes.mapClass, Nullability.legacy,
+            [node.keyType, node.valueType]),
         isFinal: true);
     List<Statement> body = [result];
     // Add all the entries up to the first control-flow entry.
@@ -444,15 +447,15 @@
       value = new VariableGet(temp);
     }
 
-    DartType entryType =
-        new InterfaceType(mapEntryClass, <DartType>[keyType, valueType]);
+    DartType entryType = new InterfaceType(
+        mapEntryClass, Nullability.legacy, <DartType>[keyType, valueType]);
     VariableDeclaration elt;
     Statement loopBody;
     if (entry.entryType == null ||
         !typeEnvironment.isSubtypeOf(entry.entryType, entryType,
             SubtypeCheckMode.ignoringNullabilities)) {
       elt = new VariableDeclaration(null,
-          type: new InterfaceType(mapEntryClass,
+          type: new InterfaceType(mapEntryClass, Nullability.legacy,
               <DartType>[const DynamicType(), const DynamicType()]),
           isFinal: true);
       VariableDeclaration keyVar = new VariableDeclaration.forValue(
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index ab150cf..0a61069 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -14,6 +14,7 @@
         Let,
         MethodInvocation,
         Name,
+        Nullability,
         Procedure,
         SetLiteral,
         StaticInvocation,
@@ -57,7 +58,8 @@
     VariableDeclaration setVar = new VariableDeclaration.forValue(
         new StaticInvocation(
             setFactory, new Arguments([], types: [node.typeArgument])),
-        type: new InterfaceType(coreTypes.setClass, [node.typeArgument]));
+        type: new InterfaceType(
+            coreTypes.setClass, Nullability.legacy, [node.typeArgument]));
     // Innermost body of let chain: setVar
     Expression setExp = new VariableGet(setVar);
     for (int i = node.expressions.length - 1; i >= 0; i--) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 2a5cbe3..91ab53c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -25,6 +25,7 @@
         MapConstant,
         NeverType,
         NullConstant,
+        Nullability,
         PartialInstantiationConstant,
         Procedure,
         SetConstant,
@@ -270,7 +271,8 @@
   }
 
   void visitInstanceConstant(InstanceConstant node) {
-    new InterfaceType(node.classNode, node.typeArguments).accept(this);
+    new InterfaceType(node.classNode, Nullability.legacy, node.typeArguments)
+        .accept(this);
     result.add(" {");
     bool first = true;
     for (Field field in node.classNode.fields) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/types.dart b/pkg/front_end/lib/src/fasta/kernel/types.dart
index d44fcec..37a3272 100644
--- a/pkg/front_end/lib/src/fasta/kernel/types.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/types.dart
@@ -22,10 +22,13 @@
         Variance,
         VoidType;
 
-import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_algebra.dart'
+    show Substitution, combineNullabilitiesForSubstitution;
 
 import 'package:kernel/type_environment.dart';
 
+import 'package:kernel/src/future_or.dart';
+
 import 'kernel_builder.dart' show ClassHierarchyBuilder;
 
 class Types implements SubtypeTester {
@@ -231,17 +234,17 @@
     for (int i = 0; i < s.length; i++) {
       int variance = p[i].variance;
       if (variance == Variance.contravariant) {
-        result = result.join(performNullabilityAwareSubtypeCheck(t[i], s[i]));
+        result = result.and(performNullabilityAwareSubtypeCheck(t[i], s[i]));
         if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
       } else if (variance == Variance.invariant) {
-        result = result.join(isSameTypeKernel(s[i], t[i]));
+        result = result.and(isSameTypeKernel(s[i], t[i]));
         if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
       } else {
-        result = result.join(performNullabilityAwareSubtypeCheck(s[i], t[i]));
+        result = result.and(performNullabilityAwareSubtypeCheck(s[i], t[i]));
         if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
@@ -252,7 +255,7 @@
 
   IsSubtypeOf isSameTypeKernel(DartType s, DartType t) {
     return performNullabilityAwareSubtypeCheck(s, t)
-        .joinWithSubtypeCheckFor(t, s, this);
+        .andSubtypeCheckFor(t, s, this);
   }
 
   @override
@@ -275,7 +278,7 @@
   InterfaceType futureType(DartType type,
       [Nullability nullability = Nullability.legacy]) {
     return new InterfaceType(
-        hierarchy.coreTypes.futureClass, <DartType>[type], nullability);
+        hierarchy.coreTypes.futureClass, nullability, <DartType>[type]);
   }
 
   @override
@@ -354,7 +357,7 @@
     return types
         .areTypeArgumentsOfSubtypeKernel(asSupertype.typeArguments,
             t.typeArguments, t.classNode.typeParameters)
-        .join(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
@@ -362,7 +365,7 @@
       TypeParameterType s, InterfaceType t, Types types) {
     return types
         .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
-        .join(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
@@ -372,12 +375,12 @@
     // Rules 7.1 and 7.2.
     return types
         .performNullabilityAwareSubtypeCheck(arguments.single, t)
-        .joinWithSubtypeCheckFor(
-            new InterfaceType(types.hierarchy.futureClass, arguments,
-                Nullability.nonNullable),
+        .andSubtypeCheckFor(
+            new InterfaceType(types.hierarchy.futureClass,
+                Nullability.nonNullable, arguments),
             t,
             types)
-        .join(new IsSubtypeOf.basedSolelyOnNullabilities(futureOr, t));
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(futureOr, t));
   }
 
   @override
@@ -404,7 +407,7 @@
     // Rule 5.
     return types
         .performNullabilityAwareSubtypeCheck(s.unalias, t)
-        .join(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
@@ -423,43 +426,45 @@
     if (sTypeVariables.length != tTypeVariables.length) {
       return const IsSubtypeOf.never();
     }
+    IsSubtypeOf result = const IsSubtypeOf.always();
     if (sTypeVariables.isNotEmpty) {
       // If the function types have type variables, we alpha-rename the type
       // variables of [s] to use those of [t].
+
+      // As an optimization, we first check if the bounds of the type variables
+      // of the two types on the same positions are mutual subtypes without
+      // alpha-renaming them.
       List<DartType> typeVariableSubstitution = <DartType>[];
-      bool secondBoundsCheckNeeded = false;
       for (int i = 0; i < sTypeVariables.length; i++) {
         TypeParameter sTypeVariable = sTypeVariables[i];
         TypeParameter tTypeVariable = tTypeVariables[i];
-        if (!types
-            .isSameTypeKernel(sTypeVariable.bound, tTypeVariable.bound)
-            .isSubtypeWhenIgnoringNullabilities()) {
-          // If the bounds aren't the same, we need to try again after
-          // computing the substitution of type variables.
-          secondBoundsCheckNeeded = true;
-        }
-        typeVariableSubstitution.add(new TypeParameterType(tTypeVariable));
+        result = result.and(
+            types.isSameTypeKernel(sTypeVariable.bound, tTypeVariable.bound));
+        typeVariableSubstitution.add(new TypeParameterType(tTypeVariable,
+            TypeParameterType.computeNullabilityFromBound(tTypeVariable)));
       }
       Substitution substitution =
           Substitution.fromPairs(sTypeVariables, typeVariableSubstitution);
-      if (secondBoundsCheckNeeded) {
+      // If the bounds aren't the same, we need to try again after computing the
+      // substitution of type variables.
+      if (!result.isSubtypeWhenIgnoringNullabilities()) {
+        result = const IsSubtypeOf.always();
         for (int i = 0; i < sTypeVariables.length; i++) {
           TypeParameter sTypeVariable = sTypeVariables[i];
           TypeParameter tTypeVariable = tTypeVariables[i];
-          if (!types
-              .isSameTypeKernel(
-                  substitution.substituteType(sTypeVariable.bound),
-                  tTypeVariable.bound)
-              .isSubtypeWhenIgnoringNullabilities()) {
+          result = result.and(types.isSameTypeKernel(
+              substitution.substituteType(sTypeVariable.bound),
+              tTypeVariable.bound));
+          if (!result.isSubtypeWhenIgnoringNullabilities()) {
             return const IsSubtypeOf.never();
           }
         }
       }
       s = substitution.substituteType(s.withoutTypeParameters);
     }
-    if (!types
-        .performNullabilityAwareSubtypeCheck(s.returnType, t.returnType)
-        .isSubtypeWhenIgnoringNullabilities()) {
+    result = result.and(
+        types.performNullabilityAwareSubtypeCheck(s.returnType, t.returnType));
+    if (!result.isSubtypeWhenIgnoringNullabilities()) {
       return const IsSubtypeOf.never();
     }
     List<DartType> sPositional = s.positionalParameters;
@@ -473,9 +478,9 @@
       return const IsSubtypeOf.never();
     }
     for (int i = 0; i < tPositional.length; i++) {
-      if (!types
-          .performNullabilityAwareSubtypeCheck(tPositional[i], sPositional[i])
-          .isSubtypeWhenIgnoringNullabilities()) {
+      result = result.and(types.performNullabilityAwareSubtypeCheck(
+          tPositional[i], sPositional[i]));
+      if (!result.isSubtypeWhenIgnoringNullabilities()) {
         // Rule 15, Tj <: Sj.
         return const IsSubtypeOf.never();
       }
@@ -501,15 +506,14 @@
           if (sNamed[sCount].name == name) break;
         }
         if (sCount == sNamed.length) return const IsSubtypeOf.never();
-        if (!types
-            .performNullabilityAwareSubtypeCheck(
-                tNamed[tCount].type, sNamed[sCount].type)
-            .isSubtypeWhenIgnoringNullabilities()) {
+        result = result.and(types.performNullabilityAwareSubtypeCheck(
+            tNamed[tCount].type, sNamed[sCount].type));
+        if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
       }
     }
-    return const IsSubtypeOf.always();
+    return result.and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
@@ -544,7 +548,9 @@
   IsSubtypeOf isTypeParameterRelated(
       TypeParameterType s, FunctionType t, Types types) {
     // Rule 13.
-    return types.performNullabilityAwareSubtypeCheck(s.parameter.bound, t);
+    return types
+        .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
@@ -565,21 +571,41 @@
   @override
   IsSubtypeOf isTypeParameterRelated(
       TypeParameterType s, TypeParameterType t, Types types) {
-    return s.parameter == t.parameter ||
-            // Rule 13.
-            types
-                .performNullabilityAwareSubtypeCheck(s.bound, t)
-                .isSubtypeWhenIgnoringNullabilities()
-        ? const IsSubtypeOf.always()
-        : const IsSubtypeOf.never();
+    IsSubtypeOf result = const IsSubtypeOf.always();
+    if (s.parameter != t.parameter) {
+      result = types.performNullabilityAwareSubtypeCheck(s.bound, t);
+    }
+    if (s.nullability == Nullability.undetermined &&
+        t.nullability == Nullability.undetermined) {
+      // The two nullabilities are undetermined, but are connected via
+      // additional constraint, namely that they will be equal at run time.
+      return result;
+    }
+    return result.and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   @override
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, TypeParameterType t, Types types) {
-    return intersection.parameter == t.parameter
-        ? const IsSubtypeOf.always()
-        : const IsSubtypeOf.never(); // Rule 8.
+    // Nullable types aren't promoted to intersection types.
+    // TODO(dmitryas): Uncomment the following when the inference is updated.
+    //assert(intersection.typeParameterTypeNullability != Nullability.nullable);
+
+    // Rule 8.
+    if (intersection.parameter == t.parameter) {
+      if (intersection.nullability == Nullability.undetermined &&
+          t.nullability == Nullability.undetermined) {
+        // The two nullabilities are undetermined, but are connected via
+        // additional constraint, namely that they will be equal at run time.
+        return const IsSubtypeOf.always();
+      }
+      return new IsSubtypeOf.basedSolelyOnNullabilities(intersection, t);
+    }
+
+    // Rule 12.
+    return types.performNullabilityAwareSubtypeCheck(
+        intersection.promotedBound.withNullability(intersection.nullability),
+        t);
   }
 
   @override
@@ -676,16 +702,20 @@
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, InterfaceType futureOr, Types types) {
     List<DartType> arguments = futureOr.typeArguments;
-    if (types
-        .performNullabilityAwareSubtypeCheck(s, arguments.single)
-        .isSubtypeWhenIgnoringNullabilities()) {
-      return const IsSubtypeOf.always(); // Rule 11.
-    }
-    // Rule 10.
-    return types.performNullabilityAwareSubtypeCheck(
-        s,
-        new InterfaceType(
-            types.hierarchy.futureClass, arguments, futureOr.nullability));
+
+    Nullability unitedNullability =
+        computeNullabilityOfFutureOr(futureOr, types.hierarchy.futureOrClass);
+
+    return types
+        // Rule 11.
+        .performNullabilityAwareSubtypeCheck(
+            s, arguments.single.withNullability(unitedNullability))
+        // Rule 10.
+        .orSubtypeCheckFor(
+            s,
+            new InterfaceType(
+                types.hierarchy.futureClass, unitedNullability, arguments),
+            types);
   }
 
   @override
@@ -702,39 +732,46 @@
       DynamicType s, InterfaceType futureOr, Types types) {
     // Rule 11.
     DartType argument = futureOr.typeArguments.single;
-    return types.performNullabilityAwareSubtypeCheck(s, argument);
+    return types.performNullabilityAwareSubtypeCheck(
+        s,
+        argument.withNullability(computeNullabilityOfFutureOr(
+            futureOr, types.hierarchy.futureOrClass)));
   }
 
   @override
   IsSubtypeOf isVoidRelated(VoidType s, InterfaceType futureOr, Types types) {
     // Rule 11.
     DartType argument = futureOr.typeArguments.single;
-    return types.performNullabilityAwareSubtypeCheck(s, argument);
+    return types.performNullabilityAwareSubtypeCheck(
+        s,
+        argument.withNullability(computeNullabilityOfFutureOr(
+            futureOr, types.hierarchy.futureOrClass)));
   }
 
   @override
   IsSubtypeOf isTypeParameterRelated(
       TypeParameterType s, InterfaceType futureOr, Types types) {
     List<DartType> arguments = futureOr.typeArguments;
-    if (types
-        .performNullabilityAwareSubtypeCheck(s, arguments.single)
-        .isSubtypeWhenIgnoringNullabilities()) {
-      // Rule 11.
-      return const IsSubtypeOf.always();
-    }
-
-    if (types
-        .performNullabilityAwareSubtypeCheck(s.parameter.bound, futureOr)
-        .isSubtypeWhenIgnoringNullabilities()) {
-      // Rule 13.
-      return const IsSubtypeOf.always();
-    }
-
-    // Rule 10.
-    return types.performNullabilityAwareSubtypeCheck(
-        s,
-        new InterfaceType(
-            types.hierarchy.futureClass, arguments, futureOr.nullability));
+    Nullability unitedNullability =
+        computeNullabilityOfFutureOr(futureOr, types.hierarchy.futureOrClass);
+    // TODO(dmitryas): Revise the original optimization.
+    return types
+        // Rule 11.
+        .performNullabilityAwareSubtypeCheck(
+            s, arguments.single.withNullability(unitedNullability))
+        // Rule 13.
+        .orSubtypeCheckFor(
+            s.parameter.bound.withNullability(
+                combineNullabilitiesForSubstitution(
+                    s.parameter.bound.nullability, s.nullability)),
+            futureOr,
+            types)
+        // Rule 10.
+        .orSubtypeCheckFor(
+            s,
+            new InterfaceType(
+                types.hierarchy.futureClass, unitedNullability, arguments),
+            types);
   }
 
   @override
@@ -742,20 +779,18 @@
       FunctionType s, InterfaceType futureOr, Types types) {
     // Rule 11.
     DartType argument = futureOr.typeArguments.single;
-    return types.performNullabilityAwareSubtypeCheck(s, argument);
+    return types.performNullabilityAwareSubtypeCheck(
+        s,
+        argument.withNullability(computeNullabilityOfFutureOr(
+            futureOr, types.hierarchy.futureOrClass)));
   }
 
   @override
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, InterfaceType futureOr, Types types) {
-    if (isTypeParameterRelated(intersection, futureOr, types)
-        .isSubtypeWhenIgnoringNullabilities()) {
-      // Rule 8.
-      return const IsSubtypeOf.always();
-    }
-    // Rule 12.
-    return types.performNullabilityAwareSubtypeCheck(
-        intersection.promotedBound, futureOr);
+    return isTypeParameterRelated(intersection, futureOr, types) // Rule 8.
+        .orSubtypeCheckFor(
+            intersection.promotedBound, futureOr, types); // Rule 12.
   }
 
   @override
@@ -773,14 +808,8 @@
       TypeParameterType tIntersection, Types types) {
     // Rule 9.
     return const IsTypeParameterSubtypeOf()
-                .isIntersectionRelated(sIntersection, tIntersection, types)
-                .isSubtypeWhenIgnoringNullabilities() &&
-            types
-                .performNullabilityAwareSubtypeCheck(
-                    sIntersection, tIntersection.promotedBound)
-                .isSubtypeWhenIgnoringNullabilities()
-        ? const IsSubtypeOf.always()
-        : const IsSubtypeOf.never();
+        .isIntersectionRelated(sIntersection, tIntersection, types)
+        .andSubtypeCheckFor(sIntersection, tIntersection.promotedBound, types);
   }
 
   @override
@@ -788,14 +817,8 @@
       TypeParameterType s, TypeParameterType intersection, Types types) {
     // Rule 9.
     return const IsTypeParameterSubtypeOf()
-                .isTypeParameterRelated(s, intersection, types)
-                .isSubtypeWhenIgnoringNullabilities() &&
-            types
-                .performNullabilityAwareSubtypeCheck(
-                    s, intersection.promotedBound)
-                .isSubtypeWhenIgnoringNullabilities()
-        ? const IsSubtypeOf.always()
-        : const IsSubtypeOf.never();
+        .isTypeParameterRelated(s, intersection, types)
+        .andSubtypeCheckFor(s, intersection.promotedBound, types);
   }
 
   @override
@@ -884,7 +907,7 @@
       TypeParameterType s, NeverType t, Types types) {
     return types
         .performNullabilityAwareSubtypeCheck(s.bound, t)
-        .join(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
   IsSubtypeOf isTypedefRelated(TypedefType s, NeverType t, Types types) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart b/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart
deleted file mode 100644
index 8463914..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../builder/builder.dart';
-
-import '../scope.dart';
-
-/// Scope that returns an [UnlinkedDeclaration] if a name can't be resolved.
-/// This is intended to be used as the `enclosingScope` in `BodyBuilder` to
-/// create ASTs with building outlines.
-class UnlinkedScope extends Scope {
-  UnlinkedScope() : super.top(isModifiable: false);
-
-  Builder lookupIn(String name, int charOffset, Uri fileUri,
-      Map<String, Builder> map, bool isInstanceScope) {
-    return new UnlinkedDeclaration(name, isInstanceScope, charOffset, fileUri);
-  }
-}
-
-class UnlinkedDeclaration extends BuilderImpl {
-  final String name;
-
-  final bool isInstanceScope;
-
-  @override
-  final int charOffset;
-
-  @override
-  final Uri fileUri;
-
-  UnlinkedDeclaration(
-      this.name, this.isInstanceScope, this.charOffset, this.fileUri);
-
-  @override
-  Builder get parent => null;
-
-  @override
-  String get fullNameForErrors => name;
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 8262018..c24a87a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -16,6 +16,7 @@
         Component,
         DartType,
         Library,
+        Nullability,
         Procedure,
         Supertype,
         TreeNode,
@@ -96,7 +97,8 @@
       TypeParameter newNode = new TypeParameter(typeParam.name)
         ..parent = fakeClass;
       typeParams[typeParam] = newNode;
-      typeSubstitution[typeParam] = new TypeParameterType(newNode);
+      typeSubstitution[typeParam] =
+          new TypeParameterType(newNode, Nullability.legacy);
     }
     CloneVisitor cloner = new CloneVisitor(
         typeSubstitution: typeSubstitution, typeParams: typeParams);
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index bae007a..225546e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -9,15 +9,19 @@
 import 'package:kernel/ast.dart'
     show
         AsExpression,
+        BottomType,
         Class,
         Component,
         DartType,
+        DynamicType,
         ExpressionStatement,
         Field,
         FunctionType,
         InterfaceType,
+        InvalidType,
         Library,
         Member,
+        NeverType,
         Nullability,
         Procedure,
         StaticInvocation,
@@ -25,7 +29,8 @@
         SuperPropertyGet,
         SuperPropertySet,
         TreeNode,
-        TypeParameter;
+        TypeParameter,
+        VoidType;
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
@@ -42,22 +47,22 @@
     show RedirectingFactoryBody, getRedirectingFactoryBody;
 
 List<LocatedMessage> verifyComponent(Component component,
-    {bool isOutline: false, bool skipPlatform: false}) {
+    {bool isOutline, bool afterConst, bool skipPlatform: false}) {
   FastaVerifyingVisitor verifier =
-      new FastaVerifyingVisitor(isOutline, skipPlatform);
+      new FastaVerifyingVisitor(isOutline, afterConst, skipPlatform);
   component.accept(verifier);
   return verifier.errors;
 }
 
 class FastaVerifyingVisitor extends VerifyingVisitor {
   final List<LocatedMessage> errors = <LocatedMessage>[];
+  Library currentLibrary = null;
 
   Uri fileUri;
   final bool skipPlatform;
 
-  FastaVerifyingVisitor(bool isOutline, this.skipPlatform) {
-    this.isOutline = isOutline;
-  }
+  FastaVerifyingVisitor(bool isOutline, bool afterConst, this.skipPlatform)
+      : super(isOutline: isOutline, afterConst: afterConst);
 
   Uri checkLocation(TreeNode node, String name, Uri fileUri) {
     if (name == null || name.contains("#")) {
@@ -145,7 +150,9 @@
       return;
     }
     fileUri = checkLocation(node, node.name, node.fileUri);
+    currentLibrary = node;
     super.visitLibrary(node);
+    currentLibrary = null;
   }
 
   @override
@@ -166,12 +173,40 @@
     super.visitProcedure(node);
   }
 
+  bool isNullType(DartType node) {
+    if (node is InterfaceType) {
+      Uri importUri = node.classNode.enclosingLibrary.importUri;
+      return node.classNode.name == "Null" &&
+          importUri.scheme == "dart" &&
+          importUri.path == "core";
+    }
+    return false;
+  }
+
   @override
   defaultDartType(DartType node) {
     if (node is UnknownType) {
       // Note: we can't pass [node] to [problem] because it's not a [TreeNode].
       problem(null, "Unexpected appearance of the unknown type.");
     }
+    bool neverLegacy = isNullType(node) ||
+        node is DynamicType ||
+        node is InvalidType ||
+        node is VoidType ||
+        node is NeverType ||
+        node is BottomType;
+    bool expectedLegacy =
+        !currentLibrary.isNonNullableByDefault && !neverLegacy;
+    if (expectedLegacy && node.nullability != Nullability.legacy) {
+      problem(
+          null, "Found a non-legacy type '${node}' in an opted-out library.");
+    }
+    Nullability nodeNullability =
+        node is InvalidType ? Nullability.undetermined : node.nullability;
+    if (currentLibrary.isNonNullableByDefault &&
+        nodeNullability == Nullability.legacy) {
+      problem(null, "Found a legacy type '${node}' in an opted-in library.");
+    }
     super.defaultDartType(node);
   }
 
@@ -192,11 +227,7 @@
 
   @override
   visitInterfaceType(InterfaceType node) {
-    Uri importUri = node.classNode.enclosingLibrary.importUri;
-    if (node.classNode.name == "Null" &&
-        importUri.scheme == "dart" &&
-        importUri.path == "core" &&
-        node.nullability != Nullability.nullable) {
+    if (isNullType(node) && node.nullability != Nullability.nullable) {
       problem(null, "Found a not nullable Null type: ${node}");
     }
     super.visitInterfaceType(node);
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index f2e6550..1fb9f37 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -257,7 +257,7 @@
     _local.forEach(f);
   }
 
-  void forEachLocalSetter(void Function(String name, Builder member) f) {
+  void forEachLocalSetter(void Function(String name, MemberBuilder member) f) {
     _setters.forEach(f);
   }
 
@@ -467,6 +467,12 @@
     ensureScope();
     return super._setters;
   }
+
+  @override
+  Set<ExtensionBuilder> get _extensions {
+    ensureScope();
+    return super._extensions;
+  }
 }
 
 class ScopeBuilder {
@@ -597,41 +603,52 @@
       String name, Builder builder, int charOffset, Uri fileUri)
       : super(name, builder, charOffset, fileUri);
 
+  @override
   Member get member => null;
 
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => null;
+
   bool get isNative => false;
 
   @override
   bool get isAssignable => false;
 
+  @override
   ClassBuilder get classBuilder => parent is ClassBuilder ? parent : null;
 
+  @override
   void set parent(Builder value) {
     throw new UnsupportedError('AmbiguousMemberBuilder.parent=');
   }
 
+  @override
   LibraryBuilder get library {
     throw new UnsupportedError('AmbiguousMemberBuilder.parent=');
   }
 
   // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  Member get extensionTearOff => null;
-
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
-  Procedure get procedure => null;
-
-  // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
+  @override
   ProcedureKind get kind => null;
 
+  @override
   void buildOutlineExpressions(LibraryBuilder library) {
     throw new UnsupportedError(
         'AmbiguousMemberBuilder.buildOutlineExpressions');
   }
 
+  @override
   void inferType() {
     throw new UnsupportedError('AmbiguousMemberBuilder.inferType');
   }
 
+  @override
   void inferCopiedType(covariant Object other) {
     throw new UnsupportedError('AmbiguousMemberBuilder.inferCopiedType');
   }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index a9638af..ade334e 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -7,6 +7,13 @@
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show Assert, DeclarationKind, MemberKind, Parser, optional;
 
+import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
+
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
+    show FixedNullableList, NullValue, ParserRecovery;
+
+import 'package:_fe_analyzer_shared/src/parser/value_kind.dart';
+
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
 import 'package:kernel/ast.dart'
@@ -58,8 +65,6 @@
 import '../problems.dart'
     show DebugAbort, internalProblem, unexpected, unhandled;
 
-import '../quote.dart' show unescapeString;
-
 import '../scope.dart';
 
 import '../source/value_kinds.dart';
@@ -71,10 +76,9 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-import 'stack_listener.dart'
-    show FixedNullableList, NullValue, ParserRecovery, StackListener;
+import 'stack_listener_impl.dart';
 
-class DietListener extends StackListener {
+class DietListener extends StackListenerImpl {
   final SourceLibraryBuilder libraryBuilder;
 
   final ClassHierarchy hierarchy;
@@ -130,7 +134,7 @@
 
   @override
   void endMetadataStar(int count) {
-    assert(checkState(null, repeatedKinds(ValueKind.Token, count)));
+    assert(checkState(null, repeatedKinds(ValueKinds.Token, count)));
     debugEvent("MetadataStar");
     if (count > 0) {
       discard(count - 1);
@@ -339,7 +343,7 @@
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery) return;
 
-    final StackListener listener =
+    final StackListenerImpl listener =
         createFunctionListener(lookupBuilder(beginToken, getOrSet, name));
     buildFunctionBody(listener, bodyToken, metadata, MemberKind.TopLevelMethod);
   }
@@ -380,12 +384,12 @@
   @override
   void handleQualified(Token period) {
     assert(checkState(period, [
-      /*suffix*/ ValueKind.NameOrParserRecovery,
+      /*suffix*/ ValueKinds.NameOrParserRecovery,
       /*prefix*/ unionOfKinds([
-        ValueKind.Name,
-        ValueKind.Generator,
-        ValueKind.ParserRecovery,
-        ValueKind.QualifiedName,
+        ValueKinds.Name,
+        ValueKinds.Generator,
+        ValueKinds.ParserRecovery,
+        ValueKinds.QualifiedName,
       ]),
     ]));
     debugEvent("handleQualified");
@@ -666,7 +670,7 @@
             : MemberKind.NonStaticMethod);
   }
 
-  StackListener createListener(ModifierBuilder builder, Scope memberScope,
+  StackListenerImpl createListener(ModifierBuilder builder, Scope memberScope,
       {bool isDeclarationInstanceMember,
       VariableDeclaration extensionThis,
       List<TypeParameter> extensionTypeParameters,
@@ -694,7 +698,7 @@
         constantContext);
   }
 
-  StackListener createListenerInternal(
+  StackListenerImpl createListenerInternal(
       ModifierBuilder builder,
       Scope memberScope,
       Scope formalParameterScope,
@@ -719,7 +723,7 @@
       ..constantContext = constantContext;
   }
 
-  StackListener createFunctionListener(FunctionBuilderImpl builder) {
+  StackListenerImpl createFunctionListener(FunctionBuilderImpl builder) {
     final Scope typeParameterScope =
         builder.computeTypeParameterScope(memberScope);
     final Scope formalParameterScope =
@@ -736,7 +740,7 @@
 
   void buildRedirectingFactoryMethod(
       Token token, FunctionBuilder builder, MemberKind kind, Token metadata) {
-    final StackListener listener = createFunctionListener(builder);
+    final StackListenerImpl listener = createFunctionListener(builder);
     try {
       Parser parser = new Parser(listener);
       if (metadata != null) {
@@ -797,9 +801,9 @@
   @override
   void beginClassOrMixinBody(DeclarationKind kind, Token token) {
     assert(checkState(token, [
-      ValueKind.Token,
-      ValueKind.NameOrParserRecovery,
-      ValueKind.TokenOrNull
+      ValueKinds.Token,
+      ValueKinds.NameOrParserRecovery,
+      ValueKinds.TokenOrNull
     ]));
     debugEvent("beginClassOrMixinBody");
     Token beginToken = pop();
@@ -884,14 +888,14 @@
     checkEmpty(beginToken.charOffset);
   }
 
-  AsyncMarker getAsyncMarker(StackListener listener) => listener.pop();
+  AsyncMarker getAsyncMarker(StackListenerImpl listener) => listener.pop();
 
   /// Invokes the listener's [finishFunction] method.
   ///
   /// This is a separate method so that it may be overridden by a derived class
   /// if more computation must be done before finishing the function.
   void listenerFinishFunction(
-      StackListener listener,
+      StackListenerImpl listener,
       Token token,
       MemberKind kind,
       dynamic formals,
@@ -904,12 +908,12 @@
   ///
   /// This is a separate method so that it may be overridden by a derived class
   /// if more computation must be done before finishing the function.
-  void listenerFinishFields(StackListener listener, Token startToken,
+  void listenerFinishFields(StackListenerImpl listener, Token startToken,
       Token metadata, bool isTopLevel) {
     listener.finishFields();
   }
 
-  void buildFunctionBody(StackListener listener, Token startToken,
+  void buildFunctionBody(StackListenerImpl listener, Token startToken,
       Token metadata, MemberKind kind) {
     Token token = startToken;
     try {
@@ -939,7 +943,7 @@
     }
   }
 
-  void parseFields(StackListener listener, Token startToken, Token metadata,
+  void parseFields(StackListenerImpl listener, Token startToken, Token metadata,
       bool isTopLevel) {
     Token token = startToken;
     Parser parser = new Parser(listener);
@@ -1051,7 +1055,7 @@
   List<Expression> parseMetadata(
       ModifierBuilder builder, Token metadata, TreeNode parent) {
     if (metadata != null) {
-      StackListener listener = createListener(builder, memberScope,
+      StackListenerImpl listener = createListener(builder, memberScope,
           isDeclarationInstanceMember: false);
       Parser parser = new Parser(listener);
       parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
diff --git a/pkg/front_end/lib/src/fasta/source/directive_listener.dart b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
index 416c577..f912c9e 100644
--- a/pkg/front_end/lib/src/fasta/source/directive_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
@@ -7,10 +7,10 @@
 library front_end.src.fasta.source.directive_listener;
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-import '../fasta_codes.dart' show messageExpectedBlockToSkip;
 import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
 import 'package:_fe_analyzer_shared/src/parser/listener.dart';
-import '../quote.dart';
+import 'package:_fe_analyzer_shared/src/parser/quote.dart';
+import '../fasta_codes.dart' show messageExpectedBlockToSkip;
 
 /// Listener that records imports, exports, and part directives.
 ///
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index ea75e1c..b27bedc 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -14,6 +14,13 @@
         MemberKind,
         optional;
 
+import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
+
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
+    show FixedNullableList, NullValue, ParserRecovery;
+
+import 'package:_fe_analyzer_shared/src/parser/value_kind.dart';
+
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
 import 'package:kernel/ast.dart' show InvalidType, ProcedureKind, Variance;
@@ -93,8 +100,6 @@
 
 import '../problems.dart' show unhandled;
 
-import '../quote.dart' show unescapeString;
-
 import 'source_library_builder.dart'
     show
         TypeParameterScopeBuilder,
@@ -102,13 +107,7 @@
         FieldInfo,
         SourceLibraryBuilder;
 
-import 'stack_listener.dart'
-    show
-        FixedNullableList,
-        NullValue,
-        ParserRecovery,
-        StackListener,
-        offsetForToken;
+import 'stack_listener_impl.dart';
 
 import 'value_kinds.dart';
 
@@ -118,7 +117,7 @@
   RedirectingFactoryBody,
 }
 
-class OutlineBuilder extends StackListener {
+class OutlineBuilder extends StackListenerImpl {
   final SourceLibraryBuilder library;
 
   final bool enableNative;
@@ -426,11 +425,14 @@
   @override
   void handleQualified(Token period) {
     assert(checkState(period, [
-      /*suffix offset*/ ValueKind.Integer,
-      /*suffix*/ ValueKind.NameOrParserRecovery,
-      /*prefix offset*/ ValueKind.Integer,
-      /*prefix*/ unionOfKinds(
-          [ValueKind.Name, ValueKind.ParserRecovery, ValueKind.QualifiedName]),
+      /*suffix offset*/ ValueKinds.Integer,
+      /*suffix*/ ValueKinds.NameOrParserRecovery,
+      /*prefix offset*/ ValueKinds.Integer,
+      /*prefix*/ unionOfKinds([
+        ValueKinds.Name,
+        ValueKinds.ParserRecovery,
+        ValueKinds.QualifiedName
+      ]),
     ]));
     debugEvent("handleQualified");
     int suffixOffset = pop();
@@ -494,7 +496,7 @@
   void beginClassOrMixinBody(DeclarationKind kind, Token token) {
     if (kind == DeclarationKind.Extension) {
       assert(checkState(token, [
-        unionOfKinds([ValueKind.ParserRecovery, ValueKind.TypeBuilder])
+        unionOfKinds([ValueKinds.ParserRecovery, ValueKinds.TypeBuilder])
       ]));
       Object extensionThisType = peek();
       if (extensionThisType is TypeBuilder) {
@@ -646,7 +648,7 @@
 
   @override
   void beginExtensionDeclarationPrelude(Token extensionKeyword) {
-    assert(checkState(extensionKeyword, [ValueKind.MetadataListOrNull]));
+    assert(checkState(extensionKeyword, [ValueKinds.MetadataListOrNull]));
     debugEvent("beginExtensionDeclaration");
     library.beginNestedDeclaration(
         TypeParameterScopeKind.extensionDeclaration, "extension");
@@ -655,7 +657,7 @@
   @override
   void beginExtensionDeclaration(Token extensionKeyword, Token nameToken) {
     assert(checkState(extensionKeyword,
-        [ValueKind.TypeVariableListOrNull, ValueKind.MetadataListOrNull]));
+        [ValueKinds.TypeVariableListOrNull, ValueKinds.MetadataListOrNull]));
     debugEvent("beginExtensionDeclaration");
     List<TypeVariableBuilder> typeVariables = pop();
     int offset = nameToken?.charOffset ?? extensionKeyword.charOffset;
@@ -673,11 +675,11 @@
   void endExtensionDeclaration(
       Token extensionKeyword, Token onKeyword, Token endToken) {
     assert(checkState(extensionKeyword, [
-      unionOfKinds([ValueKind.ParserRecovery, ValueKind.TypeBuilder]),
-      ValueKind.TypeVariableListOrNull,
-      ValueKind.Integer,
-      ValueKind.NameOrNull,
-      ValueKind.MetadataListOrNull
+      unionOfKinds([ValueKinds.ParserRecovery, ValueKinds.TypeBuilder]),
+      ValueKinds.TypeVariableListOrNull,
+      ValueKinds.Integer,
+      ValueKinds.NameOrNull,
+      ValueKinds.MetadataListOrNull
     ]));
     debugEvent("endExtensionDeclaration");
     String documentationComment = getDocumentationComment(extensionKeyword);
@@ -862,7 +864,7 @@
   @override
   void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    assert(checkState(beginToken, [ValueKind.MethodBody]));
+    assert(checkState(beginToken, [ValueKinds.MethodBody]));
     debugEvent("Method");
     MethodBody bodyKind = pop();
     if (bodyKind == MethodBody.RedirectingFactoryBody) {
@@ -870,20 +872,20 @@
       pop();
     }
     assert(checkState(beginToken, [
-      ValueKind.FormalsOrNull,
-      ValueKind.Integer, // formals offset
-      ValueKind.TypeVariableListOrNull,
-      ValueKind.Integer, // name offset
+      ValueKinds.FormalsOrNull,
+      ValueKinds.Integer, // formals offset
+      ValueKinds.TypeVariableListOrNull,
+      ValueKinds.Integer, // name offset
       unionOfKinds([
-        ValueKind.Name,
-        ValueKind.QualifiedName,
-        ValueKind.Operator,
-        ValueKind.ParserRecovery,
+        ValueKinds.Name,
+        ValueKinds.QualifiedName,
+        ValueKinds.Operator,
+        ValueKinds.ParserRecovery,
       ]),
-      ValueKind.TypeBuilderOrNull,
-      ValueKind.ModifiersOrNull,
-      ValueKind.Integer, // var/final/const offset
-      ValueKind.MetadataListOrNull,
+      ValueKinds.TypeBuilderOrNull,
+      ValueKinds.ModifiersOrNull,
+      ValueKinds.Integer, // var/final/const offset
+      ValueKinds.MetadataListOrNull,
     ]));
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/scope_listener.dart b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
index bfc1c29..29bbad1 100644
--- a/pkg/front_end/lib/src/fasta/source/scope_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
@@ -6,13 +6,15 @@
 
 import 'package:_fe_analyzer_shared/src/parser/block_kind.dart' show BlockKind;
 
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
+    show NullValue;
+
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
 import '../scope.dart' show Scope;
+import 'stack_listener_impl.dart';
 
-import 'stack_listener.dart' show NullValue, StackListener;
-
-export 'stack_listener.dart'
+export 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
     show FixedNullableList, GrowableList, NullValue, ParserRecovery;
 
 enum JumpTargetKind {
@@ -21,7 +23,7 @@
   Goto, // Continue label in switch.
 }
 
-abstract class ScopeListener<J> extends StackListener {
+abstract class ScopeListener<J> extends StackListenerImpl {
   Scope scope;
 
   J breakTarget;
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 34cfbf5..9198824 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -10,11 +10,10 @@
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_reference_builder.dart';
-import '../builder/field_builder.dart';
-import '../builder/function_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/member_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/type_builder.dart';
@@ -121,19 +120,15 @@
             unexpected(fullNameForErrors, declaration.parent?.fullNameForErrors,
                 charOffset, fileUri);
           }
-        } else if (declaration is FieldBuilder) {
-          // TODO(ahe): It would be nice to have a common interface for the
-          // build method to avoid duplicating these two cases.
-          Member field = declaration.build(library);
-          if (!declaration.isPatch && declaration.next == null) {
-            cls.addMember(field);
-          }
-        } else if (declaration is FunctionBuilder) {
-          Member member = declaration.build(library);
-          member.parent = cls;
-          if (!declaration.isPatch && declaration.next == null) {
-            cls.addMember(member);
-          }
+        } else if (declaration is MemberBuilderImpl) {
+          MemberBuilderImpl memberBuilder = declaration;
+          memberBuilder.buildMembers(library,
+              (Member member, BuiltMemberKind memberKind) {
+            member.parent = cls;
+            if (!memberBuilder.isPatch && !memberBuilder.isDuplicate) {
+              cls.addMember(member);
+            }
+          });
         } else {
           unhandled("${declaration.runtimeType}", "buildBuilders",
               declaration.charOffset, declaration.fileUri);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index be48777..b5b5959 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -11,10 +11,9 @@
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/extension_builder.dart';
-import '../builder/field_builder.dart';
 import '../builder/library_builder.dart';
+import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
-import '../builder/procedure_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
 
@@ -97,55 +96,53 @@
             unexpected(fullNameForErrors, declaration.parent?.fullNameForErrors,
                 charOffset, fileUri);
           }
-        } else if (declaration is FieldBuilder) {
-          Field field = declaration.build(libraryBuilder);
-          if (addMembersToLibrary && declaration.next == null) {
-            libraryBuilder.library.addMember(field);
-            extension.members.add(new ExtensionMemberDescriptor(
-                name: new Name(declaration.name, libraryBuilder.library),
-                member: field.reference,
-                isStatic: declaration.isStatic,
-                kind: ExtensionMemberKind.Field));
-          }
-        } else if (declaration is ProcedureBuilder) {
-          Member function = declaration.build(libraryBuilder);
-          if (addMembersToLibrary &&
-              !declaration.isPatch &&
-              declaration.next == null) {
-            libraryBuilder.library.addMember(function);
-            ExtensionMemberKind kind;
-            switch (declaration.kind) {
-              case ProcedureKind.Method:
-                kind = ExtensionMemberKind.Method;
-                break;
-              case ProcedureKind.Getter:
-                kind = ExtensionMemberKind.Getter;
-                break;
-              case ProcedureKind.Setter:
-                kind = ExtensionMemberKind.Setter;
-                break;
-              case ProcedureKind.Operator:
-                kind = ExtensionMemberKind.Operator;
-                break;
-              case ProcedureKind.Factory:
-                unsupported("Extension method kind: ${declaration.kind}",
-                    declaration.charOffset, declaration.fileUri);
+        } else if (declaration is MemberBuilderImpl) {
+          MemberBuilderImpl memberBuilder = declaration;
+          memberBuilder.buildMembers(libraryBuilder,
+              (Member member, BuiltMemberKind memberKind) {
+            if (addMembersToLibrary &&
+                !memberBuilder.isPatch &&
+                !memberBuilder.isDuplicate) {
+              ExtensionMemberKind kind;
+              switch (memberKind) {
+                case BuiltMemberKind.Constructor:
+                case BuiltMemberKind.RedirectingFactory:
+                case BuiltMemberKind.Field:
+                case BuiltMemberKind.Method:
+                  unhandled(
+                      "${member.runtimeType}:${memberKind}",
+                      "buildMembers",
+                      declaration.charOffset,
+                      declaration.fileUri);
+                  break;
+                case BuiltMemberKind.ExtensionField:
+                  kind = ExtensionMemberKind.Field;
+                  break;
+                case BuiltMemberKind.ExtensionMethod:
+                  kind = ExtensionMemberKind.Method;
+                  break;
+                case BuiltMemberKind.ExtensionGetter:
+                  kind = ExtensionMemberKind.Getter;
+                  break;
+                case BuiltMemberKind.ExtensionSetter:
+                  kind = ExtensionMemberKind.Setter;
+                  break;
+                case BuiltMemberKind.ExtensionOperator:
+                  kind = ExtensionMemberKind.Operator;
+                  break;
+                case BuiltMemberKind.ExtensionTearOff:
+                  kind = ExtensionMemberKind.TearOff;
+                  break;
+              }
+              assert(kind != null);
+              libraryBuilder.library.addMember(member);
+              extension.members.add(new ExtensionMemberDescriptor(
+                  name: new Name(memberBuilder.name, libraryBuilder.library),
+                  member: member.reference,
+                  isStatic: declaration.isStatic,
+                  kind: kind));
             }
-            extension.members.add(new ExtensionMemberDescriptor(
-                name: new Name(declaration.name, libraryBuilder.library),
-                member: function.reference,
-                isStatic: declaration.isStatic,
-                kind: kind));
-            Procedure tearOff = declaration.extensionTearOff;
-            if (tearOff != null) {
-              libraryBuilder.library.addMember(tearOff);
-              _extension.members.add(new ExtensionMemberDescriptor(
-                  name: new Name(declaration.name, libraryBuilder.library),
-                  member: tearOff.reference,
-                  isStatic: false,
-                  kind: ExtensionMemberKind.TearOff));
-            }
-          }
+          });
         } else {
           unhandled("${declaration.runtimeType}", "buildBuilders",
               declaration.charOffset, declaration.fileUri);
@@ -156,7 +153,7 @@
 
     scope.forEach(buildBuilders);
 
-    scope.forEachLocalSetter((String name, Builder setter) {
+    scope.forEachLocalSetter((String name, MemberBuilder setter) {
       Builder member = scopeBuilder[name];
       if (member == null) {
         // Setter without getter.
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 56fabe0..739d4fb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -318,6 +318,13 @@
   bool postponedProblemsIssued = false;
   List<PostponedProblem> postponedProblems;
 
+  /// List of [PrefixBuilder]s for imports with prefixes.
+  List<PrefixBuilder> _prefixBuilders;
+
+  /// Set of extension declarations in scope. This is computed lazily in
+  /// [forEachExtensionInScope].
+  Set<ExtensionBuilder> _extensionsInScope;
+
   SourceLibraryBuilder.internal(SourceLoader loader, Uri fileUri, Scope scope,
       SourceLibraryBuilder actualOrigin, Library library, Library nameOrigin)
       : this.fromScopes(
@@ -729,6 +736,10 @@
       // by name or by resolution and the remaining are dropped for the output.
       currentTypeParameterScopeBuilder.extensions.add(declaration);
     }
+    if (declaration is PrefixBuilder) {
+      _prefixBuilders ??= <PrefixBuilder>[];
+      _prefixBuilders.add(declaration);
+    }
     return members[name] = declaration;
   }
 
@@ -2060,23 +2071,54 @@
   }
 
   void buildBuilder(Builder declaration, LibraryBuilder coreLibrary) {
-    Class cls;
-    Extension extension;
-    Member member;
-    Typedef typedef;
+    String findDuplicateSuffix(Builder declaration) {
+      if (declaration.next != null) {
+        int count = 0;
+        Builder current = declaration.next;
+        while (current != null) {
+          count++;
+          current = current.next;
+        }
+        return "#$count";
+      }
+      return "";
+    }
+
     if (declaration is SourceClassBuilder) {
-      cls = declaration.build(this, coreLibrary);
+      Class cls = declaration.build(this, coreLibrary);
+      if (!declaration.isPatch) {
+        cls.name += findDuplicateSuffix(declaration);
+        library.addClass(cls);
+      }
     } else if (declaration is SourceExtensionBuilder) {
-      extension = declaration.build(this, coreLibrary,
-          addMembersToLibrary: declaration.next == null);
-    } else if (declaration is FieldBuilder) {
-      member = declaration.build(this)..isStatic = true;
-    } else if (declaration is ProcedureBuilder) {
-      member = declaration.build(this)..isStatic = true;
+      Extension extension = declaration.build(this, coreLibrary,
+          addMembersToLibrary: !declaration.isDuplicate);
+      if (!declaration.isPatch && !declaration.isDuplicate) {
+        library.addExtension(extension);
+      }
+    } else if (declaration is MemberBuilderImpl) {
+      declaration.buildMembers(this,
+          (Member member, BuiltMemberKind memberKind) {
+        if (member is Field) {
+          member.isStatic = true;
+        } else if (member is Procedure) {
+          member.isStatic = true;
+        }
+        if (!declaration.isPatch && !declaration.isDuplicate) {
+          library.addMember(member);
+        }
+      });
     } else if (declaration is TypeAliasBuilder) {
-      typedef = declaration.build(this);
+      Typedef typedef = declaration.build(this);
+      if (!declaration.isPatch && !declaration.isDuplicate) {
+        library.addTypedef(typedef);
+      }
     } else if (declaration is EnumBuilder) {
-      cls = declaration.build(this, coreLibrary);
+      Class cls = declaration.build(this, coreLibrary);
+      if (!declaration.isPatch) {
+        cls.name += findDuplicateSuffix(declaration);
+        library.addClass(cls);
+      }
     } else if (declaration is PrefixBuilder) {
       // Ignored. Kernel doesn't represent prefixes.
       return;
@@ -2088,38 +2130,6 @@
           declaration.charOffset, declaration.fileUri);
       return;
     }
-    if (declaration.isPatch) {
-      // The kernel node of a patch is shared with the origin declaration. We
-      // have two builders: the origin, and the patch, but only one kernel node
-      // (which corresponds to the final output). Consequently, the node
-      // shouldn't be added to its apparent kernel parent as this would create
-      // a duplicate entry in the parent's list of children/members.
-      return;
-    }
-    if (cls != null) {
-      if (declaration.next != null) {
-        int count = 0;
-        Builder current = declaration.next;
-        while (current != null) {
-          count++;
-          current = current.next;
-        }
-        cls.name += "#$count";
-      }
-      library.addClass(cls);
-    } else if (extension != null) {
-      if (declaration.next == null) {
-        library.addExtension(extension);
-      }
-    } else if (member != null) {
-      if (declaration.next == null) {
-        library.addMember(member);
-      }
-    } else if (typedef != null) {
-      if (declaration.next == null) {
-        library.addTypedef(typedef);
-      }
-    }
   }
 
   void addNativeDependency(String nativeImportPath) {
@@ -2795,7 +2805,8 @@
     if (node.arguments.types.isEmpty) return;
     Constructor constructor = node.target;
     Class klass = constructor.enclosingClass;
-    DartType constructedType = new InterfaceType(klass, node.arguments.types);
+    DartType constructedType =
+        new InterfaceType(klass, Nullability.legacy, node.arguments.types);
     checkBoundsInType(
         constructedType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: false);
@@ -2808,7 +2819,8 @@
     Procedure factory = node.target;
     assert(factory.isFactory);
     Class klass = factory.enclosingClass;
-    DartType constructedType = new InterfaceType(klass, node.arguments.types);
+    DartType constructedType =
+        new InterfaceType(klass, Nullability.legacy, node.arguments.types);
     checkBoundsInType(
         constructedType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: false);
@@ -2833,7 +2845,7 @@
     if (issues != null) {
       DartType targetReceiver;
       if (klass != null) {
-        targetReceiver = new InterfaceType(klass);
+        targetReceiver = new InterfaceType(klass, Nullability.legacy);
       }
       String targetName = node.target.name.name;
       reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
@@ -2885,8 +2897,8 @@
     for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
       instantiatedMethodParameters[i] =
           new TypeParameter(methodParameters[i].name);
-      substitutionMap[methodParameters[i]] =
-          new TypeParameterType(instantiatedMethodParameters[i]);
+      substitutionMap[methodParameters[i]] = new TypeParameterType(
+          instantiatedMethodParameters[i], Nullability.legacy);
     }
     for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
       instantiatedMethodParameters[i].bound =
@@ -2924,6 +2936,19 @@
     implicitlyTypedFields = null;
     return result;
   }
+
+  void forEachExtensionInScope(void Function(ExtensionBuilder) f) {
+    if (_extensionsInScope == null) {
+      _extensionsInScope = <ExtensionBuilder>{};
+      scope.forEachExtension(_extensionsInScope.add);
+      if (_prefixBuilders != null) {
+        for (PrefixBuilder prefix in _prefixBuilders) {
+          prefix.exportScope.forEachExtension(_extensionsInScope.add);
+        }
+      }
+    }
+    _extensionsInScope.forEach(f);
+  }
 }
 
 // The kind of type parameter scope built by a [TypeParameterScopeBuilder]
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 212600d..085b89a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -37,6 +37,7 @@
         InterfaceType,
         Library,
         LibraryDependency,
+        Nullability,
         ProcedureKind,
         Supertype,
         TreeNode;
@@ -114,7 +115,7 @@
 
 import '../problems.dart' show internalProblem;
 
-import '../source/stack_listener.dart' show offsetForToken;
+import '../source/stack_listener_impl.dart' show offsetForToken;
 
 import '../type_inference/type_inference_engine.dart';
 
@@ -878,12 +879,12 @@
   void computeCoreTypes(Component component) {
     coreTypes = new CoreTypes(component);
 
-    futureOfBottom = new InterfaceType(
-        coreTypes.futureClass, <DartType>[const BottomType()]);
-    iterableOfBottom = new InterfaceType(
-        coreTypes.iterableClass, <DartType>[const BottomType()]);
-    streamOfBottom = new InterfaceType(
-        coreTypes.streamClass, <DartType>[const BottomType()]);
+    futureOfBottom = new InterfaceType(coreTypes.futureClass,
+        Nullability.legacy, <DartType>[const BottomType()]);
+    iterableOfBottom = new InterfaceType(coreTypes.iterableClass,
+        Nullability.legacy, <DartType>[const BottomType()]);
+    streamOfBottom = new InterfaceType(coreTypes.streamClass,
+        Nullability.legacy, <DartType>[const BottomType()]);
 
     ticker.logMs("Computed core types");
   }
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
new file mode 100644
index 0000000..4bd5619
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.stack_listener_impl;
+
+import 'package:_fe_analyzer_shared/src/messages/codes.dart' show Message;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
+
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart';
+
+import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
+
+import 'package:kernel/ast.dart'
+    show AsyncMarker, Expression, FunctionNode, TreeNode;
+
+import '../problems.dart' as problems
+    show internalProblem, unhandled, unsupported;
+
+abstract class StackListenerImpl extends StackListener {
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
+  // and ast_builder.dart.
+  void finishFunction(
+      covariant formals, AsyncMarker asyncModifier, covariant body) {
+    return problems.unsupported("finishFunction", -1, uri);
+  }
+
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
+  // and ast_builder.dart.
+  dynamic finishFields() {
+    return problems.unsupported("finishFields", -1, uri);
+  }
+
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
+  // and ast_builder.dart.
+  List<Expression> finishMetadata(TreeNode parent) {
+    return problems.unsupported("finishMetadata", -1, uri);
+  }
+
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
+  // and ast_builder.dart.
+  void exitLocalScope() => problems.unsupported("exitLocalScope", -1, uri);
+
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart.
+  dynamic parseSingleExpression(
+      Parser parser, Token token, FunctionNode parameters) {
+    return problems.unsupported("finishSingleExpression", -1, uri);
+  }
+
+  /// Used to report an internal error encountered in the stack listener.
+  dynamic internalProblem(Message message, int charOffset, Uri uri) {
+    return problems.internalProblem(message, charOffset, uri);
+  }
+
+  /// Used to report an unexpected situation encountered in the stack
+  /// listener.
+  dynamic unhandled(String what, String where, int charOffset, Uri uri) {
+    return problems.unhandled(what, where, charOffset, uri);
+  }
+}
+
+/// A null-aware alternative to `token.offset`.  If [token] is `null`, returns
+/// `TreeNode.noOffset`.
+int offsetForToken(Token token) {
+  return token == null ? TreeNode.noOffset : token.offset;
+}
diff --git a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
deleted file mode 100644
index 91cdbaa..0000000
--- a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
+++ /dev/null
@@ -1,1427 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.type_promotion_look_ahead_listener;
-
-import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart'
-    show
-        Assert,
-        BlockKind,
-        DeclarationKind,
-        FormalParameterKind,
-        IdentifierContext,
-        Listener,
-        MemberKind;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
-
-import '../builder/builder.dart';
-
-import '../messages.dart' show LocatedMessage, Message, MessageCode;
-
-import '../problems.dart' as problems show unhandled;
-
-import '../scope.dart' show Scope;
-
-final NoArguments noArgumentsSentinel = new NoArguments();
-
-abstract class TypePromotionState {
-  final Uri uri;
-
-  final List<Scope> scopes = <Scope>[new Scope.top(isModifiable: true)];
-
-  final List<Builder> stack = <Builder>[];
-
-  TypePromotionState(this.uri);
-
-  Scope get currentScope => scopes.last;
-
-  void enterScope(String debugName) {
-    scopes.add(new Scope.nested(currentScope, "block"));
-  }
-
-  Scope exitScope(Token token) {
-    return scopes.removeLast();
-  }
-
-  void declareIdentifier(Token token) {
-    String name = token.lexeme;
-    LocatedMessage error = currentScope.declare(
-        name, new UnspecifiedDeclaration(name, uri, token.charOffset), uri);
-    if (error != null) {
-      report(error, Severity.error);
-    }
-    pushNull(token.lexeme, token);
-  }
-
-  void registerWrite(UnspecifiedDeclaration declaration, Token token) {}
-
-  void registerPromotionCandidate(
-      UnspecifiedDeclaration declaration, Token token) {}
-
-  void pushReference(Token token) {
-    String name = token.lexeme;
-    Builder declaration = currentScope.lookup(name, token.charOffset, uri);
-    stack.add(declaration);
-  }
-
-  Builder pop() => stack.removeLast();
-
-  void push(Builder declaration) {
-    stack.add(declaration);
-  }
-
-  Builder popPushNull(String name, Token token) {
-    int last = stack.length - 1;
-    Builder declaration = stack[last];
-    stack[last] = nullValue(name, token);
-    return declaration;
-  }
-
-  void discard(int count) {
-    stack.length = stack.length - count;
-  }
-
-  void pushNull(String name, Token token) {
-    stack.add(nullValue(name, token));
-  }
-
-  Builder nullValue(String name, Token token) => null;
-
-  void report(LocatedMessage message, Severity severity,
-      {List<LocatedMessage> context});
-
-  void trace(String message, Token token) {}
-
-  void checkEmpty(Token token) {}
-}
-
-class UnspecifiedDeclaration extends BuilderImpl {
-  final String name;
-
-  @override
-  final Uri fileUri;
-
-  @override
-  int charOffset;
-
-  UnspecifiedDeclaration(this.name, this.fileUri, this.charOffset);
-
-  @override
-  Builder get parent => null;
-
-  @override
-  String get fullNameForErrors => name;
-
-  @override
-  String toString() => "UnspecifiedDeclaration($name)";
-}
-
-class NoArguments extends BuilderImpl {
-  NoArguments();
-
-  @override
-  Uri get fileUri => null;
-
-  @override
-  int get charOffset => -1;
-
-  @override
-  Builder get parent => null;
-
-  @override
-  String get fullNameForErrors => "<<no arguments>>";
-
-  @override
-  String toString() => fullNameForErrors;
-}
-
-class TypePromotionLookAheadListener extends Listener {
-  final TypePromotionState state;
-
-  TypePromotionLookAheadListener(this.state);
-
-  Uri get uri => state.uri;
-
-  void logEvent(String name) {
-    throw new UnimplementedError(name);
-  }
-
-  void debugEvent(String name, Token token) {
-    // state.trace(name, token);
-  }
-
-  @override
-  void endArguments(int count, Token beginToken, Token endToken) {
-    debugEvent("Arguments", beginToken);
-    state.discard(count);
-    state.pushNull("%Arguments%", endToken);
-  }
-
-  @override
-  void handleNoArguments(Token token) {
-    debugEvent("NoArguments", token);
-    state.push(noArgumentsSentinel);
-  }
-
-  @override
-  void handleAsOperator(Token operator) {
-    debugEvent("AsOperator", operator);
-    state.popPushNull(operator.lexeme, operator);
-  }
-
-  @override
-  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token commaToken, Token semicolonToken) {
-    debugEvent("Assert", assertKeyword);
-    if (commaToken != null) {
-      state.pop(); // Message.
-    }
-    state.pop(); // Condition.
-    switch (kind) {
-      case Assert.Expression:
-        state.pushNull("%AssertExpression%", assertKeyword);
-        break;
-
-      case Assert.Initializer:
-        state.pushNull("%AssertInitializer%", assertKeyword);
-        break;
-
-      case Assert.Statement:
-        break;
-    }
-  }
-
-  @override
-  void handleAssignmentExpression(Token token) {
-    debugEvent("AssignmentExpression", token);
-    state.pop(); // Right-hand side.
-    Builder lhs = state.popPushNull(token.lexeme, token);
-    if (lhs is UnspecifiedDeclaration) {
-      state.registerWrite(lhs, token);
-    }
-  }
-
-  @override
-  void handleAsyncModifier(Token asyncToken, Token starToken) {
-    debugEvent("AsyncModifier", asyncToken);
-  }
-
-  @override
-  void endAwaitExpression(Token beginToken, Token endToken) {
-    debugEvent("AwaitExpression", beginToken);
-    state.popPushNull(beginToken.lexeme, beginToken); // Expression.
-  }
-
-  @override
-  void endInvalidAwaitExpression(
-      Token beginToken, Token endToken, MessageCode errorCode) {
-    debugEvent("InvalidAwaitExpression", beginToken);
-    state.popPushNull(beginToken.lexeme, beginToken); // Expression.
-  }
-
-  @override
-  void endBinaryExpression(Token token) {
-    debugEvent("BinaryExpression", token);
-    state.pop(); // Right-hand side.
-    state.popPushNull(token.lexeme, token); // Left-hand side.
-  }
-
-  @override
-  void beginBlock(Token token, BlockKind blockKind) {
-    debugEvent("beginBlock", token);
-    state.enterScope("block");
-  }
-
-  @override
-  void endBlock(
-      int count, Token beginToken, Token endToken, BlockKind blockKind) {
-    debugEvent("Block", beginToken);
-    state.exitScope(endToken);
-  }
-
-  @override
-  void beginBlockFunctionBody(Token token) {
-    debugEvent("beginBlockFunctionBody", token);
-    state.enterScope("block-function-body");
-  }
-
-  @override
-  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
-    debugEvent("BlockFunctionBody", beginToken);
-    state.exitScope(endToken);
-  }
-
-  @override
-  void handleBreakStatement(
-      bool hasTarget, Token breakKeyword, Token endToken) {
-    debugEvent("BreakStatement", breakKeyword);
-    if (hasTarget) {
-      state.pop(); // Target.
-    }
-  }
-
-  @override
-  void endCascade() {
-    debugEvent("Cascade", null);
-    state.popPushNull("%Cascade%", null);
-  }
-
-  @override
-  void endCaseExpression(Token colon) {
-    debugEvent("CaseExpression", colon);
-    state.pop(); // Expression.
-  }
-
-  @override
-  void handleCaseMatch(Token caseKeyword, Token colon) {
-    debugEvent("CaseMatch", caseKeyword);
-  }
-
-  @override
-  void handleCatchBlock(Token onKeyword, Token catchKeyword, Token comma) {
-    debugEvent("CatchBlock", catchKeyword);
-  }
-
-  @override
-  void endCatchClause(Token token) {
-    debugEvent("CatchClause", token);
-  }
-
-  @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    debugEvent("ClassDeclaration", beginToken);
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleClassExtends(Token extendsKeyword) {
-    debugEvent("ClassExtends", extendsKeyword);
-  }
-
-  @override
-  void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
-    debugEvent("ClassHeader", begin);
-    state.pop(); // Class name.
-    state.checkEmpty(classKeyword);
-  }
-
-  @override
-  void handleClassNoWithClause() {
-    debugEvent("ClassNoWithClause", null);
-  }
-
-  @override
-  void endClassOrMixinBody(
-      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
-    debugEvent("ClassOrMixinBody", beginToken);
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleClassOrMixinImplements(
-      Token implementsKeyword, int interfacesCount) {
-    debugEvent("ClassOrMixinImplements", implementsKeyword);
-  }
-
-  @override
-  void handleClassWithClause(Token withKeyword) {
-    debugEvent("ClassWithClause", withKeyword);
-  }
-
-  @override
-  void endCombinators(int count) {
-    debugEvent("Combinators", null);
-  }
-
-  @override
-  void handleCommentReference(
-      Token newKeyword, Token prefix, Token period, Token token) {
-    debugEvent("CommentReference", newKeyword);
-    unhandled("CommentReference", newKeyword);
-  }
-
-  @override
-  void handleNoCommentReference() {
-    debugEvent("NoCommentReference", null);
-    unhandled("NoCommentReference", null);
-  }
-
-  @override
-  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
-    debugEvent("CommentReferenceText", null);
-    unhandled("CommentReferenceText", null);
-  }
-
-  @override
-  void endCompilationUnit(int count, Token token) {
-    debugEvent("CompilationUnit", token);
-    print(state.stack);
-  }
-
-  @override
-  void endConditionalExpression(Token question, Token colon) {
-    debugEvent("ConditionalExpression", question);
-    state.pop(); // Otherwise expression.
-    state.pop(); // Then expression.
-    state.popPushNull(question.lexeme, question); // Condition.
-  }
-
-  @override
-  void handleConditionalExpressionColon() {
-    debugEvent("ConditionalExpressionColon", null);
-    // TODO(ahe): Rename this event. This is not handling any colons as it
-    // isn't being passed a colon. One alternative is
-    // handleConditionalThenExpression, but check the specification for naming
-    // conventions. Kernel uses "then" and "otherwise".
-  }
-
-  @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
-    debugEvent("ConditionalUri", ifKeyword);
-    unhandled("ConditionalUri", ifKeyword);
-  }
-
-  @override
-  void endConditionalUris(int count) {
-    debugEvent("ConditionalUris", null);
-  }
-
-  @override
-  void endConstExpression(Token token) {
-    debugEvent("ConstExpression", token);
-    doConstuctorInvocation(token, true);
-  }
-
-  @override
-  void endForControlFlow(Token token) {
-    // TODO(danrubel) add support for for control flow collection entries
-    // but for now this is ignored and an error reported in the body builder.
-  }
-
-  @override
-  void endForInControlFlow(Token token) {
-    // TODO(danrubel) add support for for control flow collection entries
-    // but for now this is ignored and an error reported in the body builder.
-  }
-
-  @override
-  void handleElseControlFlow(Token token) {}
-
-  @override
-  void endIfControlFlow(Token token) {
-    state.pop(); // Element.
-    state.pop(); // Condition.
-    state.pushNull("%IfControlFlow%", token);
-  }
-
-  @override
-  void endIfElseControlFlow(Token token) {
-    state.pop(); // Else element.
-    state.pop(); // Then element.
-    state.pop(); // Condition.
-    state.pushNull("%IfElseControlFlow%", token);
-  }
-
-  @override
-  void handleSpreadExpression(Token spreadToken) {
-    // TODO(danrubel) add support for spread collections
-    // but for now this is ignored and an error reported in the body builder.
-    // The top of stack is the spread collection expression.
-  }
-
-  void doConstuctorInvocation(Token token, bool isConst) {
-    state.pop(); // Arguments.
-    state.popPushNull(token.lexeme, token); // Constructor reference.
-  }
-
-  @override
-  void endConstLiteral(Token token) {
-    debugEvent("ConstLiteral", token);
-    state.popPushNull("%ConstLiteral%", token);
-  }
-
-  @override
-  void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
-    debugEvent("ConstructorReference", start);
-    if (periodBeforeName != null) {
-      state.pop(); // Prefix.
-    }
-    state.popPushNull("%ConstructorReference%", start);
-  }
-
-  @override
-  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
-    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments", token);
-  }
-
-  @override
-  void handleContinueStatement(
-      bool hasTarget, Token continueKeyword, Token endToken) {
-    debugEvent("ContinueStatement", continueKeyword);
-    if (hasTarget) {
-      state.pop(); // Target.
-    }
-  }
-
-  @override
-  void handleDirectivesOnly() {
-    debugEvent("DirectivesOnly", null);
-    unhandled("DirectivesOnly", null);
-  }
-
-  @override
-  void endDoWhileStatement(
-      Token doKeyword, Token whileKeyword, Token endToken) {
-    debugEvent("DoWhileStatement", doKeyword);
-    state.pop(); // Condition.
-  }
-
-  @override
-  void endDoWhileStatementBody(Token token) {
-    debugEvent("DoWhileStatementBody", token);
-  }
-
-  @override
-  void handleDottedName(int count, Token firstIdentifier) {
-    debugEvent("DottedName", firstIdentifier);
-    unhandled("DottedName", firstIdentifier);
-  }
-
-  @override
-  void endElseStatement(Token token) {
-    debugEvent("ElseStatement", token);
-  }
-
-  @override
-  void handleEmptyFunctionBody(Token semicolon) {
-    debugEvent("EmptyFunctionBody", semicolon);
-  }
-
-  @override
-  void handleEmptyStatement(Token token) {
-    debugEvent("EmptyStatement", token);
-  }
-
-  @override
-  void beginEnum(Token enumKeyword) {
-    debugEvent("beginEnum", enumKeyword);
-    state.checkEmpty(enumKeyword);
-  }
-
-  @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    debugEvent("endEnum", enumKeyword);
-    state.discard(count); // Enum values.
-    state.pop(); // Enum name.
-    state.checkEmpty(enumKeyword);
-  }
-
-  @override
-  void endExport(Token exportKeyword, Token semicolon) {
-    debugEvent("Export", exportKeyword);
-    state.pop(); // Export URI.
-    state.checkEmpty(semicolon);
-  }
-
-  @override
-  void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
-    debugEvent("ExpressionFunctionBody", arrowToken);
-    state.pop();
-  }
-
-  @override
-  void handleExpressionStatement(Token token) {
-    debugEvent("ExpressionStatement", token);
-    state.pop();
-  }
-
-  @override
-  void handleExtraneousExpression(Token token, Message message) {
-    debugEvent("ExtraneousExpression", token);
-    unhandled("ExtraneousExpression", token);
-  }
-
-  @override
-  void endClassFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    debugEvent("ClassFactoryMethod", beginToken);
-    state.pop(); // Name.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void endFieldInitializer(Token assignment, Token token) {
-    debugEvent("FieldInitializer", assignment);
-    state.pop(); // Initializer.
-  }
-
-  @override
-  void handleNoFieldInitializer(Token token) {
-    debugEvent("NoFieldInitializer", token);
-  }
-
-  @override
-  void endClassFields(Token staticToken, Token covariantToken, Token lateToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
-    debugEvent("Fields", staticToken);
-    state.discard(count); // Field names.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleFinallyBlock(Token finallyKeyword) {
-    debugEvent("FinallyBlock", finallyKeyword);
-  }
-
-  @override
-  void endForIn(Token endToken) {
-    debugEvent("ForIn", endToken);
-  }
-
-  @override
-  void endForInBody(Token token) {
-    debugEvent("ForInBody", token);
-  }
-
-  @override
-  void endForInExpression(Token token) {
-    debugEvent("ForInExpression", token);
-    state.pop(); // Expression.
-  }
-
-  @override
-  void handleForInitializerEmptyStatement(Token token) {
-    debugEvent("ForInitializerEmptyStatement", token);
-  }
-
-  @override
-  void handleForInitializerExpressionStatement(Token token, bool forIn) {
-    debugEvent("ForInitializerExpressionStatement", token);
-    state.pop(); // Expression.
-  }
-
-  @override
-  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
-    debugEvent("ForInitializerLocalVariableDeclaration", token);
-  }
-
-  @override
-  void handleForLoopParts(Token forKeyword, Token leftParen,
-      Token leftSeparator, int updateExpressionCount) {
-    debugEvent("handleForLoopParts", forKeyword);
-    state.discard(updateExpressionCount);
-  }
-
-  @override
-  void endForStatement(Token endToken) {
-    debugEvent("ForStatement", endToken);
-  }
-
-  @override
-  void endForStatementBody(Token token) {
-    debugEvent("ForStatementBody", token);
-  }
-
-  @override
-  void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
-      Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
-      FormalParameterKind kind,
-      MemberKind memberKind) {
-    debugEvent("FormalParameter", thisKeyword);
-    state.pop(); // Parameter name.
-  }
-
-  @override
-  void endFormalParameterDefaultValueExpression() {
-    debugEvent("FormalParameterDefaultValueExpression", null);
-    state.pop();
-  }
-
-  @override
-  void handleFormalParameterWithoutValue(Token token) {
-    debugEvent("FormalParameterWithoutValue", token);
-  }
-
-  @override
-  void endFormalParameters(
-      int count, Token beginToken, Token endToken, MemberKind kind) {
-    debugEvent("FormalParameters", beginToken);
-  }
-
-  @override
-  void handleNoFormalParameters(Token token, MemberKind kind) {
-    debugEvent("NoFormalParameters", token);
-  }
-
-  @override
-  void handleNoFunctionBody(Token token) {
-    debugEvent("NoFunctionBody", token);
-    unhandled("NoFunctionBody", token);
-  }
-
-  @override
-  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
-    debugEvent("FunctionBodySkipped", token);
-    unhandled("FunctionBodySkipped", token);
-  }
-
-  @override
-  void endFunctionExpression(Token beginToken, Token token) {
-    debugEvent("FunctionExpression", beginToken);
-    state.pushNull("%function%", token);
-  }
-
-  @override
-  void endFunctionName(Token beginToken, Token token) {
-    debugEvent("FunctionName", beginToken);
-  }
-
-  @override
-  void endFunctionType(Token functionToken, Token questionMark) {
-    debugEvent("FunctionType", functionToken);
-  }
-
-  @override
-  void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token endToken) {
-    debugEvent("FunctionTypeAlias", typedefKeyword);
-    state.pop(); // Name.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token question) {
-    debugEvent("FunctionTypedFormalParameter", nameToken);
-  }
-
-  @override
-  void endHide(Token hideKeyword) {
-    debugEvent("Hide", hideKeyword);
-  }
-
-  @override
-  void handleIdentifier(Token token, IdentifierContext context) {
-    debugEvent("Identifier ${context}", token);
-    if (context.inSymbol) {
-      // Do nothing.
-    } else if (context.inDeclaration) {
-      if (identical(IdentifierContext.localVariableDeclaration, context) ||
-          identical(IdentifierContext.formalParameterDeclaration, context)) {
-        state.declareIdentifier(token);
-      } else {
-        state.pushNull(token.lexeme, token);
-      }
-    } else if (context.isContinuation) {
-      state.pushNull(token.lexeme, token);
-    } else if (context.isScopeReference) {
-      state.pushReference(token);
-    } else {
-      state.pushNull(token.lexeme, token);
-    }
-  }
-
-  @override
-  void handleIdentifierList(int count) {
-    debugEvent("IdentifierList", null);
-    state.discard(count);
-  }
-
-  @override
-  void endIfStatement(Token ifToken, Token elseToken) {
-    debugEvent("IfStatement", ifToken);
-    state.pop(); // Condition.
-  }
-
-  @override
-  void endImplicitCreationExpression(Token token) {
-    debugEvent("ImplicitCreationExpression", token);
-    doConstuctorInvocation(token, false);
-  }
-
-  @override
-  void endImport(Token importKeyword, Token semicolon) {
-    debugEvent("Import", importKeyword);
-    state.pop(); // Import URI.
-    state.checkEmpty(semicolon);
-  }
-
-  @override
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
-    debugEvent("ImportPrefix", deferredKeyword);
-    if (asKeyword != null) {
-      state.pop(); // Prefix name.
-    }
-  }
-
-  @override
-  void handleIndexedExpression(
-      Token openSquareBracket, Token closeSquareBracket) {
-    debugEvent("IndexedExpression", openSquareBracket);
-    state.pop(); // Index.
-    state.popPushNull("%indexed%", closeSquareBracket); // Expression.
-  }
-
-  @override
-  void endInitializedIdentifier(Token nameToken) {
-    debugEvent("InitializedIdentifier", nameToken);
-  }
-
-  @override
-  void endInitializer(Token token) {
-    debugEvent("Initializer", token);
-    state.pop(); // Initializer.
-  }
-
-  @override
-  void endInitializers(int count, Token beginToken, Token endToken) {
-    debugEvent("Initializers", beginToken);
-  }
-
-  @override
-  void handleNoInitializers() {
-    debugEvent("NoInitializers", null);
-  }
-
-  @override
-  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
-    debugEvent("InterpolationExpression", leftBracket);
-    state.popPushNull(r"$", leftBracket);
-  }
-
-  @override
-  void handleInvalidExpression(Token token) {
-    // TODO(ahe): The parser doesn't generate this event anymore.
-    debugEvent("InvalidExpression", token);
-    unhandled("InvalidExpression", token);
-  }
-
-  @override
-  void handleInvalidFunctionBody(Token token) {
-    debugEvent("InvalidFunctionBody", token);
-  }
-
-  @override
-  void handleInvalidMember(Token endToken) {
-    debugEvent("InvalidMember", endToken);
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
-    debugEvent("InvalidOperatorName", operatorKeyword);
-    state.checkEmpty(operatorKeyword);
-  }
-
-  @override
-  void handleInvalidStatement(Token token, Message message) {
-    debugEvent("InvalidStatement", token);
-  }
-
-  @override
-  void handleInvalidTopLevelBlock(Token token) {
-    debugEvent("InvalidTopLevelBlock", token);
-    state.checkEmpty(token);
-  }
-
-  @override
-  void handleInvalidTopLevelDeclaration(Token endToken) {
-    debugEvent("InvalidTopLevelDeclaration", endToken);
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleInvalidTypeArguments(Token token) {
-    debugEvent("InvalidTypeArguments", token);
-  }
-
-  @override
-  void handleInvalidTypeReference(Token token) {
-    debugEvent("InvalidTypeReference", token);
-    unhandled("InvalidTypeReference", token);
-  }
-
-  @override
-  void handleIsOperator(Token isOperator, Token not) {
-    debugEvent("IsOperator", isOperator);
-    Builder lhs = state.popPushNull(isOperator.lexeme, isOperator);
-    if (not == null && lhs is UnspecifiedDeclaration) {
-      state.registerPromotionCandidate(lhs, isOperator);
-    }
-  }
-
-  @override
-  void handleLabel(Token token) {
-    debugEvent("Label", token);
-    state.pop(); // Label.
-  }
-
-  @override
-  void endLabeledStatement(int labelCount) {
-    debugEvent("LabeledStatement", null);
-  }
-
-  @override
-  void endLibraryName(Token libraryKeyword, Token semicolon) {
-    debugEvent("LibraryName", libraryKeyword);
-    state.pop(); // Library name.
-    state.checkEmpty(semicolon);
-  }
-
-  @override
-  void handleLiteralBool(Token token) {
-    debugEvent("LiteralBool", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void handleLiteralDouble(Token token) {
-    debugEvent("LiteralDouble", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void handleLiteralInt(Token token) {
-    debugEvent("LiteralInt", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
-    debugEvent("LiteralList", leftBracket);
-    state.discard(count);
-    state.pushNull("[]", leftBracket);
-  }
-
-  @override
-  void handleLiteralSetOrMap(
-    int count,
-    Token leftBrace,
-    Token constKeyword,
-    Token rightBrace,
-    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
-    // behavior and will be removed once unified collection has been enabled
-    bool hasSetEntry,
-  ) {
-    debugEvent("LiteralSetOrMap", leftBrace);
-    state.discard(count);
-    state.pushNull("{}", leftBrace);
-  }
-
-  @override
-  void handleLiteralMapEntry(Token colon, Token endToken) {
-    debugEvent("LiteralMapEntry", colon);
-    state.pop(); // Value.
-    state.popPushNull("%LiteralMapEntry%", colon); // Key.
-  }
-
-  @override
-  void handleLiteralNull(Token token) {
-    debugEvent("LiteralNull", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void beginLiteralString(Token token) {
-    debugEvent("beginLiteralString", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    debugEvent("LiteralString", endToken);
-    state.discard(interpolationCount * 2);
-    state.popPushNull("%string%", endToken);
-  }
-
-  @override
-  void endLiteralSymbol(Token hashToken, int identifierCount) {
-    debugEvent("LiteralSymbol", hashToken);
-    state.pushNull(hashToken.lexeme, hashToken);
-  }
-
-  @override
-  void endLocalFunctionDeclaration(Token endToken) {
-    debugEvent("LocalFunctionDeclaration", endToken);
-    state.pop(); // Function name.
-  }
-
-  @override
-  void endMember() {
-    debugEvent("Member", null);
-    state.checkEmpty(null);
-  }
-
-  @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
-    debugEvent("Metadata", beginToken);
-    state.pop(); // Arguments.
-    if (periodBeforeName != null) {
-      state.pop(); // Suffix.
-    }
-    state.pop(); // Qualifier.
-  }
-
-  @override
-  void endMetadataStar(int count) {
-    debugEvent("MetadataStar", null);
-  }
-
-  @override
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
-    debugEvent("beginMethod", name);
-    state.checkEmpty(name);
-  }
-
-  @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
-    debugEvent("endMethod", endToken);
-    state.pop(); // Method name.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    debugEvent("MixinDeclaration", mixinKeyword);
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleMixinHeader(Token mixinKeyword) {
-    debugEvent("MixinHeader", mixinKeyword);
-    state.pop(); // Mixin name.
-    state.checkEmpty(mixinKeyword);
-  }
-
-  @override
-  void handleMixinOn(Token onKeyword, int typeCount) {
-    debugEvent("MixinOn", onKeyword);
-  }
-
-  @override
-  void handleNoName(Token token) {
-    debugEvent("NoName", token);
-    state.pushNull("%NoName%", token);
-  }
-
-  @override
-  void handleNamedArgument(Token colon) {
-    debugEvent("NamedArgument", colon);
-    state.pop(); // Expression.
-    state.popPushNull("%NamedArgument%", colon); // Identifier.
-  }
-
-  @override
-  void endNamedFunctionExpression(Token endToken) {
-    debugEvent("NamedFunctionExpression", endToken);
-    state.popPushNull(
-        "%named function expression%", endToken); // Function name.
-  }
-
-  @override
-  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token implementsKeyword, Token endToken) {
-    debugEvent("NamedMixinApplication", begin);
-    state.pop(); // Mixin application name.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    debugEvent("NamedMixinApplicationWithClause", withKeyword);
-  }
-
-  @override
-  void handleNativeClause(Token nativeToken, bool hasName) {
-    debugEvent("NativeClause", nativeToken);
-    if (hasName) {
-      state.pop(); // Name.
-    }
-  }
-
-  @override
-  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
-    debugEvent("NativeFunctionBody", nativeToken);
-  }
-
-  @override
-  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
-    debugEvent("NativeFunctionBodyIgnored", nativeToken);
-  }
-
-  @override
-  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
-    debugEvent("NativeFunctionBodySkipped", nativeToken);
-  }
-
-  @override
-  void endNewExpression(Token token) {
-    debugEvent("NewExpression", token);
-    doConstuctorInvocation(token, false);
-  }
-
-  @override
-  void handleOperator(Token token) {
-    debugEvent("Operator", token);
-    unhandled("Operator", token);
-  }
-
-  @override
-  void handleOperatorName(Token operatorKeyword, Token token) {
-    debugEvent("OperatorName", operatorKeyword);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void endOptionalFormalParameters(
-      int count, Token beginToken, Token endToken) {
-    debugEvent("OptionalFormalParameters", beginToken);
-  }
-
-  @override
-  void handleParenthesizedCondition(Token token) {
-    debugEvent("ParenthesizedCondition", token);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token token) {
-    debugEvent("ParenthesizedExpression", token);
-    state.popPushNull("%(expr)%", token);
-  }
-
-  @override
-  void endPart(Token partKeyword, Token semicolon) {
-    debugEvent("Part", partKeyword);
-    state.pop(); // URI.
-    state.checkEmpty(semicolon);
-  }
-
-  @override
-  void endPartOf(
-      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
-    debugEvent("PartOf", partKeyword);
-    state.pop(); // Name or URI.
-    state.checkEmpty(semicolon);
-  }
-
-  @override
-  void handleQualified(Token period) {
-    debugEvent("Qualified", period);
-    state.pop(); // Suffix.
-    state.popPushNull("%Qualified%", period); // Qualifier.
-  }
-
-  @override
-  void handleRecoverClassHeader() {
-    debugEvent("RecoverClassHeader", null);
-    state.checkEmpty(null);
-  }
-
-  @override
-  void handleRecoverImport(Token semicolon) {
-    debugEvent("RecoverImport", semicolon);
-    unhandled("RecoverImport", semicolon);
-  }
-
-  @override
-  void handleRecoverMixinHeader() {
-    debugEvent("RecoverMixinHeader", null);
-    state.checkEmpty(null);
-  }
-
-  @override
-  void handleRecoverableError(
-      Message message, Token startToken, Token endToken) {
-    debugEvent("RecoverableError ${message.message}", startToken);
-  }
-
-  @override
-  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
-    debugEvent("RedirectingFactoryBody", beginToken);
-    state.pop(); // Constructor reference.
-  }
-
-  @override
-  void endRethrowStatement(Token rethrowToken, Token endToken) {
-    debugEvent("RethrowStatement", rethrowToken);
-  }
-
-  @override
-  void endReturnStatement(
-      bool hasExpression, Token beginToken, Token endToken) {
-    debugEvent("ReturnStatement", beginToken);
-    if (hasExpression) {
-      state.pop(); // Expression.
-    }
-  }
-
-  @override
-  void handleScript(Token token) {
-    debugEvent("Script", token);
-    unhandled("Script", token);
-  }
-
-  @override
-  void handleSend(Token beginToken, Token endToken) {
-    debugEvent("Send", beginToken);
-    Builder arguments = state.pop();
-    if (identical(arguments, noArgumentsSentinel)) {
-      // Leave the receiver on the stack.
-    } else {
-      state.popPushNull("%send%", beginToken);
-    }
-  }
-
-  @override
-  void endShow(Token showKeyword) {
-    debugEvent("Show", showKeyword);
-  }
-
-  @override
-  void handleStringJuxtaposition(int literalCount) {
-    debugEvent("StringJuxtaposition", null);
-    state.discard(literalCount);
-    state.pushNull("%StringJuxtaposition%", null);
-  }
-
-  @override
-  void handleStringPart(Token token) {
-    debugEvent("StringPart", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void handleSuperExpression(Token token, IdentifierContext context) {
-    debugEvent("SuperExpression", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
-    debugEvent("SwitchBlock", beginToken);
-    state.pop(); // Expression.
-  }
-
-  @override
-  void endSwitchCase(
-      int labelCount,
-      int expressionCount,
-      Token defaultKeyword,
-      Token colonAfterDefault,
-      int statementCount,
-      Token firstToken,
-      Token endToken) {
-    debugEvent("SwitchCase", defaultKeyword);
-  }
-
-  @override
-  void endSwitchStatement(Token switchKeyword, Token endToken) {
-    debugEvent("SwitchStatement", switchKeyword);
-  }
-
-  @override
-  void handleSymbolVoid(Token token) {
-    debugEvent("SymbolVoid", token);
-    unhandled("SymbolVoid", token);
-  }
-
-  @override
-  void endThenStatement(Token token) {
-    debugEvent("ThenStatement", token);
-  }
-
-  @override
-  void handleThisExpression(Token token, IdentifierContext context) {
-    debugEvent("ThisExpression", token);
-    state.pushNull(token.lexeme, token);
-  }
-
-  @override
-  void handleThrowExpression(Token throwToken, Token endToken) {
-    debugEvent("ThrowExpression", throwToken);
-    state.popPushNull(throwToken.lexeme, throwToken);
-  }
-
-  @override
-  void endTopLevelDeclaration(Token token) {
-    debugEvent("TopLevelDeclaration", token);
-    state.checkEmpty(token);
-  }
-
-  @override
-  void endTopLevelFields(
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    debugEvent("TopLevelFields", staticToken);
-    state.discard(count); // Field names.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
-    debugEvent("beginTopLevelMethod", lastConsumed.next);
-    state.checkEmpty(lastConsumed.next);
-  }
-
-  @override
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
-    debugEvent("endTopLevelMethod", beginToken);
-    state.pop(); // Method name.
-    state.checkEmpty(endToken);
-  }
-
-  @override
-  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
-    debugEvent("TryStatement", tryKeyword);
-  }
-
-  @override
-  void handleType(Token beginToken, Token questionMark) {
-    debugEvent("Type", beginToken);
-    state.pop();
-  }
-
-  @override
-  void handleNoType(Token lastConsumed) {
-    debugEvent("NoType", lastConsumed);
-  }
-
-  @override
-  void endTypeArguments(int count, Token beginToken, Token endToken) {
-    debugEvent("TypeArguments", beginToken);
-  }
-
-  @override
-  void handleNoTypeArguments(Token token) {
-    debugEvent("NoTypeArguments", token);
-  }
-
-  @override
-  void endTypeList(int count) {
-    debugEvent("TypeList", null);
-  }
-
-  @override
-  void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
-    debugEvent("TypeVariable", token);
-    state.pop(); // Name.
-  }
-
-  @override
-  void endTypeVariables(Token beginToken, Token endToken) {
-    debugEvent("TypeVariables", beginToken);
-  }
-
-  @override
-  void handleNoTypeVariables(Token token) {
-    debugEvent("NoTypeVariables", token);
-  }
-
-  @override
-  void handleTypeVariablesDefined(Token token, int count) {
-    debugEvent("TypeVariablesDefined", token);
-  }
-
-  @override
-  void handleUnaryPostfixAssignmentExpression(Token token) {
-    debugEvent("UnaryPostfixAssignmentExpression", token);
-    Builder expr = state.popPushNull(token.lexeme, token);
-    if (expr is UnspecifiedDeclaration) {
-      state.registerWrite(expr, token);
-    }
-  }
-
-  @override
-  void handleUnaryPrefixAssignmentExpression(Token token) {
-    debugEvent("UnaryPrefixAssignmentExpression", token);
-    Builder expr = state.popPushNull(token.lexeme, token);
-    if (expr is UnspecifiedDeclaration) {
-      state.registerWrite(expr, token);
-    }
-  }
-
-  @override
-  void handleUnaryPrefixExpression(Token token) {
-    debugEvent("UnaryPrefixExpression", token);
-    state.popPushNull("%UnaryPrefixExpression%", token);
-  }
-
-  @override
-  void handleNonNullAssertExpression(Token token) {
-    debugEvent("NonNullAssertExpression", token);
-    state.popPushNull("%NonNullAssertExpression%", token);
-  }
-
-  @override
-  void handleUnescapeError(
-      Message message, Token location, int stringOffset, int length) {
-    debugEvent("UnescapeError", location);
-    unhandled("UnescapeError", location);
-  }
-
-  @override
-  void handleValuedFormalParameter(Token equals, Token token) {
-    debugEvent("ValuedFormalParameter", equals);
-  }
-
-  @override
-  void endVariableInitializer(Token assignmentOperator) {
-    debugEvent("VariableInitializer", assignmentOperator);
-    state.pop(); // Initializer.
-  }
-
-  @override
-  void handleNoVariableInitializer(Token token) {
-    debugEvent("NoVariableInitializer", token);
-  }
-
-  @override
-  void endVariablesDeclaration(int count, Token endToken) {
-    debugEvent("VariablesDeclaration", endToken);
-    state.discard(count); // Variable names.
-  }
-
-  @override
-  void handleVoidKeyword(Token token) {
-    debugEvent("VoidKeyword", token);
-  }
-
-  @override
-  void endWhileStatement(Token whileKeyword, Token endToken) {
-    debugEvent("WhileStatement", whileKeyword);
-    state.pop(); // Condition.
-  }
-
-  @override
-  void endWhileStatementBody(Token token) {
-    debugEvent("WhileStatementBody", token);
-  }
-
-  @override
-  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
-    debugEvent("YieldStatement", yieldToken);
-    state.pop(); // Expression.
-  }
-
-  void unhandled(String event, Token token) {
-    problems.unhandled(
-        event, "TypePromotionLookAheadListener", token?.charOffset ?? -1, uri);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index dde97c4..1268e81 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -2,6 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
+    show NullValue;
+
+import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart' as type;
+
+import 'package:_fe_analyzer_shared/src/parser/value_kind.dart';
+
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as type
     show Token;
 
@@ -46,137 +53,60 @@
 
 import '../source/outline_builder.dart' as type;
 
-import 'stack_listener.dart' show NullValue;
-
-import 'stack_listener.dart' as type;
-
-/// [ValueKind] is used in [StackListener.checkState] to document and check the
-/// expected values of the stack.
-///
-/// Add new value kinds as needed for documenting and checking the various stack
-/// listener implementations.
-abstract class ValueKind {
-  const ValueKind();
-
-  /// Checks the [value] an returns `true` if the value is of the expected kind.
-  bool check(Object value);
-
-  static const ValueKind Arguments = const _SingleValueKind<type.Arguments>();
+class ValueKinds {
+  static const ValueKind Arguments = const SingleValueKind<type.Arguments>();
   static const ValueKind ArgumentsOrNull =
-      const _SingleValueKind<type.Arguments>(NullValue.Arguments);
-  static const ValueKind Expression = const _SingleValueKind<type.Expression>();
+      const SingleValueKind<type.Arguments>(NullValue.Arguments);
+  static const ValueKind Expression = const SingleValueKind<type.Expression>();
   static const ValueKind ExpressionOrNull =
-      const _SingleValueKind<type.Expression>(NullValue.Expression);
-  static const ValueKind Identifier = const _SingleValueKind<type.Identifier>();
+      const SingleValueKind<type.Expression>(NullValue.Expression);
+  static const ValueKind Identifier = const SingleValueKind<type.Identifier>();
   static const ValueKind IdentifierOrNull =
-      const _SingleValueKind<type.Identifier>(NullValue.Identifier);
-  static const ValueKind Integer = const _SingleValueKind<int>();
+      const SingleValueKind<type.Identifier>(NullValue.Identifier);
+  static const ValueKind Integer = const SingleValueKind<int>();
   static const ValueKind Formals =
-      const _SingleValueKind<List<type.FormalParameterBuilder>>();
+      const SingleValueKind<List<type.FormalParameterBuilder>>();
   static const ValueKind FormalsOrNull =
-      const _SingleValueKind<List<type.FormalParameterBuilder>>(
+      const SingleValueKind<List<type.FormalParameterBuilder>>(
           NullValue.FormalParameters);
-  static const ValueKind Generator = const _SingleValueKind<type.Generator>();
+  static const ValueKind Generator = const SingleValueKind<type.Generator>();
   static const ValueKind Initializer =
-      const _SingleValueKind<type.Initializer>();
-  static const ValueKind MethodBody = const _SingleValueKind<type.MethodBody>();
+      const SingleValueKind<type.Initializer>();
+  static const ValueKind MethodBody = const SingleValueKind<type.MethodBody>();
   static const ValueKind Modifiers =
-      const _SingleValueKind<List<type.Modifier>>();
+      const SingleValueKind<List<type.Modifier>>();
   static const ValueKind ModifiersOrNull =
-      const _SingleValueKind<List<type.Modifier>>(NullValue.Modifiers);
-  static const ValueKind Name = const _SingleValueKind<String>();
+      const SingleValueKind<List<type.Modifier>>(NullValue.Modifiers);
+  static const ValueKind Name = const SingleValueKind<String>();
   static const ValueKind NameOrNull =
-      const _SingleValueKind<String>(NullValue.Name);
+      const SingleValueKind<String>(NullValue.Name);
   static const ValueKind NameOrOperator =
-      const _UnionValueKind([Name, Operator]);
+      const UnionValueKind([Name, Operator]);
   static const ValueKind NameOrQualifiedNameOrOperator =
-      const _UnionValueKind([Name, QualifiedName, Operator]);
+      const UnionValueKind([Name, QualifiedName, Operator]);
   static const ValueKind NameOrParserRecovery =
-      const _UnionValueKind([Name, ParserRecovery]);
+      const UnionValueKind([Name, ParserRecovery]);
   static const ValueKind MetadataListOrNull =
-      const _SingleValueKind<List<type.MetadataBuilder>>(NullValue.Metadata);
-  static const ValueKind ObjectList = const _SingleValueKind<List<Object>>();
-  static const ValueKind Operator = const _SingleValueKind<type.Operator>();
+      const SingleValueKind<List<type.MetadataBuilder>>(NullValue.Metadata);
+  static const ValueKind ObjectList = const SingleValueKind<List<Object>>();
+  static const ValueKind Operator = const SingleValueKind<type.Operator>();
   static const ValueKind ParserRecovery =
-      const _SingleValueKind<type.ParserRecovery>();
+      const SingleValueKind<type.ParserRecovery>();
   static const ValueKind ProblemBuilder =
-      const _SingleValueKind<type.ProblemBuilder>();
+      const SingleValueKind<type.ProblemBuilder>();
   static const ValueKind QualifiedName =
-      const _SingleValueKind<type.QualifiedName>();
-  static const ValueKind Statement = const _SingleValueKind<type.Statement>();
-  static const ValueKind Token = const _SingleValueKind<type.Token>();
+      const SingleValueKind<type.QualifiedName>();
+  static const ValueKind Statement = const SingleValueKind<type.Statement>();
+  static const ValueKind Token = const SingleValueKind<type.Token>();
   static const ValueKind TokenOrNull =
-      const _SingleValueKind<type.Token>(NullValue.Token);
+      const SingleValueKind<type.Token>(NullValue.Token);
   static const ValueKind TypeArgumentsOrNull =
-      const _SingleValueKind<List<type.UnresolvedType>>(
-          NullValue.TypeArguments);
+      const SingleValueKind<List<type.UnresolvedType>>(NullValue.TypeArguments);
   static const ValueKind TypeBuilder =
-      const _SingleValueKind<type.TypeBuilder>();
+      const SingleValueKind<type.TypeBuilder>();
   static const ValueKind TypeBuilderOrNull =
-      const _SingleValueKind<type.TypeBuilder>(NullValue.Type);
+      const SingleValueKind<type.TypeBuilder>(NullValue.Type);
   static const ValueKind TypeVariableListOrNull =
-      const _SingleValueKind<List<type.TypeVariableBuilder>>(
+      const SingleValueKind<List<type.TypeVariableBuilder>>(
           NullValue.TypeVariables);
 }
-
-/// A [ValueKind] for a particular type [T], optionally with a recognized
-/// [NullValue].
-class _SingleValueKind<T> implements ValueKind {
-  final NullValue nullValue;
-
-  const _SingleValueKind([this.nullValue]);
-
-  @override
-  bool check(Object value) {
-    if (nullValue != null && value == nullValue) {
-      return true;
-    }
-    return value is T;
-  }
-
-  String toString() {
-    if (nullValue != null) {
-      return '$T or $nullValue';
-    }
-    return '$T';
-  }
-}
-
-/// A [ValueKind] for the union of a list of [ValueKind]s.
-class _UnionValueKind implements ValueKind {
-  final List<ValueKind> kinds;
-
-  const _UnionValueKind(this.kinds);
-
-  @override
-  bool check(Object value) {
-    for (ValueKind kind in kinds) {
-      if (kind.check(value)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    String or = '';
-    for (ValueKind kind in kinds) {
-      sb.write(or);
-      sb.write(kind);
-      or = ' or ';
-    }
-    return sb.toString();
-  }
-}
-
-/// Helper method for creating a list of [ValueKind]s of the given length
-/// [count].
-List<ValueKind> repeatedKinds(ValueKind kind, int count) {
-  return new List.generate(count, (_) => kind);
-}
-
-/// Helper method for creating a union of a list of [ValueKind]s.
-ValueKind unionOfKinds(List<ValueKind> kinds) {
-  return new _UnionValueKind(kinds);
-}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index f7e9751..6b1f45a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -111,14 +111,15 @@
       if (type2 is InterfaceType) {
         if (type2.classNode == futureOrClass) {
           // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
-          return new InterfaceType(futureOrClass, <DartType>[
+          return new InterfaceType(
+              futureOrClass, Nullability.legacy, <DartType>[
             getStandardLowerBound(
                 type1.typeArguments[0], type2.typeArguments[0])
           ]);
         }
         if (type2.classNode == futureClass) {
           // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
-          return new InterfaceType(futureClass, <DartType>[
+          return new InterfaceType(futureClass, Nullability.legacy, <DartType>[
             getStandardLowerBound(
                 type1.typeArguments[0], type2.typeArguments[0])
           ]);
@@ -135,7 +136,7 @@
     if (type2 is InterfaceType && type2.classNode == futureOrClass) {
       if (type1 is InterfaceType && type1.classNode == futureClass) {
         // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
-        return new InterfaceType(futureClass, <DartType>[
+        return new InterfaceType(futureClass, Nullability.legacy, <DartType>[
           getStandardLowerBound(type2.typeArguments[0], type1.typeArguments[0])
         ]);
       }
@@ -316,7 +317,8 @@
 
     // Calculate the SLB of the return type.
     DartType returnType = getStandardLowerBound(f.returnType, g.returnType);
-    return new FunctionType(positionalParameters, returnType,
+    return new FunctionType(
+        positionalParameters, returnType, Nullability.legacy,
         namedParameters: namedParameters,
         requiredParameterCount: requiredParameterCount);
   }
@@ -343,7 +345,7 @@
     //   SUB(([int]) -> void, (int) -> void) = (int) -> void
     if (f.requiredParameterCount != g.requiredParameterCount) {
       return new InterfaceType(
-          functionClass, const <DynamicType>[], Nullability.legacy);
+          functionClass, Nullability.legacy, const <DynamicType>[]);
     }
     int requiredParameterCount = f.requiredParameterCount;
 
@@ -390,7 +392,8 @@
 
     // Calculate the SUB of the return type.
     DartType returnType = getStandardUpperBound(f.returnType, g.returnType);
-    return new FunctionType(positionalParameters, returnType,
+    return new FunctionType(
+        positionalParameters, returnType, Nullability.legacy,
         namedParameters: namedParameters,
         requiredParameterCount: requiredParameterCount);
   }
@@ -450,7 +453,7 @@
           tArgs[i] = getStandardUpperBound(tArgs1[i], tArgs2[i]);
         }
       }
-      return new InterfaceType(type1.classNode, tArgs);
+      return new InterfaceType(type1.classNode, Nullability.legacy, tArgs);
     }
     return getLegacyLeastUpperBound(type1, type2);
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 42b0696..691ecdb 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -16,6 +16,7 @@
         Procedure,
         TypeParameter,
         TypeParameterType,
+        Variance,
         VoidType;
 
 import 'package:kernel/type_algebra.dart' show substitute, Substitution;
@@ -209,9 +210,25 @@
         getTypeAsInstanceOf(subtype, supertype.classNode);
     if (matchingSupertypeOfSubtype == null) return false;
     for (int i = 0; i < supertype.classNode.typeParameters.length; i++) {
-      if (!_isSubtypeMatch(matchingSupertypeOfSubtype.typeArguments[i],
-          supertype.typeArguments[i])) {
-        return false;
+      // Generate constraints and subtype match with respect to variance.
+      int parameterVariance = supertype.classNode.typeParameters[i].variance;
+      if (parameterVariance == Variance.contravariant) {
+        if (!_isSubtypeMatch(supertype.typeArguments[i],
+            matchingSupertypeOfSubtype.typeArguments[i])) {
+          return false;
+        }
+      } else if (parameterVariance == Variance.invariant) {
+        if (!_isSubtypeMatch(supertype.typeArguments[i],
+                matchingSupertypeOfSubtype.typeArguments[i]) ||
+            !_isSubtypeMatch(matchingSupertypeOfSubtype.typeArguments[i],
+                supertype.typeArguments[i])) {
+          return false;
+        }
+      } else {
+        if (!_isSubtypeMatch(matchingSupertypeOfSubtype.typeArguments[i],
+            supertype.typeArguments[i])) {
+          return false;
+        }
       }
     }
     return true;
@@ -401,7 +418,8 @@
     for (int i = 0; i < params1.length; ++i) {
       TypeParameter pFresh = new TypeParameter(params2[i].name);
       freshTypeVariables.add(pFresh);
-      DartType variableFresh = new TypeParameterType(pFresh);
+      DartType variableFresh =
+          new TypeParameterType(pFresh, Nullability.legacy);
       substitution1[params1[i]] = variableFresh;
       substitution2[params2[i]] = variableFresh;
       DartType bound1 = substitute(params1[i].bound, substitution1);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 9fbaded..696f7a4 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -20,7 +20,8 @@
         TypeParameter,
         TypeParameterType,
         TypedefType,
-        VariableDeclaration;
+        VariableDeclaration,
+        Variance;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -43,32 +44,15 @@
 
 import 'type_schema_environment.dart' show TypeSchemaEnvironment;
 
-enum Variance {
-  covariant,
-  contravariant,
-  invariant,
-}
-
-Variance invertVariance(Variance variance) {
-  switch (variance) {
-    case Variance.covariant:
-      return Variance.contravariant;
-    case Variance.contravariant:
-      return Variance.covariant;
-    case Variance.invariant:
-  }
-  return variance;
-}
-
 /// Visitor to check whether a given type mentions any of a class's type
 /// parameters in a non-covariant fashion.
 class IncludesTypeParametersNonCovariantly extends DartTypeVisitor<bool> {
-  Variance _variance;
+  int _variance;
 
   final List<TypeParameter> _typeParametersToSearchFor;
 
   IncludesTypeParametersNonCovariantly(this._typeParametersToSearchFor,
-      {Variance initialVariance})
+      {int initialVariance})
       : _variance = initialVariance;
 
   @override
@@ -77,12 +61,12 @@
   @override
   bool visitFunctionType(FunctionType node) {
     if (node.returnType.accept(this)) return true;
-    Variance oldVariance = _variance;
+    int oldVariance = _variance;
     _variance = Variance.invariant;
     for (TypeParameter parameter in node.typeParameters) {
       if (parameter.bound.accept(this)) return true;
     }
-    _variance = invertVariance(oldVariance);
+    _variance = Variance.combine(Variance.contravariant, oldVariance);
     for (DartType parameter in node.positionalParameters) {
       if (parameter.accept(this)) return true;
     }
@@ -95,9 +79,13 @@
 
   @override
   bool visitInterfaceType(InterfaceType node) {
-    for (DartType argument in node.typeArguments) {
-      if (argument.accept(this)) return true;
+    int oldVariance = _variance;
+    for (int i = 0; i < node.typeArguments.length; i++) {
+      _variance = Variance.combine(
+          node.classNode.typeParameters[i].variance, oldVariance);
+      if (node.typeArguments[i].accept(this)) return true;
     }
+    _variance = oldVariance;
     return false;
   }
 
@@ -108,7 +96,7 @@
 
   @override
   bool visitTypeParameterType(TypeParameterType node) {
-    return _variance != Variance.covariant &&
+    return !Variance.greaterThanOrEqual(_variance, node.parameter.variance) &&
         _typeParametersToSearchFor.contains(node.parameter);
   }
 }
@@ -307,10 +295,15 @@
   DartType variableType(VariableDeclaration variable) => variable.type;
 
   @override
-  DartType tryPromoteToType(DartType from, DartType to) {
-    if (from is TypeParameterType) {
-      return new TypeParameterType(from.parameter, to, from.nullability);
+  DartType tryPromoteToType(DartType to, DartType from) {
+    if (isSubtypeOf(to, from)) {
+      return to;
     }
-    return to;
+    if (from is TypeParameterType) {
+      if (isSubtypeOf(to, from.promotedBound ?? from.bound)) {
+        return new TypeParameterType(from.parameter, from.nullability, to);
+      }
+    }
+    return from;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 5480c6c..ec83820 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -8,7 +8,7 @@
 
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
 
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -298,7 +298,10 @@
 
   void handleYield(TypeInferrerImpl inferrer, YieldStatement node,
       ExpressionInferenceResult expressionResult) {
-    if (!isGenerator) return;
+    if (!isGenerator) {
+      node.expression = expressionResult.expression..parent = node;
+      return;
+    }
     DartType expectedType = node.isYieldStar
         ? _wrapAsyncOrGenerator(inferrer, returnOrYieldContext)
         : returnOrYieldContext;
@@ -406,7 +409,7 @@
 
   /// Performs type inference on the given function body.
   void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body);
+      AsyncMarker asyncMarker, FunctionNode function, Statement body);
 
   /// Performs type inference on the given constructor initializer.
   void inferInitializer(InferenceHelper helper, Initializer initializer);
@@ -432,7 +435,7 @@
   /// Marker object to indicate that a function takes an unknown number
   /// of arguments.
   static final FunctionType unknownFunction =
-      new FunctionType(const [], const DynamicType());
+      new FunctionType(const [], const DynamicType(), Nullability.legacy);
 
   final TypeInferenceEngine engine;
 
@@ -782,7 +785,7 @@
 
       ExtensionAccessCandidate bestSoFar;
       List<ExtensionAccessCandidate> noneMoreSpecific = [];
-      library.scope.forEachExtension((ExtensionBuilder extensionBuilder) {
+      library.forEachExtensionInScope((ExtensionBuilder extensionBuilder) {
         MemberBuilder thisBuilder =
             extensionBuilder.lookupLocalMemberByName(name, setter: setter);
         MemberBuilder otherBuilder = extensionBuilder
@@ -834,8 +837,10 @@
                         !thisBuilder.isField &&
                         !thisBuilder.isStatic
                     ? new ObjectAccessTarget.extensionMember(
-                        thisBuilder.procedure,
-                        thisBuilder.extensionTearOff,
+                        setter
+                            ? thisBuilder.writeTarget
+                            : thisBuilder.invokeTarget,
+                        thisBuilder.readTarget,
                         thisBuilder.kind,
                         inferredTypeArguments)
                     : const ObjectAccessTarget.missing(),
@@ -944,6 +949,7 @@
             return substitution.substituteType(new FunctionType(
                 functionType.positionalParameters.skip(1).toList(),
                 functionType.returnType,
+                Nullability.legacy,
                 namedParameters: functionType.namedParameters,
                 typeParameters: functionType.typeParameters
                     .skip(target.inferredExtensionTypeArguments.length)
@@ -1441,6 +1447,8 @@
     ExpressionInferenceResult result;
     if (expression is ExpressionJudgment) {
       result = expression.acceptInference(visitor, typeContext);
+    } else if (expression is InternalExpression) {
+      result = expression.acceptInference(visitor, typeContext);
     } else {
       result = expression.accept1(visitor, typeContext);
     }
@@ -1477,10 +1485,18 @@
 
   @override
   void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body) {
+      AsyncMarker asyncMarker, FunctionNode function, Statement body) {
     assert(closureContext == null);
     this.helper = helper;
     closureContext = new ClosureContext(this, asyncMarker, returnType, false);
+    if (function != null) {
+      for (VariableDeclaration parameter in function.positionalParameters) {
+        flowAnalysis.initialize(parameter);
+      }
+      for (VariableDeclaration parameter in function.namedParameters) {
+        flowAnalysis.initialize(parameter);
+      }
+    }
     inferStatement(body);
     closureContext = null;
     this.helper = null;
@@ -1538,7 +1554,9 @@
       bool isConst: false,
       bool isImplicitExtensionMember: false}) {
     FunctionType extensionFunctionType = new FunctionType(
-        [calleeType.positionalParameters.first], const DynamicType(),
+        [calleeType.positionalParameters.first],
+        const DynamicType(),
+        Nullability.legacy,
         requiredParameterCount: 1,
         typeParameters: calleeType.typeParameters
             .take(extensionTypeParameterCount)
@@ -1560,7 +1578,9 @@
           calleeType.typeParameters.skip(extensionTypeParameterCount).toList();
     }
     FunctionType targetFunctionType = new FunctionType(
-        calleeType.positionalParameters.skip(1).toList(), calleeType.returnType,
+        calleeType.positionalParameters.skip(1).toList(),
+        calleeType.returnType,
+        Nullability.legacy,
         requiredParameterCount: calleeType.requiredParameterCount - 1,
         namedParameters: calleeType.namedParameters,
         typeParameters: targetTypeParameters);
@@ -1841,6 +1861,7 @@
           function.positionalParameters;
       for (int i = 0; i < positionalParameters.length; i++) {
         VariableDeclaration parameter = positionalParameters[i];
+        flowAnalysis.initialize(parameter);
         inferMetadataKeepingHelper(parameter, parameter.annotations);
         if (parameter.initializer != null) {
           ExpressionInferenceResult initializerResult = inferExpression(
@@ -1850,6 +1871,7 @@
         }
       }
       for (VariableDeclaration parameter in function.namedParameters) {
+        flowAnalysis.initialize(parameter);
         inferMetadataKeepingHelper(parameter, parameter.annotations);
         ExpressionInferenceResult initializerResult =
             inferExpression(parameter.initializer, parameter.type, !isTopLevel);
@@ -1899,7 +1921,7 @@
       for (int i = 0; i < typeContext.typeParameters.length; i++) {
         substitutionMap[typeContext.typeParameters[i]] =
             i < typeParameters.length
-                ? new TypeParameterType(typeParameters[i])
+                ? new TypeParameterType(typeParameters[i], Nullability.legacy)
                 : const DynamicType();
       }
       substitution = Substitution.fromMap(substitutionMap);
@@ -1994,14 +2016,14 @@
     }
   }
 
-  StaticInvocation transformExtensionMethodInvocation(ObjectAccessTarget target,
-      Expression expression, Expression receiver, Arguments arguments) {
+  StaticInvocation transformExtensionMethodInvocation(int fileOffset,
+      ObjectAccessTarget target, Expression receiver, Arguments arguments) {
     assert(target.isExtensionMember);
     Procedure procedure = target.member;
     return engine.forest.createStaticInvocation(
-        expression.fileOffset,
+        fileOffset,
         target.member,
-        arguments = engine.forest.createArgumentsForExtensionMethod(
+        engine.forest.createArgumentsForExtensionMethod(
             arguments.fileOffset,
             target.inferredExtensionTypeArguments.length,
             procedure.function.typeParameters.length -
@@ -2084,7 +2106,7 @@
     Arguments arguments = node.arguments;
     if (target.isExtensionMember) {
       StaticInvocation staticInvocation = transformExtensionMethodInvocation(
-          target, node, receiver, node.arguments);
+          node.fileOffset, target, receiver, node.arguments);
       arguments = staticInvocation.arguments;
       replacement = staticInvocation;
     } else {
@@ -2396,18 +2418,19 @@
     }
     // TODO(paulberry): If [type] is a subtype of `Future`, should we just
     // return it unmodified?
-    return new InterfaceType(
-        coreTypes.futureOrClass, <DartType>[type ?? const DynamicType()]);
+    return new InterfaceType(coreTypes.futureOrClass, Nullability.legacy,
+        <DartType>[type ?? const DynamicType()]);
   }
 
   DartType wrapFutureType(DartType type) {
     DartType typeWithoutFutureOr = type ?? const DynamicType();
-    return new InterfaceType(
-        coreTypes.futureClass, <DartType>[typeWithoutFutureOr]);
+    return new InterfaceType(coreTypes.futureClass, Nullability.legacy,
+        <DartType>[typeWithoutFutureOr]);
   }
 
   DartType wrapType(DartType type, Class class_) {
-    return new InterfaceType(class_, <DartType>[type ?? const DynamicType()]);
+    return new InterfaceType(
+        class_, Nullability.legacy, <DartType>[type ?? const DynamicType()]);
   }
 
   Member _getInterfaceMember(
@@ -2577,6 +2600,7 @@
 
   Expression createMissingBinary(int fileOffset, Expression left,
       DartType leftType, Name binaryName, Expression right) {
+    assert(binaryName != equalsName);
     if (isTopLevel) {
       return engine.forest.createMethodInvocation(fileOffset, left, binaryName,
           engine.forest.createArguments(fileOffset, <Expression>[right]));
@@ -2588,6 +2612,20 @@
           binaryName.name.length);
     }
   }
+
+  Expression createMissingUnary(int fileOffset, Expression expression,
+      DartType expressionType, Name unaryName) {
+    if (isTopLevel) {
+      return new UnaryExpression(unaryName, expression)
+        ..fileOffset = fileOffset;
+    } else {
+      return helper.buildProblem(
+          templateUndefinedMethod.withArguments(
+              unaryName.name, resolveTypeParameter(expressionType)),
+          fileOffset,
+          unaryName.name == unaryMinusName.name ? 1 : unaryName.name.length);
+    }
+  }
 }
 
 abstract class MixinInferrer {
@@ -2721,7 +2759,9 @@
     // substitute them before calling instantiate to bounds.
     Substitution substitution = Substitution.fromPairs(
         mixinClass.typeParameters,
-        parameters.map((p) => new TypeParameterType(p)).toList());
+        parameters
+            .map((p) => new TypeParameterType(p, Nullability.legacy))
+            .toList());
     for (TypeParameter p in parameters) {
       p.bound = substitution.substituteType(p.bound);
     }
@@ -2975,7 +3015,8 @@
 
   ExtensionAccessCandidate(
       this.onType, this.onTypeInstantiateToBounds, this.target,
-      {this.isPlatform});
+      {this.isPlatform})
+      : assert(isPlatform != null);
 
   bool isMoreSpecificThan(TypeSchemaEnvironment typeSchemaEnvironment,
       ExtensionAccessCandidate other) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index bb90d9d..ef4c2a6 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -695,7 +695,7 @@
       // The type we are checking against is a subtype of the bound of the
       // previous type of the variable; we can promote the bound.
       return new TypeParameterType(
-          previousType.parameter, checkedType, previousType.nullability);
+          previousType.parameter, previousType.nullability, checkedType);
     } else {
       // The types aren't sufficiently related; we can't promote.
       return previousPromotedType;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index d89869f..dc1b1be 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -88,11 +88,11 @@
       return new FunctionType(
           newPositionalParameters ?? node.positionalParameters,
           newReturnType ?? node.returnType,
+          node.nullability,
           namedParameters: newNamedParameters ?? node.namedParameters,
           typeParameters: node.typeParameters,
           requiredParameterCount: node.requiredParameterCount,
-          typedefType: typedefType,
-          nullability: node.nullability);
+          typedefType: typedefType);
     }
   }
 
@@ -111,7 +111,7 @@
       return null;
     } else {
       return new InterfaceType(
-          node.classNode, newTypeArguments, node.nullability);
+          node.classNode, node.nullability, newTypeArguments);
     }
   }
 
@@ -135,8 +135,8 @@
     if (node.promotedBound != null) {
       DartType newPromotedBound = node.promotedBound.accept(this);
       if (newPromotedBound != null) {
-        return new TypeParameterType(node.parameter, newPromotedBound,
-            node.typeParameterTypeNullability);
+        return new TypeParameterType(node.parameter,
+            node.typeParameterTypeNullability, newPromotedBound);
       }
     }
     return null;
@@ -157,7 +157,7 @@
       return null;
     } else {
       return new TypedefType(
-          node.typedefNode, newTypeArguments, node.nullability);
+          node.typedefNode, node.nullability, newTypeArguments);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index eeecd4f..16cd881 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -10,6 +10,7 @@
         FunctionType,
         InterfaceType,
         NamedType,
+        Nullability,
         Procedure,
         TypeParameter;
 
@@ -41,6 +42,7 @@
   return new FunctionType(
       type.positionalParameters.map(substitution.substituteType).toList(),
       substitution.substituteType(type.returnType),
+      Nullability.legacy,
       namedParameters: type.namedParameters
           .map((named) => new NamedType(
               named.name, substitution.substituteType(named.type),
@@ -246,7 +248,7 @@
       }
 
       TypeConstraint constraint = constraints[typeParam];
-      if (downwardsInferPhase) {
+      if (downwardsInferPhase || !typeParam.isLegacyCovariant) {
         inferredTypes[i] =
             _inferTypeParameterFromContext(constraint, extendsConstraint);
       } else {
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 956b470..d69c809 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -75,6 +75,7 @@
 
     Set<Uri> externalLibs(Component component) {
       return component.libraries
+          // ignore: DEPRECATED_MEMBER_USE
           .where((lib) => lib.isExternal)
           .map((lib) => lib.importUri)
           .toSet();
@@ -102,6 +103,7 @@
     // All summaries are considered external and shouldn't include source-info.
     dillTarget.loader.libraries.forEach((lib) {
       // TODO(ahe): Don't do this, and remove [external_state_snapshot.dart].
+      // ignore: DEPRECATED_MEMBER_USE
       lib.isExternal = true;
     });
 
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index c95f2ec..01bc058 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -35,11 +35,17 @@
 /// Test configuration used for testing CFE in its default state.
 const TestConfig defaultCfeConfig = const TestConfig(cfeMarker, 'cfe');
 
-/// Test configuration used for testing CFE with nnbd.
+/// Test configuration used for testing CFE with nnbd in addition to the
+/// default state.
 const TestConfig cfeNonNullableConfig = const TestConfig(
     cfeWithNnbdMarker, 'cfe with nnbd',
     experimentalFlags: const {ExperimentalFlag.nonNullable: true});
 
+/// Test configuration used for testing CFE with nnbd as the default state.
+const TestConfig cfeNonNullableOnlyConfig = const TestConfig(
+    cfeMarker, 'cfe with nnbd',
+    experimentalFlags: const {ExperimentalFlag.nonNullable: true});
+
 class TestConfig {
   final String marker;
   final String name;
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 7b85105..ae993e2 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -233,17 +233,59 @@
 
 /// Returns a textual representation of the constant [node] to be used in
 /// testing.
-String constantToText(Constant node, {bool isNonNullableByDefault: false}) {
+String constantToText(Constant node,
+    {TypeRepresentation typeRepresentation: TypeRepresentation.legacy}) {
   StringBuffer sb = new StringBuffer();
-  new ConstantToTextVisitor(sb, isNonNullableByDefault).visit(node);
+  new ConstantToTextVisitor(sb, typeRepresentation).visit(node);
   return sb.toString();
 }
 
+enum TypeRepresentation {
+  legacy,
+  explicit,
+  implicitUndetermined,
+  nonNullableByDefault,
+}
+
 /// Returns a textual representation of the type [node] to be used in
 /// testing.
-String typeToText(DartType node, {bool isNonNullableByDefault: false}) {
+String typeToText(DartType node,
+    [TypeRepresentation typeRepresentation = TypeRepresentation.legacy]) {
   StringBuffer sb = new StringBuffer();
-  new DartTypeToTextVisitor(sb, isNonNullableByDefault).visit(node);
+  new DartTypeToTextVisitor(sb, typeRepresentation).visit(node);
+  return sb.toString();
+}
+
+Set<Class> computeAllSuperclasses(Class node) {
+  Set<Class> set = <Class>{};
+  _getAllSuperclasses(node, set);
+  return set;
+}
+
+void _getAllSuperclasses(Class node, Set<Class> set) {
+  if (set.add(node)) {
+    if (node.supertype != null) {
+      _getAllSuperclasses(node.supertype.classNode, set);
+    }
+    if (node.mixedInType != null) {
+      _getAllSuperclasses(node.mixedInType.classNode, set);
+    }
+    for (Supertype interface in node.implementedTypes) {
+      _getAllSuperclasses(interface.classNode, set);
+    }
+  }
+}
+
+String supertypeToText(Supertype node,
+    [TypeRepresentation typeRepresentation = TypeRepresentation.legacy]) {
+  StringBuffer sb = new StringBuffer();
+  sb.write(node.classNode.name);
+  if (node.typeArguments.isNotEmpty) {
+    sb.write('<');
+    new DartTypeToTextVisitor(sb, typeRepresentation)
+        .visitList(node.typeArguments);
+    sb.write('>');
+  }
   return sb.toString();
 }
 
@@ -251,8 +293,8 @@
   final StringBuffer sb;
   final DartTypeToTextVisitor typeToText;
 
-  ConstantToTextVisitor(this.sb, bool isNonNullableByDefault)
-      : typeToText = new DartTypeToTextVisitor(sb, isNonNullableByDefault);
+  ConstantToTextVisitor(this.sb, TypeRepresentation typeRepresentation)
+      : typeToText = new DartTypeToTextVisitor(sb, typeRepresentation);
 
   void visit(Constant node) => node.accept(this);
 
@@ -375,9 +417,9 @@
 
 class DartTypeToTextVisitor implements DartTypeVisitor<void> {
   final StringBuffer sb;
-  final bool isNonNullableByDefault;
+  final TypeRepresentation typeRepresentation;
 
-  DartTypeToTextVisitor(this.sb, this.isNonNullableByDefault);
+  DartTypeToTextVisitor(this.sb, this.typeRepresentation);
 
   void visit(DartType node) => node.accept(this);
 
@@ -421,8 +463,7 @@
       sb.write('>');
     }
     if (!isNull(node)) {
-      sb.write(nullabilityToText(node.nullability,
-          isNonNullableByDefault: isNonNullableByDefault));
+      sb.write(nullabilityToText(node.nullability, typeRepresentation));
     }
   }
 
@@ -454,18 +495,16 @@
       sb.write('}');
     }
     sb.write(')');
-    sb.write(nullabilityToText(node.nullability,
-        isNonNullableByDefault: isNonNullableByDefault));
+    sb.write(nullabilityToText(node.nullability, typeRepresentation));
     sb.write('->');
     visit(node.returnType);
   }
 
   void visitTypeParameterType(TypeParameterType node) {
     sb.write(node.parameter.name);
-    sb.write(nullabilityToText(node.nullability,
-        isNonNullableByDefault: isNonNullableByDefault));
+    sb.write(nullabilityToText(node.nullability, typeRepresentation));
     if (node.promotedBound != null) {
-      sb.write(' extends ');
+      sb.write(' & ');
       visit(node.promotedBound);
     }
   }
@@ -477,8 +516,7 @@
       visitList(node.typeArguments);
       sb.write('>');
     }
-    sb.write(nullabilityToText(node.nullability,
-        isNonNullableByDefault: isNonNullableByDefault));
+    sb.write(nullabilityToText(node.nullability, typeRepresentation));
   }
 }
 
@@ -546,8 +584,12 @@
 }
 
 /// Returns a textual representation of [errors] to be used in testing.
-String errorsToText(List<FormattedMessage> errors) {
-  return errors.map((m) => m.message).join(',');
+String errorsToText(List<FormattedMessage> errors, {bool useCodes: false}) {
+  if (useCodes) {
+    return errors.map((m) => m.code).join(',');
+  } else {
+    return errors.map((m) => m.message).join(',');
+  }
 }
 
 /// Returns a textual representation of [descriptor] to be used in testing.
@@ -588,18 +630,39 @@
 }
 
 /// Returns a textual representation of [nullability] to be used in testing.
-String nullabilityToText(Nullability nullability,
-    {bool isNonNullableByDefault}) {
-  assert(isNonNullableByDefault != null);
+String nullabilityToText(
+    Nullability nullability, TypeRepresentation typeRepresentation) {
   switch (nullability) {
     case Nullability.nonNullable:
-      return isNonNullableByDefault ? '' : '!';
+      switch (typeRepresentation) {
+        case TypeRepresentation.explicit:
+        case TypeRepresentation.legacy:
+        case TypeRepresentation.implicitUndetermined:
+          return '!';
+        case TypeRepresentation.nonNullableByDefault:
+          return '';
+      }
+      break;
     case Nullability.nullable:
       return '?';
     case Nullability.undetermined:
-      return '%';
+      switch (typeRepresentation) {
+        case TypeRepresentation.implicitUndetermined:
+          return '';
+        default:
+          return '%';
+      }
+      break;
     case Nullability.legacy:
-      return isNonNullableByDefault ? '*' : '';
+      switch (typeRepresentation) {
+        case TypeRepresentation.legacy:
+          return '';
+        case TypeRepresentation.explicit:
+        case TypeRepresentation.nonNullableByDefault:
+        case TypeRepresentation.implicitUndetermined:
+          return '*';
+      }
+      break;
   }
   throw new UnsupportedError('Unexpected nullability: $nullability.');
 }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 59c95bc..9901425 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -130,6 +130,8 @@
 CyclicClassHierarchy/script2: Fail # We report an error for each class involved in the cycle.
 CyclicTypedef/example: Fail
 DeferredAfterPrefix/example: Fail
+DeferredExtensionImport/analyzerCode: Fail
+DeferredExtensionImport/part_wrapped_script: Fail
 DeferredPrefixDuplicated/example: Fail
 DeferredTypeAnnotation/example: Fail
 DillOutlineSummary/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index fcdaead..670a401 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -3708,6 +3708,13 @@
 ExplicitExtensionAsLvalue:
   template: "Explicit extension application cannot be a target for assignment."
 
+DeferredExtensionImport:
+  template: "Extension '#name' cannot be imported through a deferred import."
+  tip: "Try adding the `hide #name` to the import."
+  script:
+    main.dart: "import 'lib.dart' deferred as prefix;"
+    lib.dart: "extension Extension on void {}"
+
 MultipleVarianceModifiers:
   index: 97
   template: "Each type parameter can have at most one variance modifier."
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart
new file mode 100644
index 0000000..70bdad5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart
@@ -0,0 +1 @@
+() async => a b < c $? >
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.expect
new file mode 100644
index 0000000..a38a1ad
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.expect
@@ -0,0 +1,80 @@
+Problems reported:
+
+parser_test/error_recovery/issue_39202.crash:1:1: Expected a declaration, but got '('.
+() async => a b < c $? >
+^
+
+parser_test/error_recovery/issue_39202.crash:1:2: Expected a declaration, but got ')'.
+() async => a b < c $? >
+ ^
+
+parser_test/error_recovery/issue_39202.crash:1:4: A function declaration needs an explicit list of parameters.
+() async => a b < c $? >
+   ^^^^^
+
+parser_test/error_recovery/issue_39202.crash:1:13: Expected ';' after this.
+() async => a b < c $? >
+            ^
+
+parser_test/error_recovery/issue_39202.crash:1:19: Expected '>' after this.
+() async => a b < c $? >
+                  ^
+
+parser_test/error_recovery/issue_39202.crash:1:25: Expected an identifier, but got ''.
+() async => a b < c $? >
+                        ^...
+
+parser_test/error_recovery/issue_39202.crash:1:25: Expected ';' after this.
+() async => a b < c $? >
+                        ^...
+
+beginCompilationUnit(()
+  beginMetadataStar(()
+  endMetadataStar(0)
+  beginTopLevelMember(()
+    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '('., null, {token: (}], (, ()
+    handleInvalidTopLevelDeclaration(()
+  endTopLevelDeclaration())
+  beginMetadataStar())
+  endMetadataStar(0)
+  beginTopLevelMember())
+    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got ')'., null, {token: )}], ), ))
+    handleInvalidTopLevelDeclaration())
+  endTopLevelDeclaration(async)
+  beginMetadataStar(async)
+  endMetadataStar(0)
+  beginTopLevelMember(async)
+    beginTopLevelMethod(), null)
+      handleNoType())
+      handleIdentifier(async, topLevelFunctionDeclaration)
+      handleNoTypeVariables(=>)
+      handleRecoverableError(MissingFunctionParameters, async, async)
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      handleIdentifier(a, expression)
+      handleNoTypeArguments(b)
+      handleNoArguments(b)
+      handleSend(a, b)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], a, a)
+      handleExpressionFunctionBody(=>, ;)
+    endTopLevelMethod(async, null, ;)
+  endTopLevelDeclaration(b)
+  beginMetadataStar(b)
+  endMetadataStar(0)
+  beginTopLevelMember(b)
+    handleIdentifier(b, typeReference)
+    beginTypeArguments(<)
+      handleIdentifier(c, typeReference)
+      handleNoTypeArguments($)
+      handleType(c, null)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}], c, c)
+    endTypeArguments(1, <, >)
+    handleType(b, null)
+    handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ''., null, {token: }], , )
+    handleIdentifier(, topLevelVariableDeclaration)
+    handleNoFieldInitializer()
+    handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], , )
+  endTopLevelFields(null, null, null, null, 1, b, ;)
+endTopLevelDeclaration()
+endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.intertwined.expect
new file mode 100644
index 0000000..7698ac7
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.intertwined.expect
@@ -0,0 +1,103 @@
+parseUnit(()
+  skipErrorTokens(()
+  listener: beginCompilationUnit(()
+  syntheticPreviousToken(()
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(()
+      listener: endMetadataStar(0)
+    listener: beginTopLevelMember(()
+    parseInvalidTopLevelDeclaration()
+      reportRecoverableErrorWithToken((, Instance of 'Template<(Token) => Message>')
+        listener: handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '('., null, {token: (}], (, ()
+      listener: handleInvalidTopLevelDeclaration(()
+  listener: endTopLevelDeclaration())
+  parseTopLevelDeclarationImpl((, Instance of 'DirectiveContext')
+    parseMetadataStar(()
+      listener: beginMetadataStar())
+      listener: endMetadataStar(0)
+    listener: beginTopLevelMember())
+    parseInvalidTopLevelDeclaration(()
+      reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
+        listener: handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got ')'., null, {token: )}], ), ))
+      listener: handleInvalidTopLevelDeclaration())
+  listener: endTopLevelDeclaration(async)
+  parseTopLevelDeclarationImpl(), Instance of 'DirectiveContext')
+    parseMetadataStar())
+      listener: beginMetadataStar(async)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl())
+      listener: beginTopLevelMember(async)
+      parseTopLevelMethod(), null, ), Instance of 'NoType', null, async)
+        listener: beginTopLevelMethod(), null)
+        listener: handleNoType())
+        ensureIdentifier(), topLevelFunctionDeclaration)
+          listener: handleIdentifier(async, topLevelFunctionDeclaration)
+        parseMethodTypeVar(async)
+          listener: handleNoTypeVariables(=>)
+        parseGetterOrFormalParameters(async, async, false, MemberKind.TopLevelMethod)
+          missingParameterMessage(MemberKind.TopLevelMethod)
+          reportRecoverableError(async, MissingFunctionParameters)
+            listener: handleRecoverableError(MissingFunctionParameters, async, async)
+          rewriter()
+          parseFormalParametersRest((, MemberKind.TopLevelMethod)
+            listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+            listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          parseExpressionFunctionBody(=>, false)
+            parseExpression(=>)
+              parsePrecedenceExpression(=>, 1, true)
+                parseUnaryExpression(=>, true)
+                  parsePrimary(=>, expression)
+                    parseSendOrFunctionLiteral(=>, expression)
+                      parseSend(=>, expression)
+                        ensureIdentifier(=>, expression)
+                          listener: handleIdentifier(a, expression)
+                        listener: handleNoTypeArguments(b)
+                        parseArgumentsOpt(a)
+                          listener: handleNoArguments(b)
+                        listener: handleSend(a, b)
+            ensureSemicolon(a)
+              reportRecoverableError(a, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
+                listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], a, a)
+              rewriter()
+            listener: handleExpressionFunctionBody(=>, ;)
+            inGenerator()
+        listener: endTopLevelMethod(async, null, ;)
+  listener: endTopLevelDeclaration(b)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(b)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(b)
+      parseFields(;, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', $, DeclarationKind.TopLevel)
+        ensureIdentifier(;, typeReference)
+          listener: handleIdentifier(b, typeReference)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(c, typeReference)
+        listener: handleNoTypeArguments($)
+        listener: handleType(c, null)
+        reportRecoverableError(c, Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}])
+          listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}], c, c)
+        listener: endTypeArguments(1, <, >)
+        listener: handleType(b, null)
+        ensureIdentifier(>, topLevelVariableDeclaration)
+          insertSyntheticIdentifier(>, topLevelVariableDeclaration, message: Message[ExpectedIdentifier, Expected an identifier, but got ''., null, {token: }], messageOnToken: null)
+            reportRecoverableError(, Message[ExpectedIdentifier, Expected an identifier, but got ''., null, {token: }])
+              listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ''., null, {token: }], , )
+            rewriter()
+          listener: handleIdentifier(, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(, , null, null, DeclarationKind.TopLevel)
+          listener: handleNoFieldInitializer()
+        ensureSemicolon()
+          reportRecoverableError(, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
+            listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], , )
+          rewriter()
+        listener: endTopLevelFields(null, null, null, null, 1, b, ;)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(()
+  listener: endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.parser.expect
new file mode 100644
index 0000000..7ea04bc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.parser.expect
@@ -0,0 +1,5 @@
+NOTICE: Stream was rewritten by parser!
+
+() async ()=> a ;b < c $? >;
+
+([BeginToken])[SimpleToken] async[KeywordToken] ([SyntheticBeginToken])[SyntheticToken]=>[SimpleToken] a[StringToken] ;[SyntheticToken]b[StringToken] <[BeginToken] c[StringToken] $[StringToken]?[SimpleToken] >[SimpleToken][SyntheticStringToken];[SyntheticToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.scanner.expect
new file mode 100644
index 0000000..f6ab542
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39202.crash_dart.scanner.expect
@@ -0,0 +1,3 @@
+() async => a b < c $? >
+
+([BeginToken])[SimpleToken] async[KeywordToken] =>[SimpleToken] a[StringToken] b[StringToken] <[BeginToken] c[StringToken] $[StringToken]?[SimpleToken] >[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart
new file mode 100644
index 0000000..b3588d2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart
@@ -0,0 +1,5 @@
+class C {
+  C()
+    /
+    : super();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
new file mode 100644
index 0000000..4d40dc0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
@@ -0,0 +1,70 @@
+Problems reported:
+
+parser_test/error_recovery/issue_39230.crash:3:5: Expected a function body, but got '/'.
+    /
+    ^
+
+parser_test/error_recovery/issue_39230.crash:3:5: Operator declarations must be preceded by the keyword 'operator'.
+    /
+    ^
+
+parser_test/error_recovery/issue_39230.crash:3:5: A method declaration needs an explicit list of parameters.
+    /
+    ^
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(C, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, C)
+      handleNoType(C)
+      handleClassExtends(null)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, null, null, null, null, C)
+            handleNoType({)
+            handleIdentifier(C, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '/'., null, {token: /}], /, /)
+            handleInvalidFunctionBody({)
+          endClassConstructor(null, C, (, null, })
+        endMember()
+        beginMetadataStar(/)
+        endMetadataStar(0)
+        beginMember()
+          handleRecoverableError(MissingOperatorKeyword, /, /)
+          beginMethod(null, null, null, null, null, operator)
+            handleNoType(})
+            handleOperatorName(operator, /)
+            handleNoTypeVariables(:)
+            handleRecoverableError(MissingMethodParameters, /, /)
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            beginInitializers(:)
+              beginInitializer(super)
+                handleSuperExpression(super, expression)
+                handleNoTypeArguments(()
+                beginArguments(()
+                endArguments(0, (, ))
+                handleSend(super, ;)
+              endInitializer(;)
+            endInitializers(1, :, ;)
+            handleAsyncModifier(null, null)
+            handleEmptyFunctionBody(;)
+          endClassMethod(null, operator, (, :, ;)
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 2, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
new file mode 100644
index 0000000..1712509
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
@@ -0,0 +1,124 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(C, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, C)
+        parseClass(C, class, class, C)
+          parseClassHeaderOpt(C, class, class)
+            parseClassExtendsOpt(C)
+              listener: handleNoType(C)
+              listener: handleClassExtends(null)
+            parseWithClauseOpt(C)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(C)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, C)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+              parseMetadataStar({)
+                listener: beginMetadataStar(C)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseMethod({, null, null, null, null, null, {, Instance of 'NoType', null, C, DeclarationKind.Class, C)
+                listener: beginMethod(null, null, null, null, null, C)
+                listener: handleNoType({)
+                ensureIdentifier({, methodDeclaration)
+                  listener: handleIdentifier(C, methodDeclaration)
+                parseQualifiedRestOpt(C, methodDeclarationContinuation)
+                parseMethodTypeVar(C)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(C, C, false, MemberKind.NonStaticMethod)
+                  parseFormalParameters(C, MemberKind.NonStaticMethod)
+                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                      listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  ensureBlock(), Instance of 'Template<(Token) => Message>', null)
+                    reportRecoverableError(/, Message[ExpectedFunctionBody, Expected a function body, but got '/'., null, {token: /}])
+                      listener: handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '/'., null, {token: /}], /, /)
+                    insertBlock())
+                      rewriter()
+                      rewriter()
+                  listener: handleInvalidFunctionBody({)
+                listener: endClassConstructor(null, C, (, null, })
+              listener: endMember()
+            notEofOrValue(}, /)
+            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+              parseMetadataStar(})
+                listener: beginMetadataStar(/)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              recoverFromInvalidMember(}, }, null, null, null, null, null, }, Instance of 'NoType', null, DeclarationKind.Class, C)
+                parseInvalidOperatorDeclaration(}, null, null, null, null, null, }, DeclarationKind.Class, C)
+                  reportRecoverableError(/, MissingOperatorKeyword)
+                    listener: handleRecoverableError(MissingOperatorKeyword, /, /)
+                  rewriter()
+                  parseMethod(}, null, null, null, null, null, }, Instance of 'NoType', null, operator, DeclarationKind.Class, C)
+                    listener: beginMethod(null, null, null, null, null, operator)
+                    listener: handleNoType(})
+                    parseOperatorName(})
+                      listener: handleOperatorName(operator, /)
+                    parseMethodTypeVar(/)
+                      listener: handleNoTypeVariables(:)
+                    parseGetterOrFormalParameters(/, operator, false, MemberKind.NonStaticMethod)
+                      missingParameterMessage(MemberKind.NonStaticMethod)
+                      reportRecoverableError(/, MissingMethodParameters)
+                        listener: handleRecoverableError(MissingMethodParameters, /, /)
+                      rewriter()
+                      parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                        listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                        listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                    parseInitializersOpt())
+                      parseInitializers(:)
+                        listener: beginInitializers(:)
+                        parseInitializer(:)
+                          listener: beginInitializer(super)
+                          parseSuperInitializerExpression(:)
+                            parseInitializerExpressionRest(:)
+                              parseExpression(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseSuperExpression(:, expression)
+                                        listener: handleSuperExpression(super, expression)
+                                        listener: handleNoTypeArguments(()
+                                        parseArguments(super)
+                                          parseArgumentsRest(()
+                                            listener: beginArguments(()
+                                            listener: endArguments(0, (, ))
+                                        listener: handleSend(super, ;)
+                              listener: endInitializer(;)
+                        listener: endInitializers(1, :, ;)
+                    parseAsyncModifierOpt())
+                      listener: handleAsyncModifier(null, null)
+                      inPlainSync()
+                    inPlainSync()
+                    parseFunctionBody(), false, true)
+                      listener: handleEmptyFunctionBody(;)
+                    listener: endClassMethod(null, operator, (, :, ;)
+                  listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 2, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.parser.expect
new file mode 100644
index 0000000..1be4be4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.parser.expect
@@ -0,0 +1,15 @@
+NOTICE: Stream was rewritten by parser!
+
+class C {
+C()
+{}operator/
+(): super();
+}
+
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+C[StringToken]([BeginToken])[SimpleToken]
+{[SyntheticBeginToken]}[SyntheticToken]operator[SyntheticKeywordToken]/[SimpleToken]
+([SyntheticBeginToken])[SyntheticToken]:[SimpleToken] super[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.scanner.expect
new file mode 100644
index 0000000..448d455
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.scanner.expect
@@ -0,0 +1,13 @@
+class C {
+C()
+/
+: super();
+}
+
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+C[StringToken]([BeginToken])[SimpleToken]
+/[SimpleToken]
+:[SimpleToken] super[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart
new file mode 100644
index 0000000..6654bf6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart
@@ -0,0 +1,3 @@
+void test(C x) {
+  x..f()!.g()..h();
+}
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
new file mode 100644
index 0000000..afb33dd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
@@ -0,0 +1,53 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(test, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(C, typeReference)
+          handleNoTypeArguments(x)
+          handleType(C, null)
+          handleIdentifier(x, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        handleIdentifier(x, expression)
+        handleNoTypeArguments(..)
+        handleNoArguments(..)
+        handleSend(x, ..)
+        beginCascade(..)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, !)
+        endBinaryExpression(..)
+        handleNonNullAssertExpression(!)
+        handleIdentifier(g, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(g, ..)
+      endBinaryExpression(.)
+    endCascade()
+    beginCascade(..)
+      handleIdentifier(h, expressionContinuation)
+      handleNoTypeArguments(()
+      beginArguments(()
+      endArguments(0, (, ))
+      handleSend(h, ;)
+    endBinaryExpression(..)
+  endCascade()
+  handleExpressionStatement(;)
+endBlockFunctionBody(1, {, })
+endTopLevelMethod(void, null, })
+endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
new file mode 100644
index 0000000..f60f894
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
@@ -0,0 +1,109 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, test)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifier(void, topLevelFunctionDeclaration)
+          listener: handleIdentifier(test, topLevelFunctionDeclaration)
+        parseMethodTypeVar(test)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(test, test, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(test, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(C)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(C, typeReference)
+                listener: handleNoTypeArguments(x)
+                listener: handleType(C, null)
+                ensureIdentifier(C, formalParameterDeclaration)
+                  listener: handleIdentifier(x, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, x)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                looksLikeLocalFunction(x)
+                parseExpressionStatement({)
+                  parseExpression({)
+                    parsePrecedenceExpression({, 1, true)
+                      parseUnaryExpression({, true)
+                        parsePrimary({, expression)
+                          parseSendOrFunctionLiteral({, expression)
+                            parseSend({, expression)
+                              ensureIdentifier({, expression)
+                                listener: handleIdentifier(x, expression)
+                              listener: handleNoTypeArguments(..)
+                              parseArgumentsOpt(x)
+                                listener: handleNoArguments(..)
+                              listener: handleSend(x, ..)
+                      parseCascadeExpression(x)
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(f, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(f)
+                            parseArguments(f)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(f, !)
+                        listener: endBinaryExpression(..)
+                        listener: handleNonNullAssertExpression(!)
+                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(g, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(g)
+                            parseArguments(g)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(g, ..)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                      parseCascadeExpression())
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(h, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(h)
+                            parseArguments(h)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(h, ;)
+                        listener: endBinaryExpression(..)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.parser.expect
new file mode 100644
index 0000000..1fc6db3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.parser.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f()!.g()..h();
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.scanner.expect
new file mode 100644
index 0000000..1fc6db3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.scanner.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f()!.g()..h();
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart
new file mode 100644
index 0000000..91b5943
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart
@@ -0,0 +1,3 @@
+void test(C x) {
+  x..f()!.g()['Hi!']!..h()!.y = 2;
+}
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
new file mode 100644
index 0000000..a71a466
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(test, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(C, typeReference)
+          handleNoTypeArguments(x)
+          handleType(C, null)
+          handleIdentifier(x, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        handleIdentifier(x, expression)
+        handleNoTypeArguments(..)
+        handleNoArguments(..)
+        handleSend(x, ..)
+        beginCascade(..)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, !)
+        endBinaryExpression(..)
+        handleNonNullAssertExpression(!)
+        handleIdentifier(g, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(g, [)
+      endBinaryExpression(.)
+      beginLiteralString('Hi!')
+      endLiteralString(0, ])
+      handleIndexedExpression([, ])
+      handleNonNullAssertExpression(!)
+    endCascade()
+    beginCascade(..)
+      handleIdentifier(h, expressionContinuation)
+      handleNoTypeArguments(()
+      beginArguments(()
+      endArguments(0, (, ))
+      handleSend(h, !)
+    endBinaryExpression(..)
+    handleNonNullAssertExpression(!)
+    handleIdentifier(y, expressionContinuation)
+    handleNoTypeArguments(=)
+    handleNoArguments(=)
+    handleSend(y, =)
+  endBinaryExpression(.)
+  handleLiteralInt(2)
+  handleAssignmentExpression(=)
+endCascade()
+handleExpressionStatement(;)
+endBlockFunctionBody(1, {, })
+endTopLevelMethod(void, null, })
+endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
new file mode 100644
index 0000000..8f51899
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
@@ -0,0 +1,138 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, test)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifier(void, topLevelFunctionDeclaration)
+          listener: handleIdentifier(test, topLevelFunctionDeclaration)
+        parseMethodTypeVar(test)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(test, test, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(test, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(C)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(C, typeReference)
+                listener: handleNoTypeArguments(x)
+                listener: handleType(C, null)
+                ensureIdentifier(C, formalParameterDeclaration)
+                  listener: handleIdentifier(x, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, x)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                looksLikeLocalFunction(x)
+                parseExpressionStatement({)
+                  parseExpression({)
+                    parsePrecedenceExpression({, 1, true)
+                      parseUnaryExpression({, true)
+                        parsePrimary({, expression)
+                          parseSendOrFunctionLiteral({, expression)
+                            parseSend({, expression)
+                              ensureIdentifier({, expression)
+                                listener: handleIdentifier(x, expression)
+                              listener: handleNoTypeArguments(..)
+                              parseArgumentsOpt(x)
+                                listener: handleNoArguments(..)
+                              listener: handleSend(x, ..)
+                      parseCascadeExpression(x)
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(f, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(f)
+                            parseArguments(f)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(f, !)
+                        listener: endBinaryExpression(..)
+                        listener: handleNonNullAssertExpression(!)
+                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(g, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(g)
+                            parseArguments(g)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(g, [)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                          parseExpression([)
+                            parsePrecedenceExpression([, 1, true)
+                              parseUnaryExpression([, true)
+                                parsePrimary([, expression)
+                                  parseLiteralString([)
+                                    parseSingleLiteralString([)
+                                      listener: beginLiteralString('Hi!')
+                                      listener: endLiteralString(0, ])
+                          listener: handleIndexedExpression([, ])
+                        listener: handleNonNullAssertExpression(!)
+                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                      parseCascadeExpression(!)
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(h, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(h)
+                            parseArguments(h)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(h, !)
+                        listener: endBinaryExpression(..)
+                        listener: handleNonNullAssertExpression(!)
+                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(y, expressionContinuation)
+                          listener: handleNoTypeArguments(=)
+                          parseArgumentsOpt(y)
+                            listener: handleNoArguments(=)
+                          listener: handleSend(y, =)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(y, Instance of 'NoTypeParamOrArg')
+                        parseArgumentOrIndexStar(y, Instance of 'NoTypeParamOrArg')
+                        parseExpressionWithoutCascade(=)
+                          parsePrecedenceExpression(=, 1, false)
+                            parseUnaryExpression(=, false)
+                              parsePrimary(=, expression)
+                                parseLiteralInt(=)
+                                  listener: handleLiteralInt(2)
+                        listener: handleAssignmentExpression(=)
+                        listener: endCascade()
+                  ensureSemicolon(2)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.parser.expect
new file mode 100644
index 0000000..e51c80d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.parser.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f()!.g()['Hi!']!..h()!.y = 2;
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken][[BeginToken]'Hi!'[StringToken]][SimpleToken]![SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]y[StringToken] =[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.scanner.expect
new file mode 100644
index 0000000..e51c80d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.scanner.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f()!.g()['Hi!']!..h()!.y = 2;
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken][[BeginToken]'Hi!'[StringToken]][SimpleToken]![SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken]![SimpleToken].[SimpleToken]y[StringToken] =[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart
new file mode 100644
index 0000000..a5914bb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart
@@ -0,0 +1,3 @@
+void test(C x) {
+  x..f().g()['Hi!']..h().y = 2;
+}
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
new file mode 100644
index 0000000..9af77f2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
@@ -0,0 +1,62 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(test, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(C, typeReference)
+          handleNoTypeArguments(x)
+          handleType(C, null)
+          handleIdentifier(x, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        handleIdentifier(x, expression)
+        handleNoTypeArguments(..)
+        handleNoArguments(..)
+        handleSend(x, ..)
+        beginCascade(..)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, .)
+        endBinaryExpression(..)
+        handleIdentifier(g, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(g, [)
+      endBinaryExpression(.)
+      beginLiteralString('Hi!')
+      endLiteralString(0, ])
+      handleIndexedExpression([, ])
+    endCascade()
+    beginCascade(..)
+      handleIdentifier(h, expressionContinuation)
+      handleNoTypeArguments(()
+      beginArguments(()
+      endArguments(0, (, ))
+      handleSend(h, .)
+    endBinaryExpression(..)
+    handleIdentifier(y, expressionContinuation)
+    handleNoTypeArguments(=)
+    handleNoArguments(=)
+    handleSend(y, =)
+  endBinaryExpression(.)
+  handleLiteralInt(2)
+  handleAssignmentExpression(=)
+endCascade()
+handleExpressionStatement(;)
+endBlockFunctionBody(1, {, })
+endTopLevelMethod(void, null, })
+endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
new file mode 100644
index 0000000..7e37571
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
@@ -0,0 +1,132 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, test)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifier(void, topLevelFunctionDeclaration)
+          listener: handleIdentifier(test, topLevelFunctionDeclaration)
+        parseMethodTypeVar(test)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(test, test, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(test, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(C)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(C, typeReference)
+                listener: handleNoTypeArguments(x)
+                listener: handleType(C, null)
+                ensureIdentifier(C, formalParameterDeclaration)
+                  listener: handleIdentifier(x, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, x)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                looksLikeLocalFunction(x)
+                parseExpressionStatement({)
+                  parseExpression({)
+                    parsePrecedenceExpression({, 1, true)
+                      parseUnaryExpression({, true)
+                        parsePrimary({, expression)
+                          parseSendOrFunctionLiteral({, expression)
+                            parseSend({, expression)
+                              ensureIdentifier({, expression)
+                                listener: handleIdentifier(x, expression)
+                              listener: handleNoTypeArguments(..)
+                              parseArgumentsOpt(x)
+                                listener: handleNoArguments(..)
+                              listener: handleSend(x, ..)
+                      parseCascadeExpression(x)
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(f, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(f)
+                            parseArguments(f)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(f, .)
+                        listener: endBinaryExpression(..)
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(g, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(g)
+                            parseArguments(g)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(g, [)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                          parseExpression([)
+                            parsePrecedenceExpression([, 1, true)
+                              parseUnaryExpression([, true)
+                                parsePrimary([, expression)
+                                  parseLiteralString([)
+                                    parseSingleLiteralString([)
+                                      listener: beginLiteralString('Hi!')
+                                      listener: endLiteralString(0, ])
+                          listener: handleIndexedExpression([, ])
+                        parseArgumentOrIndexStar(], Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                      parseCascadeExpression(])
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(h, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(h)
+                            parseArguments(h)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(h, .)
+                        listener: endBinaryExpression(..)
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(y, expressionContinuation)
+                          listener: handleNoTypeArguments(=)
+                          parseArgumentsOpt(y)
+                            listener: handleNoArguments(=)
+                          listener: handleSend(y, =)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(y, Instance of 'NoTypeParamOrArg')
+                        parseArgumentOrIndexStar(y, Instance of 'NoTypeParamOrArg')
+                        parseExpressionWithoutCascade(=)
+                          parsePrecedenceExpression(=, 1, false)
+                            parseUnaryExpression(=, false)
+                              parsePrimary(=, expression)
+                                parseLiteralInt(=)
+                                  listener: handleLiteralInt(2)
+                        listener: handleAssignmentExpression(=)
+                        listener: endCascade()
+                  ensureSemicolon(2)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.parser.expect
new file mode 100644
index 0000000..1739363
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.parser.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f().g()['Hi!']..h().y = 2;
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken][[BeginToken]'Hi!'[StringToken]][SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken].[SimpleToken]y[StringToken] =[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.scanner.expect
new file mode 100644
index 0000000..1739363
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.scanner.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f().g()['Hi!']..h().y = 2;
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken][[BeginToken]'Hi!'[StringToken]][SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken].[SimpleToken]y[StringToken] =[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart
new file mode 100644
index 0000000..738829b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart
@@ -0,0 +1,3 @@
+void test(C x) {
+  x..f().g()..h();
+}
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
new file mode 100644
index 0000000..fc20249
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
@@ -0,0 +1,52 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(test, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(C, typeReference)
+          handleNoTypeArguments(x)
+          handleType(C, null)
+          handleIdentifier(x, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        handleIdentifier(x, expression)
+        handleNoTypeArguments(..)
+        handleNoArguments(..)
+        handleSend(x, ..)
+        beginCascade(..)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, .)
+        endBinaryExpression(..)
+        handleIdentifier(g, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(g, ..)
+      endBinaryExpression(.)
+    endCascade()
+    beginCascade(..)
+      handleIdentifier(h, expressionContinuation)
+      handleNoTypeArguments(()
+      beginArguments(()
+      endArguments(0, (, ))
+      handleSend(h, ;)
+    endBinaryExpression(..)
+  endCascade()
+  handleExpressionStatement(;)
+endBlockFunctionBody(1, {, })
+endTopLevelMethod(void, null, })
+endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
new file mode 100644
index 0000000..478a8f6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
@@ -0,0 +1,107 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, test)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifier(void, topLevelFunctionDeclaration)
+          listener: handleIdentifier(test, topLevelFunctionDeclaration)
+        parseMethodTypeVar(test)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(test, test, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(test, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(C)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(C, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(C, typeReference)
+                listener: handleNoTypeArguments(x)
+                listener: handleType(C, null)
+                ensureIdentifier(C, formalParameterDeclaration)
+                  listener: handleIdentifier(x, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, x)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                looksLikeLocalFunction(x)
+                parseExpressionStatement({)
+                  parseExpression({)
+                    parsePrecedenceExpression({, 1, true)
+                      parseUnaryExpression({, true)
+                        parsePrimary({, expression)
+                          parseSendOrFunctionLiteral({, expression)
+                            parseSend({, expression)
+                              ensureIdentifier({, expression)
+                                listener: handleIdentifier(x, expression)
+                              listener: handleNoTypeArguments(..)
+                              parseArgumentsOpt(x)
+                                listener: handleNoArguments(..)
+                              listener: handleSend(x, ..)
+                      parseCascadeExpression(x)
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(f, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(f)
+                            parseArguments(f)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(f, .)
+                        listener: endBinaryExpression(..)
+                        parseSend(., expressionContinuation)
+                          ensureIdentifier(., expressionContinuation)
+                            listener: handleIdentifier(g, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(g)
+                            parseArguments(g)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(g, ..)
+                        listener: endBinaryExpression(.)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                      parseCascadeExpression())
+                        listener: beginCascade(..)
+                        parseSend(.., expressionContinuation)
+                          ensureIdentifier(.., expressionContinuation)
+                            listener: handleIdentifier(h, expressionContinuation)
+                          listener: handleNoTypeArguments(()
+                          parseArgumentsOpt(h)
+                            parseArguments(h)
+                              parseArgumentsRest(()
+                                listener: beginArguments(()
+                                listener: endArguments(0, (, ))
+                          listener: handleSend(h, ;)
+                        listener: endBinaryExpression(..)
+                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+                        listener: endCascade()
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.parser.expect
new file mode 100644
index 0000000..7ee59bd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.parser.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f().g()..h();
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.scanner.expect
new file mode 100644
index 0000000..7ee59bd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.scanner.expect
@@ -0,0 +1,9 @@
+void test(C x) {
+x..f().g()..h();
+}
+
+
+void[KeywordToken] test[StringToken]([BeginToken]C[StringToken] x[StringToken])[SimpleToken] {[BeginToken]
+x[StringToken]..[SimpleToken]f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]g[StringToken]([BeginToken])[SimpleToken]..[SimpleToken]h[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39326.dart b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart
new file mode 100644
index 0000000..e00ed60
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart
@@ -0,0 +1,4 @@
+main() {
+  var c;
+  c?.[1] = 42;
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.expect
new file mode 100644
index 0000000..6a23a5b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.expect
@@ -0,0 +1,34 @@
+beginCompilationUnit(main)
+  beginMetadataStar(main)
+  endMetadataStar(0)
+  beginTopLevelMember(main)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleNoType(var)
+        beginVariablesDeclaration(c, null, var)
+          handleIdentifier(c, localVariableDeclaration)
+          beginInitializedIdentifier(c)
+            handleNoVariableInitializer(;)
+          endInitializedIdentifier(c)
+        endVariablesDeclaration(1, ;)
+        handleIdentifier(c, expression)
+        handleNoTypeArguments(?.[)
+        handleNoArguments(?.[)
+        handleSend(c, ?.[)
+        handleLiteralInt(1)
+        handleIndexedExpression(?.[, ])
+        handleLiteralInt(42)
+        handleAssignmentExpression(=)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(main, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.intertwined.expect
new file mode 100644
index 0000000..337ef55
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.intertwined.expect
@@ -0,0 +1,86 @@
+parseUnit(main)
+  skipErrorTokens(main)
+  listener: beginCompilationUnit(main)
+  syntheticPreviousToken(main)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(main)
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, main)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifier(, topLevelFunctionDeclaration)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, var)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, false)
+                looksLikeLocalFunction(c)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                listener: handleNoType(var)
+                listener: beginVariablesDeclaration(c, null, var)
+                parseVariablesDeclarationRest(var, true)
+                  parseOptionallyInitializedIdentifier(var)
+                    ensureIdentifier(var, localVariableDeclaration)
+                      listener: handleIdentifier(c, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(c)
+                    parseVariableInitializerOpt(c)
+                      listener: handleNoVariableInitializer(;)
+                    listener: endInitializedIdentifier(c)
+                  ensureSemicolon(c)
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, c)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(c)
+                parseExpressionStatement(;)
+                  parseExpression(;)
+                    parsePrecedenceExpression(;, 1, true)
+                      parseUnaryExpression(;, true)
+                        parsePrimary(;, expression)
+                          parseSendOrFunctionLiteral(;, expression)
+                            parseSend(;, expression)
+                              ensureIdentifier(;, expression)
+                                listener: handleIdentifier(c, expression)
+                              listener: handleNoTypeArguments(?.[)
+                              parseArgumentsOpt(c)
+                                listener: handleNoArguments(?.[)
+                              listener: handleSend(c, ?.[)
+                      parseArgumentOrIndexStar(c, Instance of 'NoTypeParamOrArg')
+                        parseExpression(?.[)
+                          parsePrecedenceExpression(?.[, 1, true)
+                            parseUnaryExpression(?.[, true)
+                              parsePrimary(?.[, expression)
+                                parseLiteralInt(?.[)
+                                  listener: handleLiteralInt(1)
+                        listener: handleIndexedExpression(?.[, ])
+                      parsePrecedenceExpression(=, 1, true)
+                        parseUnaryExpression(=, true)
+                          parsePrimary(=, expression)
+                            parseLiteralInt(=)
+                              listener: handleLiteralInt(42)
+                      listener: handleAssignmentExpression(=)
+                  ensureSemicolon(42)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(main)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.parser.expect
new file mode 100644
index 0000000..0eb00a3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.parser.expect
@@ -0,0 +1,9 @@
+main() {
+var c;
+c?.[1] = 42;
+}
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] c[StringToken];[SimpleToken]
+c[StringToken]?.[[BeginToken]1[StringToken]][SimpleToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.scanner.expect
new file mode 100644
index 0000000..0eb00a3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39326.dart.scanner.expect
@@ -0,0 +1,9 @@
+main() {
+var c;
+c?.[1] = 42;
+}
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] c[StringToken];[SimpleToken]
+c[StringToken]?.[[BeginToken]1[StringToken]][SimpleToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart
new file mode 100644
index 0000000..e00ed60
--- /dev/null
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart
@@ -0,0 +1,4 @@
+main() {
+  var c;
+  c?.[1] = 42;
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.expect
new file mode 100644
index 0000000..db563cb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.expect
@@ -0,0 +1,36 @@
+beginCompilationUnit(main)
+  beginMetadataStar(main)
+  endMetadataStar(0)
+  beginTopLevelMember(main)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleNoType(var)
+        beginVariablesDeclaration(c, null, var)
+          handleIdentifier(c, localVariableDeclaration)
+          beginInitializedIdentifier(c)
+            handleNoVariableInitializer(;)
+          endInitializedIdentifier(c)
+        endVariablesDeclaration(1, ;)
+        handleIdentifier(c, expression)
+        handleNoTypeArguments(?.)
+        handleNoArguments(?.)
+        handleSend(c, ?.)
+        handleNoTypeArguments([)
+        handleLiteralInt(1)
+        handleLiteralList(1, [, null, ])
+      endBinaryExpression(?.)
+      handleLiteralInt(42)
+      handleAssignmentExpression(=)
+      handleExpressionStatement(;)
+    endBlockFunctionBody(2, {, })
+  endTopLevelMethod(main, null, })
+endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.intertwined.expect
new file mode 100644
index 0000000..d5b5a6b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.intertwined.expect
@@ -0,0 +1,89 @@
+parseUnit(main)
+  skipErrorTokens(main)
+  listener: beginCompilationUnit(main)
+  syntheticPreviousToken(main)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(main)
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, main)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifier(, topLevelFunctionDeclaration)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, var)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, false)
+                looksLikeLocalFunction(c)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                listener: handleNoType(var)
+                listener: beginVariablesDeclaration(c, null, var)
+                parseVariablesDeclarationRest(var, true)
+                  parseOptionallyInitializedIdentifier(var)
+                    ensureIdentifier(var, localVariableDeclaration)
+                      listener: handleIdentifier(c, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(c)
+                    parseVariableInitializerOpt(c)
+                      listener: handleNoVariableInitializer(;)
+                    listener: endInitializedIdentifier(c)
+                  ensureSemicolon(c)
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, c)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(c)
+                parseExpressionStatement(;)
+                  parseExpression(;)
+                    parsePrecedenceExpression(;, 1, true)
+                      parseUnaryExpression(;, true)
+                        parsePrimary(;, expression)
+                          parseSendOrFunctionLiteral(;, expression)
+                            parseSend(;, expression)
+                              ensureIdentifier(;, expression)
+                                listener: handleIdentifier(c, expression)
+                              listener: handleNoTypeArguments(?.)
+                              parseArgumentsOpt(c)
+                                listener: handleNoArguments(?.)
+                              listener: handleSend(c, ?.)
+                      parsePrimary(?., expressionContinuation)
+                        listener: handleNoTypeArguments([)
+                        parseLiteralListSuffix(?., null)
+                          parseExpression([)
+                            parsePrecedenceExpression([, 1, true)
+                              parseUnaryExpression([, true)
+                                parsePrimary([, expression)
+                                  parseLiteralInt([)
+                                    listener: handleLiteralInt(1)
+                          listener: handleLiteralList(1, [, null, ])
+                      listener: endBinaryExpression(?.)
+                      parsePrecedenceExpression(=, 1, true)
+                        parseUnaryExpression(=, true)
+                          parsePrimary(=, expression)
+                            parseLiteralInt(=)
+                              listener: handleLiteralInt(42)
+                      listener: handleAssignmentExpression(=)
+                  ensureSemicolon(42)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(main)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.parser.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.parser.expect
new file mode 100644
index 0000000..ce9c907
--- /dev/null
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.parser.expect
@@ -0,0 +1,9 @@
+main() {
+var c;
+c?.[1] = 42;
+}
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] c[StringToken];[SimpleToken]
+c[StringToken]?.[SimpleToken][[BeginToken]1[StringToken]][SimpleToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.scanner.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.scanner.expect
new file mode 100644
index 0000000..ce9c907
--- /dev/null
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.scanner.expect
@@ -0,0 +1,9 @@
+main() {
+var c;
+c?.[1] = 42;
+}
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] c[StringToken];[SimpleToken]
+c[StringToken]?.[SimpleToken][[BeginToken]1[StringToken]][SimpleToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/test/explicit_creation_test.dart b/pkg/front_end/test/explicit_creation_test.dart
index 89766bd..c6d3fca 100644
--- a/pkg/front_end/test/explicit_creation_test.dart
+++ b/pkg/front_end/test/explicit_creation_test.dart
@@ -28,7 +28,7 @@
 import 'package:front_end/src/fasta/source/diet_listener.dart';
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/fasta/source/source_loader.dart';
-import 'package:front_end/src/fasta/source/stack_listener.dart';
+import 'package:front_end/src/fasta/source/stack_listener_impl.dart';
 import 'package:front_end/src/fasta/ticker.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
@@ -146,7 +146,7 @@
       : super(library, hierarchy, coreTypes, typeInferenceEngine);
 
   @override
-  StackListener createListenerInternal(
+  StackListenerImpl createListenerInternal(
       ModifierBuilder builder,
       Scope memberScope,
       Scope formalParameterScope,
diff --git a/pkg/front_end/test/extensions/data/as_show/lib.dart b/pkg/front_end/test/extensions/data/as_show/lib.dart
index e89ef0c..cfe2924 100644
--- a/pkg/front_end/test/extensions/data/as_show/lib.dart
+++ b/pkg/front_end/test/extensions/data/as_show/lib.dart
@@ -6,14 +6,14 @@
 
 /*class: Extension1:
  builder-name=Extension1,
- builder-onType=String,
+ builder-onType=int,
  extension-members=[
   method1=Extension1|method1,
   tearoff method1=Extension1|get#method1],
  extension-name=Extension1,
- extension-onType=String
+ extension-onType=int
 */
-extension Extension1 on String {
+extension Extension1 on int {
   /*member: Extension1|method1:
    builder-name=method1,
    builder-params=[#this],
@@ -27,4 +27,4 @@
    builder-params=[#this],
    member-name=Extension1|get#method1,
    member-params=[#this]*/
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/as_show/main.dart b/pkg/front_end/test/extensions/data/as_show/main.dart
index 2a7d2d1..a46ead0 100644
--- a/pkg/front_end/test/extensions/data/as_show/main.dart
+++ b/pkg/front_end/test/extensions/data/as_show/main.dart
@@ -13,8 +13,8 @@
 import 'dart:test' show Extension2;
 
 main() {
-  "".method1();
-  Extension1("").method1();
+  0.method1();
+  Extension1(0).method1();
   "".method2();
   Extension2("").method2();
 }
diff --git a/pkg/front_end/test/extensions/data/prefix/lib1.dart b/pkg/front_end/test/extensions/data/prefix/lib1.dart
new file mode 100644
index 0000000..61f96cc
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/prefix/lib1.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: scope=[HiddenExtension1,ShownExtension1]*/
+
+/*class: ShownExtension1:
+ builder-name=ShownExtension1,
+ builder-onType=String,
+ extension-members=[static staticMethod=ShownExtension1|staticMethod],
+ extension-name=ShownExtension1,
+ extension-onType=String
+*/
+extension ShownExtension1 on String {
+  /*member: ShownExtension1|staticMethod:
+   builder-name=staticMethod,
+   member-name=ShownExtension1|staticMethod
+  */
+  static void staticMethod() {}
+}
+
+/*class: HiddenExtension1:
+ builder-name=HiddenExtension1,
+ builder-onType=String,
+ extension-members=[static staticMethod=HiddenExtension1|staticMethod],
+ extension-name=HiddenExtension1,
+ extension-onType=String
+*/
+extension HiddenExtension1 on String {
+  /*member: HiddenExtension1|staticMethod:
+   builder-name=staticMethod,
+   member-name=HiddenExtension1|staticMethod
+  */
+  static void staticMethod() {}
+}
diff --git a/pkg/front_end/test/extensions/data/prefix/lib2.dart b/pkg/front_end/test/extensions/data/prefix/lib2.dart
new file mode 100644
index 0000000..be8c655
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/prefix/lib2.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: scope=[HiddenExtension2,ShownExtension2]*/
+
+/*class: HiddenExtension2:
+ builder-name=HiddenExtension2,
+ builder-onType=String,
+ extension-members=[static staticMethod=HiddenExtension2|staticMethod],
+ extension-name=HiddenExtension2,
+ extension-onType=String
+*/
+extension HiddenExtension2 on String {
+  /*member: HiddenExtension2|staticMethod:
+   builder-name=staticMethod,
+   member-name=HiddenExtension2|staticMethod
+  */
+  static void staticMethod() {}
+}
+
+/*class: ShownExtension2:
+ builder-name=ShownExtension2,
+ builder-onType=String,
+ extension-members=[static staticMethod=ShownExtension2|staticMethod],
+ extension-name=ShownExtension2,
+ extension-onType=String
+*/
+extension ShownExtension2 on String {
+  /*member: ShownExtension2|staticMethod:
+   builder-name=staticMethod,
+   member-name=ShownExtension2|staticMethod
+  */
+  static void staticMethod() {}
+}
diff --git a/pkg/front_end/test/extensions/data/prefix/lib3.dart b/pkg/front_end/test/extensions/data/prefix/lib3.dart
new file mode 100644
index 0000000..26d3b8f
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/prefix/lib3.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: scope=[ShownExtension3]*/
+
+/*class: ShownExtension3:
+ builder-name=ShownExtension3,
+ builder-onType=String,
+ extension-members=[static staticMethod=ShownExtension3|staticMethod],
+ extension-name=ShownExtension3,
+ extension-onType=String
+*/
+extension ShownExtension3 on String {
+  /*member: ShownExtension3|staticMethod:
+   builder-name=staticMethod,
+   member-name=ShownExtension3|staticMethod
+  */
+  static void staticMethod() {}
+}
diff --git a/pkg/front_end/test/extensions/data/prefix/main.dart b/pkg/front_end/test/extensions/data/prefix/main.dart
new file mode 100644
index 0000000..0090c95
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/prefix/main.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: scope=[
+ lib1.dart.ShownExtension1,
+ lib2.dart.ShownExtension2,
+ lib3.dart.ShownExtension3]
+*/
+
+import 'lib1.dart' as lib1 show ShownExtension1;
+import 'lib2.dart' as lib2 hide HiddenExtension2;
+import 'lib3.dart' as lib3;
+
+main() {
+  lib1.ShownExtension1.staticMethod();
+  lib1. /*error: errors=[Getter not found: 'HiddenExtension1'.]*/
+      HiddenExtension1.staticMethod();
+  lib2.ShownExtension2.staticMethod();
+  lib2. /*error: errors=[Getter not found: 'HiddenExtension2'.]*/
+      HiddenExtension2.staticMethod();
+  lib3.ShownExtension3.staticMethod();
+}
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 6f022ff..4da60ed 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -18,7 +18,7 @@
 import 'package:front_end/src/fasta/builder/member_builder.dart';
 import 'package:front_end/src/fasta/builder/type_builder.dart';
 import 'package:front_end/src/fasta/builder/type_variable_builder.dart';
-
+import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/testing/features.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
@@ -134,9 +134,9 @@
   @override
   Features computeLibraryValue(Id id, Library library) {
     Features features = new Features();
-    LibraryBuilder libraryBuilder =
+    SourceLibraryBuilder libraryBuilder =
         lookupLibraryBuilder(compilerResult, library);
-    libraryBuilder.scope.forEachExtension((ExtensionBuilder extension) {
+    libraryBuilder.forEachExtensionInScope((ExtensionBuilder extension) {
       LibraryBuilder library = extension.parent;
       String libraryPrefix = '';
       if (library != libraryBuilder) {
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index f9e37c9..20fe91b 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -38,7 +38,7 @@
 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
 
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
-    show LoadLibraryBuilder, UnlinkedDeclaration;
+    show LoadLibraryBuilder;
 
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
@@ -143,14 +143,10 @@
         " getter: $uri::myGetter, setter: $uri::mySetter)",
         new SuperPropertyAccessGenerator(helper, token, name, getter, setter));
     check(
-        "IndexedAccessGenerator(offset: 4, receiver: expression, index: index,"
-        " getter: $uri::myGetter, setter: $uri::mySetter)",
-        new IndexedAccessGenerator(
-            helper, token, expression, index, getter, setter));
-    check(
-        "ThisIndexedAccessGenerator(offset: 4, index: index,"
-        " getter: $uri::myGetter, setter: $uri::mySetter)",
-        new ThisIndexedAccessGenerator(helper, token, index, getter, setter));
+        "IndexedAccessGenerator(offset: 4, receiver: expression, index: index)",
+        new IndexedAccessGenerator(helper, token, expression, index));
+    check("ThisIndexedAccessGenerator(offset: 4, index: index)",
+        new ThisIndexedAccessGenerator(helper, token, index));
     check(
         "SuperIndexedAccessGenerator(offset: 4, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter)",
@@ -196,10 +192,6 @@
         new TypeUseGenerator(helper, token, declaration, "foo"));
     check("UnresolvedNameGenerator(offset: 4, name: bar)",
         new UnresolvedNameGenerator.internal(helper, token, name));
-    check(
-        "UnlinkedGenerator(offset: 4, name: foo)",
-        new UnlinkedGenerator(
-            helper, token, new UnlinkedDeclaration("foo", false, -1, null)));
     check("PrefixUseGenerator(offset: 4, prefix: myPrefix, deferred: false)",
         prefixUseGenerator);
     check(
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index 8da59a4..53b52a9c 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
@@ -45,8 +45,10 @@
     component = createMockSdkComponent();
     component.libraries.add(testLib..parent = component);
     coreTypes = new CoreTypes(component);
-    T1 = new TypeParameterType(new TypeParameter('T1', objectType));
-    T2 = new TypeParameterType(new TypeParameter('T2', objectType));
+    T1 = new TypeParameterType(
+        new TypeParameter('T1', objectType), Nullability.legacy);
+    T2 = new TypeParameterType(
+        new TypeParameter('T2', objectType), Nullability.legacy);
     classP = _addClass(_class('P'));
     classQ = _addClass(_class('Q'));
   }
@@ -96,76 +98,93 @@
   }
 
   void test_function_generic() {
-    var T = new TypeParameterType(new TypeParameter('T', objectType));
-    var U = new TypeParameterType(new TypeParameter('U', objectType));
+    var T = new TypeParameterType(
+        new TypeParameter('T', objectType), Nullability.legacy);
+    var U = new TypeParameterType(
+        new TypeParameter('U', objectType), Nullability.legacy);
     // <T>() -> dynamic <: () -> dynamic, never
     _checkConstraints(
-        new FunctionType([], dynamicType, typeParameters: [T.parameter]),
-        new FunctionType([], dynamicType),
+        new FunctionType([], dynamicType, Nullability.legacy,
+            typeParameters: [T.parameter]),
+        new FunctionType([], dynamicType, Nullability.legacy),
         null);
     // () -> dynamic <: <T>() -> dynamic, never
-    _checkConstraints(new FunctionType([], dynamicType),
-        new FunctionType([], dynamicType, typeParameters: [T.parameter]), null);
+    _checkConstraints(
+        new FunctionType([], dynamicType, Nullability.legacy),
+        new FunctionType([], dynamicType, Nullability.legacy,
+            typeParameters: [T.parameter]),
+        null);
     // <T>(T) -> T <: <U>(U) -> U, always
-    _checkConstraints(new FunctionType([T], T, typeParameters: [T.parameter]),
-        new FunctionType([U], U, typeParameters: [U.parameter]), []);
+    _checkConstraints(
+        new FunctionType([T], T, Nullability.legacy,
+            typeParameters: [T.parameter]),
+        new FunctionType([U], U, Nullability.legacy,
+            typeParameters: [U.parameter]),
+        []);
   }
 
   void test_function_parameter_mismatch() {
     // (P) -> dynamic <: () -> dynamic, never
-    _checkConstraints(new FunctionType([P], dynamicType),
-        new FunctionType([], dynamicType), null);
+    _checkConstraints(new FunctionType([P], dynamicType, Nullability.legacy),
+        new FunctionType([], dynamicType, Nullability.legacy), null);
     // () -> dynamic <: (P) -> dynamic, never
-    _checkConstraints(new FunctionType([], dynamicType),
-        new FunctionType([P], dynamicType), null);
+    _checkConstraints(new FunctionType([], dynamicType, Nullability.legacy),
+        new FunctionType([P], dynamicType, Nullability.legacy), null);
     // ([P]) -> dynamic <: () -> dynamic, always
     _checkConstraints(
-        new FunctionType([P], dynamicType, requiredParameterCount: 0),
-        new FunctionType([], dynamicType), []);
+        new FunctionType([P], dynamicType, Nullability.legacy,
+            requiredParameterCount: 0),
+        new FunctionType([], dynamicType, Nullability.legacy),
+        []);
     // () -> dynamic <: ([P]) -> dynamic, never
-    _checkConstraints(new FunctionType([], dynamicType),
-        new FunctionType([P], dynamicType, requiredParameterCount: 0), null);
+    _checkConstraints(
+        new FunctionType([], dynamicType, Nullability.legacy),
+        new FunctionType([P], dynamicType, Nullability.legacy,
+            requiredParameterCount: 0),
+        null);
     // ({x: P}) -> dynamic <: () -> dynamic, always
     _checkConstraints(
-        new FunctionType([], dynamicType,
+        new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('x', P)]),
-        new FunctionType([], dynamicType),
+        new FunctionType([], dynamicType, Nullability.legacy),
         []);
     // () -> dynamic !<: ({x: P}) -> dynamic, never
     _checkConstraints(
-        new FunctionType([], dynamicType),
-        new FunctionType([], dynamicType,
+        new FunctionType([], dynamicType, Nullability.legacy),
+        new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('x', P)]),
         null);
   }
 
   void test_function_parameter_types() {
     // (T1) -> dynamic <: (Q) -> dynamic, under constraint Q <: T1
-    _checkConstraints(new FunctionType([T1], dynamicType),
-        new FunctionType([Q], dynamicType), ['lib::Q* <: T1']);
+    _checkConstraints(
+        new FunctionType([T1], dynamicType, Nullability.legacy),
+        new FunctionType([Q], dynamicType, Nullability.legacy),
+        ['lib::Q* <: T1']);
     // ({x: T1}) -> dynamic <: ({x: Q}) -> dynamic, under constraint Q <: T1
     _checkConstraints(
-        new FunctionType([], dynamicType,
+        new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('x', T1)]),
-        new FunctionType([], dynamicType,
+        new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('x', Q)]),
         ['lib::Q* <: T1']);
   }
 
   void test_function_return_type() {
     // () -> T1 <: () -> Q, under constraint T1 <: Q
-    _checkConstraints(
-        new FunctionType([], T1), new FunctionType([], Q), ['T1 <: lib::Q*']);
+    _checkConstraints(new FunctionType([], T1, Nullability.legacy),
+        new FunctionType([], Q, Nullability.legacy), ['T1 <: lib::Q*']);
     // () -> P <: () -> void, always
-    _checkConstraints(
-        new FunctionType([], P), new FunctionType([], voidType), []);
+    _checkConstraints(new FunctionType([], P, Nullability.legacy),
+        new FunctionType([], voidType, Nullability.legacy), []);
     // () -> void <: () -> P, never
-    _checkConstraints(
-        new FunctionType([], voidType), new FunctionType([], P), null);
+    _checkConstraints(new FunctionType([], voidType, Nullability.legacy),
+        new FunctionType([], P, Nullability.legacy), null);
   }
 
   void test_function_trivial_cases() {
-    var F = new FunctionType([], dynamicType);
+    var F = new FunctionType([], dynamicType, Nullability.legacy);
     // () -> dynamic <: dynamic, always
     _checkConstraints(F, dynamicType, []);
     // () -> dynamic <: Function, always
@@ -175,7 +194,8 @@
   }
 
   void test_nonInferredParameter_subtype_any() {
-    var U = new TypeParameterType(new TypeParameter('U', _list(P)));
+    var U = new TypeParameterType(
+        new TypeParameter('U', _list(P)), Nullability.legacy);
     _checkConstraints(U, _list(T1), ['lib::P* <: T1']);
   }
 
@@ -250,10 +270,11 @@
   }
 
   DartType _iterable(DartType element) =>
-      new InterfaceType(iterableClass, [element]);
+      new InterfaceType(iterableClass, Nullability.legacy, [element]);
 
-  DartType _list(DartType element) => new InterfaceType(listClass, [element]);
+  DartType _list(DartType element) =>
+      new InterfaceType(listClass, Nullability.legacy, [element]);
 
   DartType _map(DartType key, DartType value) =>
-      new InterfaceType(mapClass, [key, value]);
+      new InterfaceType(mapClass, Nullability.legacy, [key, value]);
 }
diff --git a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
index b3c3aba..95452ab 100644
--- a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
-import 'package:kernel/ast.dart' hide Variance;
+import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -18,7 +18,6 @@
   final TypeParameter T = new TypeParameter('T');
   final TypeParameter U = new TypeParameter('U');
   final TypeParameter V = new TypeParameter('V');
-  final Class cls = new Class(name: 'C');
 
   bool check(DartType type, List<TypeParameter> typeParameters) {
     return type.accept(new IncludesTypeParametersNonCovariantly(typeParameters,
@@ -26,81 +25,123 @@
   }
 
   bool checkContravariant(DartType type, List<TypeParameter> typeParameters) {
-    return check(new FunctionType([type], const VoidType()), typeParameters);
+    return check(new FunctionType([type], const VoidType(), Nullability.legacy),
+        typeParameters);
   }
 
   NamedType named(String name, DartType type) => new NamedType(name, type);
 
   void test_function_type() {
-    expect(check(new FunctionType([tpt(T), tpt(U)], const VoidType()), [T]),
-        isFalse);
-    expect(check(new FunctionType([tpt(T), tpt(U)], const VoidType()), [U]),
-        isFalse);
-    expect(check(new FunctionType([tpt(T), tpt(U)], const VoidType()), []),
+    expect(
+        check(
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            [T]),
         isFalse);
     expect(
         check(
-            new FunctionType([], const VoidType(),
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            [U]),
+        isFalse);
+    expect(
+        check(
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            []),
+        isFalse);
+    expect(
+        check(
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             [T]),
         isFalse);
     expect(
         check(
-            new FunctionType([], const VoidType(),
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             [U]),
         isFalse);
     expect(
         check(
-            new FunctionType([], const VoidType(),
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             []),
         isFalse);
-    expect(check(new FunctionType([], tpt(T)), [T]), isTrue);
-    expect(check(new FunctionType([], tpt(T)), [U]), isFalse);
+    expect(
+        check(new FunctionType([], tpt(T), Nullability.legacy), [T]), isTrue);
+    expect(
+        check(new FunctionType([], tpt(T), Nullability.legacy), [U]), isFalse);
     expect(
         checkContravariant(
-            new FunctionType([tpt(T), tpt(U)], const VoidType()), [T]),
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            [T]),
         isTrue);
     expect(
         checkContravariant(
-            new FunctionType([tpt(T), tpt(U)], const VoidType()), [U]),
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            [U]),
         isTrue);
     expect(
         checkContravariant(
-            new FunctionType([tpt(T), tpt(U)], const VoidType()), []),
+            new FunctionType(
+                [tpt(T), tpt(U)], const VoidType(), Nullability.legacy),
+            []),
         isFalse);
     expect(
         checkContravariant(
-            new FunctionType([], const VoidType(),
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             [T]),
         isTrue);
     expect(
         checkContravariant(
-            new FunctionType([], const VoidType(),
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             [U]),
         isTrue);
     expect(
         checkContravariant(
-            new FunctionType([], const VoidType(),
+            new FunctionType([], const VoidType(), Nullability.legacy,
                 namedParameters: [named('a', tpt(T)), named('b', tpt(U))]),
             []),
         isFalse);
-    expect(checkContravariant(new FunctionType([], tpt(T)), [T]), isFalse);
-    expect(checkContravariant(new FunctionType([], tpt(T)), [U]), isFalse);
+    expect(
+        checkContravariant(
+            new FunctionType([], tpt(T), Nullability.legacy), [T]),
+        isFalse);
+    expect(
+        checkContravariant(
+            new FunctionType([], tpt(T), Nullability.legacy), [U]),
+        isFalse);
   }
 
   void test_interface_type() {
-    expect(check(new InterfaceType(cls, [tpt(T), tpt(U)]), [T]), isTrue);
-    expect(check(new InterfaceType(cls, [tpt(T), tpt(U)]), [U]), isTrue);
-    expect(check(new InterfaceType(cls, [tpt(T), tpt(U)]), []), isFalse);
-    expect(checkContravariant(new InterfaceType(cls, [tpt(T), tpt(U)]), [T]),
+    Class cls = new Class(name: 'C', typeParameters: [T, U]);
+    expect(
+        check(
+            new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), [T]),
+        isTrue);
+    expect(
+        check(
+            new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), [U]),
+        isTrue);
+    expect(
+        check(new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), []),
         isFalse);
-    expect(checkContravariant(new InterfaceType(cls, [tpt(T), tpt(U)]), [U]),
+    expect(
+        checkContravariant(
+            new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), [T]),
         isFalse);
-    expect(checkContravariant(new InterfaceType(cls, [tpt(T), tpt(U)]), []),
+    expect(
+        checkContravariant(
+            new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), [U]),
+        isFalse);
+    expect(
+        checkContravariant(
+            new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), []),
         isFalse);
   }
 
@@ -116,39 +157,74 @@
     expect(checkContravariant(tpt(T), [T, U]), isFalse);
     expect(checkContravariant(tpt(U), [T, U]), isFalse);
     expect(checkContravariant(tpt(V), [T, U]), isFalse);
+
+    // Type parameters with explicit variance do not need contravariant checks
+    // if the variance position is greater or equal to the variance of the
+    // parameter on the [Variance] lattice.
+    expect(check(tpt(T, variance: Variance.covariant), [T, U]), isTrue);
+    expect(check(tpt(T, variance: Variance.contravariant), [T, U]), isFalse);
+    expect(check(tpt(T, variance: Variance.invariant), [T, U]), isFalse);
+    expect(check(tpt(V, variance: Variance.covariant), [T, U]), isFalse);
+    expect(check(tpt(V, variance: Variance.contravariant), [T, U]), isFalse);
+    expect(check(tpt(V, variance: Variance.invariant), [T, U]), isFalse);
+    expect(checkContravariant(tpt(T, variance: Variance.covariant), [T, U]),
+        isFalse);
+    expect(checkContravariant(tpt(T, variance: Variance.contravariant), [T, U]),
+        isTrue);
+    expect(checkContravariant(tpt(T, variance: Variance.invariant), [T, U]),
+        isFalse);
+    expect(checkContravariant(tpt(V, variance: Variance.covariant), [T, U]),
+        isFalse);
+    expect(checkContravariant(tpt(V, variance: Variance.contravariant), [T, U]),
+        isFalse);
+    expect(checkContravariant(tpt(V, variance: Variance.invariant), [T, U]),
+        isFalse);
   }
 
   void test_typedef_type() {
     // typedef U F<T, U>(T x);
-    var typedefNode = new Typedef('F', new FunctionType([tpt(T)], tpt(U)),
+    var typedefNode = new Typedef(
+        'F', new FunctionType([tpt(T)], tpt(U), Nullability.legacy),
         typeParameters: [T, U]);
     expect(
         check(
-            new TypedefType(
-                typedefNode, [const DynamicType(), const DynamicType()]),
+            new TypedefType(typedefNode, Nullability.legacy,
+                [const DynamicType(), const DynamicType()]),
             [V]),
         isFalse);
     expect(
-        check(new TypedefType(typedefNode, [tpt(V), const DynamicType()]), [V]),
+        check(
+            new TypedefType(
+                typedefNode, Nullability.legacy, [tpt(V), const DynamicType()]),
+            [V]),
         isFalse);
     expect(
-        check(new TypedefType(typedefNode, [const DynamicType(), tpt(V)]), [V]),
+        check(
+            new TypedefType(
+                typedefNode, Nullability.legacy, [const DynamicType(), tpt(V)]),
+            [V]),
         isTrue);
     expect(
         checkContravariant(
-            new TypedefType(
-                typedefNode, [const DynamicType(), const DynamicType()]),
+            new TypedefType(typedefNode, Nullability.legacy,
+                [const DynamicType(), const DynamicType()]),
             [V]),
         isFalse);
     expect(
         checkContravariant(
-            new TypedefType(typedefNode, [tpt(V), const DynamicType()]), [V]),
+            new TypedefType(
+                typedefNode, Nullability.legacy, [tpt(V), const DynamicType()]),
+            [V]),
         isTrue);
     expect(
         checkContravariant(
-            new TypedefType(typedefNode, [const DynamicType(), tpt(V)]), [V]),
+            new TypedefType(
+                typedefNode, Nullability.legacy, [const DynamicType(), tpt(V)]),
+            [V]),
         isFalse);
   }
 
-  TypeParameterType tpt(TypeParameter param) => new TypeParameterType(param);
+  TypeParameterType tpt(TypeParameter param, {int variance = null}) =>
+      new TypeParameterType(param, Nullability.legacy)
+        ..parameter.variance = variance;
 }
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index b6d152f..11792bc 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
@@ -36,11 +36,12 @@
 
   void test_greatestClosure_contravariant() {
     expect(
-        greatestClosure(new FunctionType([unknownType], dynamicType))
+        greatestClosure(new FunctionType(
+                [unknownType], dynamicType, Nullability.legacy))
             .toString(),
         '(dart.core::Null?) →* dynamic');
     expect(
-        greatestClosure(new FunctionType([], dynamicType,
+        greatestClosure(new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('foo', unknownType)])).toString(),
         '({foo: dart.core::Null?}) →* dynamic');
   }
@@ -48,25 +49,27 @@
   void test_greatestClosure_contravariant_contravariant() {
     expect(
         greatestClosure(new FunctionType([
-          new FunctionType([unknownType], dynamicType)
-        ], dynamicType))
+          new FunctionType([unknownType], dynamicType, Nullability.legacy)
+        ], dynamicType, Nullability.legacy))
             .toString(),
         '((dynamic) →* dynamic) →* dynamic');
   }
 
   void test_greatestClosure_covariant() {
-    expect(greatestClosure(new FunctionType([], unknownType)).toString(),
+    expect(
+        greatestClosure(new FunctionType([], unknownType, Nullability.legacy))
+            .toString(),
         '() →* dynamic');
     expect(
-        greatestClosure(new InterfaceType(coreTypes.listClass, [unknownType]))
-            .toString(),
+        greatestClosure(new InterfaceType(
+            coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
         'dart.core::List<dynamic>*');
   }
 
   void test_greatestClosure_function_multipleUnknown() {
     expect(
         greatestClosure(new FunctionType(
-            [unknownType, unknownType], unknownType,
+            [unknownType, unknownType], unknownType, Nullability.legacy,
             namedParameters: [
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
@@ -81,10 +84,12 @@
 
   void test_leastClosure_contravariant() {
     expect(
-        leastClosure(new FunctionType([unknownType], dynamicType)).toString(),
+        leastClosure(new FunctionType(
+                [unknownType], dynamicType, Nullability.legacy))
+            .toString(),
         '(dynamic) →* dynamic');
     expect(
-        leastClosure(new FunctionType([], dynamicType,
+        leastClosure(new FunctionType([], dynamicType, Nullability.legacy,
             namedParameters: [new NamedType('foo', unknownType)])).toString(),
         '({foo: dynamic}) →* dynamic');
   }
@@ -92,24 +97,27 @@
   void test_leastClosure_contravariant_contravariant() {
     expect(
         leastClosure(new FunctionType([
-          new FunctionType([unknownType], dynamicType)
-        ], dynamicType))
+          new FunctionType([unknownType], dynamicType, Nullability.legacy)
+        ], dynamicType, Nullability.legacy))
             .toString(),
         '((dart.core::Null?) →* dynamic) →* dynamic');
   }
 
   void test_leastClosure_covariant() {
-    expect(leastClosure(new FunctionType([], unknownType)).toString(),
+    expect(
+        leastClosure(new FunctionType([], unknownType, Nullability.legacy))
+            .toString(),
         '() →* dart.core::Null?');
     expect(
-        leastClosure(new InterfaceType(coreTypes.listClass, [unknownType]))
-            .toString(),
+        leastClosure(new InterfaceType(
+            coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
         'dart.core::List<dart.core::Null?>*');
   }
 
   void test_leastClosure_function_multipleUnknown() {
     expect(
-        leastClosure(new FunctionType([unknownType, unknownType], unknownType,
+        leastClosure(new FunctionType(
+            [unknownType, unknownType], unknownType, Nullability.legacy,
             namedParameters: [
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
@@ -137,7 +145,7 @@
 
   _MockCoreTypes() {
     nullType = new InterfaceType(
-        nullClass, const <DynamicType>[], Nullability.nullable);
+        nullClass, Nullability.nullable, const <DynamicType>[]);
     new Library(Uri.parse('dart:core'),
         name: 'dart.core', classes: [listClass, nullClass, objectClass]);
   }
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index c92c98e..3d9d3b1 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -109,59 +109,65 @@
     var env = _makeEnv();
     // GLB(() -> A, () -> B) = () -> B
     expect(
-        env.getStandardLowerBound(
-            new FunctionType([], A), new FunctionType([], B)),
-        new FunctionType([], B));
+        env.getStandardLowerBound(new FunctionType([], A, Nullability.legacy),
+            new FunctionType([], B, Nullability.legacy)),
+        new FunctionType([], B, Nullability.legacy));
     // GLB(() -> void, (A, B) -> void) = ([A, B]) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType), new FunctionType([A, B], voidType)),
-        new FunctionType([A, B], voidType, requiredParameterCount: 0));
+            new FunctionType([], voidType, Nullability.legacy),
+            new FunctionType([A, B], voidType, Nullability.legacy)),
+        new FunctionType([A, B], voidType, Nullability.legacy,
+            requiredParameterCount: 0));
     expect(
         env.getStandardLowerBound(
-            new FunctionType([A, B], voidType), new FunctionType([], voidType)),
-        new FunctionType([A, B], voidType, requiredParameterCount: 0));
+            new FunctionType([A, B], voidType, Nullability.legacy),
+            new FunctionType([], voidType, Nullability.legacy)),
+        new FunctionType([A, B], voidType, Nullability.legacy,
+            requiredParameterCount: 0));
     // GLB((A) -> void, (B) -> void) = (A) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([A], voidType), new FunctionType([B], voidType)),
-        new FunctionType([A], voidType));
+            new FunctionType([A], voidType, Nullability.legacy),
+            new FunctionType([B], voidType, Nullability.legacy)),
+        new FunctionType([A], voidType, Nullability.legacy));
     expect(
         env.getStandardLowerBound(
-            new FunctionType([B], voidType), new FunctionType([A], voidType)),
-        new FunctionType([A], voidType));
+            new FunctionType([B], voidType, Nullability.legacy),
+            new FunctionType([A], voidType, Nullability.legacy)),
+        new FunctionType([A], voidType, Nullability.legacy));
     // GLB(({a: A}) -> void, ({b: B}) -> void) = ({a: A, b: B}) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('b', B)])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', A), new NamedType('b', B)]));
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('b', B)]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', A), new NamedType('b', B)]));
     // GLB(({a: A, c: A}) -> void, ({b: B, d: B}) -> void)
     //     = ({a: A, b: B, c: A, d: B}) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('c', A)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('b', B),
                   new NamedType('d', B)
                 ])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [
               new NamedType('a', A),
               new NamedType('b', B),
@@ -172,53 +178,54 @@
     //     = ({a: A, b: A}) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('b', B)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', B),
                   new NamedType('b', A)
                 ])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', A), new NamedType('b', A)]));
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', B),
                   new NamedType('b', A)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('b', B)
                 ])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', A), new NamedType('b', A)]));
     // GLB((B, {a: A}) -> void, (B) -> void) = (B, {a: A}) -> void
     expect(
         env.getStandardLowerBound(
-            new FunctionType([B], voidType,
+            new FunctionType([B], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType)),
-        new FunctionType([B], voidType,
+            new FunctionType([B], voidType, Nullability.legacy)),
+        new FunctionType([B], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', A)]));
     // GLB(({a: A}) -> void, (B) -> void) = bottom
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType)),
+            new FunctionType([B], voidType, Nullability.legacy)),
         same(bottomType));
     // GLB(({a: A}) -> void, ([B]) -> void) = bottom
     expect(
         env.getStandardLowerBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType, requiredParameterCount: 0)),
+            new FunctionType([B], voidType, Nullability.legacy,
+                requiredParameterCount: 0)),
         same(bottomType));
   }
 
@@ -226,7 +233,10 @@
     var A = coreTypes.rawType(_addClass(_class('A')), Nullability.legacy);
     var env = _makeEnv();
     expect(env.getStandardLowerBound(A, A), same(A));
-    expect(env.getStandardLowerBound(new InterfaceType(A.classNode), A), A);
+    expect(
+        env.getStandardLowerBound(
+            new InterfaceType(A.classNode, Nullability.legacy), A),
+        A);
   }
 
   void test_glb_subtype() {
@@ -392,120 +402,129 @@
     var env = _makeEnv();
     // LUB(() -> A, () -> B) = () -> A
     expect(
-        env.getStandardUpperBound(
-            new FunctionType([], A), new FunctionType([], B)),
-        new FunctionType([], A));
+        env.getStandardUpperBound(new FunctionType([], A, Nullability.legacy),
+            new FunctionType([], B, Nullability.legacy)),
+        new FunctionType([], A, Nullability.legacy));
     // LUB(([A]) -> void, (A) -> void) = Function
     expect(
         env.getStandardUpperBound(
-            new FunctionType([A], voidType, requiredParameterCount: 0),
-            new FunctionType([A], voidType)),
+            new FunctionType([A], voidType, Nullability.legacy,
+                requiredParameterCount: 0),
+            new FunctionType([A], voidType, Nullability.legacy)),
         functionType);
     // LUB(() -> void, (A, B) -> void) = Function
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType), new FunctionType([A, B], voidType)),
+            new FunctionType([], voidType, Nullability.legacy),
+            new FunctionType([A, B], voidType, Nullability.legacy)),
         functionType);
     expect(
         env.getStandardUpperBound(
-            new FunctionType([A, B], voidType), new FunctionType([], voidType)),
+            new FunctionType([A, B], voidType, Nullability.legacy),
+            new FunctionType([], voidType, Nullability.legacy)),
         functionType);
     // LUB((A) -> void, (B) -> void) = (B) -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([A], voidType), new FunctionType([B], voidType)),
-        new FunctionType([B], voidType));
+            new FunctionType([A], voidType, Nullability.legacy),
+            new FunctionType([B], voidType, Nullability.legacy)),
+        new FunctionType([B], voidType, Nullability.legacy));
     expect(
         env.getStandardUpperBound(
-            new FunctionType([B], voidType), new FunctionType([A], voidType)),
-        new FunctionType([B], voidType));
+            new FunctionType([B], voidType, Nullability.legacy),
+            new FunctionType([A], voidType, Nullability.legacy)),
+        new FunctionType([B], voidType, Nullability.legacy));
     // LUB(({a: A}) -> void, ({b: B}) -> void) = () -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('b', B)])),
-        new FunctionType([], voidType));
+        new FunctionType([], voidType, Nullability.legacy));
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('b', B)]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)])),
-        new FunctionType([], voidType));
+        new FunctionType([], voidType, Nullability.legacy));
     // LUB(({a: A, c: A}) -> void, ({b: B, d: B}) -> void) = () -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('c', A)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('b', B),
                   new NamedType('d', B)
                 ])),
-        new FunctionType([], voidType));
+        new FunctionType([], voidType, Nullability.legacy));
     // LUB(({a: A, b: B}) -> void, ({a: B, b: A}) -> void)
     //     = ({a: B, b: B}) -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('b', B)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', B),
                   new NamedType('b', A)
                 ])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', B), new NamedType('b', B)]));
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', B),
                   new NamedType('b', A)
                 ]),
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [
                   new NamedType('a', A),
                   new NamedType('b', B)
                 ])),
-        new FunctionType([], voidType,
+        new FunctionType([], voidType, Nullability.legacy,
             namedParameters: [new NamedType('a', B), new NamedType('b', B)]));
     // LUB((B, {a: A}) -> void, (B) -> void) = (B) -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([B], voidType,
+            new FunctionType([B], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType)),
-        new FunctionType([B], voidType));
+            new FunctionType([B], voidType, Nullability.legacy)),
+        new FunctionType([B], voidType, Nullability.legacy));
     // LUB(({a: A}) -> void, (B) -> void) = Function
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType)),
+            new FunctionType([B], voidType, Nullability.legacy)),
         functionType);
     // GLB(({a: A}) -> void, ([B]) -> void) = () -> void
     expect(
         env.getStandardUpperBound(
-            new FunctionType([], voidType,
+            new FunctionType([], voidType, Nullability.legacy,
                 namedParameters: [new NamedType('a', A)]),
-            new FunctionType([B], voidType, requiredParameterCount: 0)),
-        new FunctionType([], voidType));
+            new FunctionType([B], voidType, Nullability.legacy,
+                requiredParameterCount: 0)),
+        new FunctionType([], voidType, Nullability.legacy));
   }
 
   void test_lub_identical() {
     var A = coreTypes.rawType(_addClass(_class('A')), Nullability.legacy);
     var env = _makeEnv();
     expect(env.getStandardUpperBound(A, A), same(A));
-    expect(env.getStandardUpperBound(new InterfaceType(A.classNode), A), A);
+    expect(
+        env.getStandardUpperBound(
+            new InterfaceType(A.classNode, Nullability.legacy), A),
+        A);
   }
 
   void test_lub_sameClass() {
@@ -545,9 +564,9 @@
   }
 
   void test_lub_typeParameter() {
-    var T = new TypeParameterType(new TypeParameter('T'));
+    var T = new TypeParameterType(new TypeParameter('T'), Nullability.legacy);
     T.parameter.bound = _list(T);
-    var U = new TypeParameterType(new TypeParameter('U'));
+    var U = new TypeParameterType(new TypeParameter('U'), Nullability.legacy);
     U.parameter.bound = _list(bottomType);
     var env = _makeEnv();
     // LUB(T, T) = T
@@ -587,15 +606,17 @@
     // Solve(A<?> <: T <: ?) => A<?>
     expect(
         env.solveTypeConstraint(_makeConstraint(
-            lower: new InterfaceType(A.classNode, [unknownType]))),
-        new InterfaceType(A.classNode, [unknownType]));
+            lower: new InterfaceType(
+                A.classNode, Nullability.legacy, [unknownType]))),
+        new InterfaceType(A.classNode, Nullability.legacy, [unknownType]));
     // Solve(A<?> <: T <: ?, grounded) => A<Null>
     expect(
         env.solveTypeConstraint(
             _makeConstraint(
-                lower: new InterfaceType(A.classNode, [unknownType])),
+                lower: new InterfaceType(
+                    A.classNode, Nullability.legacy, [unknownType])),
             grounded: true),
-        new InterfaceType(A.classNode, [nullType]));
+        new InterfaceType(A.classNode, Nullability.legacy, [nullType]));
     // Solve(? <: T <: A) => A
     expect(env.solveTypeConstraint(_makeConstraint(upper: A)), A);
     // Solve(? <: T <: A, grounded) => A
@@ -604,15 +625,17 @@
     // Solve(? <: T <: A<?>) => A<?>
     expect(
         env.solveTypeConstraint(_makeConstraint(
-            upper: new InterfaceType(A.classNode, [unknownType]))),
-        new InterfaceType(A.classNode, [unknownType]));
+            upper: new InterfaceType(
+                A.classNode, Nullability.legacy, [unknownType]))),
+        new InterfaceType(A.classNode, Nullability.legacy, [unknownType]));
     // Solve(? <: T <: A<?>, grounded) => A<dynamic>
     expect(
         env.solveTypeConstraint(
             _makeConstraint(
-                upper: new InterfaceType(A.classNode, [unknownType])),
+                upper: new InterfaceType(
+                    A.classNode, Nullability.legacy, [unknownType])),
             grounded: true),
-        new InterfaceType(A.classNode, [dynamicType]));
+        new InterfaceType(A.classNode, Nullability.legacy, [dynamicType]));
     // Solve(B <: T <: A) => B
     expect(env.solveTypeConstraint(_makeConstraint(lower: B, upper: A)), B);
     // Solve(B <: T <: A, grounded) => B
@@ -623,41 +646,53 @@
     // Solve(B<?> <: T <: A) => A
     expect(
         env.solveTypeConstraint(_makeConstraint(
-            lower: new InterfaceType(B.classNode, [unknownType]), upper: A)),
+            lower: new InterfaceType(
+                B.classNode, Nullability.legacy, [unknownType]),
+            upper: A)),
         A);
     // Solve(B<?> <: T <: A, grounded) => A
     expect(
         env.solveTypeConstraint(
             _makeConstraint(
-                lower: new InterfaceType(B.classNode, [unknownType]), upper: A),
+                lower: new InterfaceType(
+                    B.classNode, Nullability.legacy, [unknownType]),
+                upper: A),
             grounded: true),
         A);
     // Solve(B <: T <: A<?>) => B
     expect(
         env.solveTypeConstraint(_makeConstraint(
-            lower: B, upper: new InterfaceType(A.classNode, [unknownType]))),
+            lower: B,
+            upper: new InterfaceType(
+                A.classNode, Nullability.legacy, [unknownType]))),
         B);
     // Solve(B <: T <: A<?>, grounded) => B
     expect(
         env.solveTypeConstraint(
             _makeConstraint(
-                lower: B, upper: new InterfaceType(A.classNode, [unknownType])),
+                lower: B,
+                upper: new InterfaceType(
+                    A.classNode, Nullability.legacy, [unknownType])),
             grounded: true),
         B);
     // Solve(B<?> <: T <: A<?>) => B<?>
     expect(
         env.solveTypeConstraint(_makeConstraint(
-            lower: new InterfaceType(B.classNode, [unknownType]),
-            upper: new InterfaceType(A.classNode, [unknownType]))),
-        new InterfaceType(B.classNode, [unknownType]));
+            lower: new InterfaceType(
+                B.classNode, Nullability.legacy, [unknownType]),
+            upper: new InterfaceType(
+                A.classNode, Nullability.legacy, [unknownType]))),
+        new InterfaceType(B.classNode, Nullability.legacy, [unknownType]));
     // Solve(B<?> <: T <: A<?>) => B<Null>
     expect(
         env.solveTypeConstraint(
             _makeConstraint(
-                lower: new InterfaceType(B.classNode, [unknownType]),
-                upper: new InterfaceType(A.classNode, [unknownType])),
+                lower: new InterfaceType(
+                    B.classNode, Nullability.legacy, [unknownType]),
+                upper: new InterfaceType(
+                    A.classNode, Nullability.legacy, [unknownType])),
             grounded: true),
-        new InterfaceType(B.classNode, [nullType]));
+        new InterfaceType(B.classNode, Nullability.legacy, [nullType]));
   }
 
   void test_typeConstraint_default() {
@@ -722,10 +757,10 @@
   }
 
   DartType _iterable(DartType elementType) =>
-      new InterfaceType(iterableClass, [elementType]);
+      new InterfaceType(iterableClass, Nullability.legacy, [elementType]);
 
   DartType _list(DartType elementType) =>
-      new InterfaceType(listClass, [elementType]);
+      new InterfaceType(listClass, Nullability.legacy, [elementType]);
 
   TypeConstraint _makeConstraint(
       {DartType lower: const UnknownType(),
@@ -740,5 +775,5 @@
   }
 
   DartType _map(DartType key, DartType value) =>
-      new InterfaceType(mapClass, [key, value]);
+      new InterfaceType(mapClass, Nullability.legacy, [key, value]);
 }
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
index 471b69d..8c6f5a2 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
@@ -30,26 +30,36 @@
     expect(isKnown(unknownType), isFalse);
     expect(isKnown(const DynamicType()), isTrue);
     var classA = new Class(name: 'A');
-    var A = new InterfaceType(classA);
+    var A = new InterfaceType(classA, Nullability.legacy);
     var typedefF = new Typedef('F', A);
     expect(isKnown(A), isTrue);
-    expect(isKnown(new InterfaceType(classA, [A])), isTrue);
-    expect(isKnown(new InterfaceType(classA, [unknownType])), isFalse);
-    expect(isKnown(new FunctionType([], const VoidType())), isTrue);
-    expect(isKnown(new FunctionType([], unknownType)), isFalse);
-    expect(isKnown(new FunctionType([A], const VoidType())), isTrue);
-    expect(isKnown(new FunctionType([unknownType], const VoidType())), isFalse);
+    expect(isKnown(new InterfaceType(classA, Nullability.legacy, [A])), isTrue);
     expect(
-        isKnown(new FunctionType([], const VoidType(),
+        isKnown(new InterfaceType(classA, Nullability.legacy, [unknownType])),
+        isFalse);
+    expect(isKnown(new FunctionType([], const VoidType(), Nullability.legacy)),
+        isTrue);
+    expect(isKnown(new FunctionType([], unknownType, Nullability.legacy)),
+        isFalse);
+    expect(isKnown(new FunctionType([A], const VoidType(), Nullability.legacy)),
+        isTrue);
+    expect(
+        isKnown(new FunctionType(
+            [unknownType], const VoidType(), Nullability.legacy)),
+        isFalse);
+    expect(
+        isKnown(new FunctionType([], const VoidType(), Nullability.legacy,
             namedParameters: [new NamedType('x', A)])),
         isTrue);
     expect(
-        isKnown(new FunctionType([], const VoidType(),
+        isKnown(new FunctionType([], const VoidType(), Nullability.legacy,
             namedParameters: [new NamedType('x', unknownType)])),
         isFalse);
-    expect(isKnown(new TypedefType(typedefF)), isTrue);
-    expect(isKnown(new TypedefType(typedefF, [A])), isTrue);
-    expect(isKnown(new TypedefType(typedefF, [unknownType])), isFalse);
+    expect(isKnown(new TypedefType(typedefF, Nullability.legacy)), isTrue);
+    expect(isKnown(new TypedefType(typedefF, Nullability.legacy, [A])), isTrue);
+    expect(
+        isKnown(new TypedefType(typedefF, Nullability.legacy, [unknownType])),
+        isFalse);
   }
 
   void test_ordinary_visitor_noOverrides() {
@@ -88,8 +98,8 @@
     expect(unknownType.toString(), isNot('?'));
     expect(typeSchemaToString(unknownType), '?');
     expect(
-        typeSchemaToString(
-            new FunctionType([unknownType, unknownType], unknownType)),
+        typeSchemaToString(new FunctionType(
+            [unknownType, unknownType], unknownType, Nullability.legacy)),
         '(?, ?) →* ?');
   }
 
diff --git a/pkg/front_end/test/fasta/type_promotion_look_ahead_suite.dart b/pkg/front_end/test/fasta/type_promotion_look_ahead_suite.dart
deleted file mode 100644
index 94e56f1..0000000
--- a/pkg/front_end/test/fasta/type_promotion_look_ahead_suite.dart
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:convert' show jsonDecode;
-
-import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
-
-import 'package:_fe_analyzer_shared/src/util/colors.dart' as colors;
-
-import 'package:front_end/src/base/processed_options.dart'
-    show ProcessedOptions;
-
-import 'package:front_end/src/fasta/builder/builder.dart';
-
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-
-import 'package:front_end/src/fasta/messages.dart'
-    show LocatedMessage, templateUnspecified;
-
-import 'package:front_end/src/fasta/source/type_promotion_look_ahead_listener.dart'
-    show
-        TypePromotionLookAheadListener,
-        TypePromotionState,
-        UnspecifiedDeclaration;
-
-import 'package:kernel/ast.dart' show Source;
-
-import 'package:testing/testing.dart'
-    show Chain, ChainContext, ExpectationSet, Future, Result, Step, runMe;
-
-import '../utils/kernel_chain.dart' show MatchContext;
-
-import '../utils/scanner_chain.dart' show Read, Scan, ScannedFile;
-
-const String EXPECTATIONS = '''
-[
-  {
-    "name": "ExpectationFileMismatch",
-    "group": "Fail"
-  },
-  {
-    "name": "ExpectationFileMissing",
-    "group": "Fail"
-  }
-]
-''';
-
-Future<ChainContext> createContext(
-    Chain suite, Map<String, String> environment) async {
-  CompilerContext context =
-      await CompilerContext.runWithOptions<CompilerContext>(
-          new ProcessedOptions(),
-          (CompilerContext context) =>
-              new Future<CompilerContext>.value(context),
-          errorOnMissingInput: false);
-  colors.enableColors = false;
-  return new TypePromotionLookAheadContext(
-      context, environment["updateExpectations"] == "true");
-}
-
-class TypePromotionLookAheadContext extends ChainContext with MatchContext {
-  final CompilerContext context;
-
-  final List<Step> steps = const <Step>[
-    const Read(),
-    const Scan(),
-    const TypePromotionLookAheadStep(),
-    const CheckTypePromotionResult(),
-  ];
-
-  final bool updateExpectations;
-
-  final ExpectationSet expectationSet =
-      new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
-
-  TypePromotionLookAheadContext(this.context, this.updateExpectations);
-}
-
-class TypePromotionLookAheadStep extends Step<ScannedFile, TypePromotionResult,
-    TypePromotionLookAheadContext> {
-  const TypePromotionLookAheadStep();
-
-  String get name => "Type Promotion Look Ahead";
-
-  Future<Result<TypePromotionResult>> run(
-      ScannedFile file, TypePromotionLookAheadContext context) async {
-    return context.context
-        .runInContext<Result<TypePromotionResult>>((CompilerContext c) async {
-      Uri uri = file.file.uri;
-      c.uriToSource[uri] =
-          new Source(file.result.lineStarts, file.file.bytes, uri, uri);
-      StringBuffer buffer = new StringBuffer();
-      Parser parser = new Parser(new TestListener(uri, buffer));
-      try {
-        parser.parseUnit(file.result.tokens);
-      } finally {
-        c.uriToSource.remove(uri);
-      }
-      return pass(new TypePromotionResult(uri, "$buffer"));
-    });
-  }
-}
-
-class TestState extends TypePromotionState {
-  final StringBuffer buffer;
-
-  TestState(Uri uri, this.buffer) : super(uri);
-
-  void note(String message, Token token) {
-    buffer.writeln(CompilerContext.current.format(
-        debugMessage(message, uri, token.charOffset, token.lexeme.length),
-        Severity.context));
-  }
-
-  @override
-  void checkEmpty(Token token) {
-    if (stack.isNotEmpty) {
-      throw CompilerContext.current.format(
-          debugMessage("Stack not empty", uri, token?.charOffset ?? -1,
-              token?.length ?? 1),
-          Severity.internalProblem);
-    }
-  }
-
-  @override
-  void declareIdentifier(Token token) {
-    super.declareIdentifier(token);
-    trace("Declared ${token.lexeme}", token);
-  }
-
-  @override
-  Builder nullValue(String name, Token token) {
-    return new DebugDeclaration(name, uri, token?.charOffset ?? -1);
-  }
-
-  @override
-  void registerWrite(UnspecifiedDeclaration declaration, Token token) {
-    note("Write to ${declaration.name}@${declaration.charOffset}", token);
-  }
-
-  @override
-  void registerPromotionCandidate(
-      UnspecifiedDeclaration declaration, Token token) {
-    note("Possible promotion of ${declaration.name}@${declaration.charOffset}",
-        token);
-  }
-
-  @override
-  void report(LocatedMessage message, Severity severity,
-      {List<LocatedMessage> context}) {
-    CompilerContext.current.report(message, severity, context: context);
-  }
-
-  @override
-  void trace(String message, Token token) {
-    report(
-        debugMessage(message, uri, token?.charOffset ?? -1, token?.length ?? 1),
-        Severity.warning);
-    for (Object o in stack) {
-      String s = "  $o";
-      int index = s.indexOf("\n");
-      if (index != -1) {
-        s = s.substring(0, index) + "...";
-      }
-      print(s);
-    }
-    print('------------------\n');
-  }
-}
-
-LocatedMessage debugMessage(String text, Uri uri, int offset, int length) {
-  return templateUnspecified
-      .withArguments(text)
-      .withLocation(uri, offset, length);
-}
-
-class TestListener extends TypePromotionLookAheadListener {
-  TestListener(Uri uri, StringBuffer buffer)
-      : super(new TestState(uri, buffer));
-
-  @override
-  void debugEvent(String name, Token token) {
-    state.trace(name, token);
-  }
-}
-
-class DebugDeclaration extends BuilderImpl {
-  final String name;
-
-  @override
-  final Uri fileUri;
-
-  @override
-  int charOffset;
-
-  DebugDeclaration(this.name, this.fileUri, this.charOffset);
-
-  Builder get parent => null;
-
-  String get fullNameForErrors => name;
-
-  String toString() => "<<$name@$charOffset>>";
-}
-
-class TypePromotionResult {
-  final Uri uri;
-
-  final String trace;
-
-  const TypePromotionResult(this.uri, this.trace);
-}
-
-class CheckTypePromotionResult
-    extends Step<TypePromotionResult, Null, TypePromotionLookAheadContext> {
-  const CheckTypePromotionResult();
-
-  String get name => "Check Type Promotion Result";
-
-  Future<Result<Null>> run(
-      TypePromotionResult result, TypePromotionLookAheadContext context) {
-    return context.match<Null>(
-        ".type_promotion.expect", result.trace, result.uri, null);
-  }
-}
-
-main([List<String> arguments = const []]) =>
-    runMe(arguments, createContext, configurationPath: "../../testing.json");
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser.dart b/pkg/front_end/test/fasta/types/kernel_type_parser.dart
index 3ad30a1..d9e5d85 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser.dart
@@ -178,8 +178,8 @@
       } else if (kernelArguments.length != typeVariables.length) {
         throw "Expected ${typeVariables.length} type arguments: $node";
       }
-      return new InterfaceType(declaration, kernelArguments,
-          interpretParsedNullability(node.parsedNullability));
+      return new InterfaceType(declaration,
+          interpretParsedNullability(node.parsedNullability), kernelArguments);
     } else if (declaration is TypeParameter) {
       if (arguments.isNotEmpty) {
         throw "Type variable can't have arguments (${node.name})";
@@ -189,7 +189,6 @@
           : TypeParameterType.computeNullabilityFromBound(declaration);
       TypeParameterType type = new TypeParameterType(
           declaration,
-          null,
           interpretParsedNullability(node.parsedNullability,
               ifOmitted: nullability));
       // If the nullability was omitted on the type and can't be computed from
@@ -201,8 +200,8 @@
       }
       return type;
     } else if (declaration is Typedef) {
-      return new TypedefType(declaration, kernelArguments,
-          interpretParsedNullability(node.parsedNullability));
+      return new TypedefType(declaration,
+          interpretParsedNullability(node.parsedNullability), kernelArguments);
     } else {
       throw "Unhandled ${declaration.runtimeType}";
     }
@@ -256,12 +255,12 @@
       type = node.type.accept<Node, KernelEnvironment>(this, environment);
       if (type is FunctionType) {
         FunctionType f = type;
-        type = new FunctionType(f.positionalParameters, f.returnType,
+        type = new FunctionType(
+            f.positionalParameters, f.returnType, Nullability.nonNullable,
             namedParameters: f.namedParameters,
             typeParameters: f.typeParameters,
             requiredParameterCount: f.requiredParameterCount,
-            typedefType: def.thisType,
-            nullability: Nullability.nonNullable);
+            typedefType: def.thisType);
       }
     }
     return def..type = type;
@@ -296,10 +295,10 @@
     }
     namedParameters.sort();
     return new FunctionType(positionalParameters, returnType,
+        interpretParsedNullability(node.parsedNullability),
         namedParameters: namedParameters,
         requiredParameterCount: node.arguments.required.length,
-        typeParameters: parameterEnvironment.parameters,
-        nullability: interpretParsedNullability(node.parsedNullability));
+        typeParameters: parameterEnvironment.parameters);
   }
 
   VoidType visitVoidType(ParsedVoidType node, KernelEnvironment environment) {
@@ -316,7 +315,7 @@
     TypeParameterType type =
         node.a.accept<Node, KernelEnvironment>(this, environment);
     DartType bound = node.b.accept<Node, KernelEnvironment>(this, environment);
-    return new TypeParameterType(type.parameter, bound, type.nullability);
+    return new TypeParameterType(type.parameter, type.nullability, bound);
   }
 
   Supertype toSupertype(InterfaceType type) {
@@ -341,7 +340,7 @@
       if (bound == null) {
         typeParameter
           ..bound = new InterfaceType(
-              objectClass, const <DartType>[], Nullability.nullable)
+              objectClass, Nullability.nullable, const <DartType>[])
           ..defaultType = const DynamicType();
       } else {
         DartType type =
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 4d1aa06..d95d034 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -6,7 +6,8 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import "package:kernel/ast.dart" show Class, Component, DartType, InterfaceType;
+import "package:kernel/ast.dart"
+    show Class, Component, DartType, InterfaceType, Nullability;
 
 import "package:kernel/core_types.dart";
 
@@ -82,9 +83,9 @@
     //     {N<C1<String>>, Object} for N<C1<String>> and
     // Object is the most specific type in the intersection of the supertypes.
     checkGetLegacyLeastUpperBound(
-        new InterfaceType(C1, [intType]),
-        new InterfaceType(N, [
-          new InterfaceType(C1, [stringType])
+        new InterfaceType(C1, Nullability.legacy, [intType]),
+        new InterfaceType(N, Nullability.legacy, [
+          new InterfaceType(C1, Nullability.legacy, [stringType])
         ]),
         objectType);
 
@@ -94,9 +95,9 @@
     //     {N<C2<String>>, Object} for N<C2<String>> and
     // Object is the most specific type in the intersection of the supertypes.
     checkGetLegacyLeastUpperBound(
-        new InterfaceType(C2, [intType]),
-        new InterfaceType(N, [
-          new InterfaceType(C2, [stringType])
+        new InterfaceType(C2, Nullability.legacy, [intType]),
+        new InterfaceType(N, Nullability.legacy, [
+          new InterfaceType(C2, Nullability.legacy, [stringType])
         ]),
         objectType);
   }
@@ -119,21 +120,25 @@
     Class f = getClass("F");
 
     checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, [intType, doubleType]),
-        new InterfaceType(d, [intType, doubleType]),
-        new InterfaceType(d, [intType, doubleType]));
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]));
     checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, [intType, doubleType]),
-        new InterfaceType(d, [intType, boolType]),
-        new InterfaceType(b, [intType]));
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
+        new InterfaceType(d, Nullability.legacy, [intType, boolType]),
+        new InterfaceType(b, Nullability.legacy, [intType]));
     checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, [intType, doubleType]),
-        new InterfaceType(d, [boolType, doubleType]),
-        new InterfaceType(c, [doubleType]));
-    checkGetLegacyLeastUpperBound(new InterfaceType(d, [intType, doubleType]),
-        new InterfaceType(d, [boolType, intType]), coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(e),
-        coreTypes.legacyRawType(f), new InterfaceType(b, [intType]));
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
+        new InterfaceType(d, Nullability.legacy, [boolType, doubleType]),
+        new InterfaceType(c, Nullability.legacy, [doubleType]));
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
+        new InterfaceType(d, Nullability.legacy, [boolType, intType]),
+        coreTypes.legacyRawType(a));
+    checkGetLegacyLeastUpperBound(
+        coreTypes.legacyRawType(e),
+        coreTypes.legacyRawType(f),
+        new InterfaceType(b, Nullability.legacy, [intType]));
   }
 
   Future<void> test_getLegacyLeastUpperBound_nonGeneric() async {
diff --git a/pkg/front_end/test/fasta/types/shared_type_tests.dart b/pkg/front_end/test/fasta/types/shared_type_tests.dart
index dde84e42..1217c30 100644
--- a/pkg/front_end/test/fasta/types/shared_type_tests.dart
+++ b/pkg/front_end/test/fasta/types/shared_type_tests.dart
@@ -14,7 +14,7 @@
     T supertype = toType(supertypeString, environment);
     Expect.isTrue(
         isSubtypeImpl(subtype, supertype).isSubtypeWhenUsingNullabilities(),
-        "$subtypeString should be a subtype of $supertypeString.");
+        "$subtypeString should always be a subtype of $supertypeString.");
   }
 
   void isNotSubtype(String subtypeString, String supertypeString,
@@ -24,7 +24,7 @@
     T supertype = toType(supertypeString, environment);
     Expect.isFalse(
         isSubtypeImpl(subtype, supertype).isSubtypeWhenIgnoringNullabilities(),
-        "$subtypeString shouldn't be a subtype of $supertypeString.");
+        "$subtypeString should never be a subtype of $supertypeString.");
   }
 
   /// Checks if a type is a subtype of the other ignoring nullability modifiers.
@@ -33,8 +33,13 @@
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
-    Expect.isTrue(
-        isSubtypeImpl(subtype, supertype).isSubtypeWhenIgnoringNullabilities(),
+    IsSubtypeOf result = isSubtypeImpl(subtype, supertype);
+    Expect.isFalse(
+        result.isSubtypeWhenUsingNullabilities(),
+        "$subtypeString should be a subtype of $supertypeString "
+        "only if the nullability modifiers are ignored.");
+    Expect.isFalse(
+        !result.isSubtypeWhenIgnoringNullabilities(),
         "$subtypeString should be a subtype of $supertypeString "
         "if the nullability modifiers are ignored.");
   }
@@ -135,11 +140,31 @@
     isSubtype('Never', '(int*) -> num*');
     isSubtype('Never', '(int*) ->* num*');
     isSubtype('Never', '(int*) ->? num*');
+    isSubtype('bottom', '(int) -> num');
+    isSubtype('bottom', '(int) ->* num');
+    isSubtype('bottom', '(int) ->? num');
     isSubtype('(num*) ->* num*', 'Object');
     isSubtype('(num*) -> num*', 'Object');
     isObliviousSubtype('(num*) ->? num*', 'Object');
     isObliviousSubtype('Null?', '(int*) -> num*');
     isNotSubtype('(int*) -> num*', 'Never');
+    isNotSubtype('num', '(num) -> num');
+    isNotSubtype('Object', '(num) -> num');
+    isNotSubtype('Object*', '(num) -> num');
+    isNotSubtype('Object?', '(num) -> num');
+    isNotSubtype('dynamic', '(num) -> num');
+
+    isSubtype('(num) -> num', '(num) ->* num');
+    isSubtype('(num) ->* num', '(num) -> num');
+    isSubtype('(num) ->? num', '(num) ->* num');
+    isSubtype('(num) ->* num', '(num) ->? num');
+    isSubtype('(num) -> num', '(num) ->? num');
+    isObliviousSubtype('(num) ->? num', '(num) -> num');
+
+    isSubtype('(num) -> num', '(num) -> num?');
+    isSubtype('(num?) -> num', '(num) -> num');
+    isSubtype('(num?) -> num', '(num) -> num?');
+    isObliviousSubtype('(num) -> num', '(num?) -> num?');
 
     // Tests for non-generic two-argument curried function types.
     isSubtype('(num*) ->* (num*) ->* num*', '(num*) ->* (int*) ->* num*');
@@ -151,6 +176,18 @@
     isSubtype('({num* x}) ->* int*', '({num* x}) ->* num*');
     isNotSubtype('({int* x}) ->* int*', '({num* x}) ->* num*');
 
+    isSubtype('({num x}) -> num', '({num x}) -> num?');
+    isSubtype('({num? x}) -> num', '({num x}) -> num');
+    isSubtype('({num? x}) -> num', '({num x}) -> num?');
+    isObliviousSubtype('({num x}) -> num', '({num? x}) -> num?');
+
+    // Tests for non-generic one-argument function types with optional
+    // positional parameters.
+    isSubtype('([num]) -> num', '([num]) -> num?');
+    isSubtype('([num?]) -> num', '([num]) -> num');
+    isSubtype('([num?]) -> num', '([num]) -> num?');
+    isObliviousSubtype('([num]) -> num', '([num?]) -> num?');
+
     // Tests for function types with type parameters.
     isSubtype('<E>(E) ->* int*', '<E>(E) ->* num*');
     isSubtype('<E>(num*) ->* E', '<E>(int*) ->* E');
@@ -190,6 +227,12 @@
     isNotSubtype(
         '<E>(E,List<Object*>*) ->* E', '<F extends List<F*>*>(F*,F*) ->* void');
 
+    isSubtype('<E extends num>(E) -> E', '<F extends num*>(F*) -> F*');
+    isSubtype('<E extends num*>(E*) -> E*', '<F extends num>(F) -> F');
+    isSubtype('<E extends num?>(E) -> E', '<F extends num*>(F*) -> F*');
+    isSubtype('<E extends num*>(E*) -> E*', '<F extends num?>(F) -> F');
+    isObliviousSubtype('<E extends num>(E) -> E', '<F extends num?>(F) -> F');
+
     // Tests for FutureOr.
     isSubtype('int*', 'FutureOr<int*>*');
     isSubtype('int*', 'FutureOr<num*>*');
@@ -199,6 +242,48 @@
     isSubtype('FutureOr<int*>*', 'FutureOr<int*>*');
     isSubtype('FutureOr<int*>*', 'FutureOr<num*>*');
     isSubtype('FutureOr<int*>*', 'Object*');
+    isSubtype('Null?', 'FutureOr<num?>');
+    isSubtype('Null?', 'FutureOr<num>?');
+    isSubtype('num?', 'FutureOr<num?>');
+    isSubtype('num?', 'FutureOr<num>?');
+    isSubtype('Future<num>', 'FutureOr<num?>');
+    isSubtype('Future<num>', 'FutureOr<num>?');
+    isSubtype('Future<num>', 'FutureOr<num?>?');
+    isSubtype('Future<num?>', 'FutureOr<num?>');
+    isObliviousSubtype('Future<num?>', 'FutureOr<num>?');
+    isSubtype('Future<num?>', 'FutureOr<num?>?');
+
+    isSubtype('num?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype('Future<num>?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype('Future<Future<num>>?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype(
+        'Future<Future<Future<num>>>?', 'FutureOr<FutureOr<FutureOr<num>>?>');
+    isSubtype('Future<num>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype('Future<Future<num>>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype(
+        'Future<Future<Future<num>>>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype('Future<num?>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype('Future<Future<num?>?>?', 'FutureOr<FutureOr<FutureOr<num?>>>');
+    isSubtype('Future<Future<Future<num?>?>?>?',
+        'FutureOr<FutureOr<FutureOr<num?>>>');
+
+    isSubtype('FutureOr<num>?', 'FutureOr<num?>');
+    isObliviousSubtype('FutureOr<num?>', 'FutureOr<num>?');
+
+    isSubtype('dynamic', 'FutureOr<Object?>');
+    isSubtype('dynamic', 'FutureOr<Object>?');
+    isSubtype('void', 'FutureOr<Object?>');
+    isSubtype('void', 'FutureOr<Object>?');
+    isSubtype('Object*', 'FutureOr<Object?>');
+    isSubtype('Object*', 'FutureOr<Object>?');
+    isSubtype('Object?', 'FutureOr<Object?>');
+    isSubtype('Object?', 'FutureOr<Object>?');
+    isSubtype('Object', 'FutureOr<Object?>');
+    isSubtype('Object', 'FutureOr<Object>?');
+    isObliviousSubtype('dynamic', 'FutureOr<Object>');
+    isObliviousSubtype('void', 'FutureOr<Object>');
+    isObliviousSubtype('Object?', 'FutureOr<Object>');
+    isSubtype('Object', 'FutureOr<Object>');
 
     isSubtype('FutureOr<int>', 'Object');
     isSubtype('FutureOr<int>', 'Object*');
@@ -232,15 +317,87 @@
     isNotSubtype('dynamic', 'FutureOr<String*>*');
     isSubtype('void', 'FutureOr<void>*');
     isNotSubtype('void', 'FutureOr<String*>*');
-    isSubtype('E', 'FutureOr<E>*', typeParameters: 'E');
-    isNotSubtype('E', 'FutureOr<String*>*', typeParameters: 'E');
+
+    isSubtype('E*', 'FutureOr<E*>*', typeParameters: 'E extends Object*');
+    isSubtype('E?', 'FutureOr<E>?', typeParameters: 'E extends Object');
+    isSubtype('E?', 'FutureOr<E?>', typeParameters: 'E extends Object');
+    isSubtype('E', 'FutureOr<E>?', typeParameters: 'E extends Object?');
+    isSubtype('E', 'FutureOr<E?>', typeParameters: 'E extends Object?');
+    isObliviousSubtype('E?', 'FutureOr<E>', typeParameters: 'E extends Object');
+    isSubtype('E', 'FutureOr<E>', typeParameters: 'E extends Object?');
+    isNotSubtype('E*', 'FutureOr<String*>*',
+        typeParameters: 'E extends Object*');
+    isSubtype('E?', 'FutureOr<String>?', typeParameters: 'E extends String');
+    isSubtype('E?', 'FutureOr<String?>', typeParameters: 'E extends String');
+    isSubtype('E', 'FutureOr<String>?', typeParameters: 'E extends String?');
+    isSubtype('E', 'FutureOr<String?>', typeParameters: 'E extends String?');
+    isObliviousSubtype('E?', 'FutureOr<String>',
+        typeParameters: 'E extends String');
+    isObliviousSubtype('E', 'FutureOr<String>',
+        typeParameters: 'E extends String?');
+
     isSubtype('() ->* String*', 'FutureOr<() ->* void>*');
+    isSubtype('() -> String', 'FutureOr<() -> void>');
+    isSubtype('() -> String', 'FutureOr<() ->? void>');
+    isSubtype('() -> String', 'FutureOr<() -> void>?');
+    isSubtype('() ->? String', 'FutureOr<() ->? void>');
+    isSubtype('() ->? String', 'FutureOr<() -> void>?');
+    isObliviousSubtype('() ->? String', 'FutureOr<() -> void>');
+    isObliviousSubtype('() ->? String', 'FutureOr<() -> void>');
     isNotSubtype('() ->* void', 'FutureOr<() ->* String>*');
     isSubtype('FutureOr<int*>*', 'FutureOr<num*>*');
     isNotSubtype('FutureOr<num*>*', 'FutureOr<int*>*');
-    isSubtype('T & int*', 'FutureOr<num*>*', typeParameters: 'T');
-    isSubtype('T & Future<num*>*', 'FutureOr<num*>*', typeParameters: 'T');
-    isSubtype('T & Future<int*>*', 'FutureOr<num*>*', typeParameters: 'T');
+
+    isSubtype('T* & int*', 'FutureOr<num*>*',
+        typeParameters: 'T extends Object*');
+    isSubtype('T & int', 'FutureOr<num>', typeParameters: 'T extends Object');
+    isSubtype('T & int', 'FutureOr<num?>', typeParameters: 'T extends Object');
+    isSubtype('T & int', 'FutureOr<num>?', typeParameters: 'T extends Object');
+    isSubtype('T & int', 'FutureOr<num>', typeParameters: 'T extends Object?');
+    isSubtype('T & int', 'FutureOr<num?>', typeParameters: 'T extends Object?');
+    isSubtype('T & int', 'FutureOr<num>?', typeParameters: 'T extends Object?');
+    isObliviousSubtype('T & int?', 'FutureOr<num>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & int?', 'FutureOr<num?>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & int?', 'FutureOr<num>?',
+        typeParameters: 'T extends Object?');
+    isObliviousSubtype('T & S', 'FutureOr<Object>',
+        typeParameters: 'T extends Object?, S extends T');
+    isSubtype('T & S', 'FutureOr<Object?>',
+        typeParameters: 'T extends Object?, S extends T');
+    isSubtype('T & S', 'FutureOr<Object>?',
+        typeParameters: 'T extends Object?, S extends T');
+
+    isSubtype('T* & Future<num*>*', 'FutureOr<num*>*',
+        typeParameters: 'T extends Object*');
+    isSubtype('T* & Future<int*>*', 'FutureOr<num*>*',
+        typeParameters: 'T extends Object*');
+    isSubtype('T & Future<int>', 'FutureOr<num>',
+        typeParameters: 'T extends Object');
+    isSubtype('T & Future<int>', 'FutureOr<num?>',
+        typeParameters: 'T extends Object');
+    isSubtype('T & Future<int>', 'FutureOr<num>?',
+        typeParameters: 'T extends Object');
+    isSubtype('T & Future<int>', 'FutureOr<num>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & Future<int>', 'FutureOr<num?>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & Future<int>', 'FutureOr<num>?',
+        typeParameters: 'T extends Object?');
+    isObliviousSubtype('T & Future<int>?', 'FutureOr<num>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & Future<int>?', 'FutureOr<num?>',
+        typeParameters: 'T extends Object?');
+    isSubtype('T & Future<int>?', 'FutureOr<num>?',
+        typeParameters: 'T extends Object?');
+    isObliviousSubtype('T & Future<int?>', 'FutureOr<num>',
+        typeParameters: 'T extends Object');
+    isSubtype('T & Future<int?>', 'FutureOr<num?>',
+        typeParameters: 'T extends Object');
+    isObliviousSubtype('T & Future<int?>', 'FutureOr<num>?',
+        typeParameters: 'T extends Object');
+
     if (!skipFutureOrPromotion) {
       isSubtype('T & FutureOr<int*>*', 'FutureOr<num*>*', typeParameters: 'T');
       isSubtype('T & FutureOr<num*>*', 'FutureOr<num*>*', typeParameters: 'T');
@@ -252,6 +409,8 @@
           typeParameters: 'T extends FutureOr<int*>*');
       isSubtype('T* & FutureOr<String*>*', 'FutureOr<num*>*',
           typeParameters: 'T extends FutureOr<num*>*');
+      isNotSubtype('FutureOr<num>', 'T & FutureOr<num>',
+          typeParameters: 'T extends FutureOr<num>');
     }
     isNotSubtype('T & num*', 'FutureOr<int*>*', typeParameters: 'T');
     isNotSubtype('T & Future<num*>*', 'FutureOr<int*>*', typeParameters: 'T');
@@ -262,8 +421,17 @@
         typeParameters: 'T extends Future<num*>*');
     isNotSubtype('T* & FutureOr<String*>*', 'FutureOr<int*>*',
         typeParameters: 'T extends FutureOr<num*>*');
+
     isSubtype('Id<int*>*', 'FutureOr<num*>*');
+    isSubtype('Id<int>', 'FutureOr<num>');
+    isObliviousSubtype('Id<int?>', 'FutureOr<num>');
+    isSubtype('Id<int?>', 'FutureOr<num?>');
+    isSubtype('Id<int?>', 'FutureOr<num>?');
+    isObliviousSubtype('Id<int>?', 'FutureOr<num>');
+    isSubtype('Id<int>?', 'FutureOr<num?>');
+    isSubtype('Id<int>?', 'FutureOr<num>?');
     isNotSubtype('Id<num*>*', 'FutureOr<int*>*');
+
     isSubtype('FutureOr<Object*>*', 'FutureOr<FutureOr<Object*>*>*');
     isSubtype('FutureOr<num>*', 'Object');
     isSubtype('FutureOr<num>', 'Object');
@@ -287,6 +455,7 @@
     isNotSubtype('T* & num*', 'Never', typeParameters: 'T extends Object*');
     isSubtype('T', 'Never', typeParameters: 'T extends Never');
     isSubtype('T & Never', 'Never', typeParameters: 'T extends Object');
+    isSubtype('bottom', 'T & int', typeParameters: 'T extends Object');
 
     // Testing bottom types against type-parameter types.
     isSubtype('Null?', 'T?', typeParameters: 'T extends Object');
@@ -311,10 +480,16 @@
 
     // Trivial tests for type-parameter types and intersection types.
     // T & B <: T & A if B <: A
-    isSubtype('T & int*', 'T & int*', typeParameters: 'T');
-    isSubtype('T & int*', 'T & num*', typeParameters: 'T');
-    isSubtype('T & num*', 'T & num*', typeParameters: 'T');
-    isNotSubtype('T & num*', 'T & int*', typeParameters: 'T');
+    isSubtype('T* & int*', 'T* & int*', typeParameters: 'T extends Object*');
+    isSubtype('T* & int*', 'T* & num*', typeParameters: 'T extends Object*');
+    isSubtype('T* & num*', 'T* & num*', typeParameters: 'T extends Object*');
+    isNotSubtype('T* & num*', 'T* & int*', typeParameters: 'T extends Object*');
+
+    isSubtype('T & int', 'T & num', typeParameters: 'T extends Object');
+    isSubtype('T & int', 'T & num', typeParameters: 'T extends Object?');
+    isSubtype('T & int?', 'T & num?', typeParameters: 'T extends Object?');
+    isObliviousSubtype('T & int?', 'T & num',
+        typeParameters: 'T extends Object?');
 
     // T & B <: T extends A if B <: A
     // (Trivially satisfied since promoted bounds are always a isSubtype of the
@@ -325,12 +500,34 @@
 
     // T extends B <: T & A if B <: A
     isSubtype('T*', 'T* & int*', typeParameters: 'T extends int*');
+    isSubtype('T', 'T & int', typeParameters: 'T extends int');
+    isObliviousSubtype('T?', 'T & int', typeParameters: 'T extends int');
+    isObliviousSubtype('T', 'T & int', typeParameters: 'T extends int?');
+    isSubtype('T', 'T & int?', typeParameters: 'T extends int?');
+    isObliviousSubtype('T?', 'T & int?', typeParameters: 'T extends int?');
+
     isSubtype('T*', 'T* & num*', typeParameters: 'T extends int*');
+    isSubtype('T', 'T & num', typeParameters: 'T extends int');
+    isObliviousSubtype('T?', 'T & num', typeParameters: 'T extends int');
+    isObliviousSubtype('T', 'T & num', typeParameters: 'T extends int?');
+    isSubtype('T', 'T & num?', typeParameters: 'T extends int?');
+    isObliviousSubtype('T?', 'T & num?', typeParameters: 'T extends int?');
+
     isSubtype('T*', 'T* & num*', typeParameters: 'T extends num*');
+    isSubtype('T', 'T & num', typeParameters: 'T extends num');
+    isObliviousSubtype('T?', 'T & num', typeParameters: 'T extends num');
+    isObliviousSubtype('T', 'T & num', typeParameters: 'T extends num?');
+    isSubtype('T', 'T & num?', typeParameters: 'T extends num?');
+    isObliviousSubtype('T?', 'T & num?', typeParameters: 'T extends num?');
+
     isNotSubtype('T*', 'T* & int*', typeParameters: 'T extends num*');
 
     // T extends A <: T extends A
     isSubtype('T*', 'T*', typeParameters: 'T extends num*');
+    isSubtype('T', 'T', typeParameters: 'T extends num');
+    isSubtype('T', 'T', typeParameters: 'T extends num?');
+    isSubtype('T?', 'T?', typeParameters: 'T extends num');
+    isSubtype('T?', 'T?', typeParameters: 'T extends num?');
 
     isSubtype('T', 'T', typeParameters: 'T');
     isNotSubtype('S', 'T', typeParameters: 'S, T');
@@ -345,7 +542,46 @@
 
     // S <: T extends S
     isNotSubtype('S', 'T', typeParameters: 'S, T extends S');
-    isObliviousSubtype('T', 'S', typeParameters: 'S, T extends S');
+    isSubtype('T*', 'S*', typeParameters: 'S extends Object*, T extends S*');
+
+    isSubtype('T', 'S', typeParameters: 'S extends Object, T extends S');
+    isSubtype('T', 'S?', typeParameters: 'S extends Object, T extends S');
+    isObliviousSubtype('T?', 'S',
+        typeParameters: 'S extends Object, T extends S');
+    isSubtype('T?', 'S?', typeParameters: 'S extends Object, T extends S');
+
+    isSubtype('T', 'S', typeParameters: 'S extends Object?, T extends S');
+    isSubtype('T', 'S?', typeParameters: 'S extends Object?, T extends S');
+    isObliviousSubtype('T?', 'S',
+        typeParameters: 'S extends Object?, T extends S');
+    isSubtype('T?', 'S?', typeParameters: 'S extends Object?, T extends S');
+
+    isObliviousSubtype('T', 'S',
+        typeParameters: 'S extends Object?, T extends S?');
+    isSubtype('T', 'S?', typeParameters: 'S extends Object?, T extends S?');
+    isObliviousSubtype('T?', 'S',
+        typeParameters: 'S extends Object?, T extends S?');
+    isSubtype('T?', 'S?', typeParameters: 'S extends Object?, T extends S?');
+
+    isObliviousSubtype('T', 'S',
+        typeParameters: 'S extends Object, T extends S?');
+    isSubtype('T', 'S?', typeParameters: 'S extends Object, T extends S?');
+    isObliviousSubtype('T?', 'S',
+        typeParameters: 'S extends Object, T extends S?');
+    isSubtype('T?', 'S?', typeParameters: 'S extends Object, T extends S?');
+
+    isSubtype('T* & V*', 'S*',
+        typeParameters: 'S extends Object*, T extends S*, V extends S*');
+    isSubtype('T & V', 'S',
+        typeParameters: 'S extends Object, T extends S, V extends S');
+    isSubtype('T & V?', 'S?',
+        typeParameters: 'S extends Object, T extends S, V extends S');
+    isSubtype('T & V', 'S',
+        typeParameters: 'S extends Object?, T extends S, V extends S');
+    isSubtype('T & V', 'S',
+        typeParameters: 'S extends Object?, T extends S?, V extends S');
+    isObliviousSubtype('T & V', 'S',
+        typeParameters: 'S extends Object?, T extends S?, V extends S?');
 
     // Non-trivial tests for intersection types.
     // S & B <: A if B <: A, A is not S (or a promotion thereof)
@@ -564,6 +800,9 @@
     isNotSubtype('T & (void) ->* void', '(int*) ->* int*', typeParameters: 'T');
 
     isSubtype('T*', '() ->* void', typeParameters: 'T extends () ->* void');
+    isSubtype('T', '() -> void', typeParameters: 'T extends () -> void');
+    isObliviousSubtype('T?', '() -> void',
+        typeParameters: 'T extends () -> void');
     isNotSubtype('T', '() ->* void', typeParameters: 'T');
     isNotSubtype('Typedef<void>*', '() ->* void');
     isSubtype('VoidFunction*', '() ->* void');
@@ -586,7 +825,17 @@
     // Tests for checking typedef types against other kinds of types.
     isSubtype('dynamic', 'Id<dynamic>*');
     isNotSubtype('dynamic', 'Id<int*>*');
+
     isSubtype('() ->* void', 'Id<() ->* void>*');
+    isSubtype('() -> void', 'Id<() -> void>');
+    isSubtype('() -> void', 'Id<() ->? void>');
+    isSubtype('() ->? void', 'Id<() ->? void>');
+    isSubtype('() ->? void', 'Id<() -> void>?');
+    isSubtype('() ->? void', 'Id<() ->? void>?');
+    isSubtype('() -> void', 'VoidFunction');
+    isSubtype('() -> void', 'VoidFunction?');
+    isSubtype('() ->? void', 'VoidFunction?');
+
     isNotSubtype('() ->* void', 'Id<() ->* int>*');
     isNotSubtype('FutureOr<() ->* void>*', 'Id<() ->* void>*');
     isSubtype('FutureOr<() ->* void>*', 'Id<FutureOr<() ->* void>*>*');
@@ -639,17 +888,47 @@
     isNotSubtype('T & (void) ->* void', 'Id<(int*) ->* int*>*',
         typeParameters: 'T');
     isNotSubtype('dynamic', 'T & dynamic', typeParameters: 'T extends dynamic');
-    isNotSubtype('() ->* T', 'T & () ->* T', typeParameters: 'T');
+    isNotSubtype('() ->* T*', 'T* & () ->* T*',
+        typeParameters: 'T extends Object*');
 
     isNotSubtype('FutureOr<T & String*>*', 'T & String*', typeParameters: 'T');
 
-    isSubtype('Id<T & String*>*', 'T & String*', typeParameters: 'T');
-    isSubtype('Id<T & String*>*', 'T', typeParameters: 'T');
-    isSubtype('Id<T & String*>*', 'String*', typeParameters: 'T');
+    isSubtype('Id<T* & String*>*', 'T* & String*',
+        typeParameters: 'T extends Object*');
+    isSubtype('Id<T & String>', 'T & String',
+        typeParameters: 'T extends Object');
+    isSubtype('Id<T & String>', 'T & String',
+        typeParameters: 'T extends Object?');
+    isSubtype('Id<T & String?>', 'T & String?',
+        typeParameters: 'T extends Object?');
+    isSubtype('Id<T & String>', 'T & String?',
+        typeParameters: 'T extends Object?');
+    isObliviousSubtype('Id<T & String?>', 'T & String',
+        typeParameters: 'T extends Object?');
+    // TODO(dmitryas): Uncomment the following.
+    //isObliviousSubtype('Id<T & String>?', 'T & String', typeParameters: 'T extends Object');
+    //isObliviousSubtype('Id<T & String>?', 'T & String?', typeParameters: 'T extends Object');
+
+    isSubtype('Id<T* & String*>*', 'T*', typeParameters: 'T extends Object*');
+    isSubtype('Id<T & String>', 'T', typeParameters: 'T extends Object');
+    isSubtype('Id<T & String>', 'T?', typeParameters: 'T extends Object');
+    isSubtype('Id<T & String>', 'T', typeParameters: 'T extends Object?');
+    isSubtype('Id<T & String?>', 'T', typeParameters: 'T extends Object?');
+    // TODO(dmitryas): Uncomment the following.
+    //isSubtype('Id<T & String>?', 'T?', typeParameters: 'T extends Object?');
+
+    isSubtype('Id<T* & String*>*', 'String*',
+        typeParameters: 'T extends Object*');
     isNotSubtype('Id<T & String*>*', 'S & String*', typeParameters: 'T, S');
 
-    isNotSubtype('void', 'T & void', typeParameters: 'T');
+    isNotSubtype('void', 'T* & void', typeParameters: 'T extends Object*');
     isNotSubtype('void', 'T & void', typeParameters: 'T extends void');
+    isNotSubtype('Object', 'T & Object', typeParameters: 'T extends Object');
+    isNotSubtype('Object?', 'T & Object', typeParameters: 'T extends Object?');
+    isNotSubtype('Object?', 'T & Object?', typeParameters: 'T extends Object?');
+    isNotSubtype('Object*', 'T & Object*', typeParameters: 'T extends Object*');
+    isNotSubtype('num', 'T & num', typeParameters: 'T extends num');
+    isNotSubtype('FutureOr<num>', 'T & num', typeParameters: 'T extends num');
 
     isSubtype('T', 'Id<T>*', typeParameters: 'T');
     isSubtype('T', 'Id<Object*>*', typeParameters: 'T');
diff --git a/pkg/front_end/test/fasta/unlinked_scope_test.dart b/pkg/front_end/test/fasta/unlinked_scope_test.dart
deleted file mode 100644
index c3df660..0000000
--- a/pkg/front_end/test/fasta/unlinked_scope_test.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
-    show DiagnosticMessage, DiagnosticMessageHandler;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
-    show Token, scanString;
-
-import 'package:expect/expect.dart' show Expect;
-
-import 'package:kernel/ast.dart' show Expression, ProcedureKind;
-
-import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
-
-import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
-
-import 'package:front_end/src/base/processed_options.dart'
-    show ProcessedOptions;
-
-import 'package:front_end/src/fasta/builder/procedure_builder.dart';
-
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-
-import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
-
-import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
-
-import 'package:front_end/src/fasta/kernel/kernel_target.dart'
-    show KernelTarget;
-
-import 'package:front_end/src/fasta/kernel/unlinked_scope.dart'
-    show UnlinkedScope;
-
-import 'package:front_end/src/fasta/scope.dart' show Scope;
-
-import 'package:front_end/src/fasta/source/source_library_builder.dart'
-    show SourceLibraryBuilder;
-
-DiagnosticMessageHandler handler;
-
-class MockLibraryBuilder extends SourceLibraryBuilder {
-  MockLibraryBuilder(Uri uri)
-      : super(
-            uri,
-            uri,
-            new KernelTarget(
-                    null,
-                    false,
-                    new DillTarget(
-                        null, null, new NoneTarget(new TargetFlags())),
-                    null)
-                .loader,
-            null);
-
-  ProcedureBuilder mockProcedure(String name) {
-    return new ProcedureBuilderImpl(null, 0, null, name, null, null,
-        ProcedureKind.Getter, this, -1, -1, -1, -1);
-  }
-}
-
-class MockBodyBuilder extends BodyBuilder {
-  MockBodyBuilder.internal(
-      MockLibraryBuilder libraryBuilder, String name, Scope scope)
-      : super(
-            libraryBuilder: libraryBuilder,
-            member: libraryBuilder.mockProcedure(name),
-            enclosingScope: scope,
-            formalParameterScope: scope,
-            isDeclarationInstanceMember: false,
-            uri: libraryBuilder.uri);
-
-  MockBodyBuilder(Uri uri, String name, Scope scope)
-      : this.internal(new MockLibraryBuilder(uri), name, scope);
-}
-
-Expression compileExpression(String source) {
-  BodyBuilder listener = new MockBodyBuilder(
-      Uri.parse("org-dartlang-test:my_library.dart"),
-      "<test>",
-      new UnlinkedScope());
-
-  handler = (DiagnosticMessage message) {
-    throw message.plainTextFormatted.join("\n");
-  };
-
-  Token token = scanString(source).tokens;
-  Parser parser = new Parser(listener);
-  parser.parseExpression(parser.syntheticPreviousToken(token));
-  Expression e = listener.popForValue();
-  listener.checkEmpty(-1);
-  return e;
-}
-
-void testExpression(String source, [String expected]) {
-  Expression e = compileExpression(source);
-  String actual =
-      "$e".replaceAll(new RegExp(r'invalid-expression "[^"]*"\.'), "");
-  Expect.stringEquals(expected ?? source, actual);
-  print(e);
-}
-
-main() {
-  CompilerContext context = new CompilerContext(new ProcessedOptions(
-      options: new CompilerOptions()
-        ..onDiagnostic = (DiagnosticMessage message) {
-          handler(message);
-        }));
-  context.runInContext((_) {
-    testExpression("unresolved");
-    testExpression("a + b", "a.+(b)");
-    testExpression("a = b");
-    return Future<void>.value();
-  });
-}
diff --git a/pkg/front_end/test/flow_analysis/assigned_variables/assigned_variables_test.dart b/pkg/front_end/test/flow_analysis/assigned_variables/assigned_variables_test.dart
index 167365c..2bdb277 100644
--- a/pkg/front_end/test/flow_analysis/assigned_variables/assigned_variables_test.dart
+++ b/pkg/front_end/test/flow_analysis/assigned_variables/assigned_variables_test.dart
@@ -10,8 +10,6 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
 import 'package:front_end/src/fasta/builder/member_builder.dart';
 import 'package:front_end/src/fasta/source/source_loader.dart';
 
@@ -28,10 +26,8 @@
       supportedMarkers: sharedMarkers,
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(const AssignedVariablesDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true})
-      ]),
+      runTest: runTestFor(
+          const AssignedVariablesDataComputer(), [cfeNonNullableOnlyConfig]),
       skipList: [
         'for.dart',
         'for_element.dart',
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/definite_assignment_test.dart b/pkg/front_end/test/flow_analysis/definite_assignment/definite_assignment_test.dart
index 939b23d..7fa9e26 100644
--- a/pkg/front_end/test/flow_analysis/definite_assignment/definite_assignment_test.dart
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/definite_assignment_test.dart
@@ -7,9 +7,6 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
-
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
@@ -25,24 +22,14 @@
       supportedMarkers: sharedMarkers,
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(const DefiniteAssignmentDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true})
-      ]),
+      runTest: runTestFor(
+          const DefiniteAssignmentDataComputer(), [cfeNonNullableOnlyConfig]),
       skipList: [
-        // TODO(dmitryas): Run all definite assignment tests.
-        'assert.dart',
-        'assignment.dart',
-        'binary_expression.dart',
-        'conditional_expression.dart',
+        // TODO(johnniwinther): Update break/continue handling to support these:
         'do.dart',
         'for.dart',
         'for_each.dart',
-        'function_expression.dart',
-        'if.dart',
-        'initialization.dart',
         'switch.dart',
-        'try.dart',
         'while.dart',
       ]);
 }
@@ -76,7 +63,7 @@
   @override
   String computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
-      if (_flowResult.unassignedNodes.contains(node.variable)) {
+      if (_flowResult.unassignedNodes.contains(node)) {
         return 'unassigned';
       }
     }
diff --git a/pkg/front_end/test/flow_analysis/nullability/nullability_test.dart b/pkg/front_end/test/flow_analysis/nullability/nullability_test.dart
index 2f9f044..c5473b0 100644
--- a/pkg/front_end/test/flow_analysis/nullability/nullability_test.dart
+++ b/pkg/front_end/test/flow_analysis/nullability/nullability_test.dart
@@ -7,9 +7,6 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
-
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:kernel/ast.dart' hide Variance;
 
@@ -21,19 +18,11 @@
       supportedMarkers: sharedMarkers,
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(const NullabilityDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true})
-      ]),
+      runTest: runTestFor(
+          const NullabilityDataComputer(), [cfeNonNullableOnlyConfig]),
       skipList: [
-        // TODO(dmitryas): Run all nullability tests.
-        'assign.dart',
-        'if.dart',
-        'is.dart',
-        'logical.dart',
+        // TODO(johnniwinther): Run all nullability tests.
         'null_aware_access.dart',
-        'null_check.dart',
-        'potentially_mutated_in_closure.dart',
         'try_finally.dart',
         'while.dart',
       ]);
diff --git a/pkg/front_end/test/flow_analysis/reachability/reachability_test.dart b/pkg/front_end/test/flow_analysis/reachability/reachability_test.dart
index 7397b38..634b4df 100644
--- a/pkg/front_end/test/flow_analysis/reachability/reachability_test.dart
+++ b/pkg/front_end/test/flow_analysis/reachability/reachability_test.dart
@@ -7,9 +7,6 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
-
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
@@ -24,10 +21,8 @@
       supportedMarkers: sharedMarkers,
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(const ReachabilityDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true})
-      ]));
+      runTest: runTestFor(
+          const ReachabilityDataComputer(), [cfeNonNullableOnlyConfig]));
 }
 
 class ReachabilityDataComputer
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/type_promotion_test.dart b/pkg/front_end/test/flow_analysis/type_promotion/type_promotion_test.dart
index 68b4e14..cfaf1e5 100644
--- a/pkg/front_end/test/flow_analysis/type_promotion/type_promotion_test.dart
+++ b/pkg/front_end/test/flow_analysis/type_promotion/type_promotion_test.dart
@@ -3,9 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io' show Directory, Platform;
-import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
-
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
@@ -23,34 +20,17 @@
       supportedMarkers: sharedMarkers,
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(const TypePromotionDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true})
-      ]),
+      runTest: runTestFor(
+          const TypePromotionDataComputer(), [cfeNonNullableOnlyConfig]),
       skipList: [
-        // TODO(dmitryas): Run all type promotion tests.
-        'as.dart',
-        'assert.dart',
-        'assignment.dart',
+        // TODO(johnniwinther): Run all type promotion tests.
         'assignment_promoted.dart',
-        'assigned_anywhere.dart',
-        'binary.dart',
         'bug39178.dart',
-        'conditional.dart',
         'constructor_initializer.dart',
-        'do.dart',
         'for.dart',
-        'function_expression.dart',
-        'if.dart',
-        'initialization.dart',
-        'inside_closure.dart',
         'not_promoted.dart',
         'null_aware_assignment.dart',
-        'null_check.dart',
-        'potentially_mutated.dart',
         'switch.dart',
-        'try_catch.dart',
-        'try_catch_finally.dart',
         'try_finally.dart',
         'type_parameter.dart',
         'while.dart',
@@ -94,7 +74,7 @@
 
   @override
   String getText(DartType actualData) =>
-      typeToText(actualData, isNonNullableByDefault: true);
+      typeToText(actualData, TypeRepresentation.nonNullableByDefault);
 
   @override
   String isAsExpected(DartType actualData, String expectedData) {
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
new file mode 100644
index 0000000..4a703f2
--- /dev/null
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show Directory, Platform;
+import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
+    show DataInterpreter, runTests;
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+import 'package:front_end/src/fasta/kernel/kernel_api.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart';
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:kernel/ast.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script
+      .resolve('../../../_fe_analyzer_shared/test/inheritance/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkersWithNnbd,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const InheritanceDataComputer(), [cfeNonNullableOnlyConfig]));
+}
+
+class InheritanceDataComputer extends DataComputer<String> {
+  const InheritanceDataComputer();
+
+  /// Function that computes a data mapping for [library].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeLibraryData(InternalCompilerResult compilerResult,
+      Library library, Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new InheritanceDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library);
+  }
+
+  @override
+  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new InheritanceDataExtractor(compilerResult, actualMap)
+        .computeForClass(cls);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  @override
+  String computeErrorData(
+      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+    return errorsToText(errors, useCodes: true);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class InheritanceDataExtractor extends CfeDataExtractor<String> {
+  final ClassHierarchy _hierarchy;
+
+  InheritanceDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<String>> actualMap)
+      : _hierarchy = compilerResult.classHierarchy,
+        super(compilerResult, actualMap);
+
+  @override
+  String computeLibraryValue(Id id, Library node) {
+    return 'nnbd=${node.isNonNullableByDefault}';
+  }
+
+  @override
+  String computeClassValue(Id id, Class node) {
+    List<String> supertypes = <String>[];
+    for (Class superclass in computeAllSuperclasses(node)) {
+      supertypes.add(supertypeToText(
+          _hierarchy.getClassAsInstanceOf(node, superclass),
+          TypeRepresentation.implicitUndetermined));
+    }
+    supertypes.sort();
+    return supertypes.join(',');
+  }
+}
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 82ed6bd..48a4d48 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -14,7 +14,8 @@
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
+    show CompilerOptions, parseExperimentalArguments, parseExperimentalFlags;
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
@@ -76,7 +77,7 @@
 
 Future<Context> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new Context();
+  return new Context(environment["updateExpectations"] == "true");
 }
 
 class Context extends ChainContext {
@@ -85,6 +86,9 @@
     const RunCompilations(),
   ];
 
+  final bool updateExpectations;
+  Context(this.updateExpectations);
+
   @override
   Future<void> cleanUp(TestDescription description, Result result) async {
     await cleanupHelper?.outDir?.delete(recursive: true);
@@ -96,6 +100,7 @@
 class TestData {
   YamlMap map;
   Directory outDir;
+  Uri loadedFrom;
 }
 
 class ReadTest extends Step<TestDescription, TestData, Context> {
@@ -108,6 +113,7 @@
     Uri uri = description.uri;
     String contents = await new File.fromUri(uri).readAsString();
     TestData data = new TestData();
+    data.loadedFrom = uri;
     data.map = loadYamlNode(contents, sourceUrl: uri);
     data.outDir =
         Directory.systemTemp.createTempSync("incremental_load_from_dill_test");
@@ -144,6 +150,8 @@
           "incrementalSerialization"
         ]);
         await newWorldTest(
+          data,
+          context,
           map["worlds"],
           map["modules"],
           map["omitPlatform"],
@@ -286,8 +294,14 @@
   return moduleResult;
 }
 
-Future<Null> newWorldTest(List worlds, Map modules, bool omitPlatform,
-    String targetName, bool incrementalSerialization) async {
+Future<Null> newWorldTest(
+    TestData data,
+    Context context,
+    List worlds,
+    Map modules,
+    bool omitPlatform,
+    String targetName,
+    bool incrementalSerialization) async {
   final Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummary = base.resolve("vm_platform_strong.dill");
@@ -400,6 +414,12 @@
       options.sdkRoot = null;
       options.sdkSummary = sdkSummary;
       options.omitPlatform = omitPlatform != false;
+      if (world["experiments"] != null) {
+        Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
+            parseExperimentalArguments([world["experiments"]]),
+            onError: (e) => throw "Error on parsing experiments flags: $e");
+        options.experimentalFlags = experimentalFlags;
+      }
     }
     if (packagesUri != null) {
       options.packagesFileUri = packagesUri;
@@ -502,7 +522,8 @@
     performErrorAndWarningCheck(
         world, gotError, formattedErrors, gotWarning, formattedWarnings);
     util.throwOnEmptyMixinBodies(component);
-    util.throwOnInsufficientUriToSource(component);
+    await util.throwOnInsufficientUriToSource(component,
+        fileSystem: gotError ? null : fs);
     print("Compile took ${stopwatch.elapsedMilliseconds} ms");
 
     checkExpectedContent(world, component);
@@ -528,8 +549,9 @@
 
     newestWholeComponentData = util.postProcess(component);
     newestWholeComponent = component;
+    String actualSerialized = componentToStringSdkFiltered(component);
     print("*****\n\ncomponent:\n"
-        "${componentToStringSdkFiltered(component)}\n\n\n");
+        "${actualSerialized}\n\n\n");
 
     if (world["uriToSourcesDoesntInclude"] != null) {
       for (String filename in world["uriToSourcesDoesntInclude"]) {
@@ -557,6 +579,24 @@
       }
     }
 
+    Uri uri = data.loadedFrom
+        .resolve(data.loadedFrom.pathSegments.last + ".world.$worldNum.expect");
+    String expected;
+    File file = new File.fromUri(uri);
+    if (context.updateExpectations) {
+      file.writeAsStringSync(actualSerialized);
+    }
+    if (file.existsSync()) {
+      expected = file.readAsStringSync();
+    }
+    if (context.updateExpectations) {
+      file.writeAsStringSync(actualSerialized);
+    } else if (expected != actualSerialized) {
+      throw "Unexpected serialized representation. "
+          "Fix or update $uri to contain the below:\n\n"
+          "$actualSerialized";
+    }
+
     int nonSyntheticLibraries = countNonSyntheticLibraries(component);
     int nonSyntheticPlatformLibraries =
         countNonSyntheticPlatformLibraries(component);
@@ -588,6 +628,7 @@
             "libraries, got ${syntheticLibraries}";
       }
     }
+
     if (!noFullComponent) {
       List<Library> entryLib = component.libraries
           .where((Library lib) =>
@@ -708,7 +749,7 @@
       performErrorAndWarningCheck(
           world, gotError, formattedErrors, gotWarning, formattedWarnings);
       util.throwOnEmptyMixinBodies(component3);
-      util.throwOnInsufficientUriToSource(component3);
+      await util.throwOnInsufficientUriToSource(component3);
       print("Compile took ${stopwatch.elapsedMilliseconds} ms");
 
       util.postProcess(component3);
@@ -1108,7 +1149,7 @@
   Component component =
       await normalCompilePlain(input, options: options, compiler: compiler);
   util.throwOnEmptyMixinBodies(component);
-  util.throwOnInsufficientUriToSource(component);
+  await util.throwOnInsufficientUriToSource(component);
   return component;
 }
 
@@ -1130,7 +1171,7 @@
   }
   Component initializedComponent = await compiler.computeDelta();
   util.throwOnEmptyMixinBodies(initializedComponent);
-  util.throwOnInsufficientUriToSource(initializedComponent);
+  await util.throwOnInsufficientUriToSource(initializedComponent);
   bool result = compiler.initializedFromDill;
   new File.fromUri(output)
       .writeAsBytesSync(util.postProcess(initializedComponent));
@@ -1146,7 +1187,7 @@
   Component initializedFullComponent =
       await compiler.computeDelta(fullComponent: true);
   util.throwOnEmptyMixinBodies(initializedFullComponent);
-  util.throwOnInsufficientUriToSource(initializedFullComponent);
+  await util.throwOnInsufficientUriToSource(initializedFullComponent);
   Expect.equals(initializedComponent.libraries.length,
       initializedFullComponent.libraries.length);
   Expect.equals(initializedComponent.uriToSource.length,
@@ -1158,7 +1199,7 @@
 
   Component partialComponent = await compiler.computeDelta();
   util.throwOnEmptyMixinBodies(partialComponent);
-  util.throwOnInsufficientUriToSource(partialComponent);
+  await util.throwOnInsufficientUriToSource(partialComponent);
   actuallyInvalidatedCount = (compiler
           .getFilteredInvalidatedImportUrisForTesting(invalidateUris)
           ?.length ??
@@ -1170,7 +1211,7 @@
 
   Component emptyComponent = await compiler.computeDelta();
   util.throwOnEmptyMixinBodies(emptyComponent);
-  util.throwOnInsufficientUriToSource(emptyComponent);
+  await util.throwOnInsufficientUriToSource(emptyComponent);
 
   List<Uri> fullLibUris =
       initializedComponent.libraries.map((lib) => lib.importUri).toList();
diff --git a/pkg/front_end/test/incremental_utils.dart b/pkg/front_end/test/incremental_utils.dart
index f5c07a6..7cc2842 100644
--- a/pkg/front_end/test/incremental_utils.dart
+++ b/pkg/front_end/test/incremental_utils.dart
@@ -2,6 +2,10 @@
 // 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.
 
+import 'dart:convert' show utf8;
+
+import "package:front_end/src/api_prototype/file_system.dart" show FileSystem;
+
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
 import 'package:kernel/kernel.dart'
@@ -57,7 +61,8 @@
   return empty;
 }
 
-void throwOnInsufficientUriToSource(Component component) {
+Future<void> throwOnInsufficientUriToSource(Component component,
+    {FileSystem fileSystem}) async {
   UriFinder uriFinder = new UriFinder();
   component.accept(uriFinder);
   Set<Uri> uris = uriFinder.seenUris.toSet();
@@ -65,6 +70,39 @@
   if (uris.length != 0) {
     throw "Expected 0 uris with no source, but found ${uris.length} ($uris)";
   }
+
+  if (fileSystem != null) {
+    uris = uriFinder.seenUris.toSet();
+    for (Uri uri in uris) {
+      if (uri == null) continue;
+      if (uri.scheme != "org-dartlang-test") continue;
+      // The file system doesn't have the sources for any modules.
+      // For now assume that that is always what's going on.
+      if (!await fileSystem.entityForUri(uri).exists()) continue;
+      List<int> expected = await fileSystem.entityForUri(uri).readAsBytes();
+      List<int> actual = component.uriToSource[uri].source;
+      bool fail = false;
+      if (expected.length != actual.length) {
+        fail = true;
+      }
+      if (!fail) {
+        for (int i = 0; i < expected.length; i++) {
+          if (expected[i] != actual[i]) {
+            fail = true;
+            break;
+          }
+        }
+      }
+      if (fail) {
+        String expectedString = utf8.decode(expected);
+        String actualString = utf8.decode(actual);
+        throw "Not expected source for $uri:\n\n"
+            "$expectedString\n\n"
+            "vs\n\n"
+            "$actualString";
+      }
+    }
+  }
 }
 
 class UriFinder extends RecursiveVisitor {
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 0c5a766..92c2b12 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -109,6 +109,7 @@
           ?.component;
       for (var lib in component.libraries) {
         if (lib.importUri.scheme == 'dart') {
+          // ignore: DEPRECATED_MEMBER_USE
           expect(lib.isExternal, isTrue);
         }
       }
@@ -126,6 +127,7 @@
 
       var aLib = component.libraries
           .firstWhere((lib) => lib.importUri.path == '/a/b/c/a.dart');
+      // ignore: DEPRECATED_MEMBER_USE
       expect(aLib.isExternal, isTrue);
     });
 
@@ -136,6 +138,7 @@
           ?.component;
       for (var lib in component.libraries) {
         if (lib.importUri.scheme == 'dart') {
+          // ignore: DEPRECATED_MEMBER_USE
           expect(lib.isExternal, isTrue);
         }
       }
@@ -152,6 +155,7 @@
 
       var aLib = component.libraries
           .firstWhere((lib) => lib.importUri.path == '/a/b/c/a.dart');
+      // ignore: DEPRECATED_MEMBER_USE
       expect(aLib.isExternal, isFalse);
     });
 
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 5eb2b73..4fec65a 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -26,7 +26,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
-import 'package:front_end/src/fasta/source/stack_listener.dart'
+import 'package:front_end/src/fasta/source/stack_listener_impl.dart'
     show offsetForToken;
 
 import 'package:kernel/ast.dart';
@@ -74,6 +74,11 @@
     enableExtensionMethods: true,
     enableNonNullable: true);
 
+ScannerConfiguration scannerConfigurationNonNNBD = new ScannerConfiguration(
+    enableTripleShift: true,
+    enableExtensionMethods: true,
+    enableNonNullable: false);
+
 class Context extends ChainContext with MatchContext {
   final bool updateExpectations;
   final bool addTrace;
@@ -100,7 +105,9 @@
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
     List<int> lineStarts = new List<int>();
-    Token firstToken = scanUri(description.uri, lineStarts: lineStarts);
+
+    Token firstToken =
+        scanUri(description.uri, description.shortName, lineStarts: lineStarts);
 
     if (firstToken == null) {
       return Future.value(crash(description, StackTrace.current));
@@ -137,7 +144,7 @@
 
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
-    Token firstToken = scanUri(description.uri);
+    Token firstToken = scanUri(description.uri, description.shortName);
 
     if (firstToken == null) {
       return Future.value(crash(description, StackTrace.current));
@@ -166,7 +173,8 @@
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
     List<int> lineStarts = new List<int>();
-    Token firstToken = scanUri(description.uri, lineStarts: lineStarts);
+    Token firstToken =
+        scanUri(description.uri, description.shortName, lineStarts: lineStarts);
 
     if (firstToken == null) {
       return Future.value(crash(description, StackTrace.current));
@@ -261,15 +269,24 @@
   }
 }
 
-Token scanUri(Uri uri, {List<int> lineStarts}) {
+Token scanUri(Uri uri, String shortName, {List<int> lineStarts}) {
+  ScannerConfiguration config;
+
+  String firstDir = shortName.split("/")[0];
+  if (firstDir == "non-nnbd") {
+    config = scannerConfigurationNonNNBD;
+  } else {
+    config = scannerConfiguration;
+  }
+
   File f = new File.fromUri(uri);
   List<int> rawBytes = f.readAsBytesSync();
 
   Uint8List bytes = new Uint8List(rawBytes.length + 1);
   bytes.setRange(0, rawBytes.length, rawBytes);
 
-  Utf8BytesScanner scanner = new Utf8BytesScanner(bytes,
-      includeComments: true, configuration: scannerConfiguration);
+  Utf8BytesScanner scanner =
+      new Utf8BytesScanner(bytes, includeComments: true, configuration: config);
   Token firstToken = scanner.tokenize();
   if (lineStarts != null) {
     lineStarts.addAll(scanner.lineStarts);
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index b7ea368..4e23241 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -28,7 +28,7 @@
       // Find first one that's not any of the blacklisted ones.
       String line = traceLines[i];
       if (line.contains("parser_test_listener.dart:") ||
-          line.contains("parser_test.dart:")) continue;
+          line.contains("parser_suite.dart:")) continue;
       return line.substring(line.indexOf("(") + 1, line.lastIndexOf(")"));
     }
     return "N/A";
diff --git a/pkg/front_end/test/parser_test_listener_creator.dart b/pkg/front_end/test/parser_test_listener_creator.dart
index 4042166..3607a44 100644
--- a/pkg/front_end/test/parser_test_listener_creator.dart
+++ b/pkg/front_end/test/parser_test_listener_creator.dart
@@ -63,7 +63,7 @@
       // Find first one that's not any of the blacklisted ones.
       String line = traceLines[i];
       if (line.contains("parser_test_listener.dart:") ||
-          line.contains("parser_test.dart:")) continue;
+          line.contains("parser_suite.dart:")) continue;
       return line.substring(line.indexOf("(") + 1, line.lastIndexOf(")"));
     }
     return "N/A";
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 4615ee2..745be079 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -32,7 +32,7 @@
       // Find first one that's not any of the blacklisted ones.
       String line = traceLines[i];
       if (line.contains("parser_test_listener.dart:") ||
-          line.contains("parser_test.dart:") ||
+          line.contains("parser_suite.dart:") ||
           line.contains("parser_test_parser.dart:") ||
           line == "<asynchronous suspension>") continue;
       return line.substring(line.indexOf("(") + 1, line.lastIndexOf(")"));
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 8e9121c..002bf61 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -21,9 +21,8 @@
   } else {
     out = new StringBuffer();
   }
-
-  File f = new File.fromUri(
-      Platform.script.resolve("../lib/src/fasta/parser/parser.dart"));
+  File f = new File.fromUri(Platform.script
+      .resolve("../../_fe_analyzer_shared/lib/src/parser/parser_impl.dart"));
   List<int> rawBytes = f.readAsBytesSync();
 
   Uint8List bytes = new Uint8List(rawBytes.length + 1);
@@ -67,7 +66,7 @@
       // Find first one that's not any of the blacklisted ones.
       String line = traceLines[i];
       if (line.contains("parser_test_listener.dart:") ||
-          line.contains("parser_test.dart:") ||
+          line.contains("parser_suite.dart:") ||
           line.contains("parser_test_parser.dart:") ||
           line == "<asynchronous suspension>") continue;
       return line.substring(line.indexOf("(") + 1, line.lastIndexOf(")"));
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 56504e3..5f05c67 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -132,6 +132,12 @@
 clarification
 clashes
 class's
+class3a
+class3b
+class4a
+class4b
+class4c
+class4d
 clazz
 cls
 cn
@@ -448,7 +454,6 @@
 juxtaposition
 juxtapositions
 k
-k’s
 kallentu
 kernel's
 kernel2kernel
@@ -456,6 +461,7 @@
 kmillikin
 kustermann
 kv
+k’s
 l
 lacks
 lang
@@ -633,13 +639,14 @@
 quick
 quoted
 r
+r'$creation
 r'\f
 r'\r
 r'\s
 r'\t
 r'\u
 r'\v
-r'$creation
+ra
 radix
 raises
 ran
@@ -700,6 +707,7 @@
 resumed
 rewrites
 rewrote
+rf
 rhs
 ri
 rightmost
@@ -711,6 +719,7 @@
 roughly
 rounding
 rparen
+rs
 runnable
 s
 sb
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 82ad053..301934c 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -112,6 +112,7 @@
 amount
 ampersand
 an
+analog
 analogously
 analysis
 analyze
@@ -209,6 +210,7 @@
 attempting
 attempts
 attention
+attribute
 authors
 automatically
 available
@@ -377,12 +379,12 @@
 catches
 categories
 category
-caveats
 caught
 cause
 caused
 causes
 causing
+caveats
 certain
 chain
 chained
@@ -1216,8 +1218,8 @@
 go
 goes
 going
-good
 gone
+good
 got
 gotten
 governed
@@ -1551,6 +1553,7 @@
 labels
 lack
 lacking
+landed
 lands
 language
 large
@@ -2234,11 +2237,11 @@
 realigned
 realized
 really
-reassign
 reason
 reasonable
 reasoning
 reasons
+reassign
 receive
 receiver
 recent
@@ -2894,6 +2897,7 @@
 treatment
 treats
 tree
+tri
 trick
 tried
 tries
@@ -2962,6 +2966,8 @@
 unioned
 unique
 unit
+unite
+united
 units
 unix
 unknown
diff --git a/pkg/front_end/test/static_types/data/prefix_postfix.dart b/pkg/front_end/test/static_types/data/prefix_postfix.dart
index 398d9dc..71db218 100644
--- a/pkg/front_end/test/static_types/data/prefix_postfix.dart
+++ b/pkg/front_end/test/static_types/data/prefix_postfix.dart
@@ -95,13 +95,19 @@
     /*cfe:nnbd.update: num!*/
     /*cfe|dart2js.num*/
     /*cfe:nnbd.num!*/
-    numInstance /*cfe|dart2js.invoke: num*/ /*cfe:nnbd.invoke: num!*/ /*int*/ ++;
+    numInstance
+        /*cfe|dart2js.invoke: num*/
+        /*cfe:nnbd.invoke: num!*/
+        /*int*/ ++;
 
     /*cfe|dart2js.update: num*/
     /*cfe:nnbd.update: num!*/
     /*cfe|dart2js.num*/
     /*cfe:nnbd.num!*/
-    numInstance /*cfe|dart2js.invoke: num*/ /*cfe:nnbd.invoke: num!*/ /*int*/ --;
+    numInstance
+        /*cfe|dart2js.invoke: num*/
+        /*cfe:nnbd.invoke: num!*/
+        /*int*/ --;
 
     /*cfe|dart2js.invoke: num*/ /*cfe:nnbd.invoke: num!*/ /*int*/ ++
         /*cfe|dart2js.update: num*/
diff --git a/pkg/front_end/test/static_types/data/promoted_access.dart b/pkg/front_end/test/static_types/data/promoted_access.dart
index 9cc7227..a21bae7 100644
--- a/pkg/front_end/test/static_types/data/promoted_access.dart
+++ b/pkg/front_end/test/static_types/data/promoted_access.dart
@@ -8,8 +8,8 @@
 class Class<T> {
   method(T o) {
     if (/*cfe|dart2js.T*/ /*cfe:nnbd.T%*/ o is Class) {
-      /*cfe|dart2js.T extends Class<dynamic>*/
-      /*cfe:nnbd.T! extends Class<dynamic>!*/
+      /*cfe|dart2js.T & Class<dynamic>*/
+      /*cfe:nnbd.T! & Class<dynamic>!*/
       o. /*invoke: dynamic*/ method(/*Null*/ null);
     }
   }
@@ -17,8 +17,8 @@
 
 method<T>(T o) {
   if (/*cfe|dart2js.T*/ /*cfe:nnbd.T%*/ o is Class) {
-    /*cfe|dart2js.T extends Class<dynamic>*/
-    /*cfe:nnbd.T! extends Class<dynamic>!*/
+    /*cfe|dart2js.T & Class<dynamic>*/
+    /*cfe:nnbd.T! & Class<dynamic>!*/
     o. /*invoke: dynamic*/ method(/*Null*/ null);
   }
 }
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 044f900..bd63826 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -39,6 +39,7 @@
     var component = loadComponentFromBytes(summary);
     var aLib = findLibrary(component, 'a.dart');
     expect(aLib.importUri.path, '/a/b/c/a.dart');
+    // ignore: DEPRECATED_MEMBER_USE
     expect(aLib.isExternal, isFalse);
   });
 
@@ -47,6 +48,7 @@
     var summary = await summarize(['a.dart'], allSources);
     var component = loadComponentFromBytes(summary);
     var coreLib = findLibrary(component, 'core');
+    // ignore: DEPRECATED_MEMBER_USE
     expect(coreLib.isExternal, isTrue);
   });
 
@@ -60,7 +62,9 @@
     var component = loadComponentFromBytes(summaryB);
     var aLib = findLibrary(component, 'a.dart');
     var bLib = findLibrary(component, 'b.dart');
+    // ignore: DEPRECATED_MEMBER_USE
     expect(aLib.isExternal, isTrue);
+    // ignore: DEPRECATED_MEMBER_USE
     expect(bLib.isExternal, isFalse);
   });
 
@@ -151,9 +155,13 @@
   var dLib = findLibrary(component, 'd.dart');
 
   // All libraries but `d.dart` are marked external.
+  // ignore: DEPRECATED_MEMBER_USE
   expect(aLib.isExternal, isTrue);
+  // ignore: DEPRECATED_MEMBER_USE
   expect(bLib.isExternal, isTrue);
+  // ignore: DEPRECATED_MEMBER_USE
   expect(cLib.isExternal, isTrue);
+  // ignore: DEPRECATED_MEMBER_USE
   expect(dLib.isExternal, isFalse);
 
   // The type-hierarchy for A, B, D is visible and correct
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index c904fbd..3adb0e8 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -64,102 +64,120 @@
   DartType dynamicType = const DynamicType();
   check({dynamicType: "dynamic"}, 0);
 
-  DartType boolType = new InterfaceType(boolClass);
+  DartType boolType = new InterfaceType(boolClass, Nullability.legacy);
   check({boolType: "bool"}, 0);
 
-  DartType numType = new InterfaceType(numClass);
+  DartType numType = new InterfaceType(numClass, Nullability.legacy);
   check({numType: "num"}, 0);
 
-  DartType intType = new InterfaceType(intClass);
+  DartType intType = new InterfaceType(intClass, Nullability.legacy);
   check({intType: "int"}, 0);
 
-  DartType object = new InterfaceType(objectClass);
+  DartType object = new InterfaceType(objectClass, Nullability.legacy);
   check({object: "Object"}, 1);
 
-  DartType foo = new InterfaceType(fooClass);
+  DartType foo = new InterfaceType(fooClass, Nullability.legacy);
   check({foo: "Foo"}, 1);
 
-  DartType foo2 = new InterfaceType(foo2Class);
+  DartType foo2 = new InterfaceType(foo2Class, Nullability.legacy);
   check({foo2: "Foo"}, 1);
   check({foo: "Foo/*1*/", foo2: "Foo/*2*/"}, 2);
 
-  DartType barVoid = new InterfaceType(barClass, [voidType]);
+  DartType barVoid =
+      new InterfaceType(barClass, Nullability.legacy, [voidType]);
   check({barVoid: "Bar<void>"}, 1);
 
-  DartType barObject = new InterfaceType(barClass, [object]);
+  DartType barObject =
+      new InterfaceType(barClass, Nullability.legacy, [object]);
   check({barObject: "Bar<Object>"}, 2);
 
-  DartType barBarDynamic = new InterfaceType(barClass, [
-    new InterfaceType(barClass, [dynamicType])
+  DartType barBarDynamic = new InterfaceType(barClass, Nullability.legacy, [
+    new InterfaceType(barClass, Nullability.legacy, [dynamicType])
   ]);
   check({barBarDynamic: "Bar<Bar<dynamic>>"}, 1);
 
-  DartType parameterY = new TypeParameterType(new TypeParameter("Y"));
-  DartType barY = new InterfaceType(barClass, [parameterY]);
+  DartType parameterY =
+      new TypeParameterType(new TypeParameter("Y"), Nullability.legacy);
+  DartType barY = new InterfaceType(barClass, Nullability.legacy, [parameterY]);
   check({parameterY: "Y", barY: "Bar<Y>"}, 1);
 
-  DartType bazFooBarBazDynamicVoid = new InterfaceType(bazClass, [
+  DartType bazFooBarBazDynamicVoid =
+      new InterfaceType(bazClass, Nullability.legacy, [
     foo,
-    new InterfaceType(barClass, [
-      new InterfaceType(bazClass, [dynamicType, voidType])
+    new InterfaceType(barClass, Nullability.legacy, [
+      new InterfaceType(bazClass, Nullability.legacy, [dynamicType, voidType])
     ])
   ]);
   check({bazFooBarBazDynamicVoid: "Baz<Foo, Bar<Baz<dynamic, void>>>"}, 3);
 
-  DartType bazFooFoo2 = new InterfaceType(bazClass, [foo, foo2]);
+  DartType bazFooFoo2 =
+      new InterfaceType(bazClass, Nullability.legacy, [foo, foo2]);
   check({bazFooFoo2: "Baz<Foo/*1*/, Foo/*2*/>"}, 3);
 
-  DartType funVoid = new FunctionType([], voidType);
+  DartType funVoid = new FunctionType([], voidType, Nullability.legacy);
   check({funVoid: "void Function()"}, 0);
 
-  DartType funFooBarVoid = new FunctionType([foo], barVoid);
+  DartType funFooBarVoid = new FunctionType([foo], barVoid, Nullability.legacy);
   check({funFooBarVoid: "Bar<void> Function(Foo)"}, 2);
 
-  DartType funFooFoo2 = new FunctionType([foo], foo2);
+  DartType funFooFoo2 = new FunctionType([foo], foo2, Nullability.legacy);
   check({funFooFoo2: "Foo/*1*/ Function(Foo/*2*/)"}, 2);
 
-  DartType funOptFooVoid =
-      new FunctionType([foo], voidType, requiredParameterCount: 0);
+  DartType funOptFooVoid = new FunctionType([foo], voidType, Nullability.legacy,
+      requiredParameterCount: 0);
   check({funOptFooVoid: "void Function([Foo])"}, 1);
 
-  DartType funFooOptIntVoid =
-      new FunctionType([foo, intType], voidType, requiredParameterCount: 1);
+  DartType funFooOptIntVoid = new FunctionType(
+      [foo, intType], voidType, Nullability.legacy,
+      requiredParameterCount: 1);
   check({funFooOptIntVoid: "void Function(Foo, [int])"}, 1);
 
-  DartType funOptFooOptIntVoid =
-      new FunctionType([foo, intType], voidType, requiredParameterCount: 0);
+  DartType funOptFooOptIntVoid = new FunctionType(
+      [foo, intType], voidType, Nullability.legacy,
+      requiredParameterCount: 0);
   check({funOptFooOptIntVoid: "void Function([Foo, int])"}, 1);
 
-  DartType funNamedObjectVoid = new FunctionType([], voidType,
+  DartType funNamedObjectVoid = new FunctionType(
+      [], voidType, Nullability.legacy,
       namedParameters: [new NamedType("obj", object)]);
   check({funNamedObjectVoid: "void Function({Object obj})"}, 1);
 
-  DartType funFooNamedObjectVoid = new FunctionType([foo], voidType,
+  DartType funFooNamedObjectVoid = new FunctionType(
+      [foo], voidType, Nullability.legacy,
       namedParameters: [new NamedType("obj", object)]);
   check({funFooNamedObjectVoid: "void Function(Foo, {Object obj})"}, 2);
 
   TypeParameter t = new TypeParameter("T", object, dynamicType);
   DartType funGeneric = new FunctionType(
-      [new TypeParameterType(t)], new TypeParameterType(t),
+      [new TypeParameterType(t, Nullability.legacy)],
+      new TypeParameterType(t, Nullability.legacy),
+      Nullability.legacy,
       typeParameters: [t]);
   check({funGeneric: "T Function<T>(T)"}, 0);
 
   TypeParameter tObject = new TypeParameter("T", object, object);
   DartType funGenericObject = new FunctionType(
-      [new TypeParameterType(tObject)], new TypeParameterType(tObject),
+      [new TypeParameterType(tObject, Nullability.legacy)],
+      new TypeParameterType(tObject, Nullability.legacy),
+      Nullability.legacy,
       typeParameters: [tObject]);
   check({funGenericObject: "T Function<T extends Object>(T)"}, 1);
 
   TypeParameter tFoo = new TypeParameter("T", foo, dynamicType);
   DartType funGenericFoo = new FunctionType(
-      [new TypeParameterType(tFoo)], new TypeParameterType(tFoo),
+      [new TypeParameterType(tFoo, Nullability.legacy)],
+      new TypeParameterType(tFoo, Nullability.legacy),
+      Nullability.legacy,
       typeParameters: [tFoo]);
   check({funGenericFoo: "T Function<T extends Foo>(T)"}, 1);
 
   TypeParameter tBar = new TypeParameter("T", dynamicType, dynamicType);
-  tBar.bound = new InterfaceType(barClass, [new TypeParameterType(tBar)]);
+  tBar.bound = new InterfaceType(barClass, Nullability.legacy,
+      [new TypeParameterType(tBar, Nullability.legacy)]);
   DartType funGenericBar = new FunctionType(
-      [new TypeParameterType(tBar)], new TypeParameterType(tBar),
+      [new TypeParameterType(tBar, Nullability.legacy)],
+      new TypeParameterType(tBar, Nullability.legacy),
+      Nullability.legacy,
       typeParameters: [tBar]);
   check({funGenericBar: "T Function<T extends Bar<T>>(T)"}, 1);
 
@@ -171,10 +189,12 @@
   Field nextField = new Field(new Name("next"), type: foo2);
   foo2Class.fields.add(nextField);
   Field xField = new Field(new Name("x"),
-      type: new TypeParameterType(bazClass.typeParameters[0]));
+      type: new TypeParameterType(
+          bazClass.typeParameters[0], Nullability.legacy));
   bazClass.fields.add(xField);
   Field yField = new Field(new Name("y"),
-      type: new TypeParameterType(bazClass.typeParameters[1]));
+      type: new TypeParameterType(
+          bazClass.typeParameters[1], Nullability.legacy));
   bazClass.fields.add(yField);
   FunctionNode gooFunction = new FunctionNode(new EmptyStatement(),
       typeParameters: [new TypeParameter("V")]);
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index ebc86c0..a85b802 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -24,8 +24,6 @@
 import 'fasta/strong_tester.dart' as strong show createContext;
 import 'fasta/text_serialization_suite.dart' as text_serialization
     show createContext;
-import 'fasta/type_promotion_look_ahead_suite.dart' as type_promotion
-    show createContext;
 import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
     show createContext;
 import 'incremental_load_from_dill_suite.dart' as incremental_load
@@ -40,9 +38,11 @@
 class Options {
   final String configurationName;
   final bool verbose;
+  final bool printFailureLog;
   final Uri outputDirectory;
 
-  Options(this.configurationName, this.verbose, this.outputDirectory);
+  Options(this.configurationName, this.verbose, this.printFailureLog,
+      this.outputDirectory);
 
   static Options parse(List<String> args) {
     var parser = new ArgParser()
@@ -52,12 +52,14 @@
       ..addOption("output-directory",
           help: "directory to which results.json and logs.json are written")
       ..addFlag("verbose",
-          abbr: "v", help: "print additional information", defaultsTo: false);
+          abbr: "v", help: "print additional information", defaultsTo: false)
+      ..addFlag("print",
+          abbr: "p", help: "print failure logs", defaultsTo: false);
     var parsedArguments = parser.parse(args);
     String outputPath = parsedArguments["output-directory"] ?? ".";
     Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
     return Options(parsedArguments["named-configuration"],
-        parsedArguments["verbose"], outputDirectory);
+        parsedArguments["verbose"], parsedArguments["print"], outputDirectory);
   }
 }
 
@@ -65,6 +67,7 @@
   final String suiteName;
   final String prefix;
   final bool verbose;
+  final bool printFailureLog;
   final SendPort resultsPort;
   final SendPort logsPort;
   final Map<String, Stopwatch> stopwatches = {};
@@ -72,7 +75,7 @@
   final Set<String> seenTests = {};
 
   ResultLogger(this.suiteName, this.prefix, this.resultsPort, this.logsPort,
-      this.verbose, this.configurationName);
+      this.verbose, this.printFailureLog, this.configurationName);
 
   String getTestName(TestDescription description) {
     return "$prefix/${description.shortName}";
@@ -131,6 +134,10 @@
         "result": outcome,
         "log": failureLog,
       }));
+      if (printFailureLog) {
+        print('FAILED: $testName: $outcome');
+        print(failureLog);
+      }
     }
     if (verbose) {
       String result = matchedExpectations ? "PASS" : "FAIL";
@@ -200,8 +207,6 @@
       path: "fasta/strong_tester.dart", shardCount: 4, shard: 2),
   const Suite("fasta/strong4", strong.createContext, "../../testing.json",
       path: "fasta/strong_tester.dart", shardCount: 4, shard: 3),
-  const Suite("fasta/type_promotion_look_ahead", type_promotion.createContext,
-      "../../testing.json"),
   const Suite("incremental_bulk_compiler_smoke",
       incremental_bulk_compiler.createContext, "../testing.json"),
   const Suite("incremental_load_from_dill", incremental_load.createContext,
@@ -222,9 +227,10 @@
   final SendPort resultsPort;
   final SendPort logsPort;
   final bool verbose;
+  final bool printFailureLog;
   final String configurationName;
   const SuiteConfiguration(this.name, this.resultsPort, this.logsPort,
-      this.verbose, this.configurationName);
+      this.verbose, this.printFailureLog, this.configurationName);
 }
 
 void runSuite(SuiteConfiguration configuration) {
@@ -238,6 +244,7 @@
       configuration.resultsPort,
       configuration.logsPort,
       configuration.verbose,
+      configuration.printFailureLog,
       configuration.configurationName);
   runMe(<String>[], suite.createContext,
       me: suiteUri,
@@ -270,6 +277,7 @@
         resultsPort.sendPort,
         logsPort.sendPort,
         options.verbose,
+        options.printFailureLog,
         options.configurationName);
     Future future = Future<bool>(() async {
       Stopwatch stopwatch = Stopwatch()..start();
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/compounds.dart.type_promotion.expect
deleted file mode 100644
index 9a61489..0000000
--- a/pkg/front_end/testcases/extensions/compounds.dart.type_promotion.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-pkg/front_end/testcases/extensions/compounds.dart:12:43: Context: Possible promotion of other@340
-  bool operator ==(Object other) => other is Number && value == other.value;
-                                          ^^
-pkg/front_end/testcases/extensions/compounds.dart:19:15: Context: Possible promotion of other@501
-    if (other is int) {
-              ^^
-pkg/front_end/testcases/extensions/compounds.dart:21:22: Context: Possible promotion of other@501
-    } else if (other is Number) {
-                     ^^
-pkg/front_end/testcases/extensions/compounds.dart:29:15: Context: Possible promotion of other@501
-    if (other is int) {
-              ^^
-pkg/front_end/testcases/extensions/compounds.dart:31:22: Context: Possible promotion of other@501
-    } else if (other is Number) {
-                     ^^
-pkg/front_end/testcases/extensions/compounds.dart:161:16: Context: Write to v@3587
-  expect(n1, v += n1);
-               ^^
-pkg/front_end/testcases/extensions/compounds.dart:162:16: Context: Write to v@3587
-  expect(n2, v += n1);
-               ^^
-pkg/front_end/testcases/extensions/compounds.dart:163:16: Context: Write to v@3587
-  expect(n0, v -= n2);
-               ^^
-pkg/front_end/testcases/extensions/compounds.dart:164:16: Context: Write to v@3587
-  expect(n1, v += n1);
-               ^^
-pkg/front_end/testcases/extensions/compounds.dart:165:16: Context: Write to v@3587
-  expect(n0, v -= n1);
-               ^^
-pkg/front_end/testcases/extensions/compounds.dart:166:14: Context: Write to v@3587
-  expect(n1, ++v);
-             ^^
-pkg/front_end/testcases/extensions/compounds.dart:167:14: Context: Write to v@3587
-  expect(n0, --v);
-             ^^
-pkg/front_end/testcases/extensions/compounds.dart:168:15: Context: Write to v@3587
-  expect(n0, v++);
-              ^^
-pkg/front_end/testcases/extensions/compounds.dart:169:15: Context: Write to v@3587
-  expect(n1, v--);
-              ^^
-pkg/front_end/testcases/extensions/compounds.dart:173:5: Context: Write to v@3587
-  v += n1;
-    ^^
-pkg/front_end/testcases/extensions/compounds.dart:175:5: Context: Write to v@3587
-  v += n1;
-    ^^
-pkg/front_end/testcases/extensions/compounds.dart:177:5: Context: Write to v@3587
-  v -= n2;
-    ^^
-pkg/front_end/testcases/extensions/compounds.dart:179:5: Context: Write to v@3587
-  v += n1;
-    ^^
-pkg/front_end/testcases/extensions/compounds.dart:181:5: Context: Write to v@3587
-  v -= n1;
-    ^^
-pkg/front_end/testcases/extensions/compounds.dart:183:3: Context: Write to v@3587
-  ++v;
-  ^^
-pkg/front_end/testcases/extensions/compounds.dart:185:3: Context: Write to v@3587
-  --v;
-  ^^
-pkg/front_end/testcases/extensions/compounds.dart:187:4: Context: Write to v@3587
-  v++;
-   ^^
-pkg/front_end/testcases/extensions/compounds.dart:189:4: Context: Write to v@3587
-  v--;
-   ^^
-pkg/front_end/testcases/extensions/compounds.dart:489:14: Context: Write to expected@13239
-    expected = null;
-             ^
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect
deleted file mode 100644
index 3748577..0000000
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/extensions/conflict_with_object.dart:16:9: Context: Write to value@422
-  value = Extension("").noSuchMethod;
-        ^
-pkg/front_end/testcases/extensions/conflict_with_object.dart:20:9: Context: Write to value@422
-  value = Extension("").runtimeType();
-        ^
-pkg/front_end/testcases/extensions/conflict_with_object.dart:27:9: Context: Write to value@762
-  value = "".noSuchMethod;
-        ^
-pkg/front_end/testcases/extensions/conflict_with_object.dart:29:9: Context: Write to value@762
-  value = "".runtimeType;
-        ^
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart
new file mode 100644
index 0000000..70ca3dd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'deferred_explicit_access_lib.dart' deferred as prefix;
+
+main() async {
+  await prefix.loadLibrary();
+  expect(0, prefix.Extension.staticField);
+
+  expect(0, prefix.Extension(0).property);
+  expect(42, prefix.Extension(0).property = 42);
+  expect(84, prefix.Extension(42).property);
+  expect(85, prefix.Extension(43).method());
+
+  expect(42, prefix.Extension.staticProperty);
+  expect(87, prefix.Extension.staticProperty = 87);
+  expect(87, prefix.Extension.staticMethod());
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.outline.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.outline.expect
new file mode 100644
index 0000000..95c544f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.outline.expect
@@ -0,0 +1,54 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/deferred_explicit_access.dart:5:1: Error: Extension 'Extension' cannot be imported through a deferred import.
+// Try adding the `hide Extension` to the import.
+// import 'deferred_explicit_access_lib.dart' deferred as prefix;
+// ^
+//
+import self as self;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = self2::Extension|staticField;
+  static get staticProperty = get self2::Extension|staticProperty;
+  static method staticMethod = self2::Extension|staticMethod;
+  get property = self2::Extension|get#property;
+  method method = self2::Extension|method;
+  tearoff method = self2::Extension|get#method;
+  static set staticProperty = set self2::Extension|staticProperty;
+  set property = self2::Extension|set#property;
+}
+static field core::int* Extension|staticField;
+static field core::int* topLevelField;
+static get Extension|staticProperty() → core::int*
+  ;
+static set Extension|staticProperty(core::int* value) → void
+  ;
+static method Extension|staticMethod() → core::int*
+  ;
+static method Extension|get#property(final core::int* #this) → core::int*
+  ;
+static method Extension|set#property(final core::int* #this, core::int* value) → void
+  ;
+static method Extension|method(final core::int* #this) → core::int*
+  ;
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => self2::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  ;
+static set topLevelProperty(core::int* value) → void
+  ;
+static method topLevelMethod() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.expect
new file mode 100644
index 0000000..e9e8aad
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/deferred_explicit_access.dart:5:1: Error: Extension 'Extension' cannot be imported through a deferred import.
+// Try adding the `hide Extension` to the import.
+// import 'deferred_explicit_access_lib.dart' deferred as prefix;
+// ^
+//
+import self as self;
+import "deferred_explicit_access_lib.dart" as def;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic async {
+  await LoadLibrary(prefix);
+  self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
+  self::expect(0, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int* #t4 = 0 in let final core::int* #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
+  self::expect(84, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
+  self::expect(85, let final dynamic #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
+  self::expect(42, let final dynamic #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
+  self::expect(87, let final dynamic #t10 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty = 87);
+  self::expect(87, let final dynamic #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|set#property(final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..ddb1b0a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
@@ -0,0 +1,96 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/deferred_explicit_access.dart:5:1: Error: Extension 'Extension' cannot be imported through a deferred import.
+// Try adding the `hide Extension` to the import.
+// import 'deferred_explicit_access_lib.dart' deferred as prefix;
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "deferred_explicit_access_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper(LoadLibrary(prefix), :async_op_then, :async_op_error, :async_op) in null;
+        :result;
+        self::expect(0, let final core::Object* #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
+        self::expect(0, let final core::Object* #t3 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
+        self::expect(42, let final core::Object* #t4 = CheckLibraryIsLoaded(prefix) in let final core::int* #t5 = 0 in let final core::int* #t6 = 42 in let final void #t7 = def::Extension|set#property(#t5, #t6) in #t6);
+        self::expect(84, let final core::Object* #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
+        self::expect(85, let final core::Object* #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
+        self::expect(42, let final core::Object* #t10 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
+        self::expect(87, let final core::Object* #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty = 87);
+        self::expect(87, let final core::Object* #t12 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|set#property(final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart b/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart
new file mode 100644
index 0000000..a85bb28
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension Extension on int {
+  static int staticField = 0;
+
+  static int get staticProperty => staticField;
+
+  static void set staticProperty(int value) {
+    staticField = value;
+  }
+
+  static int staticMethod() => staticField;
+
+  int get property => this + staticField;
+
+  void set property(int value) {
+    staticField = value;
+  }
+
+  int method() => this + staticField;
+}
+
+int topLevelField = Extension.staticField;
+
+int get topLevelProperty => Extension.staticField;
+
+void set topLevelProperty(int value) {
+  Extension.staticField = value;
+}
+
+topLevelMethod() => Extension.staticField;
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart
new file mode 100644
index 0000000..c5d6507
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'deferred_explicit_access_lib.dart' deferred as prefix hide Extension;
+
+main() async {
+  await prefix.loadLibrary();
+  expect(0, prefix.topLevelField);
+  expect(42, prefix.topLevelField = 42);
+  expect(42, prefix.topLevelField);
+
+  expect(0, prefix.topLevelProperty);
+  expect(87, prefix.topLevelProperty = 87);
+  expect(87, prefix.topLevelProperty);
+  expect(87, prefix.topLevelMethod());
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.outline.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.outline.expect
new file mode 100644
index 0000000..d102c56
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = self2::Extension|staticField;
+  static get staticProperty = get self2::Extension|staticProperty;
+  static method staticMethod = self2::Extension|staticMethod;
+  get property = self2::Extension|get#property;
+  method method = self2::Extension|method;
+  tearoff method = self2::Extension|get#method;
+  static set staticProperty = set self2::Extension|staticProperty;
+  set property = self2::Extension|set#property;
+}
+static field core::int* Extension|staticField;
+static field core::int* topLevelField;
+static get Extension|staticProperty() → core::int*
+  ;
+static set Extension|staticProperty(core::int* value) → void
+  ;
+static method Extension|staticMethod() → core::int*
+  ;
+static method Extension|get#property(final core::int* #this) → core::int*
+  ;
+static method Extension|set#property(final core::int* #this, core::int* value) → void
+  ;
+static method Extension|method(final core::int* #this) → core::int*
+  ;
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => self2::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  ;
+static set topLevelProperty(core::int* value) → void
+  ;
+static method topLevelMethod() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.expect
new file mode 100644
index 0000000..1341a83
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "deferred_explicit_access_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic async {
+  await LoadLibrary(prefix);
+  self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+  self::expect(42, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::topLevelField = 42);
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+  self::expect(0, let final dynamic #t4 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+  self::expect(87, let final dynamic #t5 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty = 87);
+  self::expect(87, let final dynamic #t6 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+  self::expect(87, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{dart.core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|set#property(final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect
new file mode 100644
index 0000000..0508e3e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "deferred_explicit_access_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper(LoadLibrary(prefix), :async_op_then, :async_op_error, :async_op) in null;
+        :result;
+        self::expect(0, let final core::Object* #t2 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+        self::expect(42, let final core::Object* #t3 = CheckLibraryIsLoaded(prefix) in def::topLevelField = 42);
+        self::expect(42, let final core::Object* #t4 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+        self::expect(0, let final core::Object* #t5 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+        self::expect(87, let final core::Object* #t6 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty = 87);
+        self::expect(87, let final core::Object* #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+        self::expect(87, let final core::Object* #t8 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|set#property(final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField);
+static method Extension|get#method(final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.type_promotion.expect
deleted file mode 100644
index 5d34b36..0000000
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/extensions/direct_static_access.dart:101:11: Context: Write to field@408
-    field = property;
-          ^
-pkg/front_end/testcases/extensions/direct_static_access.dart:170:11: Context: Write to field@408
-    field = property;
-          ^
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.type_promotion.expect
deleted file mode 100644
index 48040a1..0000000
--- a/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,216 +0,0 @@
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:27:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:28:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:29:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:30:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:32:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:33:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:34:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:35:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:37:13: Context: Write to aVariable@453
-  aVariable = GenericExtension(cClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:38:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<A>(cClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:39:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<B>(cClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:40:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<C>(cClass).property;
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:42:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:43:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:44:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:45:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:47:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:48:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:49:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:50:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:52:13: Context: Write to aVariable@453
-  aVariable = GenericExtension(cClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:53:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<A>(cClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:54:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<B>(cClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:55:13: Context: Write to aVariable@453
-  aVariable = GenericExtension<C>(cClass).method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:57:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:58:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:59:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:60:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(aClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:61:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:62:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:63:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:64:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(aClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:65:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:66:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:67:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:68:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(aClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:69:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:70:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:71:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:72:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(aClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:74:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:75:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:76:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:77:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(bClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:78:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:79:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:80:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:81:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(bClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:82:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:83:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:84:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:85:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(bClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:86:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:87:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:88:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:89:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(bClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:91:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(cClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:92:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(cClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:93:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(cClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:94:13: Context: Write to cVariable@468
-  cVariable = GenericExtension(cClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:95:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(cClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:96:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(cClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:97:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(cClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:98:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<A>(cClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:99:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(cClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:100:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(cClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:101:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(cClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:102:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<B>(cClass).genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:103:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(cClass).genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:104:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(cClass).genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:105:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(cClass).genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/explicit_extension_inference.dart:106:13: Context: Write to cVariable@468
-  cVariable = GenericExtension<C>(cClass).genericMethod1<C>(aVariable);
-            ^
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.type_promotion.expect
deleted file mode 100644
index b4cc663..0000000
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart:15:16: Context: Write to latestType@375
-    latestType = '$T';
-               ^
-pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart:19:16: Context: Write to latestType@375
-    latestType = '$T';
-               ^
-pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart:23:16: Context: Write to latestType@375
-    latestType = '$T';
-               ^
-pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart:27:16: Context: Write to latestType@375
-    latestType = '$T:$S';
-               ^
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.type_promotion.expect
deleted file mode 100644
index 759a79d..0000000
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/extensions/extension_setter.dart:19:11: Context: Write to value@335
-    value = value + 1;
-          ^
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/if_null.dart.type_promotion.expect
deleted file mode 100644
index 8431aad..0000000
--- a/pkg/front_end/testcases/extensions/if_null.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/extensions/if_null.dart:27:5: Context: Write to c@408
-  c = new Class();
-    ^
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.type_promotion.expect
deleted file mode 100644
index c086585..0000000
--- a/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:27:13: Context: Write to cVariable@468
-  cVariable = aClass.property;
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:28:13: Context: Write to cVariable@468
-  cVariable = bClass.property;
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:29:13: Context: Write to aVariable@453
-  aVariable = cClass.property;
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:31:13: Context: Write to cVariable@468
-  cVariable = aClass.method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:32:13: Context: Write to cVariable@468
-  cVariable = bClass.method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:33:13: Context: Write to aVariable@453
-  aVariable = cClass.method(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:35:13: Context: Write to cVariable@468
-  cVariable = aClass.genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:36:13: Context: Write to cVariable@468
-  cVariable = aClass.genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:37:13: Context: Write to cVariable@468
-  cVariable = aClass.genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:38:13: Context: Write to cVariable@468
-  cVariable = aClass.genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:40:13: Context: Write to cVariable@468
-  cVariable = bClass.genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:41:13: Context: Write to cVariable@468
-  cVariable = bClass.genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:42:13: Context: Write to cVariable@468
-  cVariable = bClass.genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:43:13: Context: Write to cVariable@468
-  cVariable = bClass.genericMethod1<C>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:45:13: Context: Write to cVariable@468
-  cVariable = cClass.genericMethod1(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:46:13: Context: Write to cVariable@468
-  cVariable = cClass.genericMethod1<A>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:47:13: Context: Write to cVariable@468
-  cVariable = cClass.genericMethod1<B>(aVariable);
-            ^
-pkg/front_end/testcases/extensions/implicit_extension_inference.dart:48:13: Context: Write to cVariable@468
-  cVariable = cClass.genericMethod1<C>(aVariable);
-            ^
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart b/pkg/front_end/testcases/extensions/import_via_prefix.dart
new file mode 100644
index 0000000..a266734
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'import_via_prefix_lib.dart' as prefix;
+
+main() {
+  expect(3, "foo".method());
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw "Expected $expected, actual $actual";
+}
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.outline.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.outline.expect
new file mode 100644
index 0000000..4b7b4b9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///import_via_prefix_lib.dart" as prefix;
+
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  method method = self2::Extension|method;
+  tearoff method = self2::Extension|get#method;
+}
+static method Extension|method(final core::String* #this) → core::int*
+  ;
+static method Extension|get#method(final core::String* #this) → () →* core::int*
+  return () → core::int* => self2::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.expect
new file mode 100644
index 0000000..255aa8c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "import_via_prefix_lib.dart" as imp;
+
+import "org-dartlang-testcase:///import_via_prefix_lib.dart" as prefix;
+
+static method main() → dynamic {
+  self::expect(3, imp::Extension|method("foo"));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{dart.core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as imp;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  method method = imp::Extension|method;
+  tearoff method = imp::Extension|get#method;
+}
+static method Extension|method(final core::String* #this) → core::int*
+  return #this.{core::String::length};
+static method Extension|get#method(final core::String* #this) → () →* core::int*
+  return () → core::int* => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.transformed.expect
new file mode 100644
index 0000000..255aa8c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "import_via_prefix_lib.dart" as imp;
+
+import "org-dartlang-testcase:///import_via_prefix_lib.dart" as prefix;
+
+static method main() → dynamic {
+  self::expect(3, imp::Extension|method("foo"));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{dart.core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as imp;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  method method = imp::Extension|method;
+  tearoff method = imp::Extension|get#method;
+}
+static method Extension|method(final core::String* #this) → core::int*
+  return #this.{core::String::length};
+static method Extension|get#method(final core::String* #this) → () →* core::int*
+  return () → core::int* => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart b/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart
new file mode 100644
index 0000000..a2f111a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension Extension on String {
+  int method() => length;
+}
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/instance_access.dart.type_promotion.expect
deleted file mode 100644
index 052b274..0000000
--- a/pkg/front_end/testcases/extensions/instance_access.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/extensions/instance_access.dart:37:10: Context: Write to value@755
-    value++;
-         ^^
-pkg/front_end/testcases/extensions/instance_access.dart:57:10: Context: Write to value@1217
-    value++;
-         ^^
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.type_promotion.expect
deleted file mode 100644
index 2967660..0000000
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/extensions/instance_access_of_static.dart:18:10: Context: Write to value@447
-    value++;
-         ^^
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.type_promotion.expect
deleted file mode 100644
index 675c36c..0000000
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/extensions/instance_tearoff.dart:54:6: Context: Write to c0@978
-  c0 = new Class1(-4);
-     ^
-pkg/front_end/testcases/extensions/instance_tearoff.dart:58:6: Context: Write to c1@1007
-  c1 = new Class1(-7);
-     ^
-pkg/front_end/testcases/extensions/instance_tearoff.dart:73:6: Context: Write to c0@1494
-  c0 = new Class2(-4);
-     ^
-pkg/front_end/testcases/extensions/instance_tearoff.dart:77:6: Context: Write to c1@1523
-  c1 = new Class2(-7);
-     ^
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/issue38745.dart.type_promotion.expect
deleted file mode 100644
index 02c6ac8..0000000
--- a/pkg/front_end/testcases/extensions/issue38745.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/extensions/issue38745.dart:21:11: Context: Write to field@266
-    field = 23;
-          ^
-pkg/front_end/testcases/extensions/issue38745.dart:23:14: Context: Write to property@286
-    property = 23;
-             ^
-pkg/front_end/testcases/extensions/issue38745.dart:25:15: Context: Write to property2@349
-    property2 = 23;
-              ^
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/null_aware.dart.type_promotion.expect
deleted file mode 100644
index 5534d1b..0000000
--- a/pkg/front_end/testcases/extensions/null_aware.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/extensions/null_aware.dart:31:5: Context: Write to c@530
-  c = new Class();
-    ^
diff --git a/pkg/front_end/testcases/extensions/operators.dart b/pkg/front_end/testcases/extensions/operators.dart
index 6927bfe..17d5e27 100644
--- a/pkg/front_end/testcases/extensions/operators.dart
+++ b/pkg/front_end/testcases/extensions/operators.dart
@@ -121,6 +121,11 @@
   expect(c0, -c0);
 }
 
+void errors(Complex c) {
+  Operators(c) == c;
+  Operators(c) != c;
+}
+
 expect(expected, actual) {
   if (expected != actual) {
     throw 'Mismatch: expected=$expected, actual=$actual';
diff --git a/pkg/front_end/testcases/extensions/operators.dart.outline.expect b/pkg/front_end/testcases/extensions/operators.dart.outline.expect
index c38c397..ca95978 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.outline.expect
@@ -38,5 +38,7 @@
   ;
 static method explicit() → dynamic
   ;
+static method errors(self::Complex* c) → void
+  ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/operators.dart.strong.expect b/pkg/front_end/testcases/extensions/operators.dart.strong.expect
index 3453a24..4a46ae4 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.strong.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) == c;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) != c;
+//   ^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -114,6 +125,14 @@
   self::expect(c0, self::Operators|-(c_m2, c_m2));
   self::expect(c0, self::Operators|unary-(c0));
 }
+static method errors(self::Complex* c) → void {
+  invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) == c;
+  ^^^^^^^^^".{core::Object::==}(c);
+  !invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) != c;
+  ^^^^^^^^^".{core::Object::==}(c);
+}
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
diff --git a/pkg/front_end/testcases/extensions/operators.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/operators.dart.strong.transformed.expect
index 3453a24..4a46ae4 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.strong.transformed.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) == c;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) != c;
+//   ^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -114,6 +125,14 @@
   self::expect(c0, self::Operators|-(c_m2, c_m2));
   self::expect(c0, self::Operators|unary-(c0));
 }
+static method errors(self::Complex* c) → void {
+  invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) == c;
+  ^^^^^^^^^".{core::Object::==}(c);
+  !invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) != c;
+  ^^^^^^^^^".{core::Object::==}(c);
+}
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
diff --git a/pkg/front_end/testcases/extensions/operators.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/operators.dart.type_promotion.expect
deleted file mode 100644
index 0cf24a9..0000000
--- a/pkg/front_end/testcases/extensions/operators.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/extensions/operators.dart:27:18: Context: Possible promotion of other@348
-    return other is Complex &&
-                 ^^
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.type_promotion.expect
deleted file mode 100644
index a2934e5..0000000
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/extensions/unnamed_extensions.dart:37:10: Context: Write to value@744
-    value++;
-         ^^
-pkg/front_end/testcases/extensions/unnamed_extensions.dart:57:10: Context: Write to value@1195
-    value++;
-         ^^
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect
deleted file mode 100644
index 1a6ab73..0000000
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-pkg/front_end/testcases/general/DeltaBlue.dart:458:20: Context: Write to overridden@13140
-        overridden = overridden.satisfy(mark));
-                   ^
-pkg/front_end/testcases/general/DeltaBlue.dart:479:48: Context: Write to i@14066
-      for (int i = 0; i < unsatisfied.length; i++) {
-                                               ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:483:16: Context: Write to strength@14021
-      strength = strength.nextWeaker();
-               ^
-pkg/front_end/testcases/general/DeltaBlue.dart:530:46: Context: Write to i@16109
-    for (int i = 0; i < constraints.length; i++) {
-                                             ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:578:50: Context: Write to i@17909
-      for (int i = 0; i < v.constraints.length; i++) {
-                                                 ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:583:50: Context: Write to i@17909
-      for (int i = 0; i < v.constraints.length; i++) {
-                                                 ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:596:48: Context: Write to i@18497
-    for (int i = 0; i < v.constraints.length; i++) {
-                                               ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:618:39: Context: Write to i@19006
-    for (int i = 0; i < list.length; i++) {
-                                      ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:641:28: Context: Write to i@19940
-  for (int i = 0; i <= n; i++) {
-                           ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:644:23: Context: Write to first@19858
-    if (i == 0) first = v;
-                      ^
-pkg/front_end/testcases/general/DeltaBlue.dart:645:22: Context: Write to last@19872
-    if (i == n) last = v;
-                     ^
-pkg/front_end/testcases/general/DeltaBlue.dart:646:10: Context: Write to prev@19845
-    prev = v;
-         ^
-pkg/front_end/testcases/general/DeltaBlue.dart:651:29: Context: Write to i@19940
-  for (int i = 0; i < 100; i++) {
-                            ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:674:27: Context: Write to i@21031
-  for (int i = 0; i < n; i++) {
-                          ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:675:9: Context: Write to src@20956
-    src = new Variable("src", i);
-        ^
-pkg/front_end/testcases/general/DeltaBlue.dart:676:9: Context: Write to dst@20968
-    dst = new Variable("dst", i);
-        ^
-pkg/front_end/testcases/general/DeltaBlue.dart:686:31: Context: Write to i@21031
-  for (int i = 0; i < n - 1; i++) {
-                              ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:690:31: Context: Write to i@21031
-  for (int i = 0; i < n - 1; i++) {
-                              ^^
-pkg/front_end/testcases/general/DeltaBlue.dart:698:28: Context: Write to i@21838
-  for (int i = 0; i < 10; i++) {
-                           ^^
diff --git a/pkg/front_end/testcases/all_variances.dart b/pkg/front_end/testcases/general/all_variances.dart
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart
rename to pkg/front_end/testcases/general/all_variances.dart
diff --git a/pkg/front_end/testcases/all_variances.dart.legacy.expect b/pkg/front_end/testcases/general/all_variances.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart.legacy.expect
rename to pkg/front_end/testcases/general/all_variances.dart.legacy.expect
diff --git a/pkg/front_end/testcases/all_variances.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/all_variances.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/all_variances.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/all_variances.dart.outline.expect b/pkg/front_end/testcases/general/all_variances.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart.outline.expect
rename to pkg/front_end/testcases/general/all_variances.dart.outline.expect
diff --git a/pkg/front_end/testcases/all_variances.dart.strong.expect b/pkg/front_end/testcases/general/all_variances.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart.strong.expect
rename to pkg/front_end/testcases/general/all_variances.dart.strong.expect
diff --git a/pkg/front_end/testcases/all_variances.dart.strong.transformed.expect b/pkg/front_end/testcases/general/all_variances.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/all_variances.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/all_variances.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect b/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect
deleted file mode 100644
index ec473b6..0000000
--- a/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/arithmetic.dart:11:35: Context: Write to i@330
-  for (int i = 0; i < xs.length; i++) {}
-                                  ^^
diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.type_promotion.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.type_promotion.expect
deleted file mode 100644
index 4ea66ae..0000000
--- a/pkg/front_end/testcases/general/bad_setter_abstract.dart.type_promotion.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-pkg/front_end/testcases/general/bad_setter_abstract.dart:22:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:24:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:32:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:34:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:42:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:44:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:55:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:57:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:65:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/general/bad_setter_abstract.dart:67:11: Context: Write to threw@344
-    threw = false;
-          ^
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect b/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect
deleted file mode 100644
index 398e367..0000000
--- a/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/bug32414a.dart:10:5: Context: Write to b@305
-  b = 42;
-    ^
diff --git a/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect b/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect
deleted file mode 100644
index 27988f8..0000000
--- a/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/cascade.dart:25:8: Context: Write to list@232
-  list = [
-       ^
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.type_promotion.expect
deleted file mode 100644
index 0223359..0000000
--- a/pkg/front_end/testcases/general/check_deferred_is_check.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/check_deferred_is_check.dart:9:11: Context: Possible promotion of x@279
-  print(x is lib.C);
-          ^^
diff --git a/pkg/front_end/testcases/general/closure.dart.type_promotion.expect b/pkg/front_end/testcases/general/closure.dart.type_promotion.expect
deleted file mode 100644
index 82f0475..0000000
--- a/pkg/front_end/testcases/general/closure.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/closure.dart:18:7: Context: Write to x@336
-    x = new Foo();
-      ^
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.type_promotion.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.type_promotion.expect
deleted file mode 100644
index c79cbe1..0000000
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/general/control_flow_collection.dart:13:31: Context: Write to i@354
-    for (int i = 11; i <= 14; ++i) i,
-                              ^^
-pkg/front_end/testcases/general/control_flow_collection.dart:22:31: Context: Write to i@354
-    for (int i = 11; i <= 14; ++i) i,
-                              ^^
-pkg/front_end/testcases/general/control_flow_collection.dart:31:31: Context: Write to i@354
-    for (int i = 11; i <= 14; ++i) i: i,
-                              ^^
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect
deleted file mode 100644
index 4fe87a7..0000000
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,306 +0,0 @@
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:123:49: Context: Write to i@7018
-  var list10 = [for (int i = 0; oracle("foo"); i++) 42];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:124:48: Context: Write to i@7018
-  var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:125:48: Context: Write to i@7018
-  var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:126:49: Context: Write to i@7018
-  var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:127:48: Context: Write to i@7018
-  var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:128:48: Context: Write to i@7018
-  var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:129:49: Context: Write to i@7018
-  var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:130:48: Context: Write to i@7018
-  var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:131:48: Context: Write to i@7018
-  var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:49: Context: Write to i@7018
-  var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:48: Context: Write to i@7018
-  var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:48: Context: Write to i@7018
-  var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:49: Context: Write to i@7018
-  var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:48: Context: Write to i@7018
-  var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:48: Context: Write to i@7018
-  var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:49: Context: Write to i@7018
-  var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:48: Context: Write to i@7018
-  var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:48: Context: Write to i@7018
-  var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:49: Context: Write to i@7018
-  var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:48: Context: Write to i@7018
-  var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:48: Context: Write to i@7018
-  var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:49: Context: Write to i@7018
-  var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:48: Context: Write to i@7018
-  var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:48: Context: Write to i@7018
-  var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:49: Context: Write to i@7018
-  var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:48: Context: Write to i@7018
-  var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:48: Context: Write to i@7018
-  var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:61: Context: Write to i@7018
-  List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:59: Context: Write to i@7018
-  Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:67: Context: Write to i@7018
-  Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:61: Context: Write to i@7018
-  List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:59: Context: Write to i@7018
-  Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:61: Context: Write to i@7018
-  List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:59: Context: Write to i@7018
-  Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:67: Context: Write to i@7018
-  Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:55: Context: Write to i@7018
-  List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-                                                      ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:53: Context: Write to i@7018
-  Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-                                                    ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:61: Context: Write to i@7018
-  Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:55: Context: Write to i@7018
-  List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-                                                      ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:53: Context: Write to i@7018
-  Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-                                                    ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:55: Context: Write to i@7018
-  List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-                                                      ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:53: Context: Write to i@7018
-  Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-                                                    ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:61: Context: Write to i@7018
-  List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:59: Context: Write to i@7018
-  Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:67: Context: Write to i@7018
-  Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:61: Context: Write to i@7018
-  List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:59: Context: Write to i@7018
-  Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:67: Context: Write to i@7018
-  Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:171:61: Context: Write to i@7018
-  List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:172:59: Context: Write to i@7018
-  Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:173:67: Context: Write to i@7018
-  Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:61: Context: Write to i@7018
-  List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:59: Context: Write to i@7018
-  Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-                                                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:67: Context: Write to i@7018
-  Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:49: Context: Write to i@7018
-  var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:48: Context: Write to i@7018
-  var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:179:48: Context: Write to i@7018
-  var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:49: Context: Write to i@7018
-  var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:48: Context: Write to i@7018
-  var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:48: Context: Write to i@7018
-  var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:49: Context: Write to i@7018
-  var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:48: Context: Write to i@7018
-  var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:48: Context: Write to i@7018
-  var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:49: Context: Write to i@7018
-  var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:48: Context: Write to i@7018
-  var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:48: Context: Write to i@7018
-  var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:189:55: Context: Write to i@7018
-  List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
-                                                      ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:190:53: Context: Write to i@7018
-  Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-                                                    ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:191:61: Context: Write to i@7018
-  Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:55: Context: Write to i@7018
-  List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-                                                      ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:53: Context: Write to i@7018
-  Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-                                                    ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:61: Context: Write to i@7018
-  Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:40: Context: Write to index@6916
-  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-                                       ^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:65: Context: Write to index@6916
-  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-                                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:38: Context: Write to index@6916
-  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-                                     ^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:63: Context: Write to index@6916
-  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-                                                              ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:54: Context: Write to index@6916
-  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-                                                     ^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:79: Context: Write to index@6916
-  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-                                                                              ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:204:48: Context: Write to i@7018
-  List<int> list130 = [for (var i = 1; i < 2; i++) i];
-                                               ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:205:46: Context: Write to i@7018
-  Set<int> set130 = {for (var i = 1; i < 2; i++) i};
-                                             ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:206:51: Context: Write to i@7018
-  Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
-                                                  ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-                                             ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-                                             ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) ...map];
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-                                             ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:44: Context: Write to i@13789
-  <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-                                           ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:44: Context: Write to i@13789
-  <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-                                           ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:52: Context: Write to i@13789
-  <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-                                                   ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:49: Context: Write to i@13789
-  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-                                        ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:49: Context: Write to i@13789
-  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-                                                ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:267:29: Context: Possible promotion of a@16609
-  List<int> list10 = [if (a is B) a.foo];
-                            ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:268:27: Context: Possible promotion of a@16609
-  Set<int> set10 = {if (a is B) a.foo};
-                          ^^
-pkg/front_end/testcases/general/control_flow_collection_inference.dart:269:32: Context: Possible promotion of a@16609
-  Map<int, int> map10 = {if (a is B) a.foo: a.foo};
-                               ^^
diff --git a/pkg/front_end/testcases/general/escape.dart.type_promotion.expect b/pkg/front_end/testcases/general/escape.dart.type_promotion.expect
deleted file mode 100644
index 4360f9c..0000000
--- a/pkg/front_end/testcases/general/escape.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/general/escape.dart:31:5: Context: Write to x@483
-  x ??= "";
-    ^^^
-pkg/front_end/testcases/general/escape.dart:32:5: Context: Write to x@483
-  x ??= 45;
-    ^^^
diff --git a/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect b/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect
deleted file mode 100644
index 765bde0..0000000
--- a/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-pkg/front_end/testcases/general/expressions.dart:34:5: Context: Write to i@286
-  i = 87;
-    ^
-pkg/front_end/testcases/general/expressions.dart:38:9: Context: Write to i@286
-  print(--i);
-        ^^
-pkg/front_end/testcases/general/expressions.dart:39:9: Context: Write to i@286
-  print(++i);
-        ^^
-pkg/front_end/testcases/general/expressions.dart:40:10: Context: Write to i@286
-  print(i--);
-         ^^
-pkg/front_end/testcases/general/expressions.dart:41:10: Context: Write to i@286
-  print(i++);
-         ^^
diff --git a/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect b/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect
deleted file mode 100644
index 3758346..0000000
--- a/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/fallthrough.dart:9:9: Context: Write to x@254
-      x = 4;
-        ^
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect b/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect
deleted file mode 100644
index 76596ca..0000000
--- a/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/fibonacci.dart:11:28: Context: Write to i@332
-  for (int i = 0; i < 20; i++) {
-                           ^^
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect
deleted file mode 100644
index 30852a8..0000000
--- a/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/general/function_type_is_check.dart:8:9: Context: Possible promotion of f@272
-  if (f is void Function(Object, StackTrace)) return 1;
-        ^^
-pkg/front_end/testcases/general/function_type_is_check.dart:9:9: Context: Possible promotion of f@272
-  if (f is void Function(Object)) return 10;
-        ^^
-pkg/front_end/testcases/general/function_type_is_check.dart:10:9: Context: Possible promotion of f@272
-  if (f is void Function()) return 100;
-        ^^
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect b/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect
deleted file mode 100644
index f455e75..0000000
--- a/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/general/implicit_new.dart:31:5: Context: Write to x@522
-  x = prefix.Foo();
-    ^
-pkg/front_end/testcases/general/implicit_new.dart:33:5: Context: Write to z@559
-  z = prefix.Bar.named();
-    ^
-pkg/front_end/testcases/general/implicit_new.dart:39:5: Context: Write to l@682
-  l = [prefix.Foo(), prefix.Bar.named()];
-    ^
-pkg/front_end/testcases/general/implicit_new.dart:41:5: Context: Write to m@756
-  m = {"foo": prefix.Foo(), "bar": prefix.Bar.named()};
-    ^
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect
deleted file mode 100644
index ab4afb9..0000000
--- a/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/general/implicit_scope_test.dart:28:30: Context: Write to i@736
-    for (int i = 0; i < 10; i++) var a = "bar", b = "baz";
-                             ^^
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect
deleted file mode 100644
index 9d791cd..0000000
--- a/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-pkg/front_end/testcases/general/invalid_assignment.dart:10:5: Context: Write to i@273
-  i = 1;
-    ^
-pkg/front_end/testcases/general/invalid_assignment.dart:11:5: Context: Write to i@273
-  i = s;
-    ^
-pkg/front_end/testcases/general/invalid_assignment.dart:12:5: Context: Write to i@273
-  i ??= 1;
-    ^^^
-pkg/front_end/testcases/general/invalid_assignment.dart:13:5: Context: Write to i@273
-  i ??= s;
-    ^^^
-pkg/front_end/testcases/general/invalid_assignment.dart:14:5: Context: Write to a@288
-  a = new A();
-    ^
-pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Context: Write to a@288
-  a += 1;
-    ^^
diff --git a/pkg/front_end/testcases/general/nested_variable_set.dart.type_promotion.expect b/pkg/front_end/testcases/general/nested_variable_set.dart.type_promotion.expect
deleted file mode 100644
index 6aa997e..0000000
--- a/pkg/front_end/testcases/general/nested_variable_set.dart.type_promotion.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-pkg/front_end/testcases/general/nested_variable_set.dart:11:25: Context: Write to intLocal2@249
-  intLocal1 = intLocal2 = numLocal;
-                        ^
-pkg/front_end/testcases/general/nested_variable_set.dart:11:13: Context: Write to intLocal1@232
-  intLocal1 = intLocal2 = numLocal;
-            ^
-pkg/front_end/testcases/general/nested_variable_set.dart:12:24: Context: Write to numLocal@266
-  intLocal1 = numLocal = intLocal2;
-                       ^
-pkg/front_end/testcases/general/nested_variable_set.dart:12:13: Context: Write to intLocal1@232
-  intLocal1 = numLocal = intLocal2;
-            ^
-pkg/front_end/testcases/general/nested_variable_set.dart:13:12: Context: Write to numLocal@266
-  numLocal = 0.5;
-           ^
-pkg/front_end/testcases/general/nested_variable_set.dart:15:29: Context: Write to doubleLocal@285
-    intLocal1 = doubleLocal = numLocal;
-                            ^
-pkg/front_end/testcases/general/nested_variable_set.dart:15:15: Context: Write to intLocal1@232
-    intLocal1 = doubleLocal = numLocal;
-              ^
diff --git a/pkg/front_end/testcases/nested_variance_test.dart b/pkg/front_end/testcases/general/nested_variance.dart
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart
rename to pkg/front_end/testcases/general/nested_variance.dart
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/nested_variance.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.legacy.expect b/pkg/front_end/testcases/general/nested_variance.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.legacy.expect
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/nested_variance.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.outline.expect b/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.outline.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.outline.expect
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.strong.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.strong.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.strong.expect
diff --git a/pkg/front_end/testcases/nested_variance_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_variance_test.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/general/promoted_access.dart.type_promotion.expect b/pkg/front_end/testcases/general/promoted_access.dart.type_promotion.expect
deleted file mode 100644
index 4f2344b..0000000
--- a/pkg/front_end/testcases/general/promoted_access.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/general/promoted_access.dart:3:11: Context: Possible promotion of o@28
-    if (o is Class) {
-          ^^
-pkg/front_end/testcases/general/promoted_access.dart:10:9: Context: Possible promotion of o@28
-  if (o is Class) {
-        ^^
diff --git a/pkg/front_end/testcases/general/statements.dart.type_promotion.expect b/pkg/front_end/testcases/general/statements.dart.type_promotion.expect
deleted file mode 100644
index 5384f47..0000000
--- a/pkg/front_end/testcases/general/statements.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/general/statements.dart:51:10: Context: Write to done@988
-    done = true;
-         ^
-pkg/front_end/testcases/general/statements.dart:101:9: Context: Write to i@1834
-    if (++i < 3) continue;
-        ^^
-pkg/front_end/testcases/general/statements.dart:104:5: Context: Write to i@1834
-  i = 0;
-    ^
-pkg/front_end/testcases/general/statements.dart:108:9: Context: Write to i@1834
-    if (++i < 3) continue OUTER;
-        ^^
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.type_promotion.expect
deleted file mode 100644
index b7149e2b..0000000
--- a/pkg/front_end/testcases/general/unsound_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/general/unsound_promotion.dart:20:9: Context: Possible promotion of s@397
-  if (s is A) {
-        ^^
-pkg/front_end/testcases/general/unsound_promotion.dart:31:9: Context: Write to aList@541
-  aList = list;
-        ^
-pkg/front_end/testcases/general/unsound_promotion.dart:33:9: Context: Write to aList@541
-  aList = o;
-        ^
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect
new file mode 100644
index 0000000..c58b401
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    main::foo();
+  }
+  static method foo() → dynamic {}
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect
new file mode 100644
index 0000000..ea10dfd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:2:3: Error: 'await' can only be used in 'async' or 'async*' methods.
+//   await foo();
+//   ^^^^^
+//
+
+  static method main() → dynamic {
+    invalid-expression "org-dartlang-test:///main.dart:2:3: Error: 'await' can only be used in 'async' or 'async*' methods.\n  await foo();\n  ^^^^^";
+  }
+  static method foo() → dynamic {}
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect
new file mode 100644
index 0000000..f620098
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("Hello from v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect
new file mode 100644
index 0000000..fd564fa
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect
@@ -0,0 +1,37 @@
+main = <No Member>;
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("Hello from v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  import "package:example/b.dart";
+
+  static field dart.core::bool* foo1 = true;
+  static method foo() → dynamic {
+    dart.core::print("Hello from foo");
+    b::b();
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    foo::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect
new file mode 100644
index 0000000..36a808a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect
@@ -0,0 +1,43 @@
+main = <No Member>;
+library from "package:example/b.dart" as b {
+
+  static field dart.core::bool* example011 = true;
+  static method b() → dynamic {
+    dart.core::print("Hello from v0.1.1");
+  }
+}
+library from "package:foo/bar.dart" as bar {
+
+  static method bar() → dynamic {
+    dart.core::print("hello from bar");
+  }
+}
+library from "package:foo/baz.dart" as baz {
+
+  static method baz() → dynamic {
+    dart.core::print("hello from baz");
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  import "package:example/b.dart";
+  import "package:foo/bar.dart";
+  import "package:foo/baz.dart";
+
+  static field dart.core::bool* foo2 = true;
+  static method foo() → dynamic {
+    dart.core::print("Hello from foo 2");
+    bar::bar();
+    baz::baz();
+    b::b();
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    foo::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.1.expect
new file mode 100644
index 0000000..d0e1860
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.1.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:module/a.dart";
+
+  class Foo extends a::A {
+    synthetic constructor •() → main::Foo*
+      : super a::A::•()
+      ;
+  }
+}
+library from "package:module/a.dart" as a {
+
+  import "package:module/b.dart";
+
+  class A extends a::A2<b::B*> {
+    synthetic constructor •() → a::A*
+      : super a::A2::•()
+      ;
+  }
+  class A2<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::A2<a::A2::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:module/b.dart" as b {
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.2.expect
new file mode 100644
index 0000000..d0e1860
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_10.yaml.world.2.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:module/a.dart";
+
+  class Foo extends a::A {
+    synthetic constructor •() → main::Foo*
+      : super a::A::•()
+      ;
+  }
+}
+library from "package:module/a.dart" as a {
+
+  import "package:module/b.dart";
+
+  class A extends a::A2<b::B*> {
+    synthetic constructor •() → a::A*
+      : super a::A2::•()
+      ;
+  }
+  class A2<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::A2<a::A2::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:module/b.dart" as b {
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.1.expect
new file mode 100644
index 0000000..946f8db
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.1.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:module/a.dart";
+
+  class Foo extends a::A {
+    synthetic constructor •() → main::Foo*
+      : super a::A::•()
+      ;
+  }
+}
+library from "package:module/a.dart" as a {
+
+  import "package:module/b.dart";
+
+  class A extends dart.core::Object implements a::A2<b::B*> {
+    synthetic constructor •() → a::A*
+      : super dart.core::Object::•()
+      ;
+  }
+  class A2<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::A2<a::A2::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:module/b.dart" as b {
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.2.expect
new file mode 100644
index 0000000..946f8db
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_11.yaml.world.2.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:module/a.dart";
+
+  class Foo extends a::A {
+    synthetic constructor •() → main::Foo*
+      : super a::A::•()
+      ;
+  }
+}
+library from "package:module/a.dart" as a {
+
+  import "package:module/b.dart";
+
+  class A extends dart.core::Object implements a::A2<b::B*> {
+    synthetic constructor •() → a::A*
+      : super dart.core::Object::•()
+      ;
+  }
+  class A2<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::A2<a::A2::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:module/b.dart" as b {
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_12.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_12.yaml.world.1.expect
new file mode 100644
index 0000000..c1f1b5c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_12.yaml.world.1.expect
@@ -0,0 +1,9 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
new file mode 100644
index 0000000..f66a0d5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:module/a.dart";
+
+  class ABC = a::AB with a::C {
+    synthetic constructor •() → main::ABC*
+      : super a::AB::•()
+      ;
+  }
+}
+library from "package:module/a.dart" as a {
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → a::A*
+      : super dart.core::Object::•()
+      ;
+  }
+  class B extends dart.core::Object {
+    synthetic constructor •() → a::B*
+      : super dart.core::Object::•()
+      ;
+  }
+  class C extends dart.core::Object {
+    synthetic constructor •() → a::C*
+      : super dart.core::Object::•()
+      ;
+  }
+  class AB = a::A with a::B {
+    synthetic constructor •() → a::AB*
+      : super a::A::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
new file mode 100644
index 0000000..df74ba9c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
@@ -0,0 +1,23 @@
+main = <No Member>;
+library from "package:example/a.dart" as a {
+
+  static field dart.core::bool* example = true;
+  static method a() → dynamic {}
+}
+library from "package:foo/foo.dart" as foo {
+additionalExports = (a::example,
+  a::a)
+
+  export "package:example/a.dart";
+
+  static field dart.core::bool* foo = true;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
new file mode 100644
index 0000000..df74ba9c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
@@ -0,0 +1,23 @@
+main = <No Member>;
+library from "package:example/a.dart" as a {
+
+  static field dart.core::bool* example = true;
+  static method a() → dynamic {}
+}
+library from "package:foo/foo.dart" as foo {
+additionalExports = (a::example,
+  a::a)
+
+  export "package:example/a.dart";
+
+  static field dart.core::bool* foo = true;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect
new file mode 100644
index 0000000..71e4ef1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::bool* foo = true;
+  final field dynamic lalala_SimulateTransformer /* from null */;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  final field dynamic lalala_SimulateTransformer /* from null */;
+  static method main() → dynamic {
+    dart.core::print(foo::foo);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect
new file mode 100644
index 0000000..e13a156
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::bool* foo2 = true;
+  final field dynamic lalala_SimulateTransformer /* from null */;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/foo.dart";
+
+  final field dynamic lalala_SimulateTransformer /* from null */;
+  static method main() → dynamic {
+    dart.core::print(foo::foo2);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
new file mode 100644
index 0000000..864ab07
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
@@ -0,0 +1,39 @@
+main = <No Member>;
+library from "org-dartlang-test:///a.dart" as a {
+
+  import "package:moduleB/b.dart";
+
+  static field dart.core::String* foo = c::baz;
+  static field dart.core::int* x = b::mya2.{b::A2::bar};
+}
+library from "package:moduleB/b.dart" as b {
+additionalExports = (c::baz)
+
+  import "package:moduleC/c.dart";
+  export "package:moduleC/c.dart";
+
+  class A2 extends c::A3 {
+    field dart.core::int* bar = 42;
+    synthetic constructor •() → b::A2*
+      : super c::A3::•()
+      ;
+  }
+  static field b::A2* mya2 = new b::A2::•();
+}
+library from "package:moduleC/c.dart" as c {
+
+  import "package:moduleD/d.dart";
+
+  class A3 extends dart.core::Object {
+    field dart.core::int* foo = 42;
+    synthetic constructor •() → c::A3*
+      : super dart.core::Object::•()
+      ;
+  }
+  static field dart.core::String* baz = "42";
+  static field dart.core::String* baz2 = d::baz3;
+}
+library from "package:moduleD/d.dart" as d {
+
+  static field dart.core::String* baz3 = "baz3";
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml.world.1.expect
new file mode 100644
index 0000000..f3a7ae9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml.world.1.expect
@@ -0,0 +1,39 @@
+main = <No Member>;
+library from "org-dartlang-test:///a.dart" as a {
+
+  import "package:moduleB/b.dart";
+
+  static field dart.core::int* foo = b::bVar;
+  static field dart.core::String* foo2 = b::bVarFromC;
+}
+library from "package:moduleB/b.dart" as b {
+
+  import "package:moduleC/c.dart";
+
+  class A2 extends c::A3 {
+    field dart.core::int* bar = 42;
+    synthetic constructor •() → b::A2*
+      : super c::A3::•()
+      ;
+  }
+  static field dart.core::int* bVar = 42;
+  static field dart.core::String* bVarFromC = c::baz2;
+  static field b::A2* mya2 = new b::A2::•();
+}
+library from "package:moduleC/c.dart" as c {
+
+  import "package:moduleD/d.dart";
+
+  class A3 extends dart.core::Object {
+    field dart.core::int* foo = 42;
+    synthetic constructor •() → c::A3*
+      : super dart.core::Object::•()
+      ;
+  }
+  static field dart.core::String* baz = "42";
+  static field dart.core::String* baz2 = d::baz3;
+}
+library from "package:moduleD/d.dart" as d {
+
+  static field dart.core::String* baz3 = "baz3";
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml.world.1.expect
new file mode 100644
index 0000000..64c3715
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml.world.1.expect
@@ -0,0 +1,46 @@
+main = <No Member>;
+library from "org-dartlang-test:///a.dart" as a {
+
+  import "package:moduleB/b.dart";
+
+  class A1 extends b::A2 {
+    synthetic constructor •() → a::A1*
+      : super b::A2::•()
+      ;
+    method fooMethod() → dart.core::String*
+      return "42!";
+  }
+  static field dart.core::int* foo = b::bVar;
+  static field dart.core::String* foo2 = b::bVarFromC;
+}
+library from "package:moduleB/b.dart" as b {
+
+  import "package:moduleC/c.dart";
+
+  class A2 extends c::A3 {
+    field dart.core::int* bar = 42;
+    synthetic constructor •() → b::A2*
+      : super c::A3::•()
+      ;
+  }
+  static field dart.core::int* bVar = 42;
+  static field dart.core::String* bVarFromC = c::baz2;
+  static field b::A2* mya2 = new b::A2::•();
+}
+library from "package:moduleC/c.dart" as c {
+
+  import "package:moduleD/d.dart";
+
+  class A3 extends dart.core::Object {
+    field dart.core::int* foo = 42;
+    synthetic constructor •() → c::A3*
+      : super dart.core::Object::•()
+      ;
+  }
+  static field dart.core::String* baz = "42";
+  static field dart.core::String* baz2 = d::baz3;
+}
+library from "package:moduleD/d.dart" as d {
+
+  static field dart.core::String* baz3 = "baz3";
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect
new file mode 100644
index 0000000..d997be9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect
@@ -0,0 +1,69 @@
+main = <No Member>;
+library from "org-dartlang-test:///compileme.dart" as com {
+
+  import "package:module/lib1.dart";
+  import "package:module/lib2.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → com::Foo*
+      : super dart.core::Object::•()
+      ;
+    method class1() → lib1::Class1* {
+      lib1::Class1* class1 = new lib1::Class1::•();
+      class1.{lib1::Class1::c3a}.{lib3::Class3a::c3b}.{lib3::Class3b::str}();
+      return class1;
+    }
+  }
+  static method main() → dynamic {
+    lib2::Class2* class2 = new lib2::Class2::•();
+    dart.core::print(class2);
+  }
+}
+library from "package:module/lib1.dart" as lib1 {
+
+  import "package:module/lib3.dart";
+
+  class Class1 extends dart.core::Object {
+    synthetic constructor •() → lib1::Class1*
+      : super dart.core::Object::•()
+      ;
+    get c3a() → lib3::Class3a* {}
+  }
+}
+library from "package:module/lib2.dart" as lib2 {
+
+  import "package:module/lib4.dart";
+
+  class Class2 extends dart.core::Object {
+    synthetic constructor •() → lib2::Class2*
+      : super dart.core::Object::•()
+      ;
+    method cl4() → void {
+      lib4::Class4* class4 = new lib4::Class4::•();
+      dart.core::print(class4);
+    }
+  }
+}
+library from "package:module/lib3.dart" as lib3 {
+
+  class Class3a extends dart.core::Object {
+    synthetic constructor •() → lib3::Class3a*
+      : super dart.core::Object::•()
+      ;
+    get c3b() → lib3::Class3b* {}
+  }
+  class Class3b extends dart.core::Object {
+    synthetic constructor •() → lib3::Class3b*
+      : super dart.core::Object::•()
+      ;
+    method str() → dart.core::String* {}
+  }
+}
+library from "package:module/lib4.dart" as lib4 {
+
+  class Class4 extends dart.core::Object {
+    synthetic constructor •() → lib4::Class4*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect
new file mode 100644
index 0000000..1ac4a6f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect
@@ -0,0 +1,63 @@
+main = <No Member>;
+library from "org-dartlang-test:///compileme.dart" as com {
+
+  import "package:module/lib1.dart";
+  import "package:module/lib2.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → com::Foo*
+      ;
+    method class1() → lib1::Class1*
+      ;
+  }
+  static method main() → dynamic
+    ;
+}
+library from "package:module/lib1.dart" as lib1 {
+
+  import "package:module/lib3.dart";
+
+  class Class1 extends dart.core::Object {
+    synthetic constructor •() → lib1::Class1*
+      : super dart.core::Object::•()
+      ;
+    get c3a() → lib3::Class3a* {}
+  }
+}
+library from "package:module/lib2.dart" as lib2 {
+
+  import "package:module/lib4.dart";
+
+  class Class2 extends dart.core::Object {
+    synthetic constructor •() → lib2::Class2*
+      : super dart.core::Object::•()
+      ;
+    method cl4() → void {
+      lib4::Class4* class4 = new lib4::Class4::•();
+      dart.core::print(class4);
+    }
+  }
+}
+library from "package:module/lib3.dart" as lib3 {
+
+  class Class3a extends dart.core::Object {
+    synthetic constructor •() → lib3::Class3a*
+      : super dart.core::Object::•()
+      ;
+    get c3b() → lib3::Class3b* {}
+  }
+  class Class3b extends dart.core::Object {
+    synthetic constructor •() → lib3::Class3b*
+      : super dart.core::Object::•()
+      ;
+    method str() → dart.core::String* {}
+  }
+}
+library from "package:module/lib4.dart" as lib4 {
+
+  class Class4 extends dart.core::Object {
+    synthetic constructor •() → lib4::Class4*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect
new file mode 100644
index 0000000..5680e46
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect
@@ -0,0 +1,40 @@
+main = <No Member>;
+library from "org-dartlang-test:///compileme.dart" as com {
+
+  import "package:module/lib1.dart";
+
+  static method main() → dynamic {
+    lib1::XSet* history = new lib3::XIdentityHashSet::•();
+  }
+}
+library from "package:module/lib1.dart" as lib1 {
+
+  import "package:module/lib2.dart";
+
+  abstract class XSet extends dart.core::Object {
+    static field dynamic _redirecting# = <dynamic>[lib1::XSet::identity];
+    static factory identity() → lib1::XSet*
+      let dynamic #redirecting_factory = lib2::XLinkedHashSet::identity in invalid-expression;
+  }
+}
+library from "package:module/lib2.dart" as lib2 {
+
+  import "package:module/lib1.dart";
+  import "package:module/lib3.dart";
+
+  class XLinkedHashSet extends dart.core::Object implements lib1::XSet {
+    static field dynamic _redirecting# = <dynamic>[lib2::XLinkedHashSet::identity];
+    static factory identity() → lib2::XLinkedHashSet*
+      let dynamic #redirecting_factory = lib3::XIdentityHashSet::• in invalid-expression;
+  }
+}
+library from "package:module/lib3.dart" as lib3 {
+
+  import "package:module/lib2.dart";
+
+  class XIdentityHashSet extends dart.core::Object implements lib2::XLinkedHashSet {
+    constructor •() → lib3::XIdentityHashSet*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect
new file mode 100644
index 0000000..e8e1f54
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:moduleA/a.dart";
+
+  static method main() → dynamic {
+    a::A* a = new a::A::•();
+  }
+}
+library from "package:moduleA/a.dart" as a {
+additionalExports = (b::B)
+
+  export "package:moduleB/b.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → a::A*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:moduleB/b.dart" as b {
+
+  class B extends dart.core::Object {
+    field dart.core::int* foo = 42;
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect
new file mode 100644
index 0000000..e8e1f54
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:moduleA/a.dart";
+
+  static method main() → dynamic {
+    a::A* a = new a::A::•();
+  }
+}
+library from "package:moduleA/a.dart" as a {
+additionalExports = (b::B)
+
+  export "package:moduleB/b.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → a::A*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "package:moduleB/b.dart" as b {
+
+  class B extends dart.core::Object {
+    field dart.core::int* foo = 42;
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect
new file mode 100644
index 0000000..bb6b7ad
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect
@@ -0,0 +1,17 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  part c.dart;
+  static method b() → dynamic {
+    b::c();
+  }
+  static method /* from org-dartlang-test:///c.dart */ c() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect
new file mode 100644
index 0000000..27d1567
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect
@@ -0,0 +1,13 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect
new file mode 100644
index 0000000..4ed9953
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect
@@ -0,0 +1,23 @@
+main = <No Member>;
+library libFoo from "org-dartlang-test:///b.dart" as lib {
+
+  part e.dart;
+  part c.dart;
+  part d.dart;
+  static method b() → dynamic {
+    lib::c();
+    lib::d();
+    lib::e();
+  }
+  static method /* from org-dartlang-test:///c.dart */ c() → dynamic {}
+  static method /* from org-dartlang-test:///d.dart */ d() → dynamic {}
+  static method /* from org-dartlang-test:///e.dart */ e() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    lib::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect
new file mode 100644
index 0000000..a9622d3
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect
@@ -0,0 +1,9 @@
+main = <No Member>;
+library libFoo from "org-dartlang-test:///main.dart" as lib {
+
+  part c.dart;
+  static method /* from org-dartlang-test:///c.dart */ c() → dynamic {}
+  static method main() → dynamic {
+    lib::c();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect
new file mode 100644
index 0000000..bb6b7ad
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect
@@ -0,0 +1,17 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  part c.dart;
+  static method b() → dynamic {
+    b::c();
+  }
+  static method /* from org-dartlang-test:///c.dart */ c() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect
new file mode 100644
index 0000000..1a14625
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect
new file mode 100644
index 0000000..1a14625
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect
new file mode 100644
index 0000000..7d83543
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect
@@ -0,0 +1,13 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect
new file mode 100644
index 0000000..1a14625
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
new file mode 100644
index 0000000..b2256ee
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
@@ -0,0 +1,26 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static const field dart.core::Set<dart.core::String*>* bar = #C6;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field dart.core::Set<dart.core::String*>* foo = #C9;
+  static method main() → dynamic {
+    dart.core::print(#C9);
+    dart.core::print(#C6);
+  }
+}
+constants  {
+  #C1 = "hello"
+  #C2 = null
+  #C3 = "world"
+  #C4 = <dynamic>[#C1, #C2, #C3, #C2]
+  #C5 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C4}
+  #C6 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C5}
+  #C7 = <dynamic>[]
+  #C8 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C7}
+  #C9 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C8}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
new file mode 100644
index 0000000..264f105
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
@@ -0,0 +1,25 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static const field dart.core::Set<dart.core::int*>* bar = #C5;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field dart.core::Set<dart.core::String*>* foo = #C8;
+  static method main() → dynamic {
+    dart.core::print(#C8);
+    dart.core::print(#C5);
+  }
+}
+constants  {
+  #C1 = 42
+  #C2 = null
+  #C3 = <dynamic>[#C1, #C2]
+  #C4 = dart.core::_ImmutableMap<dart.core::int*, dart.core::Null?> {_kvPairs:#C3}
+  #C5 = dart.collection::_UnmodifiableSet<dart.core::int*> {_map:#C4}
+  #C6 = <dynamic>[]
+  #C7 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C6}
+  #C8 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C7}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect
new file mode 100644
index 0000000..69ca563
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect
@@ -0,0 +1,63 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:3:11: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+//   factory C.e4() async = C;
+//           ^^
+//
+// org-dartlang-test:///main.dart:3:18: Error: Factory bodies can't use 'async', 'async*', or 'sync*'.
+//   factory C.e4() async = C;
+//                  ^^^^^
+//
+// org-dartlang-test:///main.dart:3:24: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   factory C.e4() async = C;
+//                        ^
+//
+// org-dartlang-test:///main.dart:3:26: Error: A value of type 'Type' can't be assigned to a variable of type 'FutureOr<C>'.
+//  - 'Type' is from 'dart:core'.
+//  - 'FutureOr' is from 'dart:async'.
+//  - 'C' is from 'org-dartlang-test:///main.dart'.
+//   factory C.e4() async = C;
+//                          ^
+//
+
+  class C extends dart.core::Object {
+    static field dynamic _redirecting# = <dynamic>[main::C::e4];
+    constructor •() → main::C*
+      : super dart.core::Object::•()
+      ;
+    static factory e4() → main::C* /* originally async */ {
+      final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+      dart.async::FutureOr<dynamic>* :return_value;
+      dynamic :async_stack_trace;
+      dynamic :async_op_then;
+      dynamic :async_op_error;
+      dynamic :await_jump_var = 0;
+      dynamic :await_ctx_var;
+      function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+        try {
+          #L1:
+          {
+            :return_value = let final<BottomType> #t1 = invalid-expression "org-dartlang-test:///main.dart:3:26: Error: A value of type 'Type' can't be assigned to a variable of type 'FutureOr<C>'.\n - 'Type' is from 'dart:core'.\n - 'FutureOr' is from 'dart:async'.\n - 'C' is from 'org-dartlang-test:///main.dart'.\n  factory C.e4() async = C;\n                         ^" in main::C* as{TypeError} dart.async::FutureOr<main::C*>*;
+            break #L1;
+          }
+          dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :async_completer.{dart.async::Completer::completeError}(:exception, :stack_trace);
+        }
+      :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+      :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+      :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+      :async_completer.start(:async_op);
+      return :async_completer.{dart.async::Completer::future};
+    }
+  }
+  static method main() → void {
+    main::C* c = main::C::e4();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect
new file mode 100644
index 0000000..7e2a45a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("b");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("Hello no. 0");
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect
new file mode 100644
index 0000000..77f97dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:8: Error: Error when reading 'org-dartlang-test:///b.dart': File org-dartlang-test:///b.dart does not exist.
+// import "b.dart";
+//        ^
+//
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.
+//   b();
+//   ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("Hello no. 0");
+    invalid-expression "org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.\n  b();\n  ^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect
new file mode 100644
index 0000000..78ff159
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:8: Error: Error when reading 'org-dartlang-test:///b.dart': File org-dartlang-test:///b.dart does not exist.
+// import "b.dart";
+//        ^
+//
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.
+//   b();
+//   ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("Hello no. 1");
+    invalid-expression "org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.\n  b();\n  ^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect
new file mode 100644
index 0000000..78ff159
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:8: Error: Error when reading 'org-dartlang-test:///b.dart': File org-dartlang-test:///b.dart does not exist.
+// import "b.dart";
+//        ^
+//
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.
+//   b();
+//   ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("Hello no. 1");
+    invalid-expression "org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.\n  b();\n  ^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect
new file mode 100644
index 0000000..510b8a9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library bLibrary from "org-dartlang-test:///b.dart" as bLi {
+
+  static method foo() → dynamic {
+    dart.core::print("hello from b.dart foo!");
+  }
+}
+library mainLibrary from "org-dartlang-test:///main.dart" as mai {
+
+  import "org-dartlang-test:///b.dart" as b;
+
+  static method main() → dynamic {
+    bLi::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect
new file mode 100644
index 0000000..cae5df6
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library bLibrary from "org-dartlang-test:///b.dart" as bLi {
+
+  static method main() → dynamic {
+    dart.core::print("hello from b!");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect
new file mode 100644
index 0000000..a6e8b36
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("b");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect
new file mode 100644
index 0000000..118bd73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect
new file mode 100644
index 0000000..4c3e6ae
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "package:untitled/main.dart" as main {
+
+  static method main() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect
new file mode 100644
index 0000000..b188792
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect
@@ -0,0 +1,14 @@
+main = <No Member>;
+library from "package:untitled/main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:2:3: Error: Getter not found: 'asdf'.
+//   asdf;
+//   ^^^^
+//
+
+  static method main() → dynamic {
+    invalid-expression "org-dartlang-test:///main.dart:2:3: Error: Getter not found: 'asdf'.\n  asdf;\n  ^^^^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect
new file mode 100644
index 0000000..b1df83d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "package:untitled/main.dart" as main {
+
+  static method notMain() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
new file mode 100644
index 0000000..9af8d7f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
@@ -0,0 +1,21 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application with an experiment enabled (actually, two experiments
+# in this case).
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: triple-shift,non-nullable
+    sources:
+      main.dart: |
+        main() {
+          dynamic x;
+          print(x >>> 2);
+          Class? c = new Class();
+          print(c!);
+        }
+        class Class {}
+    expectedLibraryCount: 1
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect
new file mode 100644
index 0000000..ce0d68a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  class Class extends dart.core::Object {
+    synthetic constructor •() → main::Class*
+      : super dart.core::Object::•()
+      ;
+  }
+  static method main() → dynamic {
+    dynamic x;
+    dart.core::print(x.>>>(2));
+    main::Class? c = new main::Class::•();
+    dart.core::print(c!);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect
new file mode 100644
index 0000000..118bd73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect
new file mode 100644
index 0000000..118bd73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
new file mode 100644
index 0000000..5dfc563
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
@@ -0,0 +1,64 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class FooEntry extends dart.core::Object {
+    synthetic constructor •() → lib::FooEntry*
+      : super dart.core::Object::•()
+      ;
+  }
+  class BarEntry extends lib::FooEntry {
+    synthetic constructor •() → lib::BarEntry*
+      : super lib::FooEntry::•()
+      ;
+  }
+  abstract class FooTarget extends dart.core::Object {
+    synthetic constructor •() → lib::FooTarget*
+      : super dart.core::Object::•()
+      ;
+    abstract method hello(lib::FooEntry* entry) → void;
+  }
+  abstract class Baz extends dart.core::Object implements lib::FooTarget {
+    synthetic constructor •() → lib::Baz*
+      : super dart.core::Object::•()
+      ;
+    method hello(covariant lib::FooEntry* entry) → void {}
+  }
+  abstract class MyMixin extends lib::Baz {
+  }
+  abstract class Qux extends lib::Baz {
+    synthetic constructor •() → lib::Qux*
+      : super lib::Baz::•()
+      ;
+    method hello(covariant lib::BarEntry* entry) → void {}
+  }
+  abstract class _Quux&Qux&MyMixin extends lib::Qux implements lib::MyMixin {
+    synthetic constructor •() → lib::_Quux&Qux&MyMixin*
+      : super lib::Qux::•()
+      ;
+    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+  }
+  class Quux extends lib::_Quux&Qux&MyMixin {
+    synthetic constructor •() → lib::Quux*
+      : super lib::_Quux&Qux&MyMixin::•()
+      ;
+    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Test extends main::Test2 {
+    synthetic constructor •() → main::Test*
+      : super main::Test2::•()
+      ;
+    method world() → lib::Quux*
+      return null;
+  }
+  abstract class Test2 extends dart.core::Object {
+    synthetic constructor •() → main::Test2*
+      : super dart.core::Object::•()
+      ;
+    abstract method world() → lib::Baz*;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
new file mode 100644
index 0000000..f0b2d5e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
@@ -0,0 +1,67 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class FooEntry extends dart.core::Object {
+    synthetic constructor •() → lib::FooEntry*
+      : super dart.core::Object::•()
+      ;
+  }
+  class BarEntry extends lib::FooEntry {
+    synthetic constructor •() → lib::BarEntry*
+      : super lib::FooEntry::•()
+      ;
+  }
+  abstract class FooTarget extends dart.core::Object {
+    synthetic constructor •() → lib::FooTarget*
+      : super dart.core::Object::•()
+      ;
+    abstract method hello(lib::FooEntry* entry) → void;
+  }
+  abstract class Baz extends dart.core::Object implements lib::FooTarget {
+    synthetic constructor •() → lib::Baz*
+      : super dart.core::Object::•()
+      ;
+    method hello(covariant lib::FooEntry* entry) → void {}
+  }
+  abstract class MyMixin extends lib::Baz {
+  }
+  abstract class Qux extends lib::Baz {
+    synthetic constructor •() → lib::Qux*
+      : super lib::Baz::•()
+      ;
+    method hello(covariant lib::BarEntry* entry) → void {}
+  }
+  abstract class _Quux&Qux&MyMixin extends lib::Qux implements lib::MyMixin {
+    synthetic constructor •() → lib::_Quux&Qux&MyMixin*
+      : super lib::Qux::•()
+      ;
+    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+  }
+  class Quux extends lib::_Quux&Qux&MyMixin {
+    synthetic constructor •() → lib::Quux*
+      : super lib::_Quux&Qux&MyMixin::•()
+      ;
+    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Test extends main::Test2 {
+    synthetic constructor •() → main::Test*
+      : super main::Test2::•()
+      ;
+    method world() → lib::Quux*
+      return null;
+  }
+  abstract class Test2 extends dart.core::Object {
+    synthetic constructor •() → main::Test2*
+      : super dart.core::Object::•()
+      ;
+    abstract method world() → lib::Baz*;
+  }
+  static method main() → dynamic {
+    dart.core::print(new main::Test::•());
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect
new file mode 100644
index 0000000..6ef7b8a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:core";
+  import "package:package2/lib2.dart";
+  import "package:package2/lib3.dart";
+
+  static method main() → dynamic {
+    lib2::lib2();
+    lib3::lib3();
+  }
+}
+library from "package:package1/lib1.dart" as lib1 {
+
+  static method lib1() → dynamic {
+    return 42;
+  }
+}
+library from "package:package2/lib2.dart" as lib2 {
+
+  static method lib2() → dynamic {
+    return 42;
+  }
+}
+library from "package:package2/lib3.dart" as lib3 {
+
+  import "package:package1/lib1.dart";
+
+  static method lib3() → dynamic {
+    return lib1::lib1();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect
new file mode 100644
index 0000000..20882e7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:package1/lib1.dart";
+
+  static method main() → dynamic {
+    lib1::lib1();
+  }
+}
+library from "package:package1/lib1.dart" as lib1 {
+
+  static method lib1() → dynamic {
+    return 42;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect
new file mode 100644
index 0000000..5087f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:package2/lib2.dart";
+
+  static method main() → dynamic {
+    lib2::lib2();
+  }
+}
+library from "package:package2/lib2.dart" as lib2 {
+
+  static method lib2() → dynamic {
+    return 42;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect
new file mode 100644
index 0000000..5087f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:package2/lib2.dart";
+
+  static method main() → dynamic {
+    lib2::lib2();
+  }
+}
+library from "package:package2/lib2.dart" as lib2 {
+
+  static method lib2() → dynamic {
+    return 42;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect
new file mode 100644
index 0000000..91a004a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect
@@ -0,0 +1,33 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:package1/lib1.dart";
+  import "package:package1/lib2.dart";
+  import "package:package1/lib3.dart";
+
+  static method main() → dynamic {
+    lib1::lib1();
+    lib2::lib2();
+    lib3::lib3();
+  }
+}
+library from "package:package1/lib1.dart" as lib1 {
+
+  static method lib1() → dynamic {
+    return 42;
+  }
+}
+library from "package:package1/lib2.dart" as lib2 {
+
+  static method lib2() → dynamic {
+    return 42;
+  }
+}
+library from "package:package1/lib3.dart" as lib3 {
+
+  import "package:package1/lib1.dart";
+
+  static method lib3() → dynamic {
+    return lib1::lib1();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect
new file mode 100644
index 0000000..4a62ec6
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect
@@ -0,0 +1,24 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:package1/lib1.dart";
+  import "package:package1/lib2.dart";
+  import "package:package1/lib3.dart";
+
+  static method main() → dynamic {
+    #lib1::lib1();
+    #lib2::lib2();
+    lib3::lib3();
+  }
+}
+library from "package:package1/lib3.dart" as lib3 {
+
+  import "package:package1/lib1.dart";
+
+  static method lib3() → dynamic {
+    return lib3::lib3_1();
+  }
+  static method lib3_1() → dynamic {
+    return #lib1::lib1();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect
new file mode 100644
index 0000000..91c88a8
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect
@@ -0,0 +1,48 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:core";
+  import "package:package1/lib1_a.dart";
+
+  static method main() → dynamic {
+    lib::lib1();
+  }
+}
+library from "package:package1/lib1_a.dart" as lib2 {
+additionalExports = (lib::la,
+  lib::lib1)
+
+  import "package:package3/lib3.dart" as lib3;
+  export "package:package1/lib1_b.dart";
+
+  static method lib1a() → dynamic {
+    lib3::lib3();
+  }
+}
+library from "package:package1/lib1_b.dart" as lib {
+
+  import "package:package2/lib2.dart" as lib2;
+
+  static method lib1() → dynamic {
+    return lib::la(null);
+  }
+  static method la(lib22::Foo* f) → dynamic {
+    return 42;
+  }
+}
+library from "package:package2/lib2.dart" as lib22 {
+
+  class Foo extends dart.core::Object {
+    static field dart.core::int* y = 42;
+    synthetic constructor •() → lib22::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+  static field dart.core::int* f = 42;
+}
+library from "package:package3/lib3.dart" as lib3 {
+
+  static method lib3() → dynamic {
+    dart.core::print("lib3");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect
new file mode 100644
index 0000000..91c88a8
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect
@@ -0,0 +1,48 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:core";
+  import "package:package1/lib1_a.dart";
+
+  static method main() → dynamic {
+    lib::lib1();
+  }
+}
+library from "package:package1/lib1_a.dart" as lib2 {
+additionalExports = (lib::la,
+  lib::lib1)
+
+  import "package:package3/lib3.dart" as lib3;
+  export "package:package1/lib1_b.dart";
+
+  static method lib1a() → dynamic {
+    lib3::lib3();
+  }
+}
+library from "package:package1/lib1_b.dart" as lib {
+
+  import "package:package2/lib2.dart" as lib2;
+
+  static method lib1() → dynamic {
+    return lib::la(null);
+  }
+  static method la(lib22::Foo* f) → dynamic {
+    return 42;
+  }
+}
+library from "package:package2/lib2.dart" as lib22 {
+
+  class Foo extends dart.core::Object {
+    static field dart.core::int* y = 42;
+    synthetic constructor •() → lib22::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+  static field dart.core::int* f = 42;
+}
+library from "package:package3/lib3.dart" as lib3 {
+
+  static method lib3() → dynamic {
+    dart.core::print("lib3");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect
new file mode 100644
index 0000000..9d2d146
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///foo.dart" as foo {
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → foo::Foo*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {
+      dart.core::print("Foo!");
+    }
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///foo.dart";
+
+  static method main() → dynamic {
+    foo::Foo* foo = new foo::Foo::•();
+    foo.{foo::Foo::foo}();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect
new file mode 100644
index 0000000..e1510d4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello from main");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect
new file mode 100644
index 0000000..9d2d146
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///foo.dart" as foo {
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → foo::Foo*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {
+      dart.core::print("Foo!");
+    }
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///foo.dart";
+
+  static method main() → dynamic {
+    foo::Foo* foo = new foo::Foo::•();
+    foo.{foo::Foo::foo}();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect
new file mode 100644
index 0000000..19ebb12
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/foo.dart";
+
+  static method main() → dynamic {
+    foo::Foo* foo = new foo::Foo::•();
+    foo.{foo::Foo::foo}();
+  }
+}
+library from "package:mypackage/foo.dart" as foo {
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → foo::Foo*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {
+      dart.core::print("Foo!");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect
new file mode 100644
index 0000000..e1510d4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello from main");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect
new file mode 100644
index 0000000..19ebb12
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/foo.dart";
+
+  static method main() → dynamic {
+    foo::Foo* foo = new foo::Foo::•();
+    foo.{foo::Foo::foo}();
+  }
+}
+library from "package:mypackage/foo.dart" as foo {
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → foo::Foo*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {
+      dart.core::print("Foo!");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.1.expect
new file mode 100644
index 0000000..38a3f82
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-malformed-uri:?+package%3Afoo%2Fbar.dart" as ?+p {
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:2:7: Error: Couldn't parse URI ' package:foo/bar.dart':
+//   Scheme not starting with alphabetic character.
+// part ' package:foo/bar.dart';
+//       ^
+//
+
+  part  package:foo/bar.dart;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect
new file mode 100644
index 0000000..1a14625
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect
@@ -0,0 +1,5 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect
new file mode 100644
index 0000000..63174bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b1");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect
new file mode 100644
index 0000000..5ddb0bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b2");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect
new file mode 100644
index 0000000..231c540
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b3");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml
new file mode 100644
index 0000000..47a379d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml
@@ -0,0 +1,53 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Test that invalidating a part of a package works.
+
+type: newworld
+worlds:
+  - entry: "package:example/main.dart"
+    sources:
+      pkg/example/main.dart: |
+        part "b.dart";
+        main() {
+          print("hello");
+          b();
+        }
+      pkg/example/b.dart: |
+        part of "main.dart";
+        b() {
+          print("b1");
+        }
+      .packages: example:pkg/example
+    expectedLibraryCount: 1
+  - entry: "package:example/main.dart"
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - pkg/example/b.dart
+    expectedInvalidatedUri:
+      - "package:example/b.dart"
+    sources:
+      pkg/example/b.dart: |
+        part of "main.dart";
+        b() {
+          print("b2");
+        }
+      .packages: example:pkg/example
+    expectedLibraryCount: 1
+  - entry: "package:example/main.dart"
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - "package:example/b.dart"
+    expectedInvalidatedUri:
+      - "package:example/b.dart"
+    sources:
+      pkg/example/b.dart: |
+        part of "main.dart";
+        b() {
+          print("b3");
+        }
+      .packages: example:pkg/example
+    expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect
new file mode 100644
index 0000000..63174bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b1");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect
new file mode 100644
index 0000000..5ddb0bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b2");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect
new file mode 100644
index 0000000..231c540
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "package:example/main.dart" as main {
+
+  part b.dart;
+  static method /* from org-dartlang-test:///pkg/example/b.dart */ b() → dynamic {
+    dart.core::print("b3");
+  }
+  static method main() → dynamic {
+    dart.core::print("hello");
+    main::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect
new file mode 100644
index 0000000..5d55e04
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from b");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect
new file mode 100644
index 0000000..d52d5b0
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "org-dartlang-test:///c.dart";
+
+  static method b() → dynamic {
+    dart.core::print("hello from b");
+    c::c();
+  }
+}
+library from "org-dartlang-test:///c.dart" as c {
+
+  static method c() → dynamic {
+    dart.core::print("hello from c");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+  import "org-dartlang-test:///nonexisting.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:2:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect
new file mode 100644
index 0000000..7002b6b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect
@@ -0,0 +1,25 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "org-dartlang-test:///c.dart";
+
+  static method b() → dynamic {
+    dart.core::print("hello from b");
+    c::c();
+  }
+}
+library from "org-dartlang-test:///c.dart" as c {
+
+  static method c() → dynamic {
+    dart.core::print("hello from c");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect
new file mode 100644
index 0000000..4e19cd5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "dart:core";
+
+  static method useString(dart.core::String* s) → void {
+    dart.core::print("Hello from useString: ${s}");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    b::useString("hello");
+  }
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect
new file mode 100644
index 0000000..4e19cd5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "dart:core";
+
+  static method useString(dart.core::String* s) → void {
+    dart.core::print("Hello from useString: ${s}");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    b::useString("hello");
+  }
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_inferrer_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_inferrer_error.yaml.world.1.expect
new file mode 100644
index 0000000..b2daf41
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_inferrer_error.yaml.world.1.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:3:7: Error: 'Object' doesn't implement 'A<dynamic>' so it can't be used with 'M<dynamic>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'org-dartlang-test:///main.dart'.
+//  - 'M' is from 'org-dartlang-test:///main.dart'.
+// class C extends Object with M {}
+//       ^
+//
+// org-dartlang-test:///main.dart:3:7: Error: Type parameters could not be inferred for the mixin 'M' because 'Object' does not implement the mixin's supertype constraint 'A<T>'.
+//  - 'A' is from 'org-dartlang-test:///main.dart'.
+// class C extends Object with M {}
+//       ^
+//
+
+  abstract class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → main::A<main::A::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class M<T extends dart.core::Object* = dynamic> extends main::A<main::M::T*> {
+  }
+  abstract class _C&Object&M extends dart.core::Object implements main::M<dynamic> {
+    const synthetic constructor •() → main::_C&Object&M*
+      : super dart.core::Object::•()
+      ;
+  }
+  class C extends main::_C&Object&M {
+    synthetic constructor •() → main::C*
+      : super main::_C&Object&M::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml.world.1.expect
new file mode 100644
index 0000000..46423d5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml.world.1.expect
@@ -0,0 +1,13 @@
+main = <No Member>;
+library from "org-dartlang-test:///a.dart" as a {
+
+  static method a() → dynamic {
+    dart.core::print("hello a");
+  }
+}
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello b");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml
new file mode 100644
index 0000000..d3fe395
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml
@@ -0,0 +1,53 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+
+type: newworld
+worlds:
+  - entry: actualMain.dart
+    sources:
+      actualMain.dart: |
+        import 'main.dart' as m;
+        main() {
+          m.main();
+        }
+      main.dart: |
+        import 'libA.dart';
+
+        main() {
+          whatever();
+        }
+        mainHello() {}
+      libA.dart: |
+        import 'main.dart';
+        import 'libB.dart';
+        class Foo {}
+        whatever() {
+          Bar bar = new Bar(new Foo());
+          mainHello();
+        }
+      libB.dart: |
+        import 'libA.dart';
+        class Bar {
+          Foo foo;
+          Bar(this.foo);
+        }
+    expectedLibraryCount: 4
+  - entry: actualMain.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        main() {
+          whatever();
+          mainHello();
+        }
+        mainHello() {}
+    expectedLibraryCount: 4
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect
new file mode 100644
index 0000000..9a15e2a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect
@@ -0,0 +1,44 @@
+main = <No Member>;
+library from "org-dartlang-test:///actualMain.dart" as act {
+
+  import "org-dartlang-test:///main.dart" as m;
+
+  static method main() → dynamic {
+    main::main();
+  }
+}
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///libB.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → libA::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+  static method whatever() → dynamic {
+    libB::Bar* bar = new libB::Bar::•(new libA::Foo::•());
+    main::mainHello();
+  }
+}
+library from "org-dartlang-test:///libB.dart" as libB {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Bar extends dart.core::Object {
+    field libA::Foo* foo;
+    constructor •(libA::Foo* foo) → libB::Bar*
+      : libB::Bar::foo = foo, super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  static method main() → dynamic {
+    libA::whatever();
+  }
+  static method mainHello() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect
new file mode 100644
index 0000000..dbacc07
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect
@@ -0,0 +1,45 @@
+main = <No Member>;
+library from "org-dartlang-test:///actualMain.dart" as act {
+
+  import "org-dartlang-test:///main.dart" as m;
+
+  static method main() → dynamic {
+    main::main();
+  }
+}
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///libB.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → libA::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+  static method whatever() → dynamic {
+    libB::Bar* bar = new libB::Bar::•(new libA::Foo::•());
+    main::mainHello();
+  }
+}
+library from "org-dartlang-test:///libB.dart" as libB {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Bar extends dart.core::Object {
+    field libA::Foo* foo;
+    constructor •(libA::Foo* foo) → libB::Bar*
+      : libB::Bar::foo = foo, super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  static method main() → dynamic {
+    libA::whatever();
+    main::mainHello();
+  }
+  static method mainHello() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml
new file mode 100644
index 0000000..e9a82b1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml
@@ -0,0 +1,60 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          final message;
+          Foo(this.message);
+          @override
+          toString() { return '$message'; }
+        }
+
+        main() {
+          Foo foo = new Foo("hello");
+          whatever(foo);
+          CompilationStrategy compilationStrategy = CompilationStrategy.direct;
+          print(compilationStrategy);
+        }
+
+        enum CompilationStrategy { direct, toKernel, toData, fromData }
+      libA.dart: |
+        import 'main.dart';
+        whatever(Foo foo) {
+          print(foo);
+        }
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          final message;
+          Foo(this.message);
+          @override
+          toString() { return '$message!'; }
+        }
+
+        main() {
+          Foo foo = new Foo("hello");
+          whatever(foo);
+          CompilationStrategy compilationStrategy = CompilationStrategy.direct;
+          print(compilationStrategy);
+        }
+
+        enum CompilationStrategy { direct, toKernel, toData, fromData }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect
new file mode 100644
index 0000000..761708e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect
@@ -0,0 +1,60 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+
+  static method whatever(main::Foo* foo) → dynamic {
+    dart.core::print(foo);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    final field dynamic message;
+    constructor •(dynamic message) → main::Foo*
+      : main::Foo::message = message, super dart.core::Object::•()
+      ;
+    @#C1
+    method toString() → dart.core::String* {
+      return "${this.{main::Foo::message}}";
+    }
+  }
+  class CompilationStrategy extends dart.core::Object {
+    final field dart.core::int* index;
+    final field dart.core::String* _name;
+    static const field dart.core::List<main::CompilationStrategy*>* values = #C14;
+    static const field main::CompilationStrategy* direct = #C4;
+    static const field main::CompilationStrategy* toKernel = #C7;
+    static const field main::CompilationStrategy* toData = #C10;
+    static const field main::CompilationStrategy* fromData = #C13;
+    const constructor •(dart.core::int* index, dart.core::String* _name) → main::CompilationStrategy*
+      : main::CompilationStrategy::index = index, main::CompilationStrategy::_name = _name, super dart.core::Object::•()
+      ;
+    method toString() → dart.core::String*
+      return this.{=main::CompilationStrategy::_name};
+  }
+  static method main() → dynamic {
+    main::Foo* foo = new main::Foo::•("hello");
+    libA::whatever(foo);
+    main::CompilationStrategy* compilationStrategy = #C4;
+    dart.core::print(compilationStrategy);
+  }
+}
+constants  {
+  #C1 = dart.core::_Override {}
+  #C2 = 0
+  #C3 = "CompilationStrategy.direct"
+  #C4 = main::CompilationStrategy {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "CompilationStrategy.toKernel"
+  #C7 = main::CompilationStrategy {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "CompilationStrategy.toData"
+  #C10 = main::CompilationStrategy {index:#C8, _name:#C9}
+  #C11 = 3
+  #C12 = "CompilationStrategy.fromData"
+  #C13 = main::CompilationStrategy {index:#C11, _name:#C12}
+  #C14 = <main::CompilationStrategy*>[#C4, #C7, #C10, #C13]
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect
new file mode 100644
index 0000000..7d8e26b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect
@@ -0,0 +1,60 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+
+  static method whatever(main::Foo* foo) → dynamic {
+    dart.core::print(foo);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    final field dynamic message;
+    constructor •(dynamic message) → main::Foo*
+      : main::Foo::message = message, super dart.core::Object::•()
+      ;
+    @#C1
+    method toString() → dart.core::String* {
+      return "${this.{main::Foo::message}}!";
+    }
+  }
+  class CompilationStrategy extends dart.core::Object {
+    final field dart.core::int* index;
+    final field dart.core::String* _name;
+    static const field dart.core::List<main::CompilationStrategy*>* values = #C14;
+    static const field main::CompilationStrategy* direct = #C4;
+    static const field main::CompilationStrategy* toKernel = #C7;
+    static const field main::CompilationStrategy* toData = #C10;
+    static const field main::CompilationStrategy* fromData = #C13;
+    const constructor •(dart.core::int* index, dart.core::String* _name) → main::CompilationStrategy*
+      : main::CompilationStrategy::index = index, main::CompilationStrategy::_name = _name, super dart.core::Object::•()
+      ;
+    method toString() → dart.core::String*
+      return this.{=main::CompilationStrategy::_name};
+  }
+  static method main() → dynamic {
+    main::Foo* foo = new main::Foo::•("hello");
+    libA::whatever(foo);
+    main::CompilationStrategy* compilationStrategy = #C4;
+    dart.core::print(compilationStrategy);
+  }
+}
+constants  {
+  #C1 = dart.core::_Override {}
+  #C2 = 0
+  #C3 = "CompilationStrategy.direct"
+  #C4 = main::CompilationStrategy {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "CompilationStrategy.toKernel"
+  #C7 = main::CompilationStrategy {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "CompilationStrategy.toData"
+  #C10 = main::CompilationStrategy {index:#C8, _name:#C9}
+  #C11 = 3
+  #C12 = "CompilationStrategy.fromData"
+  #C13 = main::CompilationStrategy {index:#C11, _name:#C12}
+  #C14 = <main::CompilationStrategy*>[#C4, #C7, #C10, #C13]
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml
new file mode 100644
index 0000000..4ba8586
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          const Foo();
+          @override
+          toString() => 'Foo!';
+        }
+
+        main() async {
+          await whatever();
+          print(const Foo());
+        }
+      libA.dart: |
+        whatever() async {
+          await null;
+          return "hello";
+        }
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          const Foo();
+          @override
+          toString() => 'Foo!';
+        }
+
+        main() async {
+          await whatever();
+          print(const Foo());
+          print("Done");
+        }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
new file mode 100644
index 0000000..7a4295d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
@@ -0,0 +1,80 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  static method whatever() → dynamic /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    dart.async::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          :return_value = "hello";
+          break #L1;
+        }
+        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{dart.async::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{dart.async::Completer::future};
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    const constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+    @#C1
+    method toString() → dart.core::String*
+      return "Foo!";
+  }
+  static method main() → dynamic /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    dart.async::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = dart.async::_awaitHelper(libA::whatever(), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          dart.core::print(#C2);
+        }
+        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{dart.async::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{dart.async::Completer::future};
+  }
+}
+constants  {
+  #C1 = dart.core::_Override {}
+  #C2 = main::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
new file mode 100644
index 0000000..42e02f0
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
@@ -0,0 +1,81 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  static method whatever() → dynamic /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    dart.async::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          :return_value = "hello";
+          break #L1;
+        }
+        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{dart.async::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{dart.async::Completer::future};
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    const constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+    @#C1
+    method toString() → dart.core::String*
+      return "Foo!";
+  }
+  static method main() → dynamic /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    dart.async::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = dart.async::_awaitHelper(libA::whatever(), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          dart.core::print(#C2);
+          dart.core::print("Done");
+        }
+        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{dart.async::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{dart.async::Completer::future};
+  }
+}
+constants  {
+  #C1 = dart.core::_Override {}
+  #C2 = main::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml
new file mode 100644
index 0000000..554f242
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml
@@ -0,0 +1,44 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+# Use it as a mixin, though, so we cannot neccesarily rebuild the bodies only.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          method() {
+            print("A");
+          }
+        }
+      libA.dart: |
+        import 'main.dart';
+
+        class Bar extends Object with Foo {
+          method2() {
+            method();
+          }
+        }
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'libA.dart';
+
+        class Foo {
+          method() {
+            print("B");
+          }
+        }
+    expectedLibraryCount: 2
+    # expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.1.expect
new file mode 100644
index 0000000..a2166d9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.1.expect
@@ -0,0 +1,35 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+
+  abstract class _Bar&Object&Foo extends dart.core::Object implements main::Foo {
+    const synthetic constructor •() → libA::_Bar&Object&Foo*
+      : super dart.core::Object::•()
+      ;
+    method /* from org-dartlang-test:///main.dart */ method() → dynamic {
+      dart.core::print("A");
+    }
+  }
+  class Bar extends libA::_Bar&Object&Foo {
+    synthetic constructor •() → libA::Bar*
+      : super libA::_Bar&Object&Foo::•()
+      ;
+    method method2() → dynamic {
+      this.{main::Foo::method}();
+    }
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+    method method() → dynamic {
+      dart.core::print("A");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.2.expect
new file mode 100644
index 0000000..6ec9787
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_4.yaml.world.2.expect
@@ -0,0 +1,35 @@
+main = <No Member>;
+library from "org-dartlang-test:///libA.dart" as libA {
+
+  import "org-dartlang-test:///main.dart";
+
+  abstract class _Bar&Object&Foo extends dart.core::Object implements main::Foo {
+    const synthetic constructor •() → libA::_Bar&Object&Foo*
+      : super dart.core::Object::•()
+      ;
+    method /* from org-dartlang-test:///main.dart */ method() → dynamic {
+      dart.core::print("B");
+    }
+  }
+  class Bar extends libA::_Bar&Object&Foo {
+    synthetic constructor •() → libA::Bar*
+      : super libA::_Bar&Object&Foo::•()
+      ;
+    method method2() → dynamic {
+      this.{main::Foo::method}();
+    }
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libA.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+    method method() → dynamic {
+      dart.core::print("B");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect
new file mode 100644
index 0000000..7efd651
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("Hello world");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect
new file mode 100644
index 0000000..ff56e2e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("Hello world!");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect
new file mode 100644
index 0000000..7efd651
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("Hello world");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect
new file mode 100644
index 0000000..ff56e2e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("Hello world!");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect
new file mode 100644
index 0000000..62daba9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("Hello world");
+  }
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect
new file mode 100644
index 0000000..98d8a29
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method lib() → dynamic {
+    return "hello";
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    dart.core::print(lib::lib());
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect
new file mode 100644
index 0000000..ad8c78c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect
@@ -0,0 +1,9 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    dart.core::print(#lib1::lib().+("!"));
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect
new file mode 100644
index 0000000..6a5ad02
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method lib() → dynamic {
+    return "hello";
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    dart.core::print(lib::lib());
+  }
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect
new file mode 100644
index 0000000..d78d309
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method lib() → dynamic {
+    return "hello";
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    dart.core::print(lib::lib().+("!!"));
+  }
+}
+
+And 19 platform libraries:
+ - dart:vmservice_io
+ - dart:_http
+ - dart:_builtin
+ - dart:async
+ - dart:cli
+ - dart:collection
+ - dart:convert
+ - dart:core
+ - dart:developer
+ - dart:ffi
+ - dart:nativewrappers
+ - dart:_internal
+ - dart:io
+ - dart:isolate
+ - dart:math
+ - dart:mirrors
+ - dart:typed_data
+ - dart:_vmservice
+ - dart:wasm
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect
new file mode 100644
index 0000000..112da80
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect
@@ -0,0 +1,6 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic
+    ;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml.world.1.expect
new file mode 100644
index 0000000..2858e1c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  abstract class Foo extends dart.core::Object {
+    synthetic constructor •() → main::Foo*
+      ;
+    abstract get foo() → dart.core::int*;
+  }
+  class Bar extends dart.core::Object implements main::Foo {
+    static field dart.core::int* _foo;
+    final field dart.core::int* foo;
+    synthetic constructor •() → main::Bar*
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect
new file mode 100644
index 0000000..7b14759
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b({dart.core::int* named = #C1}) → dynamic {
+    dart.core::print("b");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:3:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   b(42);
+//    ^
+// org-dartlang-test:///b.dart:1:1: Context: Found this candidate, but the arguments don't match.
+// b({int named}) {
+// ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    invalid-expression "org-dartlang-test:///main.dart:3:4: Error: Too many positional arguments: 0 allowed, but 1 found.\nTry removing the extra positional arguments.\n  b(42);\n   ^";
+  }
+}
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect
new file mode 100644
index 0000000..c214ed4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b({dart.core::int* named = #C1}) → dynamic {
+    dart.core::print("b");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:3:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   b(42);
+//    ^
+// org-dartlang-test:///b.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// b({int named}) {
+// ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    invalid-expression "org-dartlang-test:///main.dart:3:4: Error: Too many positional arguments: 0 allowed, but 1 found.\nTry removing the extra positional arguments.\n  b(42);\n   ^";
+  }
+}
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.1.expect
new file mode 100644
index 0000000..0c74f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.1.expect
@@ -0,0 +1,22 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:1: Error: Expected ';' after this.
+// asdf
+// ^^^^
+//
+// org-dartlang-test:///b.dart:1:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// asdf
+// ^^^^
+//
+
+  static field dynamic asdf;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.2.expect
new file mode 100644
index 0000000..0c74f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.2.expect
@@ -0,0 +1,22 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:1: Error: Expected ';' after this.
+// asdf
+// ^^^^
+//
+// org-dartlang-test:///b.dart:1:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// asdf
+// ^^^^
+//
+
+  static field dynamic asdf;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.3.expect
new file mode 100644
index 0000000..0c74f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.3.expect
@@ -0,0 +1,22 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:1: Error: Expected ';' after this.
+// asdf
+// ^^^^
+//
+// org-dartlang-test:///b.dart:1:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// asdf
+// ^^^^
+//
+
+  static field dynamic asdf;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.4.expect
new file mode 100644
index 0000000..0c74f50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.4.expect
@@ -0,0 +1,22 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:1: Error: Expected ';' after this.
+// asdf
+// ^^^^
+//
+// org-dartlang-test:///b.dart:1:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// asdf
+// ^^^^
+//
+
+  static field dynamic asdf;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.5.expect
new file mode 100644
index 0000000..a44b5dc
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.5.expect
@@ -0,0 +1,18 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// asdf;
+// ^^^^
+//
+
+  static field dynamic asdf;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.6.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.6.expect
new file mode 100644
index 0000000..adb8a44
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_1.yaml.world.6.expect
@@ -0,0 +1,10 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method asdf() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect
new file mode 100644
index 0000000..e14d840
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect
new file mode 100644
index 0000000..775fa51
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect
@@ -0,0 +1,35 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField2 = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(invalid-expression "This assertion failed.");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect
new file mode 100644
index 0000000..2a323b6
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = #C1;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField2 = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(invalid-expression "This assertion failed.");
+  }
+}
+constants  {
+  #C1 = lib::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect
new file mode 100644
index 0000000..5da4981
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField2 = #C1;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(#C1);
+  }
+}
+constants  {
+  #C1 = lib::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect
new file mode 100644
index 0000000..79519c1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = #C1;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField2 = #C1;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(#C1);
+  }
+}
+constants  {
+  #C1 = lib::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect
new file mode 100644
index 0000000..e14d840
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect
new file mode 100644
index 0000000..ced3bbf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect
@@ -0,0 +1,34 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Bar extends dart.core::Object {
+    final field lib::Foo* x;
+    const constructor •() → lib2::Bar*
+      : lib2::Bar::x = invalid-expression "This assertion failed.", super dart.core::Object::•()
+      ;
+  }
+  static method bar() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib2::bar();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect
new file mode 100644
index 0000000..b212595
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect
@@ -0,0 +1,37 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Bar extends dart.core::Object {
+    final field lib::Foo* x;
+    const constructor •() → lib2::Bar*
+      : lib2::Bar::x = #C1, super dart.core::Object::•()
+      ;
+  }
+  static method bar() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib2::bar();
+  }
+}
+constants  {
+  #C1 = lib::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.1.expect
new file mode 100644
index 0000000..62af8dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.1.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:3:17: Error: Type 'A' not found.
+// class B extends A {}
+//                 ^
+//
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends b::B {
+    synthetic constructor •() → main::A*
+      : super b::B::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.2.expect
new file mode 100644
index 0000000..62af8dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.2.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:3:17: Error: Type 'A' not found.
+// class B extends A {}
+//                 ^
+//
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends b::B {
+    synthetic constructor •() → main::A*
+      : super b::B::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.3.expect
new file mode 100644
index 0000000..62af8dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.3.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:3:17: Error: Type 'A' not found.
+// class B extends A {}
+//                 ^
+//
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends b::B {
+    synthetic constructor •() → main::A*
+      : super b::B::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.4.expect
new file mode 100644
index 0000000..62af8dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.4.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:3:17: Error: Type 'A' not found.
+// class B extends A {}
+//                 ^
+//
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends b::B {
+    synthetic constructor •() → main::A*
+      : super b::B::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.5.expect
new file mode 100644
index 0000000..a8630dc
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.5.expect
@@ -0,0 +1,35 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:3:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+
+  import "org-dartlang-test:///main.dart";
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:3:7: Error: 'A' is a supertype of itself.
+// class A extends B {}
+//       ^
+//
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.6.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.6.expect
new file mode 100644
index 0000000..3ae163a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_2.yaml.world.6.expect
@@ -0,0 +1,19 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  class B extends dart.core::Object {
+    synthetic constructor •() → b::B*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  class A extends b::B {
+    synthetic constructor •() → main::A*
+      : super b::B::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect
new file mode 100644
index 0000000..560b3dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> {
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect
new file mode 100644
index 0000000..560b3dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> {
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect
new file mode 100644
index 0000000..560b3dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> {
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect
new file mode 100644
index 0000000..560b3dd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> {
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.5.expect
new file mode 100644
index 0000000..bfe5392
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.5.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  class Baz extends a::Bar<dart.core::int*> {
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect
new file mode 100644
index 0000000..999851d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  part package:mypackage/c.dart;
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> { // from org-dartlang-test:///mypackage/c.dart
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect
new file mode 100644
index 0000000..999851d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  part package:mypackage/c.dart;
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> { // from org-dartlang-test:///mypackage/c.dart
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect
new file mode 100644
index 0000000..999851d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  part package:mypackage/c.dart;
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> { // from org-dartlang-test:///mypackage/c.dart
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect
new file mode 100644
index 0000000..999851d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  part package:mypackage/c.dart;
+  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> { // from org-dartlang-test:///mypackage/c.dart
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.5.expect
new file mode 100644
index 0000000..d34698f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.5.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart";
+
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → a::Foo<a::Foo::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
+    synthetic constructor •() → a::Bar<a::Bar::T*>*
+      : super a::Foo::•()
+      ;
+  }
+}
+library from "package:mypackage/b.dart" as b {
+
+  import "package:mypackage/a.dart";
+
+  part package:mypackage/c.dart;
+  class Baz extends a::Bar<dart.core::int*> { // from org-dartlang-test:///mypackage/c.dart
+    synthetic constructor •() → b::Baz*
+      : super a::Bar::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect
new file mode 100644
index 0000000..336b536
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect
@@ -0,0 +1,30 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart" as a;
+
+  static method main() → dynamic {
+    a::main();
+  }
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  static method main() → dynamic {
+    b::foo();
+  }
+}
+library from "package:mypackage/b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.
+//   bar();
+//   ^^^
+//
+
+  static method foo() → dynamic {
+    invalid-expression "org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.\n  bar();\n  ^^^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect
new file mode 100644
index 0000000..336b536
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect
@@ -0,0 +1,30 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart" as a;
+
+  static method main() → dynamic {
+    a::main();
+  }
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  static method main() → dynamic {
+    b::foo();
+  }
+}
+library from "package:mypackage/b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.
+//   bar();
+//   ^^^
+//
+
+  static method foo() → dynamic {
+    invalid-expression "org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.\n  bar();\n  ^^^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect
new file mode 100644
index 0000000..11d08c5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect
@@ -0,0 +1,31 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart" as a;
+
+  static method main() → dynamic {
+    a::main();
+  }
+}
+library from "package:mypackage/a.dart" as a {
+
+  import "package:mypackage/b.dart";
+
+  static method main() → dynamic {
+    b::foo();
+    b::foo();
+  }
+}
+library from "package:mypackage/b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.
+//   bar();
+//   ^^^
+//
+
+  static method foo() → dynamic {
+    invalid-expression "org-dartlang-test:///mypackage/b.dart:2:3: Error: Method not found: 'bar'.\n  bar();\n  ^^^";
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect
new file mode 100644
index 0000000..0165c50
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect
@@ -0,0 +1,17 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:mypackage/a.dart" as a;
+
+  static method main() → dynamic {
+    a::main();
+  }
+}
+library from "package:mypackage/a.dart" as a {
+
+  static method main() → dynamic {
+    a::foo();
+    a::foo();
+  }
+  static method foo() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.1.expect
new file mode 100644
index 0000000..287e451
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.1.expect
@@ -0,0 +1,30 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:3:21: Error: Expected 0 type arguments.
+// class Bar<X extends Foo<Null>> {}
+//                     ^
+//
+// org-dartlang-test:///lib.dart:3:21: Error: Type 'Foo' not found.
+// class Bar<X extends Foo<Null>> {}
+//                     ^^^
+//
+
+  class Bar<X extends invalid-type = invalid-type> extends dart.core::Object {
+    synthetic constructor •() → lib::Bar<lib::Bar::X*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Foo<X extends lib::Bar<invalid-type>* = lib::Bar<invalid-type>*> extends dart.core::Object {
+    synthetic constructor •() → main::Foo<main::Foo::X*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.2.expect
new file mode 100644
index 0000000..4c8930d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.2.expect
@@ -0,0 +1,30 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:3:21: Error: Expected 0 type arguments.
+// class Bar<X extends Foo<Null>> {}
+//                     ^
+//
+// org-dartlang-test:///lib.dart:3:21: Error: Type 'Foo' not found.
+// class Bar<X extends Foo<Null>> {}
+//                     ^^^
+//
+
+  class Bar<X extends invalid-type = invalid-type> extends dart.core::Object {
+    synthetic constructor •() → lib::Bar<lib::Bar::X*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Foo extends dart.core::Object {
+    synthetic constructor •() → main::Foo*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
new file mode 100644
index 0000000..f05ee7f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///main.dart";
+
+  class Bar<X extends main::Foo<dart.core::Null?>* = main::Foo<dart.core::Null?>*> extends dart.core::Object {
+    synthetic constructor •() → lib::Bar<lib::Bar::X*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  class Foo<X extends lib::Bar<main::Foo<dart.core::Null?>*>* = lib::Bar<main::Foo<dart.core::Null?>*>*> extends dart.core::Object {
+    synthetic constructor •() → main::Foo<main::Foo::X*>*
+      : super dart.core::Object::•()
+      ;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect
new file mode 100644
index 0000000..add2ad8
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect
@@ -0,0 +1,25 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  static method foo() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import 'nonexisting.dart';
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect
new file mode 100644
index 0000000..901f5bc
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect
@@ -0,0 +1,26 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  static method foo() → dynamic {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib::foo();
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import 'nonexisting.dart';
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect
new file mode 100644
index 0000000..f9c00f1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect
@@ -0,0 +1,33 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  static method foo() → dynamic {}
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static method bar() → dynamic {
+    dart.core::print("hello");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib2::bar();
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import 'nonexisting.dart';
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect
new file mode 100644
index 0000000..a737d73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect
@@ -0,0 +1,33 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+  static method foo() → dynamic {}
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static method bar() → dynamic {
+    dart.core::print("hello2");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib2::bar();
+  }
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///lib.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import 'nonexisting.dart';
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect
new file mode 100644
index 0000000..9a5acc1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method foo() → dynamic {}
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static method bar() → dynamic {
+    dart.core::print("hello2");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    lib2::bar();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect
new file mode 100644
index 0000000..e14d840
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect
new file mode 100644
index 0000000..fd1eaf9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect
@@ -0,0 +1,29 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method bar() → dynamic {
+    invalid-expression "This assertion failed.";
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect
new file mode 100644
index 0000000..e14d840
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect
new file mode 100644
index 0000000..e14d840
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect
new file mode 100644
index 0000000..b96fc85
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect
@@ -0,0 +1,35 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  static const field lib::Foo* fooField2 = invalid-expression "This assertion failed.";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(invalid-expression "This assertion failed.");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect
new file mode 100644
index 0000000..06f21af
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect
@@ -0,0 +1,38 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  class Foo extends dart.core::Object {
+    const constructor •(dart.core::int* i) → lib::Foo*
+      : assert(i.{dart.core::num::>}(0)), super dart.core::Object::•()
+      ;
+  }
+  static method foo() → dynamic {
+    new lib::Foo::•(0);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static const field lib::Foo* fooField = #C1;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  static const field lib::Foo* fooField2 = #C1;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+  import "org-dartlang-test:///lib2.dart";
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib::foo();
+    dart.core::print(#C1);
+  }
+}
+constants  {
+  #C1 = lib::Foo {}
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect
new file mode 100644
index 0000000..7d86835
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect
@@ -0,0 +1,36 @@
+main = <No Member>;
+library bLibrary from "org-dartlang-test:///b.dart" as bLi {
+
+  class I<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → bLi::I<bLi::I::T*>*
+      : super dart.core::Object::•()
+      ;
+  }
+  class A extends dart.core::Object implements bLi::I<dart.core::int*> {
+    synthetic constructor •() → bLi::A*
+      : super dart.core::Object::•()
+      ;
+  }
+  class B extends dart.core::Object implements bLi::I<dart.core::String*> {
+    synthetic constructor •() → bLi::B*
+      : super dart.core::Object::•()
+      ;
+  }
+  class C extends bLi::A implements bLi::B {
+    synthetic constructor •() → bLi::C*
+      : super bLi::A::•()
+      ;
+  }
+  static method foo() → dynamic {
+    dart.core::print("hello from b.dart foo!");
+    dart.core::print(new bLi::C::•());
+  }
+}
+library mainLibrary from "org-dartlang-test:///main.dart" as mai {
+
+  import "org-dartlang-test:///b.dart" as b;
+
+  static method main() → dynamic {
+    bLi::foo();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect
new file mode 100644
index 0000000..468dd2a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library mainLibrary from "org-dartlang-test:///main.dart" as mai {
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect
new file mode 100644
index 0000000..a5961e3
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("b");
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect
new file mode 100644
index 0000000..118bd73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect
@@ -0,0 +1,7 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect
new file mode 100644
index 0000000..5f4155b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect
new file mode 100644
index 0000000..1ac0905
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from v0.1.1");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect
new file mode 100644
index 0000000..5f4155b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect
new file mode 100644
index 0000000..1ac0905
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from v0.1.1");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect
new file mode 100644
index 0000000..5f4155b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect
new file mode 100644
index 0000000..1ac0905
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from v0.1.1");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect
new file mode 100644
index 0000000..79c4fd3
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from package");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect
new file mode 100644
index 0000000..9ca4da6
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.
+//   b();
+//   ^
+//
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    invalid-expression "org-dartlang-test:///main.dart:4:3: Error: Method not found: 'b'.\n  b();\n  ^";
+  }
+}
+library from "package:example/b.dart" as b {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:8: Error: Not found: 'package:example/b.dart'
+// import "package:example/b.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect
new file mode 100644
index 0000000..5f4155b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect
@@ -0,0 +1,27 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/a.dart" as a {
+
+  static method a() → dynamic {
+    a::la1();
+  }
+  static method la1() → dynamic {
+    dart.core::print("v0.1.0");
+  }
+}
+library from "package:example/b.dart" as b {
+
+  import "package:example/a.dart";
+
+  static method b() → dynamic {
+    a::a();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect
new file mode 100644
index 0000000..1ac0905
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:example/b.dart";
+
+  static method main() → dynamic {
+    dart.core::print("hello");
+    b::b();
+  }
+}
+library from "package:example/b.dart" as b {
+
+  static method b() → dynamic {
+    dart.core::print("hello from v0.1.1");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.1.expect
new file mode 100644
index 0000000..3e591c7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.2.expect
new file mode 100644
index 0000000..3e591c7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_1.yaml.world.2.expect
@@ -0,0 +1,21 @@
+main = <No Member>;
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "org-dartlang-test:///nonexisting.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///b.dart";
+
+}
+library from "org-dartlang-test:///nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///b.dart:1:8: Error: Error when reading 'org-dartlang-test:///nonexisting.dart': File org-dartlang-test:///nonexisting.dart does not exist.
+// import "nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_2.yaml.world.1.expect
new file mode 100644
index 0000000..f259355
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_2.yaml.world.1.expect
@@ -0,0 +1,9 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:foo/nonexisting.dart";
+
+}
+
+And 1 platform libraries:
+ - dart:foo/nonexisting.dart
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_3.yaml.world.1.expect
new file mode 100644
index 0000000..34996e7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_3.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:6: Error: Can't use 'org-dartlang-untranslatable-uri:dart%3Afoo%2Fnonexisting.dart' as a part, because it has no 'part of' declaration.
+// part "dart:foo/nonexisting.dart";
+//      ^
+//
+
+  part dart:foo/nonexisting.dart;
+}
+
+And 1 platform libraries:
+ - dart:foo/nonexisting.dart
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_4.yaml.world.1.expect
new file mode 100644
index 0000000..76e7779
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_4.yaml.world.1.expect
@@ -0,0 +1,22 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:6: Error: Can't use 'org-dartlang-untranslatable-uri:package%3Afoo%2Fnonexisting.dart' as a part, because it has no 'part of' declaration.
+// part "package:foo/nonexisting.dart";
+//      ^
+//
+
+  part package:foo/nonexisting.dart;
+}
+library from "package:foo/nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:6: Error: Not found: 'package:foo/nonexisting.dart'
+// part "package:foo/nonexisting.dart";
+//      ^
+//
+
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_5.yaml.world.1.expect
new file mode 100644
index 0000000..2ba0d73
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/working_with_synthetic_libraries_5.yaml.world.1.expect
@@ -0,0 +1,16 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:foo/nonexisting.dart";
+
+}
+library from "package:foo/nonexisting.dart" as non {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:1:8: Error: Not found: 'package:foo/nonexisting.dart'
+// import "package:foo/nonexisting.dart";
+//        ^
+//
+
+}
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
deleted file mode 100644
index 68100f1..0000000
--- a/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/inference/assign_local.dart:14:32: Context: Write to x@320
-  var /*@ type=int* */ x1 = (x = 1);
-                               ^
-pkg/front_end/testcases/inference/assign_local.dart:15:35: Context: Write to x@320
-  var /*@ type=double* */ x2 = (x = 1.0);
-                                  ^
-pkg/front_end/testcases/inference/assign_local.dart:18:36: Context: Write to y@412
-  var /*@ type=A<int*>* */ y1 = (y = new /*@ typeArgs=int* */ A());
-                                   ^
-pkg/front_end/testcases/inference/assign_local.dart:19:36: Context: Write to y@412
-  var /*@ type=B<int*>* */ y2 = (y = new /*@ typeArgs=int* */ B());
-                                   ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
deleted file mode 100644
index 35fb3a7..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:11:5: Context: Write to g@326
-  g = /*@ returnType=String* */ () {
-    ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
deleted file mode 100644
index 2fa431c..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@353
-  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null? */ (/*@ type=Object* */ x) =>
-    ^
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
deleted file mode 100644
index a6f22c3..0000000
--- a/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/bug30620.dart:14:13: Context: Possible promotion of other@335
-      other is A && /*@ promotedType=A* */ other
-            ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
deleted file mode 100644
index c3d4ebc..0000000
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/bug30620_b.dart:14:13: Context: Possible promotion of other@335
-      other is A && /*@ promotedType=A* */ other
-            ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
deleted file mode 100644
index f1d0bf3..0000000
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/bug30620_c.dart:14:15: Context: Possible promotion of other@335
-    if (other is A && /*@ promotedType=A* */ other
-              ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect
deleted file mode 100644
index bdbeb50..0000000
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/bug30620_d.dart:8:24: Context: Possible promotion of obj@273
-String foo(obj) => obj is String
-                       ^^
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
deleted file mode 100644
index 3713459..0000000
--- a/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/bug31132.dart:15:28: Context: Possible promotion of x@318
-  var /*@ type=C* */ y = x is C ? /*@ promotedType=C* */ x : new C();
-                           ^^
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
deleted file mode 100644
index bf317e2..0000000
--- a/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-pkg/front_end/testcases/inference/bug31133.dart:10:31: Context: Write to i@299
-  for (i /*@ target=num::+ */ ++;
-                              ^^
-pkg/front_end/testcases/inference/bug31133.dart:12:30: Context: Write to i@299
-      i /*@ target=num::+ */ ++) {}
-                             ^^
-pkg/front_end/testcases/inference/bug31133.dart:13:29: Context: Write to i@299
-  for (/*@ target=num::+ */ ++i;
-                            ^^
-pkg/front_end/testcases/inference/bug31133.dart:15:30: Context: Write to i@299
-      i /*@ target=num::+ */ ++) {}
-                             ^^
-pkg/front_end/testcases/inference/bug31133.dart:16:31: Context: Write to i@299
-  for (i /*@ target=num::- */ --;
-                              ^^
-pkg/front_end/testcases/inference/bug31133.dart:18:30: Context: Write to i@299
-      i /*@ target=num::- */ --) {}
-                             ^^
-pkg/front_end/testcases/inference/bug31133.dart:19:29: Context: Write to i@299
-  for (/*@ target=num::- */ --i;
-                            ^^
-pkg/front_end/testcases/inference/bug31133.dart:21:30: Context: Write to i@299
-      i /*@ target=num::- */ --) {}
-                             ^^
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
deleted file mode 100644
index d7cbb44..0000000
--- a/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-pkg/front_end/testcases/inference/bug31436.dart:10:5: Context: Write to g@308
-  g = /*@ returnType=List<Object*>* */ () {
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:13:12: Context: Possible promotion of g@308
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:17:5: Context: Write to g@308
-  g = /*@ returnType=List<int*>* */ () {
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:20:12: Context: Possible promotion of g@308
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:21:12: Context: Possible promotion of g@308
-  assert(g is List<int> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:27:5: Context: Write to g@308
-  g = /*@ returnType=List<Object*>* */ () {
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:30:12: Context: Possible promotion of g@308
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:34:5: Context: Write to o@857
-  o = 3;
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:43:5: Context: Write to g@1323
-  g = /*@ returnType=List<Object*>* */ () => /*@ typeArgs=Object* */ [3];
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:44:12: Context: Possible promotion of g@1323
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:48:5: Context: Write to g@1323
-  g = /*@ returnType=List<int*>* */ () => l;
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:49:12: Context: Possible promotion of g@1323
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:50:12: Context: Possible promotion of g@1323
-  assert(g is List<int> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:56:5: Context: Write to g@1323
-  g = /*@ returnType=List<Object*>* */ () =>
-    ^
-pkg/front_end/testcases/inference/bug31436.dart:58:12: Context: Possible promotion of g@1323
-  assert(g is List<Object> Function());
-           ^^
-pkg/front_end/testcases/inference/bug31436.dart:62:5: Context: Write to o@1842
-  o = 3;
-    ^
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect
deleted file mode 100644
index 1d0fb56..0000000
--- a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart:10:5: Context: Write to x@281
-  x = "hi";
-    ^
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect
deleted file mode 100644
index e2bfbdc..0000000
--- a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart:10:5: Context: Write to x@295
-  x = "hi";
-    ^
-pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart:11:5: Context: Write to x@295
-  x = 3;
-    ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
deleted file mode 100644
index 40956e2b4..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart:16:30: Context: Write to i@372
-      i /*@ target=num::+ */ ++) {}
-                             ^^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
index 5002d4f..a003f3b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
@@ -8,7 +8,11 @@
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void {}
-  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null? x = <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → core::Null? {};
+  function f<@#C1 T extends core::Object* = dynamic>() → void {}
+  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
index 5002d4f..a003f3b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
@@ -8,7 +8,11 @@
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void {}
-  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null? x = <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → core::Null? {};
+  function f<@#C1 T extends core::Object* = dynamic>() → void {}
+  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
deleted file mode 100644
index 19c94fa..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:5: Context: Write to l@288
-  l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
-    ^
-pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:10: Context: Write to l@288
-  l = (l = /*@ typeArgs=int* */ [1]);
-         ^
-pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:5: Context: Write to l@288
-  l = (l = /*@ typeArgs=int* */ [1]);
-    ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect
deleted file mode 100644
index d06c6eb..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart:12:8: Context: Write to v1@368
-    v1 = <S> /*@returnType=main::::S*/ (/*@type=main::::S*/ x) => x;
-       ^
-pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart:17:8: Context: Write to v2@553
-    v2 = <S> /*@returnType=List<main::::S>*/
-       ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
deleted file mode 100644
index 370bfb82..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
+++ /dev/null
@@ -1,60 +0,0 @@
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:12:7: Context: Write to v@380
-    v = <T> /*@ returnType=Null? */ (int x) => null;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:13:7: Context: Write to v@380
-    v = <T> /*@ returnType=String* */ (int x) => "hello";
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:7: Context: Write to v@380
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:7: Context: Write to v@380
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:17:7: Context: Write to v@380
-    v = <T> /*@ returnType=String* */ (int x) {
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:24:7: Context: Write to v@889
-    v = <T> /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:25:7: Context: Write to v@889
-    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:26:7: Context: Write to v@889
-    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:29:7: Context: Write to v@889
-    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:32:7: Context: Write to v@889
-    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:39:7: Context: Write to v@1531
-    v = <T> /*@ returnType=Null? */ (int x) => null;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:40:7: Context: Write to v@1531
-    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:7: Context: Write to v@1531
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:45:7: Context: Write to v@1531
-    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:48:7: Context: Write to v@1531
-    v = <T> /*@ returnType=List<String*>* */ (int x) {
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:59:7: Context: Write to x@2340
-    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:60:7: Context: Write to x@2340
-    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x /*@target=num::+*/ + 1;
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:62:7: Context: Write to y@2568
-    y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:65:7: Context: Write to y@2568
-    y = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
-      ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:69:7: Context: Write to z@2928
-    z = <T> /*@ returnType=String* */ (/*@ type=String* */ x) =>
-      ^
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
deleted file mode 100644
index 10398e9..0000000
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/for_in_loop_promotion.dart:10:11: Context: Possible promotion of x@318
-    if (x is int) {
-          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect
deleted file mode 100644
index 3f8990b..0000000
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/for_loop_empty_condition.dart:9:43: Context: Write to x@287
-  for (num x = 0;; x /*@ target=num::+ */ ++) {
-                                          ^^
-pkg/front_end/testcases/inference/for_loop_empty_condition.dart:11:11: Context: Possible promotion of x@287
-    if (x is int) {
-          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect
deleted file mode 100644
index 0a6dba0..0000000
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:10:10: Context: Write to x@282
-  for (x = 0; x /*@target=num::<*/ < 10; x /*@ target=num::+ */ ++) {
-         ^
-pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:10:65: Context: Write to x@282
-  for (x = 0; x /*@target=num::<*/ < 10; x /*@ target=num::+ */ ++) {
-                                                                ^^
-pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:11:11: Context: Possible promotion of x@282
-    if (x is int) {
-          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect
deleted file mode 100644
index 9171867..0000000
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/for_loop_promotion.dart:9:69: Context: Write to x@287
-  for (num x = 0; x /*@target=num::<*/ < 10; x /*@ target=num::+ */ ++) {
-                                                                    ^^
-pkg/front_end/testcases/inference/for_loop_promotion.dart:10:11: Context: Possible promotion of x@287
-    if (x is int) {
-          ^^
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
deleted file mode 100644
index b21b39b..0000000
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/future_then_downwards_method_target.dart:17:5: Context: Write to b@330
-  b = f. /*@ typeArgs=List<int*>* */ /*@target=Future::then*/ then(
-    ^
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
deleted file mode 100644
index 37b52fb..0000000
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/future_then_upwards_from_block.dart:21:5: Context: Write to b@721
-  b = g;
-    ^
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
deleted file mode 100644
index a8f55d6..0000000
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart:18:8: Context: Write to list@717
-  list = result2;
-       ^
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect
deleted file mode 100644
index b9f3609..0000000
--- a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/generic_functions_return_typedef.dart:15:12: Context: Write to takesInt@458
-  takesInt = y;
-           ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
deleted file mode 100644
index c1b547d..0000000
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:20:5: Context: Write to y@448
-  y = /*info:DYNAMIC_CAST*/ z;
-    ^
-pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:35:5: Context: Write to y@976
-  y = /*info:DYNAMIC_CAST*/ z;
-    ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect
deleted file mode 100644
index 7e3d35f..0000000
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:13:5: Context: Write to y@427
-  y = "world";
-    ^
-pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:14:5: Context: Write to y@427
-  y = /*error:INVALID_ASSIGNMENT*/ 42;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
index 116991f..3f482e4 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
@@ -45,13 +45,13 @@
     let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4).{self::B::&}(self::f<self::A*>()));
     let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5).{self::B::-}(1) in let final void #t7 = this.{self::Test::[]=}(#t5, #t6) in #t6;
     let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8).{self::B::-}(1));
-    self::B* v1 = let final self::Test* #t9 = this in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = self::f<self::B*>() in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11) in #t11;
-    self::B* v2 = let final self::Index* #t13 = self::f<self::Index*>() in let final self::B* #t14 = this.{self::Test::[]}(#t13) in #t14.{core::Object::==}(null) ?{self::B*} let final self::B* #t15 = self::f<self::B*>() in let final void #t16 = this.{self::Test::[]=}(#t13, #t15) in #t15 : #t14;
-    self::A* v4 = let final self::Index* #t17 = self::f<self::Index*>() in let final self::A* #t18 = this.{self::Test::[]}(#t17).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t19 = this.{self::Test::[]=}(#t17, #t18) in #t18;
-    self::B* v3 = let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = this.{self::Test::[]}(#t20).{self::B::*}(self::f<self::B*>()) in let final void #t22 = this.{self::Test::[]=}(#t20, #t21) in #t21;
-    self::C* v5 = let final self::Index* #t23 = self::f<self::Index*>() in let final self::C* #t24 = this.{self::Test::[]}(#t23).{self::B::&}(self::f<self::A*>()) in let final void #t25 = this.{self::Test::[]=}(#t23, #t24) in #t24;
-    self::B* v6 = let final self::Index* #t26 = self::f<self::Index*>() in let final self::B* #t27 = this.{self::Test::[]}(#t26).{self::B::-}(1) in let final void #t28 = this.{self::Test::[]=}(#t26, #t27) in #t27;
-    self::B* v7 = let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = this.{self::Test::[]}(#t29) in let final void #t31 = this.{self::Test::[]=}(#t29, #t30.{self::B::-}(1)) in #t30;
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12) in #t13.{core::Object::==}(null) ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v4 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17) in #t17;
+    self::B* v3 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19).{self::B::*}(self::f<self::B*>()) in let final void #t21 = this.{self::Test::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22).{self::B::&}(self::f<self::A*>()) in let final void #t24 = this.{self::Test::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25).{self::B::-}(1) in let final void #t27 = this.{self::Test::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28) in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1)) in #t29;
   }
 }
 static method f<T extends core::Object* = dynamic>() → self::f::T*
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
index 116991f..3f482e4 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -45,13 +45,13 @@
     let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4).{self::B::&}(self::f<self::A*>()));
     let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5).{self::B::-}(1) in let final void #t7 = this.{self::Test::[]=}(#t5, #t6) in #t6;
     let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8).{self::B::-}(1));
-    self::B* v1 = let final self::Test* #t9 = this in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = self::f<self::B*>() in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11) in #t11;
-    self::B* v2 = let final self::Index* #t13 = self::f<self::Index*>() in let final self::B* #t14 = this.{self::Test::[]}(#t13) in #t14.{core::Object::==}(null) ?{self::B*} let final self::B* #t15 = self::f<self::B*>() in let final void #t16 = this.{self::Test::[]=}(#t13, #t15) in #t15 : #t14;
-    self::A* v4 = let final self::Index* #t17 = self::f<self::Index*>() in let final self::A* #t18 = this.{self::Test::[]}(#t17).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t19 = this.{self::Test::[]=}(#t17, #t18) in #t18;
-    self::B* v3 = let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = this.{self::Test::[]}(#t20).{self::B::*}(self::f<self::B*>()) in let final void #t22 = this.{self::Test::[]=}(#t20, #t21) in #t21;
-    self::C* v5 = let final self::Index* #t23 = self::f<self::Index*>() in let final self::C* #t24 = this.{self::Test::[]}(#t23).{self::B::&}(self::f<self::A*>()) in let final void #t25 = this.{self::Test::[]=}(#t23, #t24) in #t24;
-    self::B* v6 = let final self::Index* #t26 = self::f<self::Index*>() in let final self::B* #t27 = this.{self::Test::[]}(#t26).{self::B::-}(1) in let final void #t28 = this.{self::Test::[]=}(#t26, #t27) in #t27;
-    self::B* v7 = let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = this.{self::Test::[]}(#t29) in let final void #t31 = this.{self::Test::[]=}(#t29, #t30.{self::B::-}(1)) in #t30;
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12) in #t13.{core::Object::==}(null) ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v4 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17) in #t17;
+    self::B* v3 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19).{self::B::*}(self::f<self::B*>()) in let final void #t21 = this.{self::Test::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22).{self::B::&}(self::f<self::A*>()) in let final void #t24 = this.{self::Test::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25).{self::B::-}(1) in let final void #t27 = this.{self::Test::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28) in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1)) in #t29;
   }
 }
 static method f<T extends core::Object* = dynamic>() → self::f::T*
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
deleted file mode 100644
index cd4a8a3..0000000
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:23:9: Context: Write to local@474
-  local = /*@ typeArgs=B* */ f();
-        ^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:25:34: Context: Write to local@474
-  local /*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
-                                 ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:27:28: Context: Write to local@474
-  local /*@ target=B::+ */ += /*@ typeArgs=C* */ f();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:29:28: Context: Write to local@474
-  local /*@ target=B::* */ *= /*@ typeArgs=B* */ f();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:31:28: Context: Write to local@474
-  local /*@ target=B::& */ &= /*@ typeArgs=A* */ f();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:33:22: Context: Write to local@474
-  /*@ target=B::- */ --local;
-                     ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:35:28: Context: Write to local@474
-  local /*@ target=B::- */ --;
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:37:33: Context: Write to local@474
-  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
-                                ^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:40:38: Context: Write to local@474
-      local /*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
-                                     ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:42:52: Context: Write to local@474
-  var /*@ type=A* */ v3 = local /*@ target=B::+ */ += /*@ typeArgs=C* */ f();
-                                                   ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:44:52: Context: Write to local@474
-  var /*@ type=B* */ v4 = local /*@ target=B::* */ *= /*@ typeArgs=B* */ f();
-                                                   ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:46:52: Context: Write to local@474
-  var /*@ type=C* */ v5 = local /*@ target=B::& */ &= /*@ typeArgs=A* */ f();
-                                                   ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:48:46: Context: Write to local@474
-  var /*@ type=B* */ v6 = /*@ target=B::- */ --local;
-                                             ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:51:41: Context: Write to local@474
-      /*@ type=B* */ /*@ target=B::- */ --;
-                                        ^^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
deleted file mode 100644
index e4950d8..0000000
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
+++ /dev/null
@@ -1,69 +0,0 @@
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:13:31: Context: Write to t@343
-  var /*@ type=int* */ v1 = t = getInt();
-                              ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:15:51: Context: Write to t@343
-  var /*@ type=int* */ v4 = t /*@target=num::==*/ ??= getInt();
-                                                  ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:17:50: Context: Write to t@343
-  var /*@ type=int* */ v7 = t /*@target=num::+*/ += getInt();
-                                                 ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:19:49: Context: Write to t@343
-  var /*@ type=int* */ v10 = /*@target=num::+*/ ++t;
-                                                ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:22:43: Context: Write to t@343
-      /*@ type=int* */ /*@target=num::+*/ ++;
-                                          ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:26:31: Context: Write to t@343
-  var /*@ type=int* */ v1 = t = getInt();
-                              ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:28:31: Context: Write to t@343
-  var /*@ type=num* */ v2 = t = getNum();
-                              ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:30:34: Context: Write to t@343
-  var /*@ type=double* */ v3 = t = getDouble();
-                                 ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:32:51: Context: Write to t@343
-  var /*@ type=num* */ v4 = t /*@target=num::==*/ ??= getInt();
-                                                  ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:34:51: Context: Write to t@343
-  var /*@ type=num* */ v5 = t /*@target=num::==*/ ??= getNum();
-                                                  ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:36:51: Context: Write to t@343
-  var /*@ type=num* */ v6 = t /*@target=num::==*/ ??= getDouble();
-                                                  ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:38:50: Context: Write to t@343
-  var /*@ type=num* */ v7 = t /*@target=num::+*/ += getInt();
-                                                 ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:40:50: Context: Write to t@343
-  var /*@ type=num* */ v8 = t /*@target=num::+*/ += getNum();
-                                                 ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:42:50: Context: Write to t@343
-  var /*@ type=num* */ v9 = t /*@target=num::+*/ += getDouble();
-                                                 ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:44:49: Context: Write to t@343
-  var /*@ type=num* */ v10 = /*@target=num::+*/ ++t;
-                                                ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:47:43: Context: Write to t@343
-      /*@ type=num* */ /*@target=num::+*/ ++;
-                                          ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:51:34: Context: Write to t@343
-  var /*@ type=double* */ v3 = t = getDouble();
-                                 ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:53:54: Context: Write to t@343
-  var /*@ type=double* */ v6 = t /*@target=num::==*/ ??= getDouble();
-                                                     ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:55:56: Context: Write to t@343
-  var /*@ type=double* */ v7 = t /*@target=double::+*/ += getInt();
-                                                       ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:57:56: Context: Write to t@343
-  var /*@ type=double* */ v8 = t /*@target=double::+*/ += getNum();
-                                                       ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:59:56: Context: Write to t@343
-  var /*@ type=double* */ v9 = t /*@target=double::+*/ += getDouble();
-                                                       ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:61:55: Context: Write to t@343
-  var /*@ type=double* */ v10 = /*@target=double::+*/ ++t;
-                                                      ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:64:49: Context: Write to t@343
-      /*@ type=double* */ /*@target=double::+*/ ++;
-                                                ^^
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
deleted file mode 100644
index d118f42..0000000
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/infer_consts_transitively_2.dart:15:5: Context: Write to i@353
-  i = m1;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
deleted file mode 100644
index eeb9f3c..0000000
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:20:5: Context: Write to s@374
-  s = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:5: Context: Write to s@374
-  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:22:5: Context: Write to s@374
-  s = new B(). /*@target=B::z*/ z;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:5: Context: Write to s@374
-  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:25:5: Context: Write to i@383
-  i = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:5: Context: Write to i@383
-  i = new B(). /*@target=B::y*/ y;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:5: Context: Write to i@383
-  i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
-    ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:5: Context: Write to i@383
-  i = new B(). /*@target=B::w*/ w;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
deleted file mode 100644
index ca48ff3..0000000
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:14:5: Context: Write to t@372
-  t = x;
-    ^
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:15:5: Context: Write to t@372
-  t = y;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
deleted file mode 100644
index 298131f..0000000
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:16:5: Context: Write to t@383
-  t = A.x;
-    ^
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:17:5: Context: Write to t@383
-  t = B.y;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
deleted file mode 100644
index f5e0605..0000000
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/infer_statics_transitively.dart:15:5: Context: Write to i@354
-  i = m1;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
deleted file mode 100644
index bd4a813..0000000
--- a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/infer_statics_transitively2.dart:15:5: Context: Write to i@335
-  i = y1;
-    ^
-pkg/front_end/testcases/inference/infer_statics_transitively2.dart:16:5: Context: Write to i@335
-  i = y2;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
deleted file mode 100644
index 3a64db3..0000000
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:20:5: Context: Write to i@492
-  i = t1;
-    ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:21:5: Context: Write to i@492
-  i = t2;
-    ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:22:5: Context: Write to i@492
-  i = t3;
-    ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:23:5: Context: Write to i@492
-  i = t4;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect
deleted file mode 100644
index f8cd812..0000000
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/infer_type_on_var.dart:10:5: Context: Write to x@278
-  x = /*error:INVALID_ASSIGNMENT*/ "hi";
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
deleted file mode 100644
index 6b30ef6..0000000
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:5: Context: Write to x@295
-  x = /*error:INVALID_ASSIGNMENT*/ "hi";
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
deleted file mode 100644
index 5f2268b..0000000
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@323
-    a = /*error:INVALID_ASSIGNMENT*/ "hi";
-      ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@323
-    a = 3;
-      ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@426
-    b = /*error:INVALID_ASSIGNMENT*/ "hi";
-      ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@426
-    b = 4;
-      ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@529
-    c = /*error:INVALID_ASSIGNMENT*/ "hi";
-      ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@529
-    c = 4;
-      ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
deleted file mode 100644
index b899119..0000000
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:5: Context: Write to a@307
-  a = /*error:INVALID_ASSIGNMENT*/ "hi";
-    ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:13:5: Context: Write to a@307
-  a = 3;
-    ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:5: Context: Write to b@387
-  b = /*error:INVALID_ASSIGNMENT*/ "hi";
-    ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:16:5: Context: Write to b@387
-  b = 4;
-    ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:5: Context: Write to c@467
-  c = /*error:INVALID_ASSIGNMENT*/ "hi";
-    ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:19:5: Context: Write to c@467
-  c = 4;
-    ^
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
deleted file mode 100644
index dabdbac..0000000
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart:11:30: Context: Write to i@299
-      i /*@ target=num::+ */ ++) {
-                             ^^
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect
deleted file mode 100644
index b81ec02..0000000
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-pkg/front_end/testcases/inference/instantiate_tearoff.dart:18:10: Context: Write to func@399
-    func = super. /*@target=C::f*/ f;
-         ^
-pkg/front_end/testcases/inference/instantiate_tearoff.dart:25:8: Context: Write to func@504
-  func = f;
-       ^
-pkg/front_end/testcases/inference/instantiate_tearoff.dart:26:8: Context: Write to func@504
-  func = new C(). /*@target=C::f*/ f;
-       ^
-pkg/front_end/testcases/inference/instantiate_tearoff.dart:27:8: Context: Write to func@504
-  func = C.g;
-       ^
-pkg/front_end/testcases/inference/instantiate_tearoff.dart:28:8: Context: Write to func@504
-  func = h;
-       ^
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect
deleted file mode 100644
index b654339..0000000
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:8: Context: Write to func@314
-  func = f.call;
-       ^
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
deleted file mode 100644
index 82fc53b..0000000
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart:19:10: Context: Write to list@531
-    list = <String>[];
-         ^
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect
deleted file mode 100644
index 88430c6..0000000
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/inference/logical_or_promotion.dart:16:11: Context: Possible promotion of o@338
-    if (o is A || o is B) {
-          ^^
-pkg/front_end/testcases/inference/logical_or_promotion.dart:16:21: Context: Possible promotion of o@338
-    if (o is A || o is B) {
-                    ^^
-pkg/front_end/testcases/inference/logical_or_promotion.dart:17:13: Context: Possible promotion of o@338
-      if (o is A) {
-            ^^
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index 1f1aeac..936f05f 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
@@ -29,13 +29,13 @@
 static method test1() → dynamic {
   core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::int*, "w");
-  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in 4.0 as{TypeError} core::int*, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::String*);
   core::Map<core::num*, core::String*>* y = x;
@@ -43,11 +43,11 @@
 static method test2() → dynamic {
   core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::num*, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::Pattern*);
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
index 1f1aeac..936f05f 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
@@ -29,13 +29,13 @@
 static method test1() → dynamic {
   core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::int*, "w");
-  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in 4.0 as{TypeError} core::int*, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::String*);
   core::Map<core::num*, core::String*>* y = x;
@@ -43,11 +43,11 @@
 static method test2() → dynamic {
   core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::num*, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::Pattern*);
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index 4505766..edf1acd 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 //   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 //   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 //   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
@@ -30,24 +30,24 @@
 static field core::Map<core::num*, core::Pattern*>* x2 = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int*, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int*, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String*);
   core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num*, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::Pattern*);
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index 4505766..edf1acd 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 //   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 //   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 //   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
@@ -30,24 +30,24 @@
 static field core::Map<core::num*, core::Pattern*>* x2 = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int*, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int*, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String*);
   core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num*, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::Pattern*);
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect
deleted file mode 100644
index d405d4e..0000000
--- a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart:10:5: Context: Write to x@278
-  x = null;
-    ^
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
deleted file mode 100644
index 9262c18..0000000
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@353
-  f = /*@ returnType=Null? */ (/*@ type=Object* */ x) => 'hello';
-    ^
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@537
-  g = 'hello';
-    ^
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect
deleted file mode 100644
index 90d61ac..0000000
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/promote_bounds.dart:17:9: Context: Possible promotion of a@366
-  if (a is String) {
-        ^^
-pkg/front_end/testcases/inference/promote_bounds.dart:21:9: Context: Possible promotion of a@366
-  if (a is C) {
-        ^^
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect
deleted file mode 100644
index dafde1f..0000000
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/promote_from_logical_rhs.dart:9:14: Context: Possible promotion of a@279
-  if (b && a is int) {
-             ^^
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
deleted file mode 100644
index acd3603..0000000
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/inference/promotion_subtype_check.dart:9:9: Context: Possible promotion of x@276
-  if (x is int) {
-        ^^
-pkg/front_end/testcases/inference/promotion_subtype_check.dart:10:36: Context: Possible promotion of x@276
-    if (/*@ promotedType=int* */ x is String) {
-                                   ^^
-pkg/front_end/testcases/inference/promotion_subtype_check.dart:18:9: Context: Possible promotion of x@276
-  if (x is String) {
-        ^^
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect
deleted file mode 100644
index d34e2ca..0000000
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/try_catch_promotion.dart:20:11: Context: Possible promotion of x@382
-    if (x is D) {
-          ^^
-pkg/front_end/testcases/inference/try_catch_promotion.dart:23:11: Context: Possible promotion of y@385
-    if (y is E) {
-          ^^
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect
deleted file mode 100644
index 364cd86..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/inference/type_promotion_simple.dart:10:9: Context: Possible promotion of n@279
-  if (n is int) {
-        ^^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect
deleted file mode 100644
index d1dd6f5..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart:10:9: Context: Possible promotion of n@279
-  if (n is int) {
-        ^^
-pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart:16:5: Context: Write to n@279
-  n = null;
-    ^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect
deleted file mode 100644
index 3a7414e..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart:10:9: Context: Possible promotion of n@279
-  if (n is int) {
-        ^^
-pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart:12:7: Context: Write to n@279
-    n = null;
-      ^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect
deleted file mode 100644
index c5a50d4..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart:10:9: Context: Possible promotion of n@279
-  if (n is int) {
-        ^^
-pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart:14:7: Context: Write to n@279
-    n = null;
-      ^
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
deleted file mode 100644
index 36b568a..0000000
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@543
-  x = 123;
-    ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@543
-  x = 'hi';
-    ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@598
-  y = /*error:INVALID_ASSIGNMENT*/ 123;
-    ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@598
-  y = /*error:INVALID_ASSIGNMENT*/ 'hi';
-    ^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
index 909ee1a..6b50461 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
@@ -45,13 +45,13 @@
     let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4).{self::B::&}(self::f<self::A*>()));
     let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5).{self::B::-}(1) in let final void #t7 = this.{self::Test::[]=}(#t5, #t6) in #t6;
     let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8).{self::B::-}(1));
-    self::B* v1 = let final self::Test* #t9 = this in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = self::f<self::B*>() in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11) in #t11;
-    self::B* v2 = let final self::Index* #t13 = self::f<self::Index*>() in let final self::B* #t14 = this.{self::Test::[]}(#t13) in #t14.{core::Object::==}(null) ?{self::B*} let final self::B* #t15 = self::f<self::B*>() in let final void #t16 = this.{self::Test::[]=}(#t13, #t15) in #t15 : #t14;
-    self::A* v3 = let final self::Index* #t17 = self::f<self::Index*>() in let final self::A* #t18 = this.{self::Test::[]}(#t17).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t19 = this.{self::Test::[]=}(#t17, #t18) in #t18;
-    self::B* v4 = let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = this.{self::Test::[]}(#t20).{self::B::*}(self::f<self::B*>()) in let final void #t22 = this.{self::Test::[]=}(#t20, #t21) in #t21;
-    self::C* v5 = let final self::Index* #t23 = self::f<self::Index*>() in let final self::C* #t24 = this.{self::Test::[]}(#t23).{self::B::&}(self::f<self::A*>()) in let final void #t25 = this.{self::Test::[]=}(#t23, #t24) in #t24;
-    self::B* v6 = let final self::Index* #t26 = self::f<self::Index*>() in let final self::B* #t27 = this.{self::Test::[]}(#t26).{self::B::-}(1) in let final void #t28 = this.{self::Test::[]=}(#t26, #t27) in #t27;
-    self::B* v7 = let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = this.{self::Test::[]}(#t29) in let final void #t31 = this.{self::Test::[]=}(#t29, #t30.{self::B::-}(1)) in #t30;
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12) in #t13.{core::Object::==}(null) ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v3 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17) in #t17;
+    self::B* v4 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19).{self::B::*}(self::f<self::B*>()) in let final void #t21 = this.{self::Test::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22).{self::B::&}(self::f<self::A*>()) in let final void #t24 = this.{self::Test::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25).{self::B::-}(1) in let final void #t27 = this.{self::Test::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28) in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1)) in #t29;
   }
 }
 static method f<T extends core::Object* = dynamic>() → self::f::T*
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
index 909ee1a..6b50461 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -45,13 +45,13 @@
     let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4).{self::B::&}(self::f<self::A*>()));
     let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5).{self::B::-}(1) in let final void #t7 = this.{self::Test::[]=}(#t5, #t6) in #t6;
     let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8).{self::B::-}(1));
-    self::B* v1 = let final self::Test* #t9 = this in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = self::f<self::B*>() in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11) in #t11;
-    self::B* v2 = let final self::Index* #t13 = self::f<self::Index*>() in let final self::B* #t14 = this.{self::Test::[]}(#t13) in #t14.{core::Object::==}(null) ?{self::B*} let final self::B* #t15 = self::f<self::B*>() in let final void #t16 = this.{self::Test::[]=}(#t13, #t15) in #t15 : #t14;
-    self::A* v3 = let final self::Index* #t17 = self::f<self::Index*>() in let final self::A* #t18 = this.{self::Test::[]}(#t17).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t19 = this.{self::Test::[]=}(#t17, #t18) in #t18;
-    self::B* v4 = let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = this.{self::Test::[]}(#t20).{self::B::*}(self::f<self::B*>()) in let final void #t22 = this.{self::Test::[]=}(#t20, #t21) in #t21;
-    self::C* v5 = let final self::Index* #t23 = self::f<self::Index*>() in let final self::C* #t24 = this.{self::Test::[]}(#t23).{self::B::&}(self::f<self::A*>()) in let final void #t25 = this.{self::Test::[]=}(#t23, #t24) in #t24;
-    self::B* v6 = let final self::Index* #t26 = self::f<self::Index*>() in let final self::B* #t27 = this.{self::Test::[]}(#t26).{self::B::-}(1) in let final void #t28 = this.{self::Test::[]=}(#t26, #t27) in #t27;
-    self::B* v7 = let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = this.{self::Test::[]}(#t29) in let final void #t31 = this.{self::Test::[]=}(#t29, #t30.{self::B::-}(1)) in #t30;
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12) in #t13.{core::Object::==}(null) ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v3 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16).{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17) in #t17;
+    self::B* v4 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19).{self::B::*}(self::f<self::B*>()) in let final void #t21 = this.{self::Test::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22).{self::B::&}(self::f<self::A*>()) in let final void #t24 = this.{self::Test::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25).{self::B::-}(1) in let final void #t27 = this.{self::Test::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28) in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1)) in #t29;
   }
 }
 static method f<T extends core::Object* = dynamic>() → self::f::T*
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index e9c7b8e..bcb1a68 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -40,14 +40,14 @@
   abstract operator [](core::String* s) → core::int*;
   abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test1* #t1 = this in let final core::String* #t2 = "x" in let final core::int* #t3 = self::getInt() in let final void #t4 = #t1.{self::Test1::[]=}(#t2, #t3) in #t3;
-    core::num* v2 = let final self::Test1* #t5 = this in let final core::String* #t6 = "x" in let final core::num* #t7 = self::getNum() as{TypeError} core::int* in let final void #t8 = #t5.{self::Test1::[]=}(#t6, #t7) in #t7;
-    core::int* v4 = let final core::String* #t9 = "x" in let final core::int* #t10 = this.{self::Test1::[]}(#t9) in #t10.{core::num::==}(null) ?{core::int*} let final core::int* #t11 = self::getInt() in let final void #t12 = this.{self::Test1::[]=}(#t9, #t11) in #t11 : #t10;
-    core::num* v5 = let final core::String* #t13 = "x" in let final core::int* #t14 = this.{self::Test1::[]}(#t13) in #t14.{core::num::==}(null) ?{core::num*} let final core::num* #t15 = self::getNum() as{TypeError} core::int* in let final void #t16 = this.{self::Test1::[]=}(#t13, #t15) in #t15 : #t14;
-    core::int* v7 = let final core::String* #t17 = "x" in let final core::int* #t18 = this.{self::Test1::[]}(#t17).{core::num::+}(self::getInt()) in let final void #t19 = this.{self::Test1::[]=}(#t17, #t18) in #t18;
-    core::num* v8 = let final core::String* #t20 = "x" in let final core::num* #t21 = this.{self::Test1::[]}(#t20).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t22 = this.{self::Test1::[]=}(#t20, #t21) in #t21;
-    core::int* v10 = let final core::String* #t23 = "x" in let final core::int* #t24 = this.{self::Test1::[]}(#t23).{core::num::+}(1) in let final void #t25 = this.{self::Test1::[]=}(#t23, #t24) in #t24;
-    core::int* v11 = let final core::String* #t26 = "x" in let final core::int* #t27 = this.{self::Test1::[]}(#t26) in let final void #t28 = this.{self::Test1::[]=}(#t26, #t27.{core::num::+}(1)) in #t27;
+    core::int* v1 = let final core::String* #t1 = "x" in let final core::int* #t2 = self::getInt() in let final void #t3 = this.{self::Test1::[]=}(#t1, #t2) in #t2;
+    core::num* v2 = let final core::String* #t4 = "x" in let final core::num* #t5 = self::getNum() as{TypeError} core::int* in let final void #t6 = this.{self::Test1::[]=}(#t4, #t5) in #t5;
+    core::int* v4 = let final core::String* #t7 = "x" in let final core::int* #t8 = this.{self::Test1::[]}(#t7) in #t8.{core::num::==}(null) ?{core::int*} let final core::int* #t9 = self::getInt() in let final void #t10 = this.{self::Test1::[]=}(#t7, #t9) in #t9 : #t8;
+    core::num* v5 = let final core::String* #t11 = "x" in let final core::int* #t12 = this.{self::Test1::[]}(#t11) in #t12.{core::num::==}(null) ?{core::num*} let final core::num* #t13 = self::getNum() as{TypeError} core::int* in let final void #t14 = this.{self::Test1::[]=}(#t11, #t13) in #t13 : #t12;
+    core::int* v7 = let final core::String* #t15 = "x" in let final core::int* #t16 = this.{self::Test1::[]}(#t15).{core::num::+}(self::getInt()) in let final void #t17 = this.{self::Test1::[]=}(#t15, #t16) in #t16;
+    core::num* v8 = let final core::String* #t18 = "x" in let final core::num* #t19 = this.{self::Test1::[]}(#t18).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t20 = this.{self::Test1::[]=}(#t18, #t19) in #t19;
+    core::int* v10 = let final core::String* #t21 = "x" in let final core::int* #t22 = this.{self::Test1::[]}(#t21).{core::num::+}(1) in let final void #t23 = this.{self::Test1::[]=}(#t21, #t22) in #t22;
+    core::int* v11 = let final core::String* #t24 = "x" in let final core::int* #t25 = this.{self::Test1::[]}(#t24) in let final void #t26 = this.{self::Test1::[]=}(#t24, #t25.{core::num::+}(1)) in #t25;
   }
 }
 abstract class Test2 extends core::Object {
@@ -57,17 +57,17 @@
   abstract operator [](core::String* s) → core::int*;
   abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test2* #t29 = this in let final core::String* #t30 = "x" in let final core::int* #t31 = self::getInt() in let final void #t32 = #t29.{self::Test2::[]=}(#t30, #t31) in #t31;
-    core::num* v2 = let final self::Test2* #t33 = this in let final core::String* #t34 = "x" in let final core::num* #t35 = self::getNum() in let final void #t36 = #t33.{self::Test2::[]=}(#t34, #t35) in #t35;
-    core::double* v3 = let final self::Test2* #t37 = this in let final core::String* #t38 = "x" in let final core::double* #t39 = self::getDouble() in let final void #t40 = #t37.{self::Test2::[]=}(#t38, #t39) in #t39;
-    core::int* v4 = let final core::String* #t41 = "x" in let final core::int* #t42 = this.{self::Test2::[]}(#t41) in #t42.{core::num::==}(null) ?{core::int*} let final core::int* #t43 = self::getInt() in let final void #t44 = this.{self::Test2::[]=}(#t41, #t43) in #t43 : #t42;
-    core::num* v5 = let final core::String* #t45 = "x" in let final core::int* #t46 = this.{self::Test2::[]}(#t45) in #t46.{core::num::==}(null) ?{core::num*} let final core::num* #t47 = self::getNum() in let final void #t48 = this.{self::Test2::[]=}(#t45, #t47) in #t47 : #t46;
-    core::num* v6 = let final core::String* #t49 = "x" in let final core::int* #t50 = this.{self::Test2::[]}(#t49) in #t50.{core::num::==}(null) ?{core::num*} let final core::double* #t51 = self::getDouble() in let final void #t52 = this.{self::Test2::[]=}(#t49, #t51) in #t51 : #t50;
-    core::int* v7 = let final core::String* #t53 = "x" in let final core::int* #t54 = this.{self::Test2::[]}(#t53).{core::num::+}(self::getInt()) in let final void #t55 = this.{self::Test2::[]=}(#t53, #t54) in #t54;
-    core::num* v8 = let final core::String* #t56 = "x" in let final core::num* #t57 = this.{self::Test2::[]}(#t56).{core::num::+}(self::getNum()) in let final void #t58 = this.{self::Test2::[]=}(#t56, #t57) in #t57;
-    core::double* v9 = let final core::String* #t59 = "x" in let final core::double* #t60 = this.{self::Test2::[]}(#t59).{core::num::+}(self::getDouble()) in let final void #t61 = this.{self::Test2::[]=}(#t59, #t60) in #t60;
-    core::int* v10 = let final core::String* #t62 = "x" in let final core::int* #t63 = this.{self::Test2::[]}(#t62).{core::num::+}(1) in let final void #t64 = this.{self::Test2::[]=}(#t62, #t63) in #t63;
-    core::int* v11 = let final core::String* #t65 = "x" in let final core::int* #t66 = this.{self::Test2::[]}(#t65) in let final void #t67 = this.{self::Test2::[]=}(#t65, #t66.{core::num::+}(1)) in #t66;
+    core::int* v1 = let final core::String* #t27 = "x" in let final core::int* #t28 = self::getInt() in let final void #t29 = this.{self::Test2::[]=}(#t27, #t28) in #t28;
+    core::num* v2 = let final core::String* #t30 = "x" in let final core::num* #t31 = self::getNum() in let final void #t32 = this.{self::Test2::[]=}(#t30, #t31) in #t31;
+    core::double* v3 = let final core::String* #t33 = "x" in let final core::double* #t34 = self::getDouble() in let final void #t35 = this.{self::Test2::[]=}(#t33, #t34) in #t34;
+    core::int* v4 = let final core::String* #t36 = "x" in let final core::int* #t37 = this.{self::Test2::[]}(#t36) in #t37.{core::num::==}(null) ?{core::int*} let final core::int* #t38 = self::getInt() in let final void #t39 = this.{self::Test2::[]=}(#t36, #t38) in #t38 : #t37;
+    core::num* v5 = let final core::String* #t40 = "x" in let final core::int* #t41 = this.{self::Test2::[]}(#t40) in #t41.{core::num::==}(null) ?{core::num*} let final core::num* #t42 = self::getNum() in let final void #t43 = this.{self::Test2::[]=}(#t40, #t42) in #t42 : #t41;
+    core::num* v6 = let final core::String* #t44 = "x" in let final core::int* #t45 = this.{self::Test2::[]}(#t44) in #t45.{core::num::==}(null) ?{core::num*} let final core::double* #t46 = self::getDouble() in let final void #t47 = this.{self::Test2::[]=}(#t44, #t46) in #t46 : #t45;
+    core::int* v7 = let final core::String* #t48 = "x" in let final core::int* #t49 = this.{self::Test2::[]}(#t48).{core::num::+}(self::getInt()) in let final void #t50 = this.{self::Test2::[]=}(#t48, #t49) in #t49;
+    core::num* v8 = let final core::String* #t51 = "x" in let final core::num* #t52 = this.{self::Test2::[]}(#t51).{core::num::+}(self::getNum()) in let final void #t53 = this.{self::Test2::[]=}(#t51, #t52) in #t52;
+    core::double* v9 = let final core::String* #t54 = "x" in let final core::double* #t55 = this.{self::Test2::[]}(#t54).{core::num::+}(self::getDouble()) in let final void #t56 = this.{self::Test2::[]=}(#t54, #t55) in #t55;
+    core::int* v10 = let final core::String* #t57 = "x" in let final core::int* #t58 = this.{self::Test2::[]}(#t57).{core::num::+}(1) in let final void #t59 = this.{self::Test2::[]=}(#t57, #t58) in #t58;
+    core::int* v11 = let final core::String* #t60 = "x" in let final core::int* #t61 = this.{self::Test2::[]}(#t60) in let final void #t62 = this.{self::Test2::[]=}(#t60, #t61.{core::num::+}(1)) in #t61;
   }
 }
 abstract class Test3 extends core::Object {
@@ -77,21 +77,21 @@
   abstract operator [](core::String* s) → core::int*;
   abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
-    core::num* v2 = let final self::Test3* #t68 = this in let final core::String* #t69 = "x" in let final core::num* #t70 = self::getNum() as{TypeError} core::double* in let final void #t71 = #t68.{self::Test3::[]=}(#t69, #t70) in #t70;
-    core::double* v3 = let final self::Test3* #t72 = this in let final core::String* #t73 = "x" in let final core::double* #t74 = self::getDouble() in let final void #t75 = #t72.{self::Test3::[]=}(#t73, #t74) in #t74;
-    core::num* v5 = let final core::String* #t76 = "x" in let final core::int* #t77 = this.{self::Test3::[]}(#t76) in #t77.{core::num::==}(null) ?{core::num*} let final core::num* #t78 = self::getNum() as{TypeError} core::double* in let final void #t79 = this.{self::Test3::[]=}(#t76, #t78) in #t78 : #t77;
-    core::num* v6 = let final core::String* #t80 = "x" in let final core::int* #t81 = this.{self::Test3::[]}(#t80) in #t81.{core::num::==}(null) ?{core::num*} let final core::double* #t82 = self::getDouble() in let final void #t83 = this.{self::Test3::[]=}(#t80, #t82) in #t82 : #t81;
-    core::int* v7 = let final core::String* #t84 = "x" in let final core::int* #t85 = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:111:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    core::num* v2 = let final core::String* #t63 = "x" in let final core::num* #t64 = self::getNum() as{TypeError} core::double* in let final void #t65 = this.{self::Test3::[]=}(#t63, #t64) in #t64;
+    core::double* v3 = let final core::String* #t66 = "x" in let final core::double* #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67) in #t67;
+    core::num* v5 = let final core::String* #t69 = "x" in let final core::int* #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num*} let final core::num* #t71 = self::getNum() as{TypeError} core::double* in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
+    core::num* v6 = let final core::String* #t73 = "x" in let final core::int* #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num*} let final core::double* #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
+    core::int* v7 = let final core::String* #t77 = "x" in let final core::int* #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:111:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
         /*@target=num::+*/ += getInt();
-                           ^" in this.{self::Test3::[]}(#t84).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t87 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
-    core::num* v8 = let final core::String* #t88 = "x" in let final core::num* #t89 = this.{self::Test3::[]}(#t88).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t90 = this.{self::Test3::[]=}(#t88, #t89) in #t89;
-    core::double* v9 = let final core::String* #t91 = "x" in let final core::double* #t92 = this.{self::Test3::[]}(#t91).{core::num::+}(self::getDouble()) in let final void #t93 = this.{self::Test3::[]=}(#t91, #t92) in #t92;
-    core::int* v10 = let final core::String* #t94 = "x" in let final core::int* #t95 = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:121:51: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+                           ^" in this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
+    core::num* v8 = let final core::String* #t81 = "x" in let final core::num* #t82 = this.{self::Test3::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t83 = this.{self::Test3::[]=}(#t81, #t82) in #t82;
+    core::double* v9 = let final core::String* #t84 = "x" in let final core::double* #t85 = this.{self::Test3::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
+    core::int* v10 = let final core::String* #t87 = "x" in let final core::int* #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:121:51: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
     var /*@ type=int* */ v10 = /*@target=num::+*/ ++this
-                                                  ^" in this.{self::Test3::[]}(#t94).{core::num::+}(1) as{TypeError} core::double* in let final void #t97 = this.{self::Test3::[]=}(#t94, #t95) in #t95;
-    core::int* v11 = let final core::String* #t98 = "x" in let final core::int* #t99 = this.{self::Test3::[]}(#t98) in let final void #t100 = this.{self::Test3::[]=}(#t98, let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+                                                  ^" in this.{self::Test3::[]}(#t87).{core::num::+}(1) as{TypeError} core::double* in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
+    core::int* v11 = let final core::String* #t91 = "x" in let final core::int* #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
         /*@target=num::+*/ ++;
-                           ^" in #t99.{core::num::+}(1) as{TypeError} core::double*) in #t99;
+                           ^" in #t92.{core::num::+}(1) as{TypeError} core::double*) in #t92;
   }
 }
 abstract class Test4 extends core::Object {
@@ -101,14 +101,14 @@
   abstract operator [](core::String* s) → core::num*;
   abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test4* #t102 = this in let final core::String* #t103 = "x" in let final core::int* #t104 = self::getInt() in let final void #t105 = #t102.{self::Test4::[]=}(#t103, #t104) in #t104;
-    core::num* v2 = let final self::Test4* #t106 = this in let final core::String* #t107 = "x" in let final core::num* #t108 = self::getNum() as{TypeError} core::int* in let final void #t109 = #t106.{self::Test4::[]=}(#t107, #t108) in #t108;
-    core::num* v4 = let final core::String* #t110 = "x" in let final core::num* #t111 = this.{self::Test4::[]}(#t110) in #t111.{core::num::==}(null) ?{core::num*} let final core::int* #t112 = self::getInt() in let final void #t113 = this.{self::Test4::[]=}(#t110, #t112) in #t112 : #t111;
-    core::num* v5 = let final core::String* #t114 = "x" in let final core::num* #t115 = this.{self::Test4::[]}(#t114) in #t115.{core::num::==}(null) ?{core::num*} let final core::num* #t116 = self::getNum() as{TypeError} core::int* in let final void #t117 = this.{self::Test4::[]=}(#t114, #t116) in #t116 : #t115;
-    core::num* v7 = let final core::String* #t118 = "x" in let final core::num* #t119 = this.{self::Test4::[]}(#t118).{core::num::+}(self::getInt()) as{TypeError} core::int* in let final void #t120 = this.{self::Test4::[]=}(#t118, #t119) in #t119;
-    core::num* v8 = let final core::String* #t121 = "x" in let final core::num* #t122 = this.{self::Test4::[]}(#t121).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t123 = this.{self::Test4::[]=}(#t121, #t122) in #t122;
-    core::num* v10 = let final core::String* #t124 = "x" in let final core::num* #t125 = this.{self::Test4::[]}(#t124).{core::num::+}(1) as{TypeError} core::int* in let final void #t126 = this.{self::Test4::[]=}(#t124, #t125) in #t125;
-    core::num* v11 = let final core::String* #t127 = "x" in let final core::num* #t128 = this.{self::Test4::[]}(#t127) in let final void #t129 = this.{self::Test4::[]=}(#t127, #t128.{core::num::+}(1) as{TypeError} core::int*) in #t128;
+    core::int* v1 = let final core::String* #t95 = "x" in let final core::int* #t96 = self::getInt() in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96) in #t96;
+    core::num* v2 = let final core::String* #t98 = "x" in let final core::num* #t99 = self::getNum() as{TypeError} core::int* in let final void #t100 = this.{self::Test4::[]=}(#t98, #t99) in #t99;
+    core::num* v4 = let final core::String* #t101 = "x" in let final core::num* #t102 = this.{self::Test4::[]}(#t101) in #t102.{core::num::==}(null) ?{core::num*} let final core::int* #t103 = self::getInt() in let final void #t104 = this.{self::Test4::[]=}(#t101, #t103) in #t103 : #t102;
+    core::num* v5 = let final core::String* #t105 = "x" in let final core::num* #t106 = this.{self::Test4::[]}(#t105) in #t106.{core::num::==}(null) ?{core::num*} let final core::num* #t107 = self::getNum() as{TypeError} core::int* in let final void #t108 = this.{self::Test4::[]=}(#t105, #t107) in #t107 : #t106;
+    core::num* v7 = let final core::String* #t109 = "x" in let final core::num* #t110 = this.{self::Test4::[]}(#t109).{core::num::+}(self::getInt()) as{TypeError} core::int* in let final void #t111 = this.{self::Test4::[]=}(#t109, #t110) in #t110;
+    core::num* v8 = let final core::String* #t112 = "x" in let final core::num* #t113 = this.{self::Test4::[]}(#t112).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t114 = this.{self::Test4::[]=}(#t112, #t113) in #t113;
+    core::num* v10 = let final core::String* #t115 = "x" in let final core::num* #t116 = this.{self::Test4::[]}(#t115).{core::num::+}(1) as{TypeError} core::int* in let final void #t117 = this.{self::Test4::[]=}(#t115, #t116) in #t116;
+    core::num* v11 = let final core::String* #t118 = "x" in let final core::num* #t119 = this.{self::Test4::[]}(#t118) in let final void #t120 = this.{self::Test4::[]=}(#t118, #t119.{core::num::+}(1) as{TypeError} core::int*) in #t119;
   }
 }
 abstract class Test5 extends core::Object {
@@ -118,17 +118,17 @@
   abstract operator [](core::String* s) → core::num*;
   abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test5* #t130 = this in let final core::String* #t131 = "x" in let final core::int* #t132 = self::getInt() in let final void #t133 = #t130.{self::Test5::[]=}(#t131, #t132) in #t132;
-    core::num* v2 = let final self::Test5* #t134 = this in let final core::String* #t135 = "x" in let final core::num* #t136 = self::getNum() in let final void #t137 = #t134.{self::Test5::[]=}(#t135, #t136) in #t136;
-    core::double* v3 = let final self::Test5* #t138 = this in let final core::String* #t139 = "x" in let final core::double* #t140 = self::getDouble() in let final void #t141 = #t138.{self::Test5::[]=}(#t139, #t140) in #t140;
-    core::num* v4 = let final core::String* #t142 = "x" in let final core::num* #t143 = this.{self::Test5::[]}(#t142) in #t143.{core::num::==}(null) ?{core::num*} let final core::int* #t144 = self::getInt() in let final void #t145 = this.{self::Test5::[]=}(#t142, #t144) in #t144 : #t143;
-    core::num* v5 = let final core::String* #t146 = "x" in let final core::num* #t147 = this.{self::Test5::[]}(#t146) in #t147.{core::num::==}(null) ?{core::num*} let final core::num* #t148 = self::getNum() in let final void #t149 = this.{self::Test5::[]=}(#t146, #t148) in #t148 : #t147;
-    core::num* v6 = let final core::String* #t150 = "x" in let final core::num* #t151 = this.{self::Test5::[]}(#t150) in #t151.{core::num::==}(null) ?{core::num*} let final core::double* #t152 = self::getDouble() in let final void #t153 = this.{self::Test5::[]=}(#t150, #t152) in #t152 : #t151;
-    core::num* v7 = let final core::String* #t154 = "x" in let final core::num* #t155 = this.{self::Test5::[]}(#t154).{core::num::+}(self::getInt()) in let final void #t156 = this.{self::Test5::[]=}(#t154, #t155) in #t155;
-    core::num* v8 = let final core::String* #t157 = "x" in let final core::num* #t158 = this.{self::Test5::[]}(#t157).{core::num::+}(self::getNum()) in let final void #t159 = this.{self::Test5::[]=}(#t157, #t158) in #t158;
-    core::num* v9 = let final core::String* #t160 = "x" in let final core::num* #t161 = this.{self::Test5::[]}(#t160).{core::num::+}(self::getDouble()) in let final void #t162 = this.{self::Test5::[]=}(#t160, #t161) in #t161;
-    core::num* v10 = let final core::String* #t163 = "x" in let final core::num* #t164 = this.{self::Test5::[]}(#t163).{core::num::+}(1) in let final void #t165 = this.{self::Test5::[]=}(#t163, #t164) in #t164;
-    core::num* v11 = let final core::String* #t166 = "x" in let final core::num* #t167 = this.{self::Test5::[]}(#t166) in let final void #t168 = this.{self::Test5::[]=}(#t166, #t167.{core::num::+}(1)) in #t167;
+    core::int* v1 = let final core::String* #t121 = "x" in let final core::int* #t122 = self::getInt() in let final void #t123 = this.{self::Test5::[]=}(#t121, #t122) in #t122;
+    core::num* v2 = let final core::String* #t124 = "x" in let final core::num* #t125 = self::getNum() in let final void #t126 = this.{self::Test5::[]=}(#t124, #t125) in #t125;
+    core::double* v3 = let final core::String* #t127 = "x" in let final core::double* #t128 = self::getDouble() in let final void #t129 = this.{self::Test5::[]=}(#t127, #t128) in #t128;
+    core::num* v4 = let final core::String* #t130 = "x" in let final core::num* #t131 = this.{self::Test5::[]}(#t130) in #t131.{core::num::==}(null) ?{core::num*} let final core::int* #t132 = self::getInt() in let final void #t133 = this.{self::Test5::[]=}(#t130, #t132) in #t132 : #t131;
+    core::num* v5 = let final core::String* #t134 = "x" in let final core::num* #t135 = this.{self::Test5::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num*} let final core::num* #t136 = self::getNum() in let final void #t137 = this.{self::Test5::[]=}(#t134, #t136) in #t136 : #t135;
+    core::num* v6 = let final core::String* #t138 = "x" in let final core::num* #t139 = this.{self::Test5::[]}(#t138) in #t139.{core::num::==}(null) ?{core::num*} let final core::double* #t140 = self::getDouble() in let final void #t141 = this.{self::Test5::[]=}(#t138, #t140) in #t140 : #t139;
+    core::num* v7 = let final core::String* #t142 = "x" in let final core::num* #t143 = this.{self::Test5::[]}(#t142).{core::num::+}(self::getInt()) in let final void #t144 = this.{self::Test5::[]=}(#t142, #t143) in #t143;
+    core::num* v8 = let final core::String* #t145 = "x" in let final core::num* #t146 = this.{self::Test5::[]}(#t145).{core::num::+}(self::getNum()) in let final void #t147 = this.{self::Test5::[]=}(#t145, #t146) in #t146;
+    core::num* v9 = let final core::String* #t148 = "x" in let final core::num* #t149 = this.{self::Test5::[]}(#t148).{core::num::+}(self::getDouble()) in let final void #t150 = this.{self::Test5::[]=}(#t148, #t149) in #t149;
+    core::num* v10 = let final core::String* #t151 = "x" in let final core::num* #t152 = this.{self::Test5::[]}(#t151).{core::num::+}(1) in let final void #t153 = this.{self::Test5::[]=}(#t151, #t152) in #t152;
+    core::num* v11 = let final core::String* #t154 = "x" in let final core::num* #t155 = this.{self::Test5::[]}(#t154) in let final void #t156 = this.{self::Test5::[]=}(#t154, #t155.{core::num::+}(1)) in #t155;
   }
 }
 abstract class Test6 extends core::Object {
@@ -138,15 +138,15 @@
   abstract operator [](core::String* s) → core::num*;
   abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
-    core::num* v2 = let final self::Test6* #t169 = this in let final core::String* #t170 = "x" in let final core::num* #t171 = self::getNum() as{TypeError} core::double* in let final void #t172 = #t169.{self::Test6::[]=}(#t170, #t171) in #t171;
-    core::double* v3 = let final self::Test6* #t173 = this in let final core::String* #t174 = "x" in let final core::double* #t175 = self::getDouble() in let final void #t176 = #t173.{self::Test6::[]=}(#t174, #t175) in #t175;
-    core::num* v5 = let final core::String* #t177 = "x" in let final core::num* #t178 = this.{self::Test6::[]}(#t177) in #t178.{core::num::==}(null) ?{core::num*} let final core::num* #t179 = self::getNum() as{TypeError} core::double* in let final void #t180 = this.{self::Test6::[]=}(#t177, #t179) in #t179 : #t178;
-    core::num* v6 = let final core::String* #t181 = "x" in let final core::num* #t182 = this.{self::Test6::[]}(#t181) in #t182.{core::num::==}(null) ?{core::num*} let final core::double* #t183 = self::getDouble() in let final void #t184 = this.{self::Test6::[]=}(#t181, #t183) in #t183 : #t182;
-    core::num* v7 = let final core::String* #t185 = "x" in let final core::num* #t186 = this.{self::Test6::[]}(#t185).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t187 = this.{self::Test6::[]=}(#t185, #t186) in #t186;
-    core::num* v8 = let final core::String* #t188 = "x" in let final core::num* #t189 = this.{self::Test6::[]}(#t188).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t190 = this.{self::Test6::[]=}(#t188, #t189) in #t189;
-    core::num* v9 = let final core::String* #t191 = "x" in let final core::num* #t192 = this.{self::Test6::[]}(#t191).{core::num::+}(self::getDouble()) as{TypeError} core::double* in let final void #t193 = this.{self::Test6::[]=}(#t191, #t192) in #t192;
-    core::num* v10 = let final core::String* #t194 = "x" in let final core::num* #t195 = this.{self::Test6::[]}(#t194).{core::num::+}(1) as{TypeError} core::double* in let final void #t196 = this.{self::Test6::[]=}(#t194, #t195) in #t195;
-    core::num* v11 = let final core::String* #t197 = "x" in let final core::num* #t198 = this.{self::Test6::[]}(#t197) in let final void #t199 = this.{self::Test6::[]=}(#t197, #t198.{core::num::+}(1) as{TypeError} core::double*) in #t198;
+    core::num* v2 = let final core::String* #t157 = "x" in let final core::num* #t158 = self::getNum() as{TypeError} core::double* in let final void #t159 = this.{self::Test6::[]=}(#t157, #t158) in #t158;
+    core::double* v3 = let final core::String* #t160 = "x" in let final core::double* #t161 = self::getDouble() in let final void #t162 = this.{self::Test6::[]=}(#t160, #t161) in #t161;
+    core::num* v5 = let final core::String* #t163 = "x" in let final core::num* #t164 = this.{self::Test6::[]}(#t163) in #t164.{core::num::==}(null) ?{core::num*} let final core::num* #t165 = self::getNum() as{TypeError} core::double* in let final void #t166 = this.{self::Test6::[]=}(#t163, #t165) in #t165 : #t164;
+    core::num* v6 = let final core::String* #t167 = "x" in let final core::num* #t168 = this.{self::Test6::[]}(#t167) in #t168.{core::num::==}(null) ?{core::num*} let final core::double* #t169 = self::getDouble() in let final void #t170 = this.{self::Test6::[]=}(#t167, #t169) in #t169 : #t168;
+    core::num* v7 = let final core::String* #t171 = "x" in let final core::num* #t172 = this.{self::Test6::[]}(#t171).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t173 = this.{self::Test6::[]=}(#t171, #t172) in #t172;
+    core::num* v8 = let final core::String* #t174 = "x" in let final core::num* #t175 = this.{self::Test6::[]}(#t174).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t176 = this.{self::Test6::[]=}(#t174, #t175) in #t175;
+    core::num* v9 = let final core::String* #t177 = "x" in let final core::num* #t178 = this.{self::Test6::[]}(#t177).{core::num::+}(self::getDouble()) as{TypeError} core::double* in let final void #t179 = this.{self::Test6::[]=}(#t177, #t178) in #t178;
+    core::num* v10 = let final core::String* #t180 = "x" in let final core::num* #t181 = this.{self::Test6::[]}(#t180).{core::num::+}(1) as{TypeError} core::double* in let final void #t182 = this.{self::Test6::[]=}(#t180, #t181) in #t181;
+    core::num* v11 = let final core::String* #t183 = "x" in let final core::num* #t184 = this.{self::Test6::[]}(#t183) in let final void #t185 = this.{self::Test6::[]=}(#t183, #t184.{core::num::+}(1) as{TypeError} core::double*) in #t184;
   }
 }
 abstract class Test7 extends core::Object {
@@ -156,22 +156,22 @@
   abstract operator [](core::String* s) → core::double*;
   abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test7* #t200 = this in let final core::String* #t201 = "x" in let final core::int* #t202 = self::getInt() in let final void #t203 = #t200.{self::Test7::[]=}(#t201, #t202) in #t202;
-    core::num* v2 = let final self::Test7* #t204 = this in let final core::String* #t205 = "x" in let final core::num* #t206 = self::getNum() as{TypeError} core::int* in let final void #t207 = #t204.{self::Test7::[]=}(#t205, #t206) in #t206;
-    core::num* v4 = let final core::String* #t208 = "x" in let final core::double* #t209 = this.{self::Test7::[]}(#t208) in #t209.{core::num::==}(null) ?{core::num*} let final core::int* #t210 = self::getInt() in let final void #t211 = this.{self::Test7::[]=}(#t208, #t210) in #t210 : #t209;
-    core::num* v5 = let final core::String* #t212 = "x" in let final core::double* #t213 = this.{self::Test7::[]}(#t212) in #t213.{core::num::==}(null) ?{core::num*} let final core::num* #t214 = self::getNum() as{TypeError} core::int* in let final void #t215 = this.{self::Test7::[]=}(#t212, #t214) in #t214 : #t213;
-    core::double* v7 = let final core::String* #t216 = "x" in let final core::double* #t217 = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    core::int* v1 = let final core::String* #t186 = "x" in let final core::int* #t187 = self::getInt() in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187) in #t187;
+    core::num* v2 = let final core::String* #t189 = "x" in let final core::num* #t190 = self::getNum() as{TypeError} core::int* in let final void #t191 = this.{self::Test7::[]=}(#t189, #t190) in #t190;
+    core::num* v4 = let final core::String* #t192 = "x" in let final core::double* #t193 = this.{self::Test7::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num*} let final core::int* #t194 = self::getInt() in let final void #t195 = this.{self::Test7::[]=}(#t192, #t194) in #t194 : #t193;
+    core::num* v5 = let final core::String* #t196 = "x" in let final core::double* #t197 = this.{self::Test7::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num*} let final core::num* #t198 = self::getNum() as{TypeError} core::int* in let final void #t199 = this.{self::Test7::[]=}(#t196, #t198) in #t198 : #t197;
+    core::double* v7 = let final core::String* #t200 = "x" in let final core::double* #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
         /*@target=double::+*/ += getInt();
-                              ^" in this.{self::Test7::[]}(#t216).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t219 = this.{self::Test7::[]=}(#t216, #t217) in #t217;
-    core::double* v8 = let final core::String* #t220 = "x" in let final core::double* #t221 = let final<BottomType> #t222 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:272:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+                              ^" in this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
+    core::double* v8 = let final core::String* #t204 = "x" in let final core::double* #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:272:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
         /*@target=double::+*/ += getNum();
-                              ^" in this.{self::Test7::[]}(#t220).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t223 = this.{self::Test7::[]=}(#t220, #t221) in #t221;
-    core::double* v10 = let final core::String* #t224 = "x" in let final core::double* #t225 = let final<BottomType> #t226 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:274:57: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+                              ^" in this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
+    core::double* v10 = let final core::String* #t208 = "x" in let final core::double* #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:274:57: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
     var /*@ type=double* */ v10 = /*@target=double::+*/ ++this
-                                                        ^" in this.{self::Test7::[]}(#t224).{core::double::+}(1) as{TypeError} core::int* in let final void #t227 = this.{self::Test7::[]=}(#t224, #t225) in #t225;
-    core::double* v11 = let final core::String* #t228 = "x" in let final core::double* #t229 = this.{self::Test7::[]}(#t228) in let final void #t230 = this.{self::Test7::[]=}(#t228, let final<BottomType> #t231 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:279:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+                                                        ^" in this.{self::Test7::[]}(#t208).{core::double::+}(1) as{TypeError} core::int* in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
+    core::double* v11 = let final core::String* #t212 = "x" in let final core::double* #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:279:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
         /*@target=double::+*/ ++;
-                              ^" in #t229.{core::double::+}(1) as{TypeError} core::int*) in #t229;
+                              ^" in #t213.{core::double::+}(1) as{TypeError} core::int*) in #t213;
   }
 }
 abstract class Test8 extends core::Object {
@@ -181,17 +181,17 @@
   abstract operator [](core::String* s) → core::double*;
   abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
-    core::int* v1 = let final self::Test8* #t232 = this in let final core::String* #t233 = "x" in let final core::int* #t234 = self::getInt() in let final void #t235 = #t232.{self::Test8::[]=}(#t233, #t234) in #t234;
-    core::num* v2 = let final self::Test8* #t236 = this in let final core::String* #t237 = "x" in let final core::num* #t238 = self::getNum() in let final void #t239 = #t236.{self::Test8::[]=}(#t237, #t238) in #t238;
-    core::double* v3 = let final self::Test8* #t240 = this in let final core::String* #t241 = "x" in let final core::double* #t242 = self::getDouble() in let final void #t243 = #t240.{self::Test8::[]=}(#t241, #t242) in #t242;
-    core::num* v4 = let final core::String* #t244 = "x" in let final core::double* #t245 = this.{self::Test8::[]}(#t244) in #t245.{core::num::==}(null) ?{core::num*} let final core::int* #t246 = self::getInt() in let final void #t247 = this.{self::Test8::[]=}(#t244, #t246) in #t246 : #t245;
-    core::num* v5 = let final core::String* #t248 = "x" in let final core::double* #t249 = this.{self::Test8::[]}(#t248) in #t249.{core::num::==}(null) ?{core::num*} let final core::num* #t250 = self::getNum() in let final void #t251 = this.{self::Test8::[]=}(#t248, #t250) in #t250 : #t249;
-    core::double* v6 = let final core::String* #t252 = "x" in let final core::double* #t253 = this.{self::Test8::[]}(#t252) in #t253.{core::num::==}(null) ?{core::double*} let final core::double* #t254 = self::getDouble() in let final void #t255 = this.{self::Test8::[]=}(#t252, #t254) in #t254 : #t253;
-    core::double* v7 = let final core::String* #t256 = "x" in let final core::double* #t257 = this.{self::Test8::[]}(#t256).{core::double::+}(self::getInt()) in let final void #t258 = this.{self::Test8::[]=}(#t256, #t257) in #t257;
-    core::double* v8 = let final core::String* #t259 = "x" in let final core::double* #t260 = this.{self::Test8::[]}(#t259).{core::double::+}(self::getNum()) in let final void #t261 = this.{self::Test8::[]=}(#t259, #t260) in #t260;
-    core::double* v9 = let final core::String* #t262 = "x" in let final core::double* #t263 = this.{self::Test8::[]}(#t262).{core::double::+}(self::getDouble()) in let final void #t264 = this.{self::Test8::[]=}(#t262, #t263) in #t263;
-    core::double* v10 = let final core::String* #t265 = "x" in let final core::double* #t266 = this.{self::Test8::[]}(#t265).{core::double::+}(1) in let final void #t267 = this.{self::Test8::[]=}(#t265, #t266) in #t266;
-    core::double* v11 = let final core::String* #t268 = "x" in let final core::double* #t269 = this.{self::Test8::[]}(#t268) in let final void #t270 = this.{self::Test8::[]=}(#t268, #t269.{core::double::+}(1)) in #t269;
+    core::int* v1 = let final core::String* #t216 = "x" in let final core::int* #t217 = self::getInt() in let final void #t218 = this.{self::Test8::[]=}(#t216, #t217) in #t217;
+    core::num* v2 = let final core::String* #t219 = "x" in let final core::num* #t220 = self::getNum() in let final void #t221 = this.{self::Test8::[]=}(#t219, #t220) in #t220;
+    core::double* v3 = let final core::String* #t222 = "x" in let final core::double* #t223 = self::getDouble() in let final void #t224 = this.{self::Test8::[]=}(#t222, #t223) in #t223;
+    core::num* v4 = let final core::String* #t225 = "x" in let final core::double* #t226 = this.{self::Test8::[]}(#t225) in #t226.{core::num::==}(null) ?{core::num*} let final core::int* #t227 = self::getInt() in let final void #t228 = this.{self::Test8::[]=}(#t225, #t227) in #t227 : #t226;
+    core::num* v5 = let final core::String* #t229 = "x" in let final core::double* #t230 = this.{self::Test8::[]}(#t229) in #t230.{core::num::==}(null) ?{core::num*} let final core::num* #t231 = self::getNum() in let final void #t232 = this.{self::Test8::[]=}(#t229, #t231) in #t231 : #t230;
+    core::double* v6 = let final core::String* #t233 = "x" in let final core::double* #t234 = this.{self::Test8::[]}(#t233) in #t234.{core::num::==}(null) ?{core::double*} let final core::double* #t235 = self::getDouble() in let final void #t236 = this.{self::Test8::[]=}(#t233, #t235) in #t235 : #t234;
+    core::double* v7 = let final core::String* #t237 = "x" in let final core::double* #t238 = this.{self::Test8::[]}(#t237).{core::double::+}(self::getInt()) in let final void #t239 = this.{self::Test8::[]=}(#t237, #t238) in #t238;
+    core::double* v8 = let final core::String* #t240 = "x" in let final core::double* #t241 = this.{self::Test8::[]}(#t240).{core::double::+}(self::getNum()) in let final void #t242 = this.{self::Test8::[]=}(#t240, #t241) in #t241;
+    core::double* v9 = let final core::String* #t243 = "x" in let final core::double* #t244 = this.{self::Test8::[]}(#t243).{core::double::+}(self::getDouble()) in let final void #t245 = this.{self::Test8::[]=}(#t243, #t244) in #t244;
+    core::double* v10 = let final core::String* #t246 = "x" in let final core::double* #t247 = this.{self::Test8::[]}(#t246).{core::double::+}(1) in let final void #t248 = this.{self::Test8::[]=}(#t246, #t247) in #t247;
+    core::double* v11 = let final core::String* #t249 = "x" in let final core::double* #t250 = this.{self::Test8::[]}(#t249) in let final void #t251 = this.{self::Test8::[]=}(#t249, #t250.{core::double::+}(1)) in #t250;
   }
 }
 abstract class Test9 extends core::Object {
@@ -201,15 +201,15 @@
   abstract operator [](core::String* s) → core::double*;
   abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
-    core::num* v2 = let final self::Test9* #t271 = this in let final core::String* #t272 = "x" in let final core::num* #t273 = self::getNum() as{TypeError} core::double* in let final void #t274 = #t271.{self::Test9::[]=}(#t272, #t273) in #t273;
-    core::double* v3 = let final self::Test9* #t275 = this in let final core::String* #t276 = "x" in let final core::double* #t277 = self::getDouble() in let final void #t278 = #t275.{self::Test9::[]=}(#t276, #t277) in #t277;
-    core::num* v5 = let final core::String* #t279 = "x" in let final core::double* #t280 = this.{self::Test9::[]}(#t279) in #t280.{core::num::==}(null) ?{core::num*} let final core::num* #t281 = self::getNum() as{TypeError} core::double* in let final void #t282 = this.{self::Test9::[]=}(#t279, #t281) in #t281 : #t280;
-    core::double* v6 = let final core::String* #t283 = "x" in let final core::double* #t284 = this.{self::Test9::[]}(#t283) in #t284.{core::num::==}(null) ?{core::double*} let final core::double* #t285 = self::getDouble() in let final void #t286 = this.{self::Test9::[]=}(#t283, #t285) in #t285 : #t284;
-    core::double* v7 = let final core::String* #t287 = "x" in let final core::double* #t288 = this.{self::Test9::[]}(#t287).{core::double::+}(self::getInt()) in let final void #t289 = this.{self::Test9::[]=}(#t287, #t288) in #t288;
-    core::double* v8 = let final core::String* #t290 = "x" in let final core::double* #t291 = this.{self::Test9::[]}(#t290).{core::double::+}(self::getNum()) in let final void #t292 = this.{self::Test9::[]=}(#t290, #t291) in #t291;
-    core::double* v9 = let final core::String* #t293 = "x" in let final core::double* #t294 = this.{self::Test9::[]}(#t293).{core::double::+}(self::getDouble()) in let final void #t295 = this.{self::Test9::[]=}(#t293, #t294) in #t294;
-    core::double* v10 = let final core::String* #t296 = "x" in let final core::double* #t297 = this.{self::Test9::[]}(#t296).{core::double::+}(1) in let final void #t298 = this.{self::Test9::[]=}(#t296, #t297) in #t297;
-    core::double* v11 = let final core::String* #t299 = "x" in let final core::double* #t300 = this.{self::Test9::[]}(#t299) in let final void #t301 = this.{self::Test9::[]=}(#t299, #t300.{core::double::+}(1)) in #t300;
+    core::num* v2 = let final core::String* #t252 = "x" in let final core::num* #t253 = self::getNum() as{TypeError} core::double* in let final void #t254 = this.{self::Test9::[]=}(#t252, #t253) in #t253;
+    core::double* v3 = let final core::String* #t255 = "x" in let final core::double* #t256 = self::getDouble() in let final void #t257 = this.{self::Test9::[]=}(#t255, #t256) in #t256;
+    core::num* v5 = let final core::String* #t258 = "x" in let final core::double* #t259 = this.{self::Test9::[]}(#t258) in #t259.{core::num::==}(null) ?{core::num*} let final core::num* #t260 = self::getNum() as{TypeError} core::double* in let final void #t261 = this.{self::Test9::[]=}(#t258, #t260) in #t260 : #t259;
+    core::double* v6 = let final core::String* #t262 = "x" in let final core::double* #t263 = this.{self::Test9::[]}(#t262) in #t263.{core::num::==}(null) ?{core::double*} let final core::double* #t264 = self::getDouble() in let final void #t265 = this.{self::Test9::[]=}(#t262, #t264) in #t264 : #t263;
+    core::double* v7 = let final core::String* #t266 = "x" in let final core::double* #t267 = this.{self::Test9::[]}(#t266).{core::double::+}(self::getInt()) in let final void #t268 = this.{self::Test9::[]=}(#t266, #t267) in #t267;
+    core::double* v8 = let final core::String* #t269 = "x" in let final core::double* #t270 = this.{self::Test9::[]}(#t269).{core::double::+}(self::getNum()) in let final void #t271 = this.{self::Test9::[]=}(#t269, #t270) in #t270;
+    core::double* v9 = let final core::String* #t272 = "x" in let final core::double* #t273 = this.{self::Test9::[]}(#t272).{core::double::+}(self::getDouble()) in let final void #t274 = this.{self::Test9::[]=}(#t272, #t273) in #t273;
+    core::double* v10 = let final core::String* #t275 = "x" in let final core::double* #t276 = this.{self::Test9::[]}(#t275).{core::double::+}(1) in let final void #t277 = this.{self::Test9::[]=}(#t275, #t276) in #t276;
+    core::double* v11 = let final core::String* #t278 = "x" in let final core::double* #t279 = this.{self::Test9::[]}(#t278) in let final void #t280 = this.{self::Test9::[]=}(#t278, #t279.{core::double::+}(1)) in #t279;
   }
 }
 static method getInt() → core::int*
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
deleted file mode 100644
index 64f43c5..0000000
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:23:9: Context: Write to local@474
-  local = /*@ typeArgs=B* */ f();
-        ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:25:34: Context: Write to local@474
-  local /*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
-                                 ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:27:28: Context: Write to local@474
-  local /*@ target=B::+ */ += /*@ typeArgs=C* */ f();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:29:28: Context: Write to local@474
-  local /*@ target=B::* */ *= /*@ typeArgs=B* */ f();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:31:28: Context: Write to local@474
-  local /*@ target=B::& */ &= /*@ typeArgs=A* */ f();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:33:22: Context: Write to local@474
-  /*@ target=B::- */ --local;
-                     ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:35:28: Context: Write to local@474
-  local /*@ target=B::- */ --;
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:37:33: Context: Write to local@474
-  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
-                                ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:40:38: Context: Write to local@474
-      local /*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
-                                     ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:43:26: Context: Write to local@474
-      /*@ target=B::+ */ += /*@ typeArgs=C* */ f();
-                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:46:26: Context: Write to local@474
-      /*@ target=B::* */ *= /*@ typeArgs=B* */ f();
-                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:49:26: Context: Write to local@474
-      /*@ target=B::& */ &= /*@ typeArgs=A* */ f();
-                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:51:46: Context: Write to local@474
-  var /*@ type=B* */ v6 = /*@ target=B::- */ --local;
-                                             ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:54:41: Context: Write to local@474
-      /*@ type=B* */ /*@ target=B::- */ --;
-                                        ^^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
deleted file mode 100644
index db044b6..0000000
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
+++ /dev/null
@@ -1,84 +0,0 @@
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:13:31: Context: Write to t@343
-  var /*@ type=int* */ v1 = t = getInt();
-                              ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:15:31: Context: Write to t@343
-  var /*@ type=num* */ v2 = t = getNum();
-                              ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:17:53: Context: Write to t@343
-  var /*@ type=int* */ v4 = t /*@ target=num::== */ ??= getInt();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:19:53: Context: Write to t@343
-  var /*@ type=num* */ v5 = t /*@ target=num::== */ ??= getNum();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:21:52: Context: Write to t@343
-  var /*@ type=int* */ v7 = t /*@ target=num::+ */ += getInt();
-                                                   ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:23:52: Context: Write to t@343
-  var /*@ type=num* */ v8 = t /*@ target=num::+ */ += getNum();
-                                                   ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:25:51: Context: Write to t@343
-  var /*@ type=int* */ v10 = /*@ target=num::+ */ ++t;
-                                                  ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:28:64: Context: Write to t@343
-      /*@ type=int* */ t /*@ type=int* */ /*@ target=num::+ */ ++;
-                                                               ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:32:31: Context: Write to t@343
-  var /*@ type=int* */ v1 = t = getInt();
-                              ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:34:31: Context: Write to t@343
-  var /*@ type=num* */ v2 = t = getNum();
-                              ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:36:34: Context: Write to t@343
-  var /*@ type=double* */ v3 = t = getDouble();
-                                 ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:38:53: Context: Write to t@343
-  var /*@ type=num* */ v4 = t /*@ target=num::== */ ??= getInt();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:40:53: Context: Write to t@343
-  var /*@ type=num* */ v5 = t /*@ target=num::== */ ??= getNum();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:42:53: Context: Write to t@343
-  var /*@ type=num* */ v6 = t /*@ target=num::== */ ??= getDouble();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:44:52: Context: Write to t@343
-  var /*@ type=num* */ v7 = t /*@ target=num::+ */ += getInt();
-                                                   ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:46:52: Context: Write to t@343
-  var /*@ type=num* */ v8 = t /*@ target=num::+ */ += getNum();
-                                                   ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:48:52: Context: Write to t@343
-  var /*@ type=num* */ v9 = t /*@ target=num::+ */ += getDouble();
-                                                   ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:50:51: Context: Write to t@343
-  var /*@ type=num* */ v10 = /*@ target=num::+ */ ++t;
-                                                  ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:53:64: Context: Write to t@343
-      /*@ type=num* */ t /*@ type=num* */ /*@ target=num::+ */ ++;
-                                                               ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:57:31: Context: Write to t@343
-  var /*@ type=num* */ v2 = t = getNum();
-                              ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:59:34: Context: Write to t@343
-  var /*@ type=double* */ v3 = t = getDouble();
-                                 ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:61:53: Context: Write to t@343
-  var /*@ type=num* */ v5 = t /*@ target=num::== */ ??= getNum();
-                                                    ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:63:56: Context: Write to t@343
-  var /*@ type=double* */ v6 = t /*@ target=num::== */ ??= getDouble();
-                                                       ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:65:58: Context: Write to t@343
-  var /*@ type=double* */ v7 = t /*@ target=double::+ */ += getInt();
-                                                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:67:58: Context: Write to t@343
-  var /*@ type=double* */ v8 = t /*@ target=double::+ */ += getNum();
-                                                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:69:58: Context: Write to t@343
-  var /*@ type=double* */ v9 = t /*@ target=double::+ */ += getDouble();
-                                                         ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:71:57: Context: Write to t@343
-  var /*@ type=double* */ v10 = /*@ target=double::+ */ ++t;
-                                                        ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:74:73: Context: Write to t@343
-      /*@ type=double* */ t /*@ type=double* */ /*@ target=double::+ */ ++;
-                                                                        ^^
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart
new file mode 100644
index 0000000..8a69a3c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'inheritance_from_opt_out_lib.dart';
+
+class Class1 extends LegacyClass1 {}
+
+class Class2<T> extends LegacyClass2<T> {}
+
+class Class3a<T> extends LegacyClass3<T> {}
+
+class Class3b<T> extends LegacyClass3<T> implements GenericInterface<T> {}
+
+class Class4a extends LegacyClass4 {}
+
+class Class4b implements GenericInterface<num> {}
+
+class Class4c implements GenericInterface<num?> {}
+
+class Class4d extends LegacyClass4 implements GenericInterface<num> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.outline.expect
new file mode 100644
index 0000000..b279e44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.outline.expect
@@ -0,0 +1,79 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart:13:7: Error: 'Class3b' can't implement both 'GenericInterface<T>' and 'GenericInterface<T>'
+//  - 'GenericInterface' is from 'pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart'.
+// class Class3b<T> extends LegacyClass3<T> implements GenericInterface<T> {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart:21:7: Error: 'Class4d' can't implement both 'GenericInterface<num>' and 'GenericInterface<num>'
+//  - 'GenericInterface' is from 'pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart'.
+// class Class4d extends LegacyClass4 implements GenericInterface<num> {}
+//       ^
+//
+library;
+import self as self;
+import "inheritance_from_opt_out_lib.dart" as inh;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///inheritance_from_opt_out_lib.dart";
+
+class Class1 extends inh::LegacyClass1 {
+  synthetic constructor •() → self::Class1*
+    ;
+}
+class Class2<T extends core::Object? = dynamic> extends inh::LegacyClass2<self::Class2::T%> {
+  synthetic constructor •() → self::Class2<self::Class2::T*>*
+    ;
+}
+class Class3a<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3a::T%> {
+  synthetic constructor •() → self::Class3a<self::Class3a::T*>*
+    ;
+}
+class Class3b<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3b::T%> implements inh::GenericInterface<self::Class3b::T%> {
+  synthetic constructor •() → self::Class3b<self::Class3b::T*>*
+    ;
+}
+class Class4a extends inh::LegacyClass4 {
+  synthetic constructor •() → self::Class4a*
+    ;
+}
+class Class4b extends core::Object implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4b*
+    ;
+}
+class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
+  synthetic constructor •() → self::Class4c*
+    ;
+}
+class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4d*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as inh;
+import "dart:core" as core;
+
+abstract class GenericInterface<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::GenericInterface<inh::GenericInterface::T*>*
+    ;
+}
+class LegacyClass1 extends core::Object {
+  synthetic constructor •() → inh::LegacyClass1*
+    ;
+}
+class LegacyClass2<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::LegacyClass2<inh::LegacyClass2::T*>*
+    ;
+}
+class LegacyClass3<T extends core::Object* = dynamic> extends core::Object implements inh::GenericInterface<inh::LegacyClass3::T*> {
+  synthetic constructor •() → inh::LegacyClass3<inh::LegacyClass3::T*>*
+    ;
+}
+class LegacyClass4 extends core::Object implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → inh::LegacyClass4*
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.strong.expect
new file mode 100644
index 0000000..c729feb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart.strong.expect
@@ -0,0 +1,91 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart:13:7: Error: 'Class3b' can't implement both 'GenericInterface<T>' and 'GenericInterface<T>'
+//  - 'GenericInterface' is from 'pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart'.
+// class Class3b<T> extends LegacyClass3<T> implements GenericInterface<T> {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/inheritance_from_opt_out.dart:21:7: Error: 'Class4d' can't implement both 'GenericInterface<num>' and 'GenericInterface<num>'
+//  - 'GenericInterface' is from 'pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart'.
+// class Class4d extends LegacyClass4 implements GenericInterface<num> {}
+//       ^
+//
+library;
+import self as self;
+import "inheritance_from_opt_out_lib.dart" as inh;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///inheritance_from_opt_out_lib.dart";
+
+class Class1 extends inh::LegacyClass1 {
+  synthetic constructor •() → self::Class1*
+    : super inh::LegacyClass1::•()
+    ;
+}
+class Class2<T extends core::Object? = dynamic> extends inh::LegacyClass2<self::Class2::T%> {
+  synthetic constructor •() → self::Class2<self::Class2::T*>*
+    : super inh::LegacyClass2::•()
+    ;
+}
+class Class3a<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3a::T%> {
+  synthetic constructor •() → self::Class3a<self::Class3a::T*>*
+    : super inh::LegacyClass3::•()
+    ;
+}
+class Class3b<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3b::T%> implements inh::GenericInterface<self::Class3b::T%> {
+  synthetic constructor •() → self::Class3b<self::Class3b::T*>*
+    : super inh::LegacyClass3::•()
+    ;
+}
+class Class4a extends inh::LegacyClass4 {
+  synthetic constructor •() → self::Class4a*
+    : super inh::LegacyClass4::•()
+    ;
+}
+class Class4b extends core::Object implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4b*
+    : super core::Object::•()
+    ;
+}
+class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
+  synthetic constructor •() → self::Class4c*
+    : super core::Object::•()
+    ;
+}
+class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4d*
+    : super inh::LegacyClass4::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as inh;
+import "dart:core" as core;
+
+abstract class GenericInterface<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::GenericInterface<inh::GenericInterface::T*>*
+    : super core::Object::•()
+    ;
+}
+class LegacyClass1 extends core::Object {
+  synthetic constructor •() → inh::LegacyClass1*
+    : super core::Object::•()
+    ;
+}
+class LegacyClass2<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::LegacyClass2<inh::LegacyClass2::T*>*
+    : super core::Object::•()
+    ;
+}
+class LegacyClass3<T extends core::Object* = dynamic> extends core::Object implements inh::GenericInterface<inh::LegacyClass3::T*> {
+  synthetic constructor •() → inh::LegacyClass3<inh::LegacyClass3::T*>*
+    : super core::Object::•()
+    ;
+}
+class LegacyClass4 extends core::Object implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → inh::LegacyClass4*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart
new file mode 100644
index 0000000..6324c15
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_out_lib.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.5
+
+abstract class GenericInterface<T> {}
+
+class LegacyClass1 {}
+
+class LegacyClass2<T> {}
+
+class LegacyClass3<T> implements GenericInterface<T> {}
+
+class LegacyClass4 implements GenericInterface<num> {}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect
deleted file mode 100644
index ffa128e..0000000
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/nnbd/intersection_types.dart:13:11: Context: Possible promotion of t@403
-    if (t is B?) {
-          ^^
-pkg/front_end/testcases/nnbd/intersection_types.dart:15:13: Context: Possible promotion of t@403
-      if (t is C?) {
-            ^^
-pkg/front_end/testcases/nnbd/intersection_types.dart:22:11: Context: Possible promotion of t@403
-    if (t is B) {
-          ^^
-pkg/front_end/testcases/nnbd/intersection_types.dart:24:13: Context: Possible promotion of t@403
-      if (t is C) {
-            ^^
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart b/pkg/front_end/testcases/nnbd/issue_39286.dart
new file mode 100644
index 0000000..89da27c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+  D? f() => new D();
+  void h() {}
+}
+
+class D {
+  void g() {}
+}
+
+void test(C x) {
+  x..f()!.g()..h();
+}
+
+main() {
+  test(new C());
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.outline.expect
new file mode 100644
index 0000000..acfeb30
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f() → self::D?
+    ;
+  method h() → void
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+  method g() → void
+    ;
+}
+static method test(self::C x) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect
new file mode 100644
index 0000000..108244e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → void {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method g() → void {}
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect
new file mode 100644
index 0000000..108244e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → void {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method g() → void {}
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart b/pkg/front_end/testcases/nnbd/issue_39286_2.dart
new file mode 100644
index 0000000..b241823
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+  int y;
+  D? f() => new D();
+  C h() => this;
+}
+class D {
+  D g() => this;
+  String operator [](String s) { return "!$s!";}
+}
+void test(C x) {
+  x..f()!.g()['Hi!']!..h()!.y = 2;
+}
+main() {
+  test(new C());
+}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.outline.expect
new file mode 100644
index 0000000..f2c2b39
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.outline.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int y;
+  synthetic constructor •() → self::C*
+    ;
+  method f() → self::D?
+    ;
+  method h() → self::C
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+  method g() → self::D
+    ;
+  operator [](core::String s) → core::String
+    ;
+}
+static method test(self::C x) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect
new file mode 100644
index 0000000..37e9149
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int y = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → self::C
+    return this;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method g() → self::D
+    return this;
+  operator [](core::String s) → core::String {
+    return "!${s}!";
+  }
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect
new file mode 100644
index 0000000..37e9149
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int y = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → self::C
+    return this;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method g() → self::D
+    return this;
+  operator [](core::String s) → core::String {
+    return "!${s}!";
+  }
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/late.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/late.dart.type_promotion.expect
deleted file mode 100644
index d8c4180..0000000
--- a/pkg/front_end/testcases/nnbd/late.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/nnbd/late.dart:29:23: Context: Write to lateFinalVariable@862
-    lateFinalVariable = 0;
-                      ^
-pkg/front_end/testcases/nnbd/late.dart:40:31: Context: Write to lateFinalVariableWithInit@1146
-    lateFinalVariableWithInit = 0;
-                              ^
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
index d9dcefa..8e7b90e 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
@@ -15,17 +15,17 @@
 static method main() → dynamic {
   self::Class? c = new self::Class::•();
   c!;
-  c!.{self::Class::field};
-  c!.{self::Class::field} = 42;
-  c!.{self::Class::method};
-  c!.{self::Class::method}();
-  c!.{self::Class::field}!.{core::int::toString}();
-  c!.{self::Class::method}()!.{core::int::toString}();
-  c!.{self::Class::+}(c);
-  c!.{self::Class::+}(c!);
-  c.{self::Class::+}(c!);
-  c.{self::Class::+}(c)!;
+  c{self::Class}!.{self::Class::field};
+  c{self::Class}!.{self::Class::field} = 42;
+  c{self::Class}!.{self::Class::method};
+  c{self::Class}!.{self::Class::method}();
+  c{self::Class}!.{self::Class::field}!.{core::int::toString}();
+  c{self::Class}!.{self::Class::method}()!.{core::int::toString}();
+  c{self::Class}!.{self::Class::+}(c{self::Class});
+  c{self::Class}!.{self::Class::+}(c{self::Class}!);
+  c{self::Class}.{self::Class::+}(c{self::Class}!);
+  c{self::Class}.{self::Class::+}(c{self::Class})!;
   core::bool? o = true;
-  !o! ?{core::bool} !o! : !!o!!;
-  !o! ?{core::bool} (!o)! : (!(!o)!)!;
+  !o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
+  !o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_check.dart.strong.transformed.expect
index d9dcefa..8e7b90e 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.strong.transformed.expect
@@ -15,17 +15,17 @@
 static method main() → dynamic {
   self::Class? c = new self::Class::•();
   c!;
-  c!.{self::Class::field};
-  c!.{self::Class::field} = 42;
-  c!.{self::Class::method};
-  c!.{self::Class::method}();
-  c!.{self::Class::field}!.{core::int::toString}();
-  c!.{self::Class::method}()!.{core::int::toString}();
-  c!.{self::Class::+}(c);
-  c!.{self::Class::+}(c!);
-  c.{self::Class::+}(c!);
-  c.{self::Class::+}(c)!;
+  c{self::Class}!.{self::Class::field};
+  c{self::Class}!.{self::Class::field} = 42;
+  c{self::Class}!.{self::Class::method};
+  c{self::Class}!.{self::Class::method}();
+  c{self::Class}!.{self::Class::field}!.{core::int::toString}();
+  c{self::Class}!.{self::Class::method}()!.{core::int::toString}();
+  c{self::Class}!.{self::Class::+}(c{self::Class});
+  c{self::Class}!.{self::Class::+}(c{self::Class}!);
+  c{self::Class}.{self::Class::+}(c{self::Class}!);
+  c{self::Class}.{self::Class::+}(c{self::Class})!;
   core::bool? o = true;
-  !o! ?{core::bool} !o! : !!o!!;
-  !o! ?{core::bool} (!o)! : (!(!o)!)!;
+  !o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
+  !o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart b/pkg/front_end/testcases/nnbd/null_shorting.dart
index 3f9a93b..681c577 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart
@@ -12,6 +12,8 @@
   }
 
   Class? operator +(int value) => field;
+
+  Class? operator -() => field;
 }
 
 main() {
@@ -29,6 +31,9 @@
 
   c?.field.field;
   c?.field.field = new Class();
+  throws(() => (c?.field).field);
+  throws(() => (c?.field = new Class()).field);
+  throws(() => (c?.method()).field);
   c = c?.field.field = new Class();
   c?.field.method();
   c?.field = new Class().field;
@@ -109,8 +114,8 @@
 }
 
 void operatorAccess(Class? c) {
-  // TODO(johnniwinther): + should _not_ be null-shortened.
-  c?.field + 0;
+  throws(() => c?.field + 0);
+  throws(() => -c?.field);
   c?.field += 0;
   c = c?.field += 0;
   c?.field.field += 0;
@@ -128,3 +133,12 @@
   c = c?.field ??= c;
   c?.field[c] ??= c;
 }
+
+void throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception.';
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.outline.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.outline.expect
index 707d670..4e95ca9d 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.outline.expect
@@ -14,6 +14,8 @@
     ;
   operator +(core::int value) → self::Class?
     ;
+  operator unary-() → self::Class?
+    ;
 }
 static method main() → dynamic
   ;
@@ -25,3 +27,5 @@
   ;
 static method ifNull(self::Class? c) → void
   ;
+static method throws(() → void f) → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
index 45eb1bf..e1af1bb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
@@ -16,6 +16,8 @@
   }
   operator +(core::int value) → self::Class?
     return this.{self::Class::field};
+  operator unary-() → self::Class?
+    return this.{self::Class::field};
 }
 static method main() → dynamic {
   self::propertyAccess(null);
@@ -30,87 +32,100 @@
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : #t4.{self::Class::method}();
   let final self::Class? #t5 = c in #t5.{core::Object::==}(null) ?{self::Class?} null : #t5.{self::Class::field}.{self::Class::field};
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class*} null : #t6.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class*} null : #t7.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : #t8.{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9.{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class?} null : #t10.{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{self::Class*} null : #t11.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class*} null : #t12.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : #t13.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : #t14.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{self::Class?} null : #t15.{self::Class::method}().{self::Class::field};
-  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{self::Class*} null : #t16.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : #t17.{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : #t18.{self::Class::field}.{self::Class::field}.{self::Class::field};
-  let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class*} null : #t19.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : #t20.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t21 = c in #t21.{core::Object::==}(null) ?{self::Class?} null : #t21.{self::Class::field}.{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class?} null : #t22.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
-  c = let final self::Class? #t23 = c in #t23.{core::Object::==}(null) ?{self::Class?} null : #t23.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
-  let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{self::Class*} null : #t24.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : #t25.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : #t26.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
-  c = let final self::Class? #t27 = c in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t28 = c in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::method}().{self::Class::field}.{self::Class::field};
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class*} null : #t29.{self::Class::method}().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : #t30.{self::Class::method}().{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : #t31.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : #t32.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : #t33.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : #t34.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class?} null : #t35.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : #t36.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : #t37.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : #t38.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : #t39.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t40 = c in #t40.{core::Object::==}(null) ?{self::Class*} null : #t40.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t41 = c in #t41.{core::Object::==}(null) ?{self::Class?} null : #t41.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : #t45.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t46 = c in #t46.{core::Object::==}(null) ?{self::Class*} null : #t46.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class?} null : #t47.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t48 = c in #t48.{core::Object::==}(null) ?{self::Class?} null : #t48.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t49 = c in #t49.{core::Object::==}(null) ?{self::Class?} null : #t49.{self::Class::field}.{self::Class::method}().{self::Class::field};
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : #t50.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class*} null : #t51.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t52 = c in #t52.{core::Object::==}(null) ?{self::Class?} null : #t52.{self::Class::field}.{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t53 = c in #t53.{core::Object::==}(null) ?{self::Class?} null : #t53.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
-  c = let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : #t54.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : #t55.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class*} null : #t56.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : #t57.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : #t58.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : #t59.{self::Class::method}().{self::Class::method}().{self::Class::field};
-  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : #t60.{self::Class::method}().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : #t61.{self::Class::method}().{self::Class::method}().{self::Class::method}();
+  self::throws(() → self::Class? => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7.{self::Class::field}).{self::Class::field});
+  self::throws(() → self::Class? => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : #t8.{self::Class::field} = new self::Class::•()).{self::Class::field});
+  self::throws(() → self::Class? => (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9.{self::Class::method}()).{self::Class::field});
+  c = let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : #t10.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{self::Class?} null : #t11.{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : #t12.{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : #t13.{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : #t14.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{self::Class*} null : #t15.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{self::Class?} null : #t16.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : #t17.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : #t18.{self::Class::method}().{self::Class::field};
+  let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class*} null : #t19.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class?} null : #t20.{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t21 = c in #t21.{core::Object::==}(null) ?{self::Class?} null : #t21.{self::Class::field}.{self::Class::field}.{self::Class::field};
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : #t22.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t23 = c in #t23.{core::Object::==}(null) ?{self::Class*} null : #t23.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{self::Class?} null : #t24.{self::Class::field}.{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : #t25.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
+  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : #t26.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
+  let final self::Class? #t27 = c in #t27.{core::Object::==}(null) ?{self::Class*} null : #t27.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t28 = c in #t28.{core::Object::==}(null) ?{self::Class*} null : #t28.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : #t29.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
+  c = let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : #t30.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : #t31.{self::Class::method}().{self::Class::field}.{self::Class::field};
+  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class*} null : #t32.{self::Class::method}().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class?} null : #t33.{self::Class::method}().{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : #t34.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class?} null : #t35.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class*} null : #t36.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class*} null : #t37.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : #t38.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : #t39.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t40 = c in #t40.{core::Object::==}(null) ?{self::Class?} null : #t40.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t41 = c in #t41.{core::Object::==}(null) ?{self::Class?} null : #t41.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : #t42.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class*} null : #t43.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t46 = c in #t46.{core::Object::==}(null) ?{self::Class?} null : #t46.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class?} null : #t47.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t48 = c in #t48.{core::Object::==}(null) ?{self::Class*} null : #t48.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t49 = c in #t49.{core::Object::==}(null) ?{self::Class*} null : #t49.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : #t50.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : #t51.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t52 = c in #t52.{core::Object::==}(null) ?{self::Class?} null : #t52.{self::Class::field}.{self::Class::method}().{self::Class::field};
+  let final self::Class? #t53 = c in #t53.{core::Object::==}(null) ?{self::Class*} null : #t53.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class*} null : #t54.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : #t55.{self::Class::field}.{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : #t56.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
+  c = let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : #t57.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
+  let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class*} null : #t58.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class*} null : #t59.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class?} null : #t60.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
+  c = let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : #t61.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : #t62.{self::Class::method}().{self::Class::method}().{self::Class::field};
+  let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class*} null : #t63.{self::Class::method}().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class?} null : #t64.{self::Class::method}().{self::Class::method}().{self::Class::method}();
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : #t62.{self::Class::field}.{self::Class::[]}(c);
-  let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{void} null : #t63.{self::Class::field}.{self::Class::[]=}(c, new self::Class::•());
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t65 = #t64.{self::Class::field} in let final self::Class? #t66 = c in let final self::Class* #t67 = new self::Class::•() in let final void #t68 = #t65.{self::Class::[]=}(#t66, #t67) in #t67;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : #t69.{self::Class::field}.{self::Class::[]}(c).{self::Class::method}();
-  let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = #t70.{self::Class::field} in let final self::Class? #t72 = c in #t71.{self::Class::[]=}(#t72, #t71.{self::Class::[]}(#t72).{self::Class::+}(0));
-  c = let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t74 = #t73.{self::Class::field} in let final self::Class? #t75 = c in let final self::Class? #t76 = #t74.{self::Class::[]}(#t75).{self::Class::+}(0) in let final void #t77 = #t74.{self::Class::[]=}(#t75, #t76) in #t76;
-  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t79 = #t78.{self::Class::field} in let final self::Class? #t80 = c in #t79.{self::Class::[]=}(#t80, #t79.{self::Class::[]}(#t80).{self::Class::+}(1));
-  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = #t81.{self::Class::field} in let final self::Class? #t83 = c in let final self::Class? #t84 = #t82.{self::Class::[]}(#t83) in let final void #t85 = #t82.{self::Class::[]=}(#t83, #t84.{self::Class::+}(1)) in #t84;
-  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t87 = #t86.{self::Class::field} in let final self::Class? #t88 = c in let final self::Class? #t89 = #t87.{self::Class::[]}(#t88).{self::Class::+}(1) in let final void #t90 = #t87.{self::Class::[]=}(#t88, #t89) in #t89;
-  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t92 = #t91.{self::Class::field} in let final self::Class? #t93 = c in let final self::Class? #t94 = #t92.{self::Class::[]}(#t93).{self::Class::+}(1) in let final void #t95 = #t92.{self::Class::[]=}(#t93, #t94) in #t94;
+  let final self::Class? #t65 = c in #t65.{core::Object::==}(null) ?{self::Class?} null : #t65.{self::Class::field}.{self::Class::[]}(c);
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : #t66.{self::Class::field}.{self::Class::[]=}(c, new self::Class::•());
+  c = let final self::Class? #t67 = c in #t67.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t68 = #t67.{self::Class::field} in let final self::Class? #t69 = c in let final self::Class* #t70 = new self::Class::•() in let final void #t71 = #t68.{self::Class::[]=}(#t69, #t70) in #t70;
+  let final self::Class? #t72 = c in #t72.{core::Object::==}(null) ?{self::Class?} null : #t72.{self::Class::field}.{self::Class::[]}(c).{self::Class::method}();
+  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t74 = #t73.{self::Class::field} in let final self::Class? #t75 = c in #t74.{self::Class::[]=}(#t75, #t74.{self::Class::[]}(#t75).{self::Class::+}(0));
+  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = #t76.{self::Class::field} in let final self::Class? #t78 = c in let final self::Class? #t79 = #t77.{self::Class::[]}(#t78).{self::Class::+}(0) in let final void #t80 = #t77.{self::Class::[]=}(#t78, #t79) in #t79;
+  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = #t81.{self::Class::field} in let final self::Class? #t83 = c in #t82.{self::Class::[]=}(#t83, #t82.{self::Class::[]}(#t83).{self::Class::+}(1));
+  c = let final self::Class? #t84 = c in #t84.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t85 = #t84.{self::Class::field} in let final self::Class? #t86 = c in let final self::Class? #t87 = #t85.{self::Class::[]}(#t86) in let final void #t88 = #t85.{self::Class::[]=}(#t86, #t87.{self::Class::+}(1)) in #t87;
+  let final self::Class? #t89 = c in #t89.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t90 = #t89.{self::Class::field} in let final self::Class? #t91 = c in let final self::Class? #t92 = #t90.{self::Class::[]}(#t91).{self::Class::+}(1) in let final void #t93 = #t90.{self::Class::[]=}(#t91, #t92) in #t92;
+  c = let final self::Class? #t94 = c in #t94.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t95 = #t94.{self::Class::field} in let final self::Class? #t96 = c in let final self::Class? #t97 = #t95.{self::Class::[]}(#t96).{self::Class::+}(1) in let final void #t98 = #t95.{self::Class::[]=}(#t96, #t97) in #t97;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : #t96.{self::Class::field}.{self::Class::+}(0);
-  let final self::Class? #t97 = c in #t97.{core::Object::==}(null) ?{self::Class?} null : #t97.{self::Class::field} = #t97.{self::Class::field}.{self::Class::+}(0);
-  c = let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t99 = #t98.{self::Class::field}.{self::Class::+}(0) in let final void #t100 = #t98.{self::Class::field} = #t99 in #t99;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = #t101.{self::Class::field} in #t102.{self::Class::field} = #t102.{self::Class::field}.{self::Class::+}(0);
-  c = let final self::Class? #t103 = c in #t103.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t104 = #t103.{self::Class::field} in #t104.{self::Class::field} = #t104.{self::Class::field}.{self::Class::+}(0);
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class?} null : #t105.{self::Class::field} = #t105.{self::Class::field}.{self::Class::+}(1);
-  c = let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t107 = #t106.{self::Class::field} in let final void #t108 = #t106.{self::Class::field} = #t107.{self::Class::+}(1) in #t107;
-  let final self::Class? #t109 = c in #t109.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t110 = #t109.{self::Class::field}.{self::Class::+}(1) in let final void #t111 = #t109.{self::Class::field} = #t110 in #t110;
-  c = let final self::Class? #t112 = c in #t112.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t113 = #t112.{self::Class::field}.{self::Class::+}(1) in let final void #t114 = #t112.{self::Class::field} = #t113 in #t113;
+  self::throws(() → self::Class? => (let final self::Class? #t99 = c in #t99.{core::Object::==}(null) ?{self::Class?} null : #t99.{self::Class::field}).{self::Class::+}(0));
+  self::throws(() → self::Class? => (let final self::Class? #t100 = c in #t100.{core::Object::==}(null) ?{self::Class?} null : #t100.{self::Class::field}).{self::Class::unary-}());
+  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : #t101.{self::Class::field} = #t101.{self::Class::field}.{self::Class::+}(0);
+  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = #t102.{self::Class::field}.{self::Class::+}(0) in let final void #t104 = #t102.{self::Class::field} = #t103 in #t103;
+  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t106 = #t105.{self::Class::field} in #t106.{self::Class::field} = #t106.{self::Class::field}.{self::Class::+}(0);
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = #t107.{self::Class::field} in #t108.{self::Class::field} = #t108.{self::Class::field}.{self::Class::+}(0);
+  let final self::Class? #t109 = c in #t109.{core::Object::==}(null) ?{self::Class?} null : #t109.{self::Class::field} = #t109.{self::Class::field}.{self::Class::+}(1);
+  c = let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t111 = #t110.{self::Class::field} in let final void #t112 = #t110.{self::Class::field} = #t111.{self::Class::+}(1) in #t111;
+  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t114 = #t113.{self::Class::field}.{self::Class::+}(1) in let final void #t115 = #t113.{self::Class::field} = #t114 in #t114;
+  c = let final self::Class? #t116 = c in #t116.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t117 = #t116.{self::Class::field}.{self::Class::+}(1) in let final void #t118 = #t116.{self::Class::field} = #t117 in #t117;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t115 = c in #t115.{core::Object::==}(null) ?{self::Class?} null : #t115.{self::Class::field}.{core::Object::==}(null) ?{self::Class?} #t115.{self::Class::field} = c : null;
-  c = let final self::Class? #t116 = c in #t116.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t117 = #t116.{self::Class::field} in #t117.{core::Object::==}(null) ?{self::Class?} #t116.{self::Class::field} = c : #t117;
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t119 = #t118.{self::Class::field} in let final self::Class? #t120 = c in #t119.{self::Class::[]}(#t120).{core::Object::==}(null) ?{self::Class?} #t119.{self::Class::[]=}(#t120, c) : null;
+  let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : #t119.{self::Class::field}.{core::Object::==}(null) ?{self::Class?} #t119.{self::Class::field} = c : null;
+  c = let final self::Class? #t120 = c in #t120.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t121 = #t120.{self::Class::field} in #t121.{core::Object::==}(null) ?{self::Class?} #t120.{self::Class::field} = c : #t121;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t123 = #t122.{self::Class::field} in let final self::Class? #t124 = c in #t123.{self::Class::[]}(#t124).{core::Object::==}(null) ?{self::Class?} #t123.{self::Class::[]=}(#t124, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
index 45eb1bf..e1af1bb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
@@ -16,6 +16,8 @@
   }
   operator +(core::int value) → self::Class?
     return this.{self::Class::field};
+  operator unary-() → self::Class?
+    return this.{self::Class::field};
 }
 static method main() → dynamic {
   self::propertyAccess(null);
@@ -30,87 +32,100 @@
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : #t4.{self::Class::method}();
   let final self::Class? #t5 = c in #t5.{core::Object::==}(null) ?{self::Class?} null : #t5.{self::Class::field}.{self::Class::field};
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class*} null : #t6.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class*} null : #t7.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : #t8.{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9.{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class?} null : #t10.{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{self::Class*} null : #t11.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class*} null : #t12.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : #t13.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : #t14.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{self::Class?} null : #t15.{self::Class::method}().{self::Class::field};
-  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{self::Class*} null : #t16.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : #t17.{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : #t18.{self::Class::field}.{self::Class::field}.{self::Class::field};
-  let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class*} null : #t19.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : #t20.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t21 = c in #t21.{core::Object::==}(null) ?{self::Class?} null : #t21.{self::Class::field}.{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class?} null : #t22.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
-  c = let final self::Class? #t23 = c in #t23.{core::Object::==}(null) ?{self::Class?} null : #t23.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
-  let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{self::Class*} null : #t24.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : #t25.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : #t26.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
-  c = let final self::Class? #t27 = c in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t28 = c in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::method}().{self::Class::field}.{self::Class::field};
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class*} null : #t29.{self::Class::method}().{self::Class::field}.{self::Class::field} = new self::Class::•();
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : #t30.{self::Class::method}().{self::Class::field}.{self::Class::method}();
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : #t31.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : #t32.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : #t33.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : #t34.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class?} null : #t35.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : #t36.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : #t37.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : #t38.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : #t39.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t40 = c in #t40.{core::Object::==}(null) ?{self::Class*} null : #t40.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t41 = c in #t41.{core::Object::==}(null) ?{self::Class?} null : #t41.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
-  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
-  let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : #t45.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t46 = c in #t46.{core::Object::==}(null) ?{self::Class*} null : #t46.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class?} null : #t47.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  c = let final self::Class? #t48 = c in #t48.{core::Object::==}(null) ?{self::Class?} null : #t48.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
-  let final self::Class? #t49 = c in #t49.{core::Object::==}(null) ?{self::Class?} null : #t49.{self::Class::field}.{self::Class::method}().{self::Class::field};
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : #t50.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class*} null : #t51.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t52 = c in #t52.{core::Object::==}(null) ?{self::Class?} null : #t52.{self::Class::field}.{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t53 = c in #t53.{core::Object::==}(null) ?{self::Class?} null : #t53.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
-  c = let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : #t54.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : #t55.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class*} null : #t56.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : #t57.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : #t58.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
-  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : #t59.{self::Class::method}().{self::Class::method}().{self::Class::field};
-  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : #t60.{self::Class::method}().{self::Class::method}().{self::Class::field} = new self::Class::•();
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : #t61.{self::Class::method}().{self::Class::method}().{self::Class::method}();
+  self::throws(() → self::Class? => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7.{self::Class::field}).{self::Class::field});
+  self::throws(() → self::Class? => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : #t8.{self::Class::field} = new self::Class::•()).{self::Class::field});
+  self::throws(() → self::Class? => (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9.{self::Class::method}()).{self::Class::field});
+  c = let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : #t10.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{self::Class?} null : #t11.{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : #t12.{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : #t13.{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : #t14.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{self::Class*} null : #t15.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{self::Class?} null : #t16.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : #t17.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : #t18.{self::Class::method}().{self::Class::field};
+  let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class*} null : #t19.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class?} null : #t20.{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t21 = c in #t21.{core::Object::==}(null) ?{self::Class?} null : #t21.{self::Class::field}.{self::Class::field}.{self::Class::field};
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : #t22.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t23 = c in #t23.{core::Object::==}(null) ?{self::Class*} null : #t23.{self::Class::field}.{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{self::Class?} null : #t24.{self::Class::field}.{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : #t25.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
+  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : #t26.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field};
+  let final self::Class? #t27 = c in #t27.{core::Object::==}(null) ?{self::Class*} null : #t27.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t28 = c in #t28.{core::Object::==}(null) ?{self::Class*} null : #t28.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : #t29.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
+  c = let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : #t30.{self::Class::field} = new self::Class::•().{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : #t31.{self::Class::method}().{self::Class::field}.{self::Class::field};
+  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class*} null : #t32.{self::Class::method}().{self::Class::field}.{self::Class::field} = new self::Class::•();
+  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class?} null : #t33.{self::Class::method}().{self::Class::field}.{self::Class::method}();
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : #t34.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class?} null : #t35.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class*} null : #t36.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class*} null : #t37.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : #t38.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : #t39.{self::Class::field}.{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t40 = c in #t40.{core::Object::==}(null) ?{self::Class?} null : #t40.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t41 = c in #t41.{core::Object::==}(null) ?{self::Class?} null : #t41.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : #t42.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class*} null : #t43.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t46 = c in #t46.{core::Object::==}(null) ?{self::Class?} null : #t46.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
+  c = let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class?} null : #t47.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field};
+  let final self::Class? #t48 = c in #t48.{core::Object::==}(null) ?{self::Class*} null : #t48.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t49 = c in #t49.{core::Object::==}(null) ?{self::Class*} null : #t49.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : #t50.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : #t51.{self::Class::method}().{self::Class::field} = new self::Class::•().{self::Class::method}();
+  let final self::Class? #t52 = c in #t52.{core::Object::==}(null) ?{self::Class?} null : #t52.{self::Class::field}.{self::Class::method}().{self::Class::field};
+  let final self::Class? #t53 = c in #t53.{core::Object::==}(null) ?{self::Class*} null : #t53.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class*} null : #t54.{self::Class::field}.{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : #t55.{self::Class::field}.{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : #t56.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
+  c = let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : #t57.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field};
+  let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class*} null : #t58.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  c = let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class*} null : #t59.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class?} null : #t60.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
+  c = let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : #t61.{self::Class::field} = new self::Class::•().{self::Class::method}().{self::Class::method}();
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : #t62.{self::Class::method}().{self::Class::method}().{self::Class::field};
+  let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class*} null : #t63.{self::Class::method}().{self::Class::method}().{self::Class::field} = new self::Class::•();
+  let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class?} null : #t64.{self::Class::method}().{self::Class::method}().{self::Class::method}();
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : #t62.{self::Class::field}.{self::Class::[]}(c);
-  let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{void} null : #t63.{self::Class::field}.{self::Class::[]=}(c, new self::Class::•());
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t65 = #t64.{self::Class::field} in let final self::Class? #t66 = c in let final self::Class* #t67 = new self::Class::•() in let final void #t68 = #t65.{self::Class::[]=}(#t66, #t67) in #t67;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : #t69.{self::Class::field}.{self::Class::[]}(c).{self::Class::method}();
-  let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = #t70.{self::Class::field} in let final self::Class? #t72 = c in #t71.{self::Class::[]=}(#t72, #t71.{self::Class::[]}(#t72).{self::Class::+}(0));
-  c = let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t74 = #t73.{self::Class::field} in let final self::Class? #t75 = c in let final self::Class? #t76 = #t74.{self::Class::[]}(#t75).{self::Class::+}(0) in let final void #t77 = #t74.{self::Class::[]=}(#t75, #t76) in #t76;
-  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t79 = #t78.{self::Class::field} in let final self::Class? #t80 = c in #t79.{self::Class::[]=}(#t80, #t79.{self::Class::[]}(#t80).{self::Class::+}(1));
-  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = #t81.{self::Class::field} in let final self::Class? #t83 = c in let final self::Class? #t84 = #t82.{self::Class::[]}(#t83) in let final void #t85 = #t82.{self::Class::[]=}(#t83, #t84.{self::Class::+}(1)) in #t84;
-  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t87 = #t86.{self::Class::field} in let final self::Class? #t88 = c in let final self::Class? #t89 = #t87.{self::Class::[]}(#t88).{self::Class::+}(1) in let final void #t90 = #t87.{self::Class::[]=}(#t88, #t89) in #t89;
-  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t92 = #t91.{self::Class::field} in let final self::Class? #t93 = c in let final self::Class? #t94 = #t92.{self::Class::[]}(#t93).{self::Class::+}(1) in let final void #t95 = #t92.{self::Class::[]=}(#t93, #t94) in #t94;
+  let final self::Class? #t65 = c in #t65.{core::Object::==}(null) ?{self::Class?} null : #t65.{self::Class::field}.{self::Class::[]}(c);
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : #t66.{self::Class::field}.{self::Class::[]=}(c, new self::Class::•());
+  c = let final self::Class? #t67 = c in #t67.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t68 = #t67.{self::Class::field} in let final self::Class? #t69 = c in let final self::Class* #t70 = new self::Class::•() in let final void #t71 = #t68.{self::Class::[]=}(#t69, #t70) in #t70;
+  let final self::Class? #t72 = c in #t72.{core::Object::==}(null) ?{self::Class?} null : #t72.{self::Class::field}.{self::Class::[]}(c).{self::Class::method}();
+  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t74 = #t73.{self::Class::field} in let final self::Class? #t75 = c in #t74.{self::Class::[]=}(#t75, #t74.{self::Class::[]}(#t75).{self::Class::+}(0));
+  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = #t76.{self::Class::field} in let final self::Class? #t78 = c in let final self::Class? #t79 = #t77.{self::Class::[]}(#t78).{self::Class::+}(0) in let final void #t80 = #t77.{self::Class::[]=}(#t78, #t79) in #t79;
+  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = #t81.{self::Class::field} in let final self::Class? #t83 = c in #t82.{self::Class::[]=}(#t83, #t82.{self::Class::[]}(#t83).{self::Class::+}(1));
+  c = let final self::Class? #t84 = c in #t84.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t85 = #t84.{self::Class::field} in let final self::Class? #t86 = c in let final self::Class? #t87 = #t85.{self::Class::[]}(#t86) in let final void #t88 = #t85.{self::Class::[]=}(#t86, #t87.{self::Class::+}(1)) in #t87;
+  let final self::Class? #t89 = c in #t89.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t90 = #t89.{self::Class::field} in let final self::Class? #t91 = c in let final self::Class? #t92 = #t90.{self::Class::[]}(#t91).{self::Class::+}(1) in let final void #t93 = #t90.{self::Class::[]=}(#t91, #t92) in #t92;
+  c = let final self::Class? #t94 = c in #t94.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t95 = #t94.{self::Class::field} in let final self::Class? #t96 = c in let final self::Class? #t97 = #t95.{self::Class::[]}(#t96).{self::Class::+}(1) in let final void #t98 = #t95.{self::Class::[]=}(#t96, #t97) in #t97;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : #t96.{self::Class::field}.{self::Class::+}(0);
-  let final self::Class? #t97 = c in #t97.{core::Object::==}(null) ?{self::Class?} null : #t97.{self::Class::field} = #t97.{self::Class::field}.{self::Class::+}(0);
-  c = let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t99 = #t98.{self::Class::field}.{self::Class::+}(0) in let final void #t100 = #t98.{self::Class::field} = #t99 in #t99;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = #t101.{self::Class::field} in #t102.{self::Class::field} = #t102.{self::Class::field}.{self::Class::+}(0);
-  c = let final self::Class? #t103 = c in #t103.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t104 = #t103.{self::Class::field} in #t104.{self::Class::field} = #t104.{self::Class::field}.{self::Class::+}(0);
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class?} null : #t105.{self::Class::field} = #t105.{self::Class::field}.{self::Class::+}(1);
-  c = let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t107 = #t106.{self::Class::field} in let final void #t108 = #t106.{self::Class::field} = #t107.{self::Class::+}(1) in #t107;
-  let final self::Class? #t109 = c in #t109.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t110 = #t109.{self::Class::field}.{self::Class::+}(1) in let final void #t111 = #t109.{self::Class::field} = #t110 in #t110;
-  c = let final self::Class? #t112 = c in #t112.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t113 = #t112.{self::Class::field}.{self::Class::+}(1) in let final void #t114 = #t112.{self::Class::field} = #t113 in #t113;
+  self::throws(() → self::Class? => (let final self::Class? #t99 = c in #t99.{core::Object::==}(null) ?{self::Class?} null : #t99.{self::Class::field}).{self::Class::+}(0));
+  self::throws(() → self::Class? => (let final self::Class? #t100 = c in #t100.{core::Object::==}(null) ?{self::Class?} null : #t100.{self::Class::field}).{self::Class::unary-}());
+  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : #t101.{self::Class::field} = #t101.{self::Class::field}.{self::Class::+}(0);
+  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = #t102.{self::Class::field}.{self::Class::+}(0) in let final void #t104 = #t102.{self::Class::field} = #t103 in #t103;
+  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t106 = #t105.{self::Class::field} in #t106.{self::Class::field} = #t106.{self::Class::field}.{self::Class::+}(0);
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = #t107.{self::Class::field} in #t108.{self::Class::field} = #t108.{self::Class::field}.{self::Class::+}(0);
+  let final self::Class? #t109 = c in #t109.{core::Object::==}(null) ?{self::Class?} null : #t109.{self::Class::field} = #t109.{self::Class::field}.{self::Class::+}(1);
+  c = let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t111 = #t110.{self::Class::field} in let final void #t112 = #t110.{self::Class::field} = #t111.{self::Class::+}(1) in #t111;
+  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t114 = #t113.{self::Class::field}.{self::Class::+}(1) in let final void #t115 = #t113.{self::Class::field} = #t114 in #t114;
+  c = let final self::Class? #t116 = c in #t116.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t117 = #t116.{self::Class::field}.{self::Class::+}(1) in let final void #t118 = #t116.{self::Class::field} = #t117 in #t117;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t115 = c in #t115.{core::Object::==}(null) ?{self::Class?} null : #t115.{self::Class::field}.{core::Object::==}(null) ?{self::Class?} #t115.{self::Class::field} = c : null;
-  c = let final self::Class? #t116 = c in #t116.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t117 = #t116.{self::Class::field} in #t117.{core::Object::==}(null) ?{self::Class?} #t116.{self::Class::field} = c : #t117;
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t119 = #t118.{self::Class::field} in let final self::Class? #t120 = c in #t119.{self::Class::[]}(#t120).{core::Object::==}(null) ?{self::Class?} #t119.{self::Class::[]=}(#t120, c) : null;
+  let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : #t119.{self::Class::field}.{core::Object::==}(null) ?{self::Class?} #t119.{self::Class::field} = c : null;
+  c = let final self::Class? #t120 = c in #t120.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t121 = #t120.{self::Class::field} in #t121.{core::Object::==}(null) ?{self::Class?} #t120.{self::Class::field} = c : #t121;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t123 = #t122.{self::Class::field} in let final self::Class? #t124 = c in #t123.{self::Class::[]}(#t124).{core::Object::==}(null) ?{self::Class?} #t123.{self::Class::[]=}(#t124, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.type_promotion.expect
deleted file mode 100644
index 20c93f0..0000000
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.type_promotion.expect
+++ /dev/null
@@ -1,93 +0,0 @@
-pkg/front_end/testcases/nnbd/null_shorting.dart:27:5: Context: Write to c@558
-  c = c?.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:32:5: Context: Write to c@558
-  c = c?.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:35:5: Context: Write to c@558
-  c = c?.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:37:5: Context: Write to c@558
-  c = c?.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:39:5: Context: Write to c@558
-  c = c?.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:46:5: Context: Write to c@558
-  c = c?.field.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:49:5: Context: Write to c@558
-  c = c?.field = new Class().field.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:51:5: Context: Write to c@558
-  c = c?.field = new Class().field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:53:5: Context: Write to c@558
-  c = c?.field = new Class().field.method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:59:5: Context: Write to c@558
-  c = c?.field.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:61:5: Context: Write to c@558
-  c = c?.field.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:63:5: Context: Write to c@558
-  c = c?.field.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:65:5: Context: Write to c@558
-  c = c?.field = new Class().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:67:5: Context: Write to c@558
-  c = c?.field = new Class().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:69:5: Context: Write to c@558
-  c = c?.field = new Class().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:71:5: Context: Write to c@558
-  c = c?.method().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:73:5: Context: Write to c@558
-  c = c?.method().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:75:5: Context: Write to c@558
-  c = c?.method().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:79:5: Context: Write to c@558
-  c = c?.field.method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:82:5: Context: Write to c@558
-  c = c?.field = new Class().method().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:84:5: Context: Write to c@558
-  c = c?.field = new Class().method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:86:5: Context: Write to c@558
-  c = c?.field = new Class().method().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:99:5: Context: Write to c@558
-  c = c?.field[c] = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:102:5: Context: Write to c@558
-  c = c?.field[c] += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:106:5: Context: Write to c@558
-  c = c?.field[c]++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:108:5: Context: Write to c@558
-  c = ++c?.field[c];
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:115:5: Context: Write to c@558
-  c = c?.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:117:5: Context: Write to c@558
-  c = c?.field.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:121:5: Context: Write to c@558
-  c = c?.field++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:123:5: Context: Write to c@558
-  c = ++c?.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting.dart:128:5: Context: Write to c@558
-  c = c?.field ??= c;
-    ^
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart
index 78ec83e..68821f8 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart
@@ -20,6 +20,8 @@
   }
 
   Class? operator +(int value) => field;
+
+  Class? operator -() => field;
 }
 
 main() {
@@ -37,6 +39,9 @@
 
   Extension(c)?.field.field;
   Extension(c)?.field.field = new Class();
+  throws(() => (Extension(c)?.field).field);
+  throws(() => (Extension(c)?.field = new Class()).field);
+  throws(() => (Extension(c)?.method()).field);
   c = Extension(c)?.field.field = new Class();
   Extension(c)?.field.method();
   Extension(c)?.field = new Class().field;
@@ -117,8 +122,8 @@
 }
 
 void operatorAccess(Class? c) {
-  // TODO(johnniwinther): + should _not_ be null-shortened.
-  Extension(c)?.field + 0;
+  throws(() => Extension(c)?.field + 0);
+  throws(() => -Extension(c)?.field);
   Extension(c)?.field += 0;
   c = Extension(c)?.field += 0;
   Extension(c)?.field.field += 0;
@@ -136,3 +141,12 @@
   c = Extension(c)?.field ??= c;
   Extension(c)?.field[c] ??= c;
 }
+
+void throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception.';
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.outline.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.outline.expect
index b39c0d9..8a55652 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.outline.expect
@@ -14,6 +14,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -30,6 +31,8 @@
   ;
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   ;
+static method Extension|unary-(final self::Class #this) → self::Class?
+  ;
 static method main() → dynamic
   ;
 static method propertyAccess(self::Class? c) → void
@@ -40,3 +43,5 @@
   ;
 static method ifNull(self::Class? c) → void
   ;
+static method throws(() → void f) → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
index d579764..a988b01 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
@@ -15,6 +15,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -33,6 +34,8 @@
 }
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   return self::Extension|get#field(#this);
+static method Extension|unary-(final self::Class #this) → self::Class?
+  return self::Extension|get#field(#this);
 static method main() → dynamic {
   self::propertyAccess(null);
   self::indexAccess(null);
@@ -46,87 +49,100 @@
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t6);
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(#t7));
   let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t8), new self::Class::•());
-  c = let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t10 = new self::Class::•() in let final void #t11 = self::Extension|set#field(self::Extension|get#field(#t9), #t10) in #t10;
-  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t12));
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t13, self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t15 = self::Extension|get#field(new self::Class::•()) in let final void #t16 = self::Extension|set#field(#t14, #t15) in #t15;
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t17, let final self::Class* #t18 = new self::Class::•() in let final void #t19 = self::Extension|set#field(new self::Class::•(), #t18) in #t18);
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t21 = let final self::Class* #t22 = new self::Class::•() in let final void #t23 = self::Extension|set#field(new self::Class::•(), #t22) in #t22 in let final void #t24 = self::Extension|set#field(#t20, #t21) in #t21;
-  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t25, self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t27 = self::Extension|method(new self::Class::•()) in let final void #t28 = self::Extension|set#field(#t26, #t27) in #t27;
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t29));
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t30), new self::Class::•());
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t31));
-  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t32)));
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t33)), new self::Class::•());
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t34)), #t35) in #t35;
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t37)));
-  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t38, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t40 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
-  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t43) in #t43);
-  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t50, self::Extension|method(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t52 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
-  let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t54)));
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t55)), new self::Class::•());
-  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t56)));
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t57), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t59 = self::Extension|get#field(new self::Class::•()) in let final void #t60 = self::Extension|set#field(self::Extension|get#field(#t58), #t59) in #t59;
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t61), let final self::Class* #t62 = new self::Class::•() in let final void #t63 = self::Extension|set#field(new self::Class::•(), #t62) in #t62);
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t65 = let final self::Class* #t66 = new self::Class::•() in let final void #t67 = self::Extension|set#field(new self::Class::•(), #t66) in #t66 in let final void #t68 = self::Extension|set#field(self::Extension|get#field(#t64), #t65) in #t65;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t69), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = self::Extension|method(new self::Class::•()) in let final void #t72 = self::Extension|set#field(self::Extension|get#field(#t70), #t71) in #t71;
-  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t73, let final self::Class? #t74 = self::Extension|get#field(new self::Class::•()) in let final void #t75 = self::Extension|set#field(new self::Class::•(), #t74) in #t74);
-  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = let final self::Class? #t78 = self::Extension|get#field(new self::Class::•()) in let final void #t79 = self::Extension|set#field(new self::Class::•(), #t78) in #t78 in let final void #t80 = self::Extension|set#field(#t76, #t77) in #t77;
-  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t81, let final self::Class* #t82 = let final self::Class* #t83 = new self::Class::•() in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(new self::Class::•(), #t82) in #t82);
-  c = let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t87 = let final self::Class* #t88 = let final self::Class* #t89 = new self::Class::•() in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t89) in #t89 in let final void #t91 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t92 = self::Extension|set#field(#t86, #t87) in #t87;
-  let final self::Class? #t93 = c in #t93.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t93, let final self::Class? #t94 = self::Extension|method(new self::Class::•()) in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94);
-  c = let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t97 = let final self::Class? #t98 = self::Extension|method(new self::Class::•()) in let final void #t99 = self::Extension|set#field(new self::Class::•(), #t98) in #t98 in let final void #t100 = self::Extension|set#field(#t96, #t97) in #t97;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t101), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = self::Extension|get#field(new self::Class::•()) in let final void #t104 = self::Extension|set#field(self::Extension|method(#t102), #t103) in #t103;
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t105), let final self::Class* #t106 = new self::Class::•() in let final void #t107 = self::Extension|set#field(new self::Class::•(), #t106) in #t106);
-  c = let final self::Class? #t108 = c in #t108.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t109 = let final self::Class* #t110 = new self::Class::•() in let final void #t111 = self::Extension|set#field(new self::Class::•(), #t110) in #t110 in let final void #t112 = self::Extension|set#field(self::Extension|method(#t108), #t109) in #t109;
-  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t113), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t114 = c in #t114.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t115 = self::Extension|method(new self::Class::•()) in let final void #t116 = self::Extension|set#field(self::Extension|method(#t114), #t115) in #t115;
-  let final self::Class? #t117 = c in #t117.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t117)));
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t118)), new self::Class::•());
-  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t119)), #t120) in #t120;
-  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t122)));
-  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t123, self::Extension|get#field(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t125 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t126 = self::Extension|set#field(#t124, #t125) in #t125;
-  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t127, let final self::Class* #t128 = new self::Class::•() in let final void #t129 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t128) in #t128);
-  c = let final self::Class? #t130 = c in #t130.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t131 = let final self::Class* #t132 = new self::Class::•() in let final void #t133 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t132) in #t132 in let final void #t134 = self::Extension|set#field(#t130, #t131) in #t131;
-  let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t135, self::Extension|method(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t136 = c in #t136.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t137 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t138 = self::Extension|set#field(#t136, #t137) in #t137;
-  let final self::Class? #t139 = c in #t139.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t139)));
-  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t140)), new self::Class::•());
-  let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t141)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t9)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t11 = new self::Class::•() in let final void #t12 = self::Extension|set#field(#t10, #t11) in #t11));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t13)));
+  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t15 = new self::Class::•() in let final void #t16 = self::Extension|set#field(self::Extension|get#field(#t14), #t15) in #t15;
+  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t17));
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t18, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t20 = self::Extension|get#field(new self::Class::•()) in let final void #t21 = self::Extension|set#field(#t19, #t20) in #t20;
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t22, let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(new self::Class::•(), #t23) in #t23);
+  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t26 = let final self::Class* #t27 = new self::Class::•() in let final void #t28 = self::Extension|set#field(new self::Class::•(), #t27) in #t27 in let final void #t29 = self::Extension|set#field(#t25, #t26) in #t26;
+  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t30, self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t32 = self::Extension|method(new self::Class::•()) in let final void #t33 = self::Extension|set#field(#t31, #t32) in #t32;
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t34));
+  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t35), new self::Class::•());
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t36));
+  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t37)));
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t38)), new self::Class::•());
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t40 = new self::Class::•() in let final void #t41 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t39)), #t40) in #t40;
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t42)));
+  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t43, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t45 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t46 = self::Extension|set#field(#t44, #t45) in #t45;
+  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t47, let final self::Class* #t48 = new self::Class::•() in let final void #t49 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t48) in #t48);
+  c = let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t51 = let final self::Class* #t52 = new self::Class::•() in let final void #t53 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t52) in #t52 in let final void #t54 = self::Extension|set#field(#t50, #t51) in #t51;
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t55, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t57 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t58 = self::Extension|set#field(#t56, #t57) in #t57;
+  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t59)));
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t60)), new self::Class::•());
+  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t61)));
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t62), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t64 = self::Extension|get#field(new self::Class::•()) in let final void #t65 = self::Extension|set#field(self::Extension|get#field(#t63), #t64) in #t64;
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t66), let final self::Class* #t67 = new self::Class::•() in let final void #t68 = self::Extension|set#field(new self::Class::•(), #t67) in #t67);
+  c = let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t70 = let final self::Class* #t71 = new self::Class::•() in let final void #t72 = self::Extension|set#field(new self::Class::•(), #t71) in #t71 in let final void #t73 = self::Extension|set#field(self::Extension|get#field(#t69), #t70) in #t70;
+  let final self::Class? #t74 = c in #t74.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t74), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t75 = c in #t75.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t76 = self::Extension|method(new self::Class::•()) in let final void #t77 = self::Extension|set#field(self::Extension|get#field(#t75), #t76) in #t76;
+  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t78, let final self::Class? #t79 = self::Extension|get#field(new self::Class::•()) in let final void #t80 = self::Extension|set#field(new self::Class::•(), #t79) in #t79);
+  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = let final self::Class? #t83 = self::Extension|get#field(new self::Class::•()) in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(#t81, #t82) in #t82;
+  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t86, let final self::Class* #t87 = let final self::Class* #t88 = new self::Class::•() in let final void #t89 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t87) in #t87);
+  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t92 = let final self::Class* #t93 = let final self::Class* #t94 = new self::Class::•() in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94 in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t93) in #t93 in let final void #t97 = self::Extension|set#field(#t91, #t92) in #t92;
+  let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t98, let final self::Class? #t99 = self::Extension|method(new self::Class::•()) in let final void #t100 = self::Extension|set#field(new self::Class::•(), #t99) in #t99);
+  c = let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = let final self::Class? #t103 = self::Extension|method(new self::Class::•()) in let final void #t104 = self::Extension|set#field(new self::Class::•(), #t103) in #t103 in let final void #t105 = self::Extension|set#field(#t101, #t102) in #t102;
+  let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t106), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = self::Extension|get#field(new self::Class::•()) in let final void #t109 = self::Extension|set#field(self::Extension|method(#t107), #t108) in #t108;
+  let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t110), let final self::Class* #t111 = new self::Class::•() in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = new self::Class::•() in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(self::Extension|method(#t113), #t114) in #t114;
+  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t118), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t120 = self::Extension|method(new self::Class::•()) in let final void #t121 = self::Extension|set#field(self::Extension|method(#t119), #t120) in #t120;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t122)));
+  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t123)), new self::Class::•());
+  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t125 = new self::Class::•() in let final void #t126 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t124)), #t125) in #t125;
+  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t127)));
+  let final self::Class? #t128 = c in #t128.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t128, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t129 = c in #t129.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t130 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t131 = self::Extension|set#field(#t129, #t130) in #t130;
+  let final self::Class? #t132 = c in #t132.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t132, let final self::Class* #t133 = new self::Class::•() in let final void #t134 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t133) in #t133);
+  c = let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t136 = let final self::Class* #t137 = new self::Class::•() in let final void #t138 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t137) in #t137 in let final void #t139 = self::Extension|set#field(#t135, #t136) in #t136;
+  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t140, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t142 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t143 = self::Extension|set#field(#t141, #t142) in #t142;
+  let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t144)));
+  let final self::Class? #t145 = c in #t145.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t145)), new self::Class::•());
+  let final self::Class? #t146 = c in #t146.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t146)));
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t142 = c in #t142.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t142), c);
-  let final self::Class? #t143 = c in #t143.{core::Object::==}(null) ?{void} null : self::Extension|[]=(self::Extension|get#field(#t143), c, new self::Class::•());
-  c = let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t145 = self::Extension|get#field(#t144) in let final self::Class? #t146 = c in let final self::Class* #t147 = new self::Class::•() in let final void #t148 = self::Extension|[]=(#t145, #t146, #t147) in #t147;
-  let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t149), c));
-  let final self::Class? #t150 = c in #t150.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t151 = self::Extension|get#field(#t150) in let final self::Class? #t152 = c in self::Extension|[]=(#t151, #t152, self::Extension|+(self::Extension|[](#t151, #t152), 0));
-  c = let final self::Class? #t153 = c in #t153.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t154 = self::Extension|get#field(#t153) in let final self::Class? #t155 = c in let final self::Class? #t156 = self::Extension|+(self::Extension|[](#t154, #t155), 0) in let final void #t157 = self::Extension|[]=(#t154, #t155, #t156) in #t156;
-  let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in self::Extension|[]=(#t159, #t160, self::Extension|+(self::Extension|[](#t159, #t160), 1));
-  c = let final self::Class? #t161 = c in #t161.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t162 = self::Extension|get#field(#t161) in let final self::Class? #t163 = c in let final self::Class? #t164 = self::Extension|[](#t162, #t163) in let final void #t165 = self::Extension|[]=(#t162, #t163, self::Extension|+(#t164, 1)) in #t164;
-  let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|+(self::Extension|[](#t167, #t168), 1) in let final void #t170 = self::Extension|[]=(#t167, #t168, #t169) in #t169;
-  c = let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  let final self::Class? #t147 = c in #t147.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t147), c);
+  let final self::Class? #t148 = c in #t148.{core::Object::==}(null) ?{self::Class*} null : self::Extension|[]=(self::Extension|get#field(#t148), c, new self::Class::•());
+  c = let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t150 = self::Extension|get#field(#t149) in let final self::Class? #t151 = c in let final self::Class* #t152 = new self::Class::•() in let final void #t153 = self::Extension|[]=(#t150, #t151, #t152) in #t152;
+  let final self::Class? #t154 = c in #t154.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t154), c));
+  let final self::Class? #t155 = c in #t155.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t156 = self::Extension|get#field(#t155) in let final self::Class? #t157 = c in self::Extension|[]=(#t156, #t157, self::Extension|+(self::Extension|[](#t156, #t157), 0));
+  c = let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in let final self::Class? #t161 = self::Extension|+(self::Extension|[](#t159, #t160), 0) in let final void #t162 = self::Extension|[]=(#t159, #t160, #t161) in #t161;
+  let final self::Class? #t163 = c in #t163.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t164 = self::Extension|get#field(#t163) in let final self::Class? #t165 = c in self::Extension|[]=(#t164, #t165, self::Extension|+(self::Extension|[](#t164, #t165), 1));
+  c = let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|[](#t167, #t168) in let final void #t170 = self::Extension|[]=(#t167, #t168, self::Extension|+(#t169, 1)) in #t169;
+  let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  c = let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t177 = self::Extension|get#field(#t176) in let final self::Class? #t178 = c in let final self::Class? #t179 = self::Extension|+(self::Extension|[](#t177, #t178), 1) in let final void #t180 = self::Extension|[]=(#t177, #t178, #t179) in #t179;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : self::Extension|+(self::Extension|get#field(#t176), 0);
-  let final self::Class? #t177 = c in #t177.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t177, self::Extension|+(self::Extension|get#field(#t177), 0));
-  c = let final self::Class? #t178 = c in #t178.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t179 = self::Extension|+(self::Extension|get#field(#t178), 0) in let final void #t180 = self::Extension|set#field(#t178, #t179) in #t179;
-  let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t182 = self::Extension|get#field(#t181) in self::Extension|set#field(#t182, self::Extension|+(self::Extension|get#field(#t182), 0));
-  c = let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t184 = self::Extension|get#field(#t183) in let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
-  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t187, self::Extension|+(self::Extension|get#field(#t187), 1));
-  c = let final self::Class? #t188 = c in #t188.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t189 = self::Extension|get#field(#t188) in let final self::Class? #t190 = let final self::Class? #t191 = self::Extension|+(#t189, 1) in let final void #t192 = self::Extension|set#field(#t188, #t191) in #t191 in #t189;
-  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t194 = self::Extension|+(self::Extension|get#field(#t193), 1) in let final void #t195 = self::Extension|set#field(#t193, #t194) in #t194;
-  c = let final self::Class? #t196 = c in #t196.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t197 = self::Extension|+(self::Extension|get#field(#t196), 1) in let final void #t198 = self::Extension|set#field(#t196, #t197) in #t197;
+  self::throws(() → self::Class? => self::Extension|+(let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t181), 0));
+  self::throws(() → self::Class? => self::Extension|unary-(let final self::Class? #t182 = c in #t182.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t182)));
+  let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t183, self::Extension|+(self::Extension|get#field(#t183), 0));
+  c = let final self::Class? #t184 = c in #t184.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
+  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t188 = self::Extension|get#field(#t187) in self::Extension|set#field(#t188, self::Extension|+(self::Extension|get#field(#t188), 0));
+  c = let final self::Class? #t189 = c in #t189.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t190 = self::Extension|get#field(#t189) in let final self::Class? #t191 = self::Extension|+(self::Extension|get#field(#t190), 0) in let final void #t192 = self::Extension|set#field(#t190, #t191) in #t191;
+  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t193, self::Extension|+(self::Extension|get#field(#t193), 1));
+  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|get#field(#t194) in let final self::Class? #t196 = let final self::Class? #t197 = self::Extension|+(#t195, 1) in let final void #t198 = self::Extension|set#field(#t194, #t197) in #t197 in #t195;
+  let final self::Class? #t199 = c in #t199.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t200 = self::Extension|+(self::Extension|get#field(#t199), 1) in let final void #t201 = self::Extension|set#field(#t199, #t200) in #t200;
+  c = let final self::Class? #t202 = c in #t202.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t203 = self::Extension|+(self::Extension|get#field(#t202), 1) in let final void #t204 = self::Extension|set#field(#t202, #t203) in #t203;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t199 = c in #t199.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t199).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t199, c) : null;
-  c = let final self::Class? #t200 = c in #t200.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t201 = self::Extension|get#field(#t200) in #t201.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t202 = c in let final void #t203 = self::Extension|set#field(#t200, #t202) in #t202 : #t201;
-  let final self::Class? #t204 = c in #t204.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t205 = self::Extension|get#field(#t204) in let final self::Class? #t206 = c in self::Extension|[](#t205, #t206).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t205, #t206, c) : null;
+  let final self::Class? #t205 = c in #t205.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t205).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t205, c) : null;
+  c = let final self::Class? #t206 = c in #t206.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t207 = self::Extension|get#field(#t206) in #t207.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t208 = c in let final void #t209 = self::Extension|set#field(#t206, #t208) in #t208 : #t207;
+  let final self::Class? #t210 = c in #t210.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t211 = self::Extension|get#field(#t210) in let final self::Class? #t212 = c in self::Extension|[](#t211, #t212).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t211, #t212, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
index d579764..a988b01 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
@@ -15,6 +15,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -33,6 +34,8 @@
 }
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   return self::Extension|get#field(#this);
+static method Extension|unary-(final self::Class #this) → self::Class?
+  return self::Extension|get#field(#this);
 static method main() → dynamic {
   self::propertyAccess(null);
   self::indexAccess(null);
@@ -46,87 +49,100 @@
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t6);
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(#t7));
   let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t8), new self::Class::•());
-  c = let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t10 = new self::Class::•() in let final void #t11 = self::Extension|set#field(self::Extension|get#field(#t9), #t10) in #t10;
-  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t12));
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t13, self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t15 = self::Extension|get#field(new self::Class::•()) in let final void #t16 = self::Extension|set#field(#t14, #t15) in #t15;
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t17, let final self::Class* #t18 = new self::Class::•() in let final void #t19 = self::Extension|set#field(new self::Class::•(), #t18) in #t18);
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t21 = let final self::Class* #t22 = new self::Class::•() in let final void #t23 = self::Extension|set#field(new self::Class::•(), #t22) in #t22 in let final void #t24 = self::Extension|set#field(#t20, #t21) in #t21;
-  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t25, self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t27 = self::Extension|method(new self::Class::•()) in let final void #t28 = self::Extension|set#field(#t26, #t27) in #t27;
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t29));
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t30), new self::Class::•());
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t31));
-  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t32)));
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t33)), new self::Class::•());
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t34)), #t35) in #t35;
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t37)));
-  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t38, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t40 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
-  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t43) in #t43);
-  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t50, self::Extension|method(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t52 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
-  let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t54)));
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t55)), new self::Class::•());
-  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t56)));
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t57), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t59 = self::Extension|get#field(new self::Class::•()) in let final void #t60 = self::Extension|set#field(self::Extension|get#field(#t58), #t59) in #t59;
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t61), let final self::Class* #t62 = new self::Class::•() in let final void #t63 = self::Extension|set#field(new self::Class::•(), #t62) in #t62);
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t65 = let final self::Class* #t66 = new self::Class::•() in let final void #t67 = self::Extension|set#field(new self::Class::•(), #t66) in #t66 in let final void #t68 = self::Extension|set#field(self::Extension|get#field(#t64), #t65) in #t65;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t69), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = self::Extension|method(new self::Class::•()) in let final void #t72 = self::Extension|set#field(self::Extension|get#field(#t70), #t71) in #t71;
-  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t73, let final self::Class? #t74 = self::Extension|get#field(new self::Class::•()) in let final void #t75 = self::Extension|set#field(new self::Class::•(), #t74) in #t74);
-  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = let final self::Class? #t78 = self::Extension|get#field(new self::Class::•()) in let final void #t79 = self::Extension|set#field(new self::Class::•(), #t78) in #t78 in let final void #t80 = self::Extension|set#field(#t76, #t77) in #t77;
-  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t81, let final self::Class* #t82 = let final self::Class* #t83 = new self::Class::•() in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(new self::Class::•(), #t82) in #t82);
-  c = let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t87 = let final self::Class* #t88 = let final self::Class* #t89 = new self::Class::•() in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t89) in #t89 in let final void #t91 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t92 = self::Extension|set#field(#t86, #t87) in #t87;
-  let final self::Class? #t93 = c in #t93.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t93, let final self::Class? #t94 = self::Extension|method(new self::Class::•()) in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94);
-  c = let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t97 = let final self::Class? #t98 = self::Extension|method(new self::Class::•()) in let final void #t99 = self::Extension|set#field(new self::Class::•(), #t98) in #t98 in let final void #t100 = self::Extension|set#field(#t96, #t97) in #t97;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t101), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = self::Extension|get#field(new self::Class::•()) in let final void #t104 = self::Extension|set#field(self::Extension|method(#t102), #t103) in #t103;
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t105), let final self::Class* #t106 = new self::Class::•() in let final void #t107 = self::Extension|set#field(new self::Class::•(), #t106) in #t106);
-  c = let final self::Class? #t108 = c in #t108.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t109 = let final self::Class* #t110 = new self::Class::•() in let final void #t111 = self::Extension|set#field(new self::Class::•(), #t110) in #t110 in let final void #t112 = self::Extension|set#field(self::Extension|method(#t108), #t109) in #t109;
-  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t113), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t114 = c in #t114.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t115 = self::Extension|method(new self::Class::•()) in let final void #t116 = self::Extension|set#field(self::Extension|method(#t114), #t115) in #t115;
-  let final self::Class? #t117 = c in #t117.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t117)));
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t118)), new self::Class::•());
-  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t119)), #t120) in #t120;
-  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t122)));
-  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t123, self::Extension|get#field(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t125 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t126 = self::Extension|set#field(#t124, #t125) in #t125;
-  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t127, let final self::Class* #t128 = new self::Class::•() in let final void #t129 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t128) in #t128);
-  c = let final self::Class? #t130 = c in #t130.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t131 = let final self::Class* #t132 = new self::Class::•() in let final void #t133 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t132) in #t132 in let final void #t134 = self::Extension|set#field(#t130, #t131) in #t131;
-  let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t135, self::Extension|method(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t136 = c in #t136.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t137 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t138 = self::Extension|set#field(#t136, #t137) in #t137;
-  let final self::Class? #t139 = c in #t139.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t139)));
-  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t140)), new self::Class::•());
-  let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t141)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t9)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t11 = new self::Class::•() in let final void #t12 = self::Extension|set#field(#t10, #t11) in #t11));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t13)));
+  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t15 = new self::Class::•() in let final void #t16 = self::Extension|set#field(self::Extension|get#field(#t14), #t15) in #t15;
+  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t17));
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t18, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t20 = self::Extension|get#field(new self::Class::•()) in let final void #t21 = self::Extension|set#field(#t19, #t20) in #t20;
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t22, let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(new self::Class::•(), #t23) in #t23);
+  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t26 = let final self::Class* #t27 = new self::Class::•() in let final void #t28 = self::Extension|set#field(new self::Class::•(), #t27) in #t27 in let final void #t29 = self::Extension|set#field(#t25, #t26) in #t26;
+  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t30, self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t32 = self::Extension|method(new self::Class::•()) in let final void #t33 = self::Extension|set#field(#t31, #t32) in #t32;
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t34));
+  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t35), new self::Class::•());
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t36));
+  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t37)));
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t38)), new self::Class::•());
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t40 = new self::Class::•() in let final void #t41 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t39)), #t40) in #t40;
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t42)));
+  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t43, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t45 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t46 = self::Extension|set#field(#t44, #t45) in #t45;
+  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t47, let final self::Class* #t48 = new self::Class::•() in let final void #t49 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t48) in #t48);
+  c = let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t51 = let final self::Class* #t52 = new self::Class::•() in let final void #t53 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t52) in #t52 in let final void #t54 = self::Extension|set#field(#t50, #t51) in #t51;
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t55, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t57 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t58 = self::Extension|set#field(#t56, #t57) in #t57;
+  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t59)));
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t60)), new self::Class::•());
+  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t61)));
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t62), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t64 = self::Extension|get#field(new self::Class::•()) in let final void #t65 = self::Extension|set#field(self::Extension|get#field(#t63), #t64) in #t64;
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t66), let final self::Class* #t67 = new self::Class::•() in let final void #t68 = self::Extension|set#field(new self::Class::•(), #t67) in #t67);
+  c = let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t70 = let final self::Class* #t71 = new self::Class::•() in let final void #t72 = self::Extension|set#field(new self::Class::•(), #t71) in #t71 in let final void #t73 = self::Extension|set#field(self::Extension|get#field(#t69), #t70) in #t70;
+  let final self::Class? #t74 = c in #t74.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t74), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t75 = c in #t75.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t76 = self::Extension|method(new self::Class::•()) in let final void #t77 = self::Extension|set#field(self::Extension|get#field(#t75), #t76) in #t76;
+  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t78, let final self::Class? #t79 = self::Extension|get#field(new self::Class::•()) in let final void #t80 = self::Extension|set#field(new self::Class::•(), #t79) in #t79);
+  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = let final self::Class? #t83 = self::Extension|get#field(new self::Class::•()) in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(#t81, #t82) in #t82;
+  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t86, let final self::Class* #t87 = let final self::Class* #t88 = new self::Class::•() in let final void #t89 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t87) in #t87);
+  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t92 = let final self::Class* #t93 = let final self::Class* #t94 = new self::Class::•() in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94 in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t93) in #t93 in let final void #t97 = self::Extension|set#field(#t91, #t92) in #t92;
+  let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t98, let final self::Class? #t99 = self::Extension|method(new self::Class::•()) in let final void #t100 = self::Extension|set#field(new self::Class::•(), #t99) in #t99);
+  c = let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = let final self::Class? #t103 = self::Extension|method(new self::Class::•()) in let final void #t104 = self::Extension|set#field(new self::Class::•(), #t103) in #t103 in let final void #t105 = self::Extension|set#field(#t101, #t102) in #t102;
+  let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t106), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = self::Extension|get#field(new self::Class::•()) in let final void #t109 = self::Extension|set#field(self::Extension|method(#t107), #t108) in #t108;
+  let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t110), let final self::Class* #t111 = new self::Class::•() in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = new self::Class::•() in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(self::Extension|method(#t113), #t114) in #t114;
+  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t118), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t120 = self::Extension|method(new self::Class::•()) in let final void #t121 = self::Extension|set#field(self::Extension|method(#t119), #t120) in #t120;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t122)));
+  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t123)), new self::Class::•());
+  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t125 = new self::Class::•() in let final void #t126 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t124)), #t125) in #t125;
+  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t127)));
+  let final self::Class? #t128 = c in #t128.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t128, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t129 = c in #t129.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t130 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t131 = self::Extension|set#field(#t129, #t130) in #t130;
+  let final self::Class? #t132 = c in #t132.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t132, let final self::Class* #t133 = new self::Class::•() in let final void #t134 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t133) in #t133);
+  c = let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t136 = let final self::Class* #t137 = new self::Class::•() in let final void #t138 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t137) in #t137 in let final void #t139 = self::Extension|set#field(#t135, #t136) in #t136;
+  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t140, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t142 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t143 = self::Extension|set#field(#t141, #t142) in #t142;
+  let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t144)));
+  let final self::Class? #t145 = c in #t145.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t145)), new self::Class::•());
+  let final self::Class? #t146 = c in #t146.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t146)));
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t142 = c in #t142.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t142), c);
-  let final self::Class? #t143 = c in #t143.{core::Object::==}(null) ?{void} null : self::Extension|[]=(self::Extension|get#field(#t143), c, new self::Class::•());
-  c = let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t145 = self::Extension|get#field(#t144) in let final self::Class? #t146 = c in let final self::Class* #t147 = new self::Class::•() in let final void #t148 = self::Extension|[]=(#t145, #t146, #t147) in #t147;
-  let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t149), c));
-  let final self::Class? #t150 = c in #t150.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t151 = self::Extension|get#field(#t150) in let final self::Class? #t152 = c in self::Extension|[]=(#t151, #t152, self::Extension|+(self::Extension|[](#t151, #t152), 0));
-  c = let final self::Class? #t153 = c in #t153.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t154 = self::Extension|get#field(#t153) in let final self::Class? #t155 = c in let final self::Class? #t156 = self::Extension|+(self::Extension|[](#t154, #t155), 0) in let final void #t157 = self::Extension|[]=(#t154, #t155, #t156) in #t156;
-  let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in self::Extension|[]=(#t159, #t160, self::Extension|+(self::Extension|[](#t159, #t160), 1));
-  c = let final self::Class? #t161 = c in #t161.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t162 = self::Extension|get#field(#t161) in let final self::Class? #t163 = c in let final self::Class? #t164 = self::Extension|[](#t162, #t163) in let final void #t165 = self::Extension|[]=(#t162, #t163, self::Extension|+(#t164, 1)) in #t164;
-  let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|+(self::Extension|[](#t167, #t168), 1) in let final void #t170 = self::Extension|[]=(#t167, #t168, #t169) in #t169;
-  c = let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  let final self::Class? #t147 = c in #t147.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t147), c);
+  let final self::Class? #t148 = c in #t148.{core::Object::==}(null) ?{self::Class*} null : self::Extension|[]=(self::Extension|get#field(#t148), c, new self::Class::•());
+  c = let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t150 = self::Extension|get#field(#t149) in let final self::Class? #t151 = c in let final self::Class* #t152 = new self::Class::•() in let final void #t153 = self::Extension|[]=(#t150, #t151, #t152) in #t152;
+  let final self::Class? #t154 = c in #t154.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t154), c));
+  let final self::Class? #t155 = c in #t155.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t156 = self::Extension|get#field(#t155) in let final self::Class? #t157 = c in self::Extension|[]=(#t156, #t157, self::Extension|+(self::Extension|[](#t156, #t157), 0));
+  c = let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in let final self::Class? #t161 = self::Extension|+(self::Extension|[](#t159, #t160), 0) in let final void #t162 = self::Extension|[]=(#t159, #t160, #t161) in #t161;
+  let final self::Class? #t163 = c in #t163.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t164 = self::Extension|get#field(#t163) in let final self::Class? #t165 = c in self::Extension|[]=(#t164, #t165, self::Extension|+(self::Extension|[](#t164, #t165), 1));
+  c = let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|[](#t167, #t168) in let final void #t170 = self::Extension|[]=(#t167, #t168, self::Extension|+(#t169, 1)) in #t169;
+  let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  c = let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t177 = self::Extension|get#field(#t176) in let final self::Class? #t178 = c in let final self::Class? #t179 = self::Extension|+(self::Extension|[](#t177, #t178), 1) in let final void #t180 = self::Extension|[]=(#t177, #t178, #t179) in #t179;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : self::Extension|+(self::Extension|get#field(#t176), 0);
-  let final self::Class? #t177 = c in #t177.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t177, self::Extension|+(self::Extension|get#field(#t177), 0));
-  c = let final self::Class? #t178 = c in #t178.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t179 = self::Extension|+(self::Extension|get#field(#t178), 0) in let final void #t180 = self::Extension|set#field(#t178, #t179) in #t179;
-  let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t182 = self::Extension|get#field(#t181) in self::Extension|set#field(#t182, self::Extension|+(self::Extension|get#field(#t182), 0));
-  c = let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t184 = self::Extension|get#field(#t183) in let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
-  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t187, self::Extension|+(self::Extension|get#field(#t187), 1));
-  c = let final self::Class? #t188 = c in #t188.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t189 = self::Extension|get#field(#t188) in let final self::Class? #t190 = let final self::Class? #t191 = self::Extension|+(#t189, 1) in let final void #t192 = self::Extension|set#field(#t188, #t191) in #t191 in #t189;
-  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t194 = self::Extension|+(self::Extension|get#field(#t193), 1) in let final void #t195 = self::Extension|set#field(#t193, #t194) in #t194;
-  c = let final self::Class? #t196 = c in #t196.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t197 = self::Extension|+(self::Extension|get#field(#t196), 1) in let final void #t198 = self::Extension|set#field(#t196, #t197) in #t197;
+  self::throws(() → self::Class? => self::Extension|+(let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t181), 0));
+  self::throws(() → self::Class? => self::Extension|unary-(let final self::Class? #t182 = c in #t182.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t182)));
+  let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t183, self::Extension|+(self::Extension|get#field(#t183), 0));
+  c = let final self::Class? #t184 = c in #t184.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
+  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t188 = self::Extension|get#field(#t187) in self::Extension|set#field(#t188, self::Extension|+(self::Extension|get#field(#t188), 0));
+  c = let final self::Class? #t189 = c in #t189.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t190 = self::Extension|get#field(#t189) in let final self::Class? #t191 = self::Extension|+(self::Extension|get#field(#t190), 0) in let final void #t192 = self::Extension|set#field(#t190, #t191) in #t191;
+  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t193, self::Extension|+(self::Extension|get#field(#t193), 1));
+  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|get#field(#t194) in let final self::Class? #t196 = let final self::Class? #t197 = self::Extension|+(#t195, 1) in let final void #t198 = self::Extension|set#field(#t194, #t197) in #t197 in #t195;
+  let final self::Class? #t199 = c in #t199.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t200 = self::Extension|+(self::Extension|get#field(#t199), 1) in let final void #t201 = self::Extension|set#field(#t199, #t200) in #t200;
+  c = let final self::Class? #t202 = c in #t202.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t203 = self::Extension|+(self::Extension|get#field(#t202), 1) in let final void #t204 = self::Extension|set#field(#t202, #t203) in #t203;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t199 = c in #t199.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t199).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t199, c) : null;
-  c = let final self::Class? #t200 = c in #t200.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t201 = self::Extension|get#field(#t200) in #t201.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t202 = c in let final void #t203 = self::Extension|set#field(#t200, #t202) in #t202 : #t201;
-  let final self::Class? #t204 = c in #t204.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t205 = self::Extension|get#field(#t204) in let final self::Class? #t206 = c in self::Extension|[](#t205, #t206).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t205, #t206, c) : null;
+  let final self::Class? #t205 = c in #t205.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t205).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t205, c) : null;
+  c = let final self::Class? #t206 = c in #t206.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t207 = self::Extension|get#field(#t206) in #t207.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t208 = c in let final void #t209 = self::Extension|set#field(#t206, #t208) in #t208 : #t207;
+  let final self::Class? #t210 = c in #t210.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t211 = self::Extension|get#field(#t210) in let final self::Class? #t212 = c in self::Extension|[](#t211, #t212).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t211, #t212, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.type_promotion.expect
deleted file mode 100644
index c773aae..0000000
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.type_promotion.expect
+++ /dev/null
@@ -1,93 +0,0 @@
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:35:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:40:5: Context: Write to c@681
-  c = Extension(c)?.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:43:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:45:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:47:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:54:5: Context: Write to c@681
-  c = Extension(c)?.field.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:57:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:59:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:61:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field.method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:67:5: Context: Write to c@681
-  c = Extension(c)?.field.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:69:5: Context: Write to c@681
-  c = Extension(c)?.field.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:71:5: Context: Write to c@681
-  c = Extension(c)?.field.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:73:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:75:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:77:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:79:5: Context: Write to c@681
-  c = Extension(c)?.method().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:81:5: Context: Write to c@681
-  c = Extension(c)?.method().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:83:5: Context: Write to c@681
-  c = Extension(c)?.method().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:87:5: Context: Write to c@681
-  c = Extension(c)?.field.method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:90:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().method().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:92:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:5: Context: Write to c@681
-  c = Extension(c)?.field = new Class().method().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:107:5: Context: Write to c@681
-  c = Extension(c)?.field[c] = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:110:5: Context: Write to c@681
-  c = Extension(c)?.field[c] += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:114:5: Context: Write to c@681
-  c = Extension(c)?.field[c]++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:116:5: Context: Write to c@681
-  c = ++Extension(c)?.field[c];
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:123:5: Context: Write to c@681
-  c = Extension(c)?.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:125:5: Context: Write to c@681
-  c = Extension(c)?.field.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:129:5: Context: Write to c@681
-  c = Extension(c)?.field++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:131:5: Context: Write to c@681
-  c = ++Extension(c)?.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:136:5: Context: Write to c@681
-  c = Extension(c)?.field ??= c;
-    ^
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart
index ee725c7..25f6e4e 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart
@@ -20,6 +20,8 @@
   }
 
   Class? operator +(int value) => field;
+
+  Class? operator -() => field;
 }
 
 main() {
@@ -37,6 +39,9 @@
 
   c?.field.field;
   c?.field.field = new Class();
+  throws(() => (c?.field).field);
+  throws(() => (c?.field = new Class()).field);
+  throws(() => (c?.method()).field);
   c = c?.field.field = new Class();
   c?.field.method();
   c?.field = new Class().field;
@@ -117,8 +122,8 @@
 }
 
 void operatorAccess(Class? c) {
-  // TODO(johnniwinther): + should _not_ be null-shortened.
-  c?.field + 0;
+  throws(() => c?.field + 0);
+  throws(() => -c?.field);
   c?.field += 0;
   c = c?.field += 0;
   c?.field.field += 0;
@@ -136,3 +141,12 @@
   c = c?.field ??= c;
   c?.field[c] ??= c;
 }
+
+void throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception.';
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.outline.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.outline.expect
index b39c0d9..8a55652 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.outline.expect
@@ -14,6 +14,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -30,6 +31,8 @@
   ;
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   ;
+static method Extension|unary-(final self::Class #this) → self::Class?
+  ;
 static method main() → dynamic
   ;
 static method propertyAccess(self::Class? c) → void
@@ -40,3 +43,5 @@
   ;
 static method ifNull(self::Class? c) → void
   ;
+static method throws(() → void f) → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
index 8bb6efe..ac7b6fb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
@@ -15,6 +15,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -33,6 +34,8 @@
 }
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   return self::Extension|get#field(#this);
+static method Extension|unary-(final self::Class #this) → self::Class?
+  return self::Extension|get#field(#this);
 static method main() → dynamic {
   self::propertyAccess(null);
   self::indexAccess(null);
@@ -46,87 +49,100 @@
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t6);
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(#t7));
   let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t8), new self::Class::•());
-  c = let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t10 = new self::Class::•() in let final void #t11 = self::Extension|set#field(self::Extension|get#field(#t9), #t10) in #t10;
-  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t12));
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t13, self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t15 = self::Extension|get#field(new self::Class::•()) in let final void #t16 = self::Extension|set#field(#t14, #t15) in #t15;
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t17, let final self::Class* #t18 = new self::Class::•() in let final void #t19 = self::Extension|set#field(new self::Class::•(), #t18) in #t18);
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t21 = let final self::Class* #t22 = new self::Class::•() in let final void #t23 = self::Extension|set#field(new self::Class::•(), #t22) in #t22 in let final void #t24 = self::Extension|set#field(#t20, #t21) in #t21;
-  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t25, self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t27 = self::Extension|method(new self::Class::•()) in let final void #t28 = self::Extension|set#field(#t26, #t27) in #t27;
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t29));
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t30), new self::Class::•());
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t31));
-  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t32)));
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t33)), new self::Class::•());
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t34)), #t35) in #t35;
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t37)));
-  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t38, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t40 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
-  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t43) in #t43);
-  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t50, self::Extension|method(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t52 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
-  let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t54)));
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t55)), new self::Class::•());
-  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t56)));
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t57), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t59 = self::Extension|get#field(new self::Class::•()) in let final void #t60 = self::Extension|set#field(self::Extension|get#field(#t58), #t59) in #t59;
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t61), let final self::Class* #t62 = new self::Class::•() in let final void #t63 = self::Extension|set#field(new self::Class::•(), #t62) in #t62);
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t65 = let final self::Class* #t66 = new self::Class::•() in let final void #t67 = self::Extension|set#field(new self::Class::•(), #t66) in #t66 in let final void #t68 = self::Extension|set#field(self::Extension|get#field(#t64), #t65) in #t65;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t69), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = self::Extension|method(new self::Class::•()) in let final void #t72 = self::Extension|set#field(self::Extension|get#field(#t70), #t71) in #t71;
-  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t73, let final self::Class? #t74 = self::Extension|get#field(new self::Class::•()) in let final void #t75 = self::Extension|set#field(new self::Class::•(), #t74) in #t74);
-  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = let final self::Class? #t78 = self::Extension|get#field(new self::Class::•()) in let final void #t79 = self::Extension|set#field(new self::Class::•(), #t78) in #t78 in let final void #t80 = self::Extension|set#field(#t76, #t77) in #t77;
-  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t81, let final self::Class* #t82 = let final self::Class* #t83 = new self::Class::•() in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(new self::Class::•(), #t82) in #t82);
-  c = let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t87 = let final self::Class* #t88 = let final self::Class* #t89 = new self::Class::•() in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t89) in #t89 in let final void #t91 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t92 = self::Extension|set#field(#t86, #t87) in #t87;
-  let final self::Class? #t93 = c in #t93.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t93, let final self::Class? #t94 = self::Extension|method(new self::Class::•()) in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94);
-  c = let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t97 = let final self::Class? #t98 = self::Extension|method(new self::Class::•()) in let final void #t99 = self::Extension|set#field(new self::Class::•(), #t98) in #t98 in let final void #t100 = self::Extension|set#field(#t96, #t97) in #t97;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t101), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = self::Extension|get#field(new self::Class::•()) in let final void #t104 = self::Extension|set#field(self::Extension|method(#t102), #t103) in #t103;
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t105), let final self::Class* #t106 = new self::Class::•() in let final void #t107 = self::Extension|set#field(new self::Class::•(), #t106) in #t106);
-  c = let final self::Class? #t108 = c in #t108.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t109 = let final self::Class* #t110 = new self::Class::•() in let final void #t111 = self::Extension|set#field(new self::Class::•(), #t110) in #t110 in let final void #t112 = self::Extension|set#field(self::Extension|method(#t108), #t109) in #t109;
-  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t113), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t114 = c in #t114.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t115 = self::Extension|method(new self::Class::•()) in let final void #t116 = self::Extension|set#field(self::Extension|method(#t114), #t115) in #t115;
-  let final self::Class? #t117 = c in #t117.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t117)));
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t118)), new self::Class::•());
-  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t119)), #t120) in #t120;
-  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t122)));
-  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t123, self::Extension|get#field(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t125 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t126 = self::Extension|set#field(#t124, #t125) in #t125;
-  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t127, let final self::Class* #t128 = new self::Class::•() in let final void #t129 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t128) in #t128);
-  c = let final self::Class? #t130 = c in #t130.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t131 = let final self::Class* #t132 = new self::Class::•() in let final void #t133 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t132) in #t132 in let final void #t134 = self::Extension|set#field(#t130, #t131) in #t131;
-  let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t135, self::Extension|method(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t136 = c in #t136.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t137 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t138 = self::Extension|set#field(#t136, #t137) in #t137;
-  let final self::Class? #t139 = c in #t139.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t139)));
-  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t140)), new self::Class::•());
-  let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t141)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t9)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t11 = new self::Class::•() in let final void #t12 = self::Extension|set#field(#t10, #t11) in #t11));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t13)));
+  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t15 = new self::Class::•() in let final void #t16 = self::Extension|set#field(self::Extension|get#field(#t14), #t15) in #t15;
+  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t17));
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t18, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t20 = self::Extension|get#field(new self::Class::•()) in let final void #t21 = self::Extension|set#field(#t19, #t20) in #t20;
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t22, let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(new self::Class::•(), #t23) in #t23);
+  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t26 = let final self::Class* #t27 = new self::Class::•() in let final void #t28 = self::Extension|set#field(new self::Class::•(), #t27) in #t27 in let final void #t29 = self::Extension|set#field(#t25, #t26) in #t26;
+  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t30, self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t32 = self::Extension|method(new self::Class::•()) in let final void #t33 = self::Extension|set#field(#t31, #t32) in #t32;
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t34));
+  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t35), new self::Class::•());
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t36));
+  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t37)));
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t38)), new self::Class::•());
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t40 = new self::Class::•() in let final void #t41 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t39)), #t40) in #t40;
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t42)));
+  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t43, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t45 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t46 = self::Extension|set#field(#t44, #t45) in #t45;
+  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t47, let final self::Class* #t48 = new self::Class::•() in let final void #t49 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t48) in #t48);
+  c = let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t51 = let final self::Class* #t52 = new self::Class::•() in let final void #t53 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t52) in #t52 in let final void #t54 = self::Extension|set#field(#t50, #t51) in #t51;
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t55, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t57 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t58 = self::Extension|set#field(#t56, #t57) in #t57;
+  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t59)));
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t60)), new self::Class::•());
+  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t61)));
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t62), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t64 = self::Extension|get#field(new self::Class::•()) in let final void #t65 = self::Extension|set#field(self::Extension|get#field(#t63), #t64) in #t64;
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t66), let final self::Class* #t67 = new self::Class::•() in let final void #t68 = self::Extension|set#field(new self::Class::•(), #t67) in #t67);
+  c = let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t70 = let final self::Class* #t71 = new self::Class::•() in let final void #t72 = self::Extension|set#field(new self::Class::•(), #t71) in #t71 in let final void #t73 = self::Extension|set#field(self::Extension|get#field(#t69), #t70) in #t70;
+  let final self::Class? #t74 = c in #t74.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t74), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t75 = c in #t75.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t76 = self::Extension|method(new self::Class::•()) in let final void #t77 = self::Extension|set#field(self::Extension|get#field(#t75), #t76) in #t76;
+  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t78, let final self::Class? #t79 = self::Extension|get#field(new self::Class::•()) in let final void #t80 = self::Extension|set#field(new self::Class::•(), #t79) in #t79);
+  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = let final self::Class? #t83 = self::Extension|get#field(new self::Class::•()) in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(#t81, #t82) in #t82;
+  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t86, let final self::Class* #t87 = let final self::Class* #t88 = new self::Class::•() in let final void #t89 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t87) in #t87);
+  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t92 = let final self::Class* #t93 = let final self::Class* #t94 = new self::Class::•() in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94 in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t93) in #t93 in let final void #t97 = self::Extension|set#field(#t91, #t92) in #t92;
+  let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t98, let final self::Class? #t99 = self::Extension|method(new self::Class::•()) in let final void #t100 = self::Extension|set#field(new self::Class::•(), #t99) in #t99);
+  c = let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = let final self::Class? #t103 = self::Extension|method(new self::Class::•()) in let final void #t104 = self::Extension|set#field(new self::Class::•(), #t103) in #t103 in let final void #t105 = self::Extension|set#field(#t101, #t102) in #t102;
+  let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t106), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = self::Extension|get#field(new self::Class::•()) in let final void #t109 = self::Extension|set#field(self::Extension|method(#t107), #t108) in #t108;
+  let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t110), let final self::Class* #t111 = new self::Class::•() in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = new self::Class::•() in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(self::Extension|method(#t113), #t114) in #t114;
+  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t118), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t120 = self::Extension|method(new self::Class::•()) in let final void #t121 = self::Extension|set#field(self::Extension|method(#t119), #t120) in #t120;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t122)));
+  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t123)), new self::Class::•());
+  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t125 = new self::Class::•() in let final void #t126 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t124)), #t125) in #t125;
+  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t127)));
+  let final self::Class? #t128 = c in #t128.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t128, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t129 = c in #t129.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t130 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t131 = self::Extension|set#field(#t129, #t130) in #t130;
+  let final self::Class? #t132 = c in #t132.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t132, let final self::Class* #t133 = new self::Class::•() in let final void #t134 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t133) in #t133);
+  c = let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t136 = let final self::Class* #t137 = new self::Class::•() in let final void #t138 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t137) in #t137 in let final void #t139 = self::Extension|set#field(#t135, #t136) in #t136;
+  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t140, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t142 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t143 = self::Extension|set#field(#t141, #t142) in #t142;
+  let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t144)));
+  let final self::Class? #t145 = c in #t145.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t145)), new self::Class::•());
+  let final self::Class? #t146 = c in #t146.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t146)));
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t142 = c in #t142.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t142), c);
-  let final self::Class? #t143 = c in #t143.{core::Object::==}(null) ?{void} null : self::Extension|[]=(self::Extension|get#field(#t143), c, new self::Class::•());
-  c = let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t145 = self::Extension|get#field(#t144) in let final self::Class? #t146 = c in let final self::Class* #t147 = new self::Class::•() in let final void #t148 = self::Extension|[]=(#t145, #t146, #t147) in #t147;
-  let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t149), c));
-  let final self::Class? #t150 = c in #t150.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t151 = self::Extension|get#field(#t150) in let final self::Class? #t152 = c in self::Extension|[]=(#t151, #t152, self::Extension|+(self::Extension|[](#t151, #t152), 0));
-  c = let final self::Class? #t153 = c in #t153.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t154 = self::Extension|get#field(#t153) in let final self::Class? #t155 = c in let final self::Class? #t156 = self::Extension|+(self::Extension|[](#t154, #t155), 0) in let final void #t157 = self::Extension|[]=(#t154, #t155, #t156) in #t156;
-  let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in self::Extension|[]=(#t159, #t160, self::Extension|+(self::Extension|[](#t159, #t160), 1));
-  c = let final self::Class? #t161 = c in #t161.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t162 = self::Extension|get#field(#t161) in let final self::Class? #t163 = c in let final self::Class? #t164 = self::Extension|[](#t162, #t163) in let final void #t165 = self::Extension|[]=(#t162, #t163, self::Extension|+(#t164, 1)) in #t164;
-  let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|+(self::Extension|[](#t167, #t168), 1) in let final void #t170 = self::Extension|[]=(#t167, #t168, #t169) in #t169;
-  c = let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  let final self::Class? #t147 = c in #t147.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t147), c);
+  let final self::Class? #t148 = c in #t148.{core::Object::==}(null) ?{self::Class*} null : self::Extension|[]=(self::Extension|get#field(#t148), c, new self::Class::•());
+  c = let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t150 = self::Extension|get#field(#t149) in let final self::Class? #t151 = c in let final self::Class* #t152 = new self::Class::•() in let final void #t153 = self::Extension|[]=(#t150, #t151, #t152) in #t152;
+  let final self::Class? #t154 = c in #t154.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t154), c));
+  let final self::Class? #t155 = c in #t155.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t156 = self::Extension|get#field(#t155) in let final self::Class? #t157 = c in self::Extension|[]=(#t156, #t157, self::Extension|+(self::Extension|[](#t156, #t157), 0));
+  c = let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in let final self::Class? #t161 = self::Extension|+(self::Extension|[](#t159, #t160), 0) in let final void #t162 = self::Extension|[]=(#t159, #t160, #t161) in #t161;
+  let final self::Class? #t163 = c in #t163.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t164 = self::Extension|get#field(#t163) in let final self::Class? #t165 = c in self::Extension|[]=(#t164, #t165, self::Extension|+(self::Extension|[](#t164, #t165), 1));
+  c = let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|[](#t167, #t168) in let final void #t170 = self::Extension|[]=(#t167, #t168, self::Extension|+(#t169, 1)) in #t169;
+  let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  c = let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t177 = self::Extension|get#field(#t176) in let final self::Class? #t178 = c in let final self::Class? #t179 = self::Extension|+(self::Extension|[](#t177, #t178), 1) in let final void #t180 = self::Extension|[]=(#t177, #t178, #t179) in #t179;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : self::Extension|+(self::Extension|get#field(#t176), 0);
-  let final self::Class? #t177 = c in #t177.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t177, self::Extension|+(self::Extension|get#field(#t177), 0));
-  c = let final self::Class? #t178 = c in #t178.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t179 = self::Extension|+(self::Extension|get#field(#t178), 0) in let final void #t180 = self::Extension|set#field(#t178, #t179) in #t179;
-  let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t182 = self::Extension|get#field(#t181) in self::Extension|set#field(#t182, self::Extension|+(self::Extension|get#field(#t182), 0));
-  c = let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t184 = self::Extension|get#field(#t183) in let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
-  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t187, self::Extension|+(self::Extension|get#field(#t187), 1));
-  c = let final self::Class? #t188 = c in #t188.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t189 = self::Extension|get#field(#t188) in let final void #t190 = self::Extension|set#field(#t188, self::Extension|+(#t189, 1)) in #t189;
-  let final self::Class? #t191 = c in #t191.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t192 = self::Extension|+(self::Extension|get#field(#t191), 1) in let final void #t193 = self::Extension|set#field(#t191, #t192) in #t192;
-  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|+(self::Extension|get#field(#t194), 1) in let final void #t196 = self::Extension|set#field(#t194, #t195) in #t195;
+  self::throws(() → self::Class? => self::Extension|+(let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t181), 0));
+  self::throws(() → self::Class? => self::Extension|unary-(let final self::Class? #t182 = c in #t182.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t182)));
+  let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t183, self::Extension|+(self::Extension|get#field(#t183), 0));
+  c = let final self::Class? #t184 = c in #t184.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
+  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t188 = self::Extension|get#field(#t187) in self::Extension|set#field(#t188, self::Extension|+(self::Extension|get#field(#t188), 0));
+  c = let final self::Class? #t189 = c in #t189.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t190 = self::Extension|get#field(#t189) in let final self::Class? #t191 = self::Extension|+(self::Extension|get#field(#t190), 0) in let final void #t192 = self::Extension|set#field(#t190, #t191) in #t191;
+  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t193, self::Extension|+(self::Extension|get#field(#t193), 1));
+  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|get#field(#t194) in let final void #t196 = self::Extension|set#field(#t194, self::Extension|+(#t195, 1)) in #t195;
+  let final self::Class? #t197 = c in #t197.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t198 = self::Extension|+(self::Extension|get#field(#t197), 1) in let final void #t199 = self::Extension|set#field(#t197, #t198) in #t198;
+  c = let final self::Class? #t200 = c in #t200.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t201 = self::Extension|+(self::Extension|get#field(#t200), 1) in let final void #t202 = self::Extension|set#field(#t200, #t201) in #t201;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t197 = c in #t197.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t197).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t197, c) : null;
-  c = let final self::Class? #t198 = c in #t198.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t199 = self::Extension|get#field(#t198) in #t199.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t200 = c in let final void #t201 = self::Extension|set#field(#t198, #t200) in #t200 : #t199;
-  let final self::Class? #t202 = c in #t202.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t203 = self::Extension|get#field(#t202) in let final self::Class? #t204 = c in self::Extension|[](#t203, #t204).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t203, #t204, c) : null;
+  let final self::Class? #t203 = c in #t203.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t203).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t203, c) : null;
+  c = let final self::Class? #t204 = c in #t204.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t205 = self::Extension|get#field(#t204) in #t205.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t206 = c in let final void #t207 = self::Extension|set#field(#t204, #t206) in #t206 : #t205;
+  let final self::Class? #t208 = c in #t208.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t209 = self::Extension|get#field(#t208) in let final self::Class? #t210 = c in self::Extension|[](#t209, #t210).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t209, #t210, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
index 8bb6efe..ac7b6fb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
@@ -15,6 +15,7 @@
   operator [] = self::Extension|[];
   operator []= = self::Extension|[]=;
   operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
   set field = self::Extension|set#field;
 }
 static method Extension|get#field(final self::Class #this) → self::Class?
@@ -33,6 +34,8 @@
 }
 static method Extension|+(final self::Class #this, core::int value) → self::Class?
   return self::Extension|get#field(#this);
+static method Extension|unary-(final self::Class #this) → self::Class?
+  return self::Extension|get#field(#this);
 static method main() → dynamic {
   self::propertyAccess(null);
   self::indexAccess(null);
@@ -46,87 +49,100 @@
   let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t6);
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(#t7));
   let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t8), new self::Class::•());
-  c = let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t10 = new self::Class::•() in let final void #t11 = self::Extension|set#field(self::Extension|get#field(#t9), #t10) in #t10;
-  let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t12));
-  let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t13, self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t15 = self::Extension|get#field(new self::Class::•()) in let final void #t16 = self::Extension|set#field(#t14, #t15) in #t15;
-  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t17, let final self::Class* #t18 = new self::Class::•() in let final void #t19 = self::Extension|set#field(new self::Class::•(), #t18) in #t18);
-  c = let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t21 = let final self::Class* #t22 = new self::Class::•() in let final void #t23 = self::Extension|set#field(new self::Class::•(), #t22) in #t22 in let final void #t24 = self::Extension|set#field(#t20, #t21) in #t21;
-  let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t25, self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t27 = self::Extension|method(new self::Class::•()) in let final void #t28 = self::Extension|set#field(#t26, #t27) in #t27;
-  let final self::Class? #t29 = c in #t29.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t29));
-  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t30), new self::Class::•());
-  let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t31));
-  let final self::Class? #t32 = c in #t32.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t32)));
-  let final self::Class? #t33 = c in #t33.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t33)), new self::Class::•());
-  c = let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t34)), #t35) in #t35;
-  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t37)));
-  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t38, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t40 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
-  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t43) in #t43);
-  c = let final self::Class? #t45 = c in #t45.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
-  let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t50, self::Extension|method(self::Extension|get#field(new self::Class::•())));
-  c = let final self::Class? #t51 = c in #t51.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t52 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
-  let final self::Class? #t54 = c in #t54.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t54)));
-  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t55)), new self::Class::•());
-  let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t56)));
-  let final self::Class? #t57 = c in #t57.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t57), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t58 = c in #t58.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t59 = self::Extension|get#field(new self::Class::•()) in let final void #t60 = self::Extension|set#field(self::Extension|get#field(#t58), #t59) in #t59;
-  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t61), let final self::Class* #t62 = new self::Class::•() in let final void #t63 = self::Extension|set#field(new self::Class::•(), #t62) in #t62);
-  c = let final self::Class? #t64 = c in #t64.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t65 = let final self::Class* #t66 = new self::Class::•() in let final void #t67 = self::Extension|set#field(new self::Class::•(), #t66) in #t66 in let final void #t68 = self::Extension|set#field(self::Extension|get#field(#t64), #t65) in #t65;
-  let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t69), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t70 = c in #t70.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t71 = self::Extension|method(new self::Class::•()) in let final void #t72 = self::Extension|set#field(self::Extension|get#field(#t70), #t71) in #t71;
-  let final self::Class? #t73 = c in #t73.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t73, let final self::Class? #t74 = self::Extension|get#field(new self::Class::•()) in let final void #t75 = self::Extension|set#field(new self::Class::•(), #t74) in #t74);
-  c = let final self::Class? #t76 = c in #t76.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t77 = let final self::Class? #t78 = self::Extension|get#field(new self::Class::•()) in let final void #t79 = self::Extension|set#field(new self::Class::•(), #t78) in #t78 in let final void #t80 = self::Extension|set#field(#t76, #t77) in #t77;
-  let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t81, let final self::Class* #t82 = let final self::Class* #t83 = new self::Class::•() in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(new self::Class::•(), #t82) in #t82);
-  c = let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t87 = let final self::Class* #t88 = let final self::Class* #t89 = new self::Class::•() in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t89) in #t89 in let final void #t91 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t92 = self::Extension|set#field(#t86, #t87) in #t87;
-  let final self::Class? #t93 = c in #t93.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t93, let final self::Class? #t94 = self::Extension|method(new self::Class::•()) in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94);
-  c = let final self::Class? #t96 = c in #t96.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t97 = let final self::Class? #t98 = self::Extension|method(new self::Class::•()) in let final void #t99 = self::Extension|set#field(new self::Class::•(), #t98) in #t98 in let final void #t100 = self::Extension|set#field(#t96, #t97) in #t97;
-  let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t101), self::Extension|get#field(new self::Class::•()));
-  c = let final self::Class? #t102 = c in #t102.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t103 = self::Extension|get#field(new self::Class::•()) in let final void #t104 = self::Extension|set#field(self::Extension|method(#t102), #t103) in #t103;
-  let final self::Class? #t105 = c in #t105.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t105), let final self::Class* #t106 = new self::Class::•() in let final void #t107 = self::Extension|set#field(new self::Class::•(), #t106) in #t106);
-  c = let final self::Class? #t108 = c in #t108.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t109 = let final self::Class* #t110 = new self::Class::•() in let final void #t111 = self::Extension|set#field(new self::Class::•(), #t110) in #t110 in let final void #t112 = self::Extension|set#field(self::Extension|method(#t108), #t109) in #t109;
-  let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t113), self::Extension|method(new self::Class::•()));
-  c = let final self::Class? #t114 = c in #t114.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t115 = self::Extension|method(new self::Class::•()) in let final void #t116 = self::Extension|set#field(self::Extension|method(#t114), #t115) in #t115;
-  let final self::Class? #t117 = c in #t117.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t117)));
-  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t118)), new self::Class::•());
-  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t119)), #t120) in #t120;
-  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t122)));
-  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t123, self::Extension|get#field(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t125 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t126 = self::Extension|set#field(#t124, #t125) in #t125;
-  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t127, let final self::Class* #t128 = new self::Class::•() in let final void #t129 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t128) in #t128);
-  c = let final self::Class? #t130 = c in #t130.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t131 = let final self::Class* #t132 = new self::Class::•() in let final void #t133 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t132) in #t132 in let final void #t134 = self::Extension|set#field(#t130, #t131) in #t131;
-  let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t135, self::Extension|method(self::Extension|method(new self::Class::•())));
-  c = let final self::Class? #t136 = c in #t136.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t137 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t138 = self::Extension|set#field(#t136, #t137) in #t137;
-  let final self::Class? #t139 = c in #t139.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t139)));
-  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t140)), new self::Class::•());
-  let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t141)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t9)));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t11 = new self::Class::•() in let final void #t12 = self::Extension|set#field(#t10, #t11) in #t11));
+  self::throws(() → self::Class? => self::Extension|get#field(let final self::Class? #t13 = c in #t13.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(#t13)));
+  c = let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t15 = new self::Class::•() in let final void #t16 = self::Extension|set#field(self::Extension|get#field(#t14), #t15) in #t15;
+  let final self::Class? #t17 = c in #t17.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(#t17));
+  let final self::Class? #t18 = c in #t18.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t18, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t20 = self::Extension|get#field(new self::Class::•()) in let final void #t21 = self::Extension|set#field(#t19, #t20) in #t20;
+  let final self::Class? #t22 = c in #t22.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t22, let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(new self::Class::•(), #t23) in #t23);
+  c = let final self::Class? #t25 = c in #t25.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t26 = let final self::Class* #t27 = new self::Class::•() in let final void #t28 = self::Extension|set#field(new self::Class::•(), #t27) in #t27 in let final void #t29 = self::Extension|set#field(#t25, #t26) in #t26;
+  let final self::Class? #t30 = c in #t30.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t30, self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t31 = c in #t31.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t32 = self::Extension|method(new self::Class::•()) in let final void #t33 = self::Extension|set#field(#t31, #t32) in #t32;
+  let final self::Class? #t34 = c in #t34.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(#t34));
+  let final self::Class? #t35 = c in #t35.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t35), new self::Class::•());
+  let final self::Class? #t36 = c in #t36.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(#t36));
+  let final self::Class? #t37 = c in #t37.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|get#field(#t37)));
+  let final self::Class? #t38 = c in #t38.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t38)), new self::Class::•());
+  c = let final self::Class? #t39 = c in #t39.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t40 = new self::Class::•() in let final void #t41 = self::Extension|set#field(self::Extension|get#field(self::Extension|get#field(#t39)), #t40) in #t40;
+  let final self::Class? #t42 = c in #t42.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|get#field(#t42)));
+  let final self::Class? #t43 = c in #t43.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t43, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t44 = c in #t44.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t45 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t46 = self::Extension|set#field(#t44, #t45) in #t45;
+  let final self::Class? #t47 = c in #t47.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t47, let final self::Class* #t48 = new self::Class::•() in let final void #t49 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t48) in #t48);
+  c = let final self::Class? #t50 = c in #t50.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t51 = let final self::Class* #t52 = new self::Class::•() in let final void #t53 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t52) in #t52 in let final void #t54 = self::Extension|set#field(#t50, #t51) in #t51;
+  let final self::Class? #t55 = c in #t55.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t55, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class? #t56 = c in #t56.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t57 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t58 = self::Extension|set#field(#t56, #t57) in #t57;
+  let final self::Class? #t59 = c in #t59.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|get#field(self::Extension|method(#t59)));
+  let final self::Class? #t60 = c in #t60.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(self::Extension|method(#t60)), new self::Class::•());
+  let final self::Class? #t61 = c in #t61.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|get#field(self::Extension|method(#t61)));
+  let final self::Class? #t62 = c in #t62.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t62), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t63 = c in #t63.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t64 = self::Extension|get#field(new self::Class::•()) in let final void #t65 = self::Extension|set#field(self::Extension|get#field(#t63), #t64) in #t64;
+  let final self::Class? #t66 = c in #t66.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|get#field(#t66), let final self::Class* #t67 = new self::Class::•() in let final void #t68 = self::Extension|set#field(new self::Class::•(), #t67) in #t67);
+  c = let final self::Class? #t69 = c in #t69.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t70 = let final self::Class* #t71 = new self::Class::•() in let final void #t72 = self::Extension|set#field(new self::Class::•(), #t71) in #t71 in let final void #t73 = self::Extension|set#field(self::Extension|get#field(#t69), #t70) in #t70;
+  let final self::Class? #t74 = c in #t74.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|get#field(#t74), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t75 = c in #t75.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t76 = self::Extension|method(new self::Class::•()) in let final void #t77 = self::Extension|set#field(self::Extension|get#field(#t75), #t76) in #t76;
+  let final self::Class? #t78 = c in #t78.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t78, let final self::Class? #t79 = self::Extension|get#field(new self::Class::•()) in let final void #t80 = self::Extension|set#field(new self::Class::•(), #t79) in #t79);
+  c = let final self::Class? #t81 = c in #t81.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t82 = let final self::Class? #t83 = self::Extension|get#field(new self::Class::•()) in let final void #t84 = self::Extension|set#field(new self::Class::•(), #t83) in #t83 in let final void #t85 = self::Extension|set#field(#t81, #t82) in #t82;
+  let final self::Class? #t86 = c in #t86.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t86, let final self::Class* #t87 = let final self::Class* #t88 = new self::Class::•() in let final void #t89 = self::Extension|set#field(new self::Class::•(), #t88) in #t88 in let final void #t90 = self::Extension|set#field(new self::Class::•(), #t87) in #t87);
+  c = let final self::Class? #t91 = c in #t91.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t92 = let final self::Class* #t93 = let final self::Class* #t94 = new self::Class::•() in let final void #t95 = self::Extension|set#field(new self::Class::•(), #t94) in #t94 in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t93) in #t93 in let final void #t97 = self::Extension|set#field(#t91, #t92) in #t92;
+  let final self::Class? #t98 = c in #t98.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t98, let final self::Class? #t99 = self::Extension|method(new self::Class::•()) in let final void #t100 = self::Extension|set#field(new self::Class::•(), #t99) in #t99);
+  c = let final self::Class? #t101 = c in #t101.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t102 = let final self::Class? #t103 = self::Extension|method(new self::Class::•()) in let final void #t104 = self::Extension|set#field(new self::Class::•(), #t103) in #t103 in let final void #t105 = self::Extension|set#field(#t101, #t102) in #t102;
+  let final self::Class? #t106 = c in #t106.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t106), self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class? #t107 = c in #t107.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t108 = self::Extension|get#field(new self::Class::•()) in let final void #t109 = self::Extension|set#field(self::Extension|method(#t107), #t108) in #t108;
+  let final self::Class? #t110 = c in #t110.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(#t110), let final self::Class* #t111 = new self::Class::•() in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class? #t113 = c in #t113.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = new self::Class::•() in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(self::Extension|method(#t113), #t114) in #t114;
+  let final self::Class? #t118 = c in #t118.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(self::Extension|method(#t118), self::Extension|method(new self::Class::•()));
+  c = let final self::Class? #t119 = c in #t119.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t120 = self::Extension|method(new self::Class::•()) in let final void #t121 = self::Extension|set#field(self::Extension|method(#t119), #t120) in #t120;
+  let final self::Class? #t122 = c in #t122.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|get#field(#t122)));
+  let final self::Class? #t123 = c in #t123.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t123)), new self::Class::•());
+  c = let final self::Class? #t124 = c in #t124.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t125 = new self::Class::•() in let final void #t126 = self::Extension|set#field(self::Extension|method(self::Extension|get#field(#t124)), #t125) in #t125;
+  let final self::Class? #t127 = c in #t127.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|get#field(#t127)));
+  let final self::Class? #t128 = c in #t128.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t128, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t129 = c in #t129.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t130 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t131 = self::Extension|set#field(#t129, #t130) in #t130;
+  let final self::Class? #t132 = c in #t132.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(#t132, let final self::Class* #t133 = new self::Class::•() in let final void #t134 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t133) in #t133);
+  c = let final self::Class? #t135 = c in #t135.{core::Object::==}(null) ?{self::Class*} null : let final self::Class* #t136 = let final self::Class* #t137 = new self::Class::•() in let final void #t138 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t137) in #t137 in let final void #t139 = self::Extension|set#field(#t135, #t136) in #t136;
+  let final self::Class? #t140 = c in #t140.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t140, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class? #t141 = c in #t141.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t142 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t143 = self::Extension|set#field(#t141, #t142) in #t142;
+  let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(self::Extension|method(self::Extension|method(#t144)));
+  let final self::Class? #t145 = c in #t145.{core::Object::==}(null) ?{self::Class*} null : self::Extension|set#field(self::Extension|method(self::Extension|method(#t145)), new self::Class::•());
+  let final self::Class? #t146 = c in #t146.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|method(self::Extension|method(#t146)));
 }
 static method indexAccess(self::Class? c) → void {
-  let final self::Class? #t142 = c in #t142.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t142), c);
-  let final self::Class? #t143 = c in #t143.{core::Object::==}(null) ?{void} null : self::Extension|[]=(self::Extension|get#field(#t143), c, new self::Class::•());
-  c = let final self::Class? #t144 = c in #t144.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t145 = self::Extension|get#field(#t144) in let final self::Class? #t146 = c in let final self::Class* #t147 = new self::Class::•() in let final void #t148 = self::Extension|[]=(#t145, #t146, #t147) in #t147;
-  let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t149), c));
-  let final self::Class? #t150 = c in #t150.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t151 = self::Extension|get#field(#t150) in let final self::Class? #t152 = c in self::Extension|[]=(#t151, #t152, self::Extension|+(self::Extension|[](#t151, #t152), 0));
-  c = let final self::Class? #t153 = c in #t153.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t154 = self::Extension|get#field(#t153) in let final self::Class? #t155 = c in let final self::Class? #t156 = self::Extension|+(self::Extension|[](#t154, #t155), 0) in let final void #t157 = self::Extension|[]=(#t154, #t155, #t156) in #t156;
-  let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in self::Extension|[]=(#t159, #t160, self::Extension|+(self::Extension|[](#t159, #t160), 1));
-  c = let final self::Class? #t161 = c in #t161.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t162 = self::Extension|get#field(#t161) in let final self::Class? #t163 = c in let final self::Class? #t164 = self::Extension|[](#t162, #t163) in let final void #t165 = self::Extension|[]=(#t162, #t163, self::Extension|+(#t164, 1)) in #t164;
-  let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|+(self::Extension|[](#t167, #t168), 1) in let final void #t170 = self::Extension|[]=(#t167, #t168, #t169) in #t169;
-  c = let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  let final self::Class? #t147 = c in #t147.{core::Object::==}(null) ?{self::Class?} null : self::Extension|[](self::Extension|get#field(#t147), c);
+  let final self::Class? #t148 = c in #t148.{core::Object::==}(null) ?{self::Class*} null : self::Extension|[]=(self::Extension|get#field(#t148), c, new self::Class::•());
+  c = let final self::Class? #t149 = c in #t149.{core::Object::==}(null) ?{self::Class*} null : let final self::Class? #t150 = self::Extension|get#field(#t149) in let final self::Class? #t151 = c in let final self::Class* #t152 = new self::Class::•() in let final void #t153 = self::Extension|[]=(#t150, #t151, #t152) in #t152;
+  let final self::Class? #t154 = c in #t154.{core::Object::==}(null) ?{self::Class?} null : self::Extension|method(self::Extension|[](self::Extension|get#field(#t154), c));
+  let final self::Class? #t155 = c in #t155.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t156 = self::Extension|get#field(#t155) in let final self::Class? #t157 = c in self::Extension|[]=(#t156, #t157, self::Extension|+(self::Extension|[](#t156, #t157), 0));
+  c = let final self::Class? #t158 = c in #t158.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t159 = self::Extension|get#field(#t158) in let final self::Class? #t160 = c in let final self::Class? #t161 = self::Extension|+(self::Extension|[](#t159, #t160), 0) in let final void #t162 = self::Extension|[]=(#t159, #t160, #t161) in #t161;
+  let final self::Class? #t163 = c in #t163.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t164 = self::Extension|get#field(#t163) in let final self::Class? #t165 = c in self::Extension|[]=(#t164, #t165, self::Extension|+(self::Extension|[](#t164, #t165), 1));
+  c = let final self::Class? #t166 = c in #t166.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t167 = self::Extension|get#field(#t166) in let final self::Class? #t168 = c in let final self::Class? #t169 = self::Extension|[](#t167, #t168) in let final void #t170 = self::Extension|[]=(#t167, #t168, self::Extension|+(#t169, 1)) in #t169;
+  let final self::Class? #t171 = c in #t171.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t172 = self::Extension|get#field(#t171) in let final self::Class? #t173 = c in let final self::Class? #t174 = self::Extension|+(self::Extension|[](#t172, #t173), 1) in let final void #t175 = self::Extension|[]=(#t172, #t173, #t174) in #t174;
+  c = let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t177 = self::Extension|get#field(#t176) in let final self::Class? #t178 = c in let final self::Class? #t179 = self::Extension|+(self::Extension|[](#t177, #t178), 1) in let final void #t180 = self::Extension|[]=(#t177, #t178, #t179) in #t179;
 }
 static method operatorAccess(self::Class? c) → void {
-  let final self::Class? #t176 = c in #t176.{core::Object::==}(null) ?{self::Class?} null : self::Extension|+(self::Extension|get#field(#t176), 0);
-  let final self::Class? #t177 = c in #t177.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t177, self::Extension|+(self::Extension|get#field(#t177), 0));
-  c = let final self::Class? #t178 = c in #t178.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t179 = self::Extension|+(self::Extension|get#field(#t178), 0) in let final void #t180 = self::Extension|set#field(#t178, #t179) in #t179;
-  let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t182 = self::Extension|get#field(#t181) in self::Extension|set#field(#t182, self::Extension|+(self::Extension|get#field(#t182), 0));
-  c = let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t184 = self::Extension|get#field(#t183) in let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
-  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t187, self::Extension|+(self::Extension|get#field(#t187), 1));
-  c = let final self::Class? #t188 = c in #t188.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t189 = self::Extension|get#field(#t188) in let final void #t190 = self::Extension|set#field(#t188, self::Extension|+(#t189, 1)) in #t189;
-  let final self::Class? #t191 = c in #t191.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t192 = self::Extension|+(self::Extension|get#field(#t191), 1) in let final void #t193 = self::Extension|set#field(#t191, #t192) in #t192;
-  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|+(self::Extension|get#field(#t194), 1) in let final void #t196 = self::Extension|set#field(#t194, #t195) in #t195;
+  self::throws(() → self::Class? => self::Extension|+(let final self::Class? #t181 = c in #t181.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t181), 0));
+  self::throws(() → self::Class? => self::Extension|unary-(let final self::Class? #t182 = c in #t182.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t182)));
+  let final self::Class? #t183 = c in #t183.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t183, self::Extension|+(self::Extension|get#field(#t183), 0));
+  c = let final self::Class? #t184 = c in #t184.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t185 = self::Extension|+(self::Extension|get#field(#t184), 0) in let final void #t186 = self::Extension|set#field(#t184, #t185) in #t185;
+  let final self::Class? #t187 = c in #t187.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t188 = self::Extension|get#field(#t187) in self::Extension|set#field(#t188, self::Extension|+(self::Extension|get#field(#t188), 0));
+  c = let final self::Class? #t189 = c in #t189.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t190 = self::Extension|get#field(#t189) in let final self::Class? #t191 = self::Extension|+(self::Extension|get#field(#t190), 0) in let final void #t192 = self::Extension|set#field(#t190, #t191) in #t191;
+  let final self::Class? #t193 = c in #t193.{core::Object::==}(null) ?{self::Class?} null : self::Extension|set#field(#t193, self::Extension|+(self::Extension|get#field(#t193), 1));
+  c = let final self::Class? #t194 = c in #t194.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t195 = self::Extension|get#field(#t194) in let final void #t196 = self::Extension|set#field(#t194, self::Extension|+(#t195, 1)) in #t195;
+  let final self::Class? #t197 = c in #t197.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t198 = self::Extension|+(self::Extension|get#field(#t197), 1) in let final void #t199 = self::Extension|set#field(#t197, #t198) in #t198;
+  c = let final self::Class? #t200 = c in #t200.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t201 = self::Extension|+(self::Extension|get#field(#t200), 1) in let final void #t202 = self::Extension|set#field(#t200, #t201) in #t201;
 }
 static method ifNull(self::Class? c) → void {
-  let final self::Class? #t197 = c in #t197.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t197).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t197, c) : null;
-  c = let final self::Class? #t198 = c in #t198.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t199 = self::Extension|get#field(#t198) in #t199.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t200 = c in let final void #t201 = self::Extension|set#field(#t198, #t200) in #t200 : #t199;
-  let final self::Class? #t202 = c in #t202.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t203 = self::Extension|get#field(#t202) in let final self::Class? #t204 = c in self::Extension|[](#t203, #t204).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t203, #t204, c) : null;
+  let final self::Class? #t203 = c in #t203.{core::Object::==}(null) ?{self::Class?} null : self::Extension|get#field(#t203).{core::Object::==}(null) ?{self::Class?} self::Extension|set#field(#t203, c) : null;
+  c = let final self::Class? #t204 = c in #t204.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t205 = self::Extension|get#field(#t204) in #t205.{core::Object::==}(null) ?{self::Class?} let final self::Class? #t206 = c in let final void #t207 = self::Extension|set#field(#t204, #t206) in #t206 : #t205;
+  let final self::Class? #t208 = c in #t208.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t209 = self::Extension|get#field(#t208) in let final self::Class? #t210 = c in self::Extension|[](#t209, #t210).{core::Object::==}(null) ?{self::Class?} self::Extension|[]=(#t209, #t210, c) : null;
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.type_promotion.expect
deleted file mode 100644
index e88f73d..0000000
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.type_promotion.expect
+++ /dev/null
@@ -1,93 +0,0 @@
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:35:5: Context: Write to c@681
-  c = c?.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:40:5: Context: Write to c@681
-  c = c?.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:43:5: Context: Write to c@681
-  c = c?.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:45:5: Context: Write to c@681
-  c = c?.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:47:5: Context: Write to c@681
-  c = c?.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:54:5: Context: Write to c@681
-  c = c?.field.field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:57:5: Context: Write to c@681
-  c = c?.field = new Class().field.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:59:5: Context: Write to c@681
-  c = c?.field = new Class().field.field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:61:5: Context: Write to c@681
-  c = c?.field = new Class().field.method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:67:5: Context: Write to c@681
-  c = c?.field.field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:69:5: Context: Write to c@681
-  c = c?.field.field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:71:5: Context: Write to c@681
-  c = c?.field.field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:73:5: Context: Write to c@681
-  c = c?.field = new Class().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:75:5: Context: Write to c@681
-  c = c?.field = new Class().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:77:5: Context: Write to c@681
-  c = c?.field = new Class().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:79:5: Context: Write to c@681
-  c = c?.method().field = new Class().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:81:5: Context: Write to c@681
-  c = c?.method().field = new Class().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:83:5: Context: Write to c@681
-  c = c?.method().field = new Class().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:87:5: Context: Write to c@681
-  c = c?.field.method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:90:5: Context: Write to c@681
-  c = c?.field = new Class().method().field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:92:5: Context: Write to c@681
-  c = c?.field = new Class().method().field = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:5: Context: Write to c@681
-  c = c?.field = new Class().method().method();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:107:5: Context: Write to c@681
-  c = c?.field[c] = new Class();
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:110:5: Context: Write to c@681
-  c = c?.field[c] += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:114:5: Context: Write to c@681
-  c = c?.field[c]++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:116:5: Context: Write to c@681
-  c = ++c?.field[c];
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:123:5: Context: Write to c@681
-  c = c?.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:125:5: Context: Write to c@681
-  c = c?.field.field += 0;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:129:5: Context: Write to c@681
-  c = c?.field++;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:131:5: Context: Write to c@681
-  c = ++c?.field;
-    ^
-pkg/front_end/testcases/nnbd/null_shorting_extension.dart:136:5: Context: Write to c@681
-  c = c?.field ??= c;
-    ^
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart b/pkg/front_end/testcases/nnbd/opt_out.dart
new file mode 100644
index 0000000..8816bd9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'opt_out_lib.dart';
+
+main() {}
+
+noErrors() {
+  String? s = null;
+}
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
new file mode 100644
index 0000000..0661ed3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method main() → dynamic
+  ;
+static method noErrors() → dynamic
+  ;
+
+library;
+import self as self2;
+
+static method errors() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
new file mode 100644
index 0000000..4d98003
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method main() → dynamic {}
+static method noErrors() → dynamic {
+  core::String? s = null;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:8:9: Error: This requires the 'non-nullable' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+//   String? s = null;
+//         ^
+//
+import self as self2;
+import "dart:core" as core;
+
+static method errors() → dynamic {
+  core::String? s = null;
+}
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
new file mode 100644
index 0000000..4d98003
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method main() → dynamic {}
+static method noErrors() → dynamic {
+  core::String? s = null;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:8:9: Error: This requires the 'non-nullable' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+//   String? s = null;
+//         ^
+//
+import self as self2;
+import "dart:core" as core;
+
+static method errors() → dynamic {
+  core::String? s = null;
+}
diff --git a/pkg/front_end/testcases/nnbd/opt_out_lib.dart b/pkg/front_end/testcases/nnbd/opt_out_lib.dart
new file mode 100644
index 0000000..789d84a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/opt_out_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.5
+
+errors() {
+  String? s = null;
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect
deleted file mode 100644
index 8dc5a4c..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart:34:14: Context: Write to value@1053
-  if ((value = b.foo()) != "baz") {
-             ^
-pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart:37:14: Context: Write to value@1053
-  if ((value = b.hest()) != 42) {
-             ^
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index e90a514..33482fb 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -43,6 +43,8 @@
 inference_new/infer_field_override_accessors: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 
+nnbd/inheritance_from_opt_out: TypeCheckError
+
 rasta/native_is_illegal: Pass # Issue 29763
 
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect
deleted file mode 100644
index 2beae6f..0000000
--- a/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/rasta/for_loop.dart:7:29: Context: Write to i@292
-  for (int i = 0; i < 100; i++) {
-                            ^^
-pkg/front_end/testcases/rasta/for_loop.dart:8:12: Context: Write to i@292
-    print(i++);
-           ^^
-pkg/front_end/testcases/rasta/for_loop.dart:10:53: Context: Write to i@292
-  for (int i = 0; i < 100; c < 42 ? throw "fisk" : i++) {
-                                                    ^^
-pkg/front_end/testcases/rasta/for_loop.dart:11:12: Context: Write to i@292
-    print(i++);
-           ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect
deleted file mode 100644
index 4904aab..0000000
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/rasta/issue_000004.dart:10:7: Context: Write to f@273
-    f *= n;
-      ^^
-pkg/front_end/testcases/rasta/issue_000004.dart:18:7: Context: Write to f@359
-    f *= n;
-      ^^
-pkg/front_end/testcases/rasta/issue_000004.dart:27:7: Context: Write to f@459
-    f *= global;
-      ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect
deleted file mode 100644
index f2b5d7c..0000000
--- a/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/rasta/issue_000069.dart:7:11: Context: Write to i@237
-  while (i++ < 5) var x = i;
-          ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect
deleted file mode 100644
index 27f599e..0000000
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/rasta/issue_000070.dart:11:21: Context: Possible promotion of n@306
-    Expect.isTrue(n is N);
-                    ^^
-pkg/front_end/testcases/rasta/issue_000070.dart:12:21: Context: Possible promotion of s@311
-    Expect.isTrue(s is S);
-                    ^^
-pkg/front_end/testcases/rasta/issue_000070.dart:18:21: Context: Possible promotion of s@311
-    Expect.isTrue(s is S);
-                    ^^
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect
deleted file mode 100644
index a1bf30c..0000000
--- a/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/rasta/super_operator.dart:18:34: Context: Write to i@401
-  operator []=(i, val) => super[i++] += val;
-                                 ^^
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect
deleted file mode 100644
index 4aebb51..0000000
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:33:21: Context: Write to result@1329
-    case 1:  result = 1;
-                    ^
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:21: Context: Write to result@1329
-    case 2:  result = 2; /// static warning - case fall-through, see "Switch"
-                    ^
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:21: Context: Write to result@1329
-    case 3:  result = 3; /// static warning - case fall-through, see "Switch"
-                    ^
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:37:21: Context: Write to result@1329
-    default: result = 4;
-                    ^
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:47:20: Context: Write to result@1636
-    case 2: result = 1; /// static warning - case fall-through, see "Switch"
-                   ^
-pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:49:20: Context: Write to result@1636
-    case 4: result = 2;
-                   ^
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect
deleted file mode 100644
index 9514d8e..0000000
--- a/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/regress/issue_31184.dart:6:28: Context: Write to i@243
-  for (int i = 0, i > 10; i++) {}
-                           ^^
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect
deleted file mode 100644
index 64406e2..0000000
--- a/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-pkg/front_end/testcases/regress/issue_33452.dart:11:5: Context: Write to x@296
-  x = new ExistingClass();
-    ^
-pkg/front_end/testcases/regress/issue_33452.dart:12:5: Context: Write to x@296
-  x = new ExistingClass<String>();
-    ^
-pkg/front_end/testcases/regress/issue_33452.dart:13:5: Context: Write to x@296
-  x = new ExistingClass<String>.nonExistingConstructor();
-    ^
-pkg/front_end/testcases/regress/issue_33452.dart:14:5: Context: Write to x@296
-  x = new ExistingClass<String, String>.nonExistingConstructor();
-    ^
-pkg/front_end/testcases/regress/issue_33452.dart:15:5: Context: Write to x@296
-  x = new NonExistingClass();
-    ^
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect
deleted file mode 100644
index 929bc26..0000000
--- a/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/regress/issue_33672.dart:7:34: Context: Write to a@260
-  yield: for (int a = 0; a < 10; ++a) {
-                                 ^^
-pkg/front_end/testcases/regress/issue_33672.dart:8:29: Context: Write to b@295
-    for (int b = 0; b < 10; ++b) {
-                            ^^
-pkg/front_end/testcases/regress/issue_33672.dart:9:7: Context: Write to count@231
-      ++count;
-      ^^
-pkg/front_end/testcases/regress/issue_33672.dart:12:5: Context: Write to count@231
-    ++count;
-    ^^
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect
deleted file mode 100644
index 77d54c8..0000000
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart:11:25: Context: Write to i@310
-    for (int i = 0; o; i++) {}
-                        ^^
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
deleted file mode 100644
index 0a2841f..0000000
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:22:50: Context: Write to b@535
-  b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
-                                                 ^^
-pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:23:58: Context: Write to b@535
-  var x = b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
-                                                         ^^
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect
deleted file mode 100644
index 52a0161..0000000
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:51:5: Context: Write to d@1119
-  d = new D(new C(numToNum));
-    ^
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index a78d1d1..626187039 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -112,6 +112,7 @@
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
 instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
 nnbd/nullable_param: RuntimeError
+nnbd/inheritance_from_opt_out: TypeCheckError
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 681bed8..c70f507 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,7 +6,6 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
-all_variances: TextSerializationFailure
 expression/eval: TextSerializationFailure # Was: Pass
 expression/main: TextSerializationFailure # Was: Pass
 extensions/annotations: TextSerializationFailure
@@ -16,6 +15,8 @@
 extensions/conflict_with_object: TextSerializationFailure
 extensions/conflicts: TextSerializationFailure
 extensions/default_values: TextSerializationFailure
+extensions/deferred_explicit_access: TextSerializationFailure
+extensions/deferred_import_hidden: TextSerializationFailure
 extensions/direct_instance_access: TextSerializationFailure
 extensions/direct_static_access: TextSerializationFailure
 extensions/dynamic_invoke: TextSerializationFailure
@@ -35,6 +36,7 @@
 extensions/if_null: TextSerializationFailure
 extensions/implicit_extension_inference: TextSerializationFailure
 extensions/implicit_this: TextSerializationFailure
+extensions/import_via_prefix: TextSerializationFailure
 extensions/index: TextSerializationFailure
 extensions/instance_access: TextSerializationFailure
 extensions/instance_access_of_static: TextSerializationFailure
@@ -69,6 +71,7 @@
 general/abstract_members: TypeCheckError
 general/abstract_overrides_concrete_with_no_such_method: TextSerializationFailure
 general/accessors: TextSerializationFailure # Was: RuntimeError
+general/all_variances: TextSerializationFailure
 general/ambiguous_exports: TextSerializationFailure # Was: RuntimeError # Expected, this file exports two main methods.
 general/annotation_eof: TextSerializationFailure # Was: Pass
 general/annotation_on_enum_values: TextSerializationFailure # Was: Pass
@@ -235,6 +238,7 @@
 general/nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
 general/nested_property_set: TextSerializationFailure
 general/nested_variable_set: TextSerializationFailure
+general/nested_variance: TextSerializationFailure
 general/no_such_method_private_setter: TextSerializationFailure # Was: Pass
 general/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
 general/non_covariant_checks: TextSerializationFailure
@@ -885,10 +889,12 @@
 instantiate_to_bound/typedef_omitted_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_raw_in_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_super_bounded_type: TextSerializationFailure # Was: Pass
-nested_variance_test: TextSerializationFailure
 new_const_insertion/simple: TextSerializationFailure # Was: Pass
 nnbd/function_types: TextSerializationFailure
+nnbd/inheritance_from_opt_out: TypeCheckError
 nnbd/intersection_types: TextSerializationFailure
+nnbd/issue_39286: TextSerializationFailure
+nnbd/issue_39286_2: TextSerializationFailure
 nnbd/late: TextSerializationFailure
 nnbd/null_check: TextSerializationFailure
 nnbd/null_shorting: TextSerializationFailure
@@ -896,6 +902,7 @@
 nnbd/null_shorting_extension: TextSerializationFailure
 nnbd/nullable_null: TextSerializationFailure
 nnbd/nullable_param: TextSerializationFailure
+nnbd/opt_out: TextSerializationFailure
 nnbd/required: TextSerializationFailure
 nnbd/simple_never: TextSerializationFailure
 nnbd/substitution_in_inference: TextSerializationFailure
@@ -1166,3 +1173,4 @@
 unified_collections/mixed_entries: TextSerializationFailure
 variance/class_type_parameter_modifier: TextSerializationFailure
 variance/mixin_type_parameter_modifier: TextSerializationFailure
+variance/generic_covariance_sound_variance: TextSerializationFailure
diff --git a/pkg/front_end/testcases/type_promotion_look_ahead.status b/pkg/front_end/testcases/type_promotion_look_ahead.status
deleted file mode 100644
index bee4fdc..0000000
--- a/pkg/front_end/testcases/type_promotion_look_ahead.status
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE.md file.
-
-# Status file for the ../test/fasta/type_promotion_look_ahead_test.dart test suite.
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.type_promotion.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.type_promotion.expect
deleted file mode 100644
index f87b142..0000000
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.type_promotion.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:21:64: Context: Write to i@665
-var map8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]: 1};
-                                                               ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:22:54: Context: Write to i@665
-var map9 = {if (b) for (var i = 0; i < list.length; i++) list[i]: 1 else 0: 1};
-                                                     ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:24:54: Context: Write to i@665
-  if (b) 0: 1 else for (var i = 0; i < list.length; i++) ...{list[i]: 1}
-                                                     ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:27:44: Context: Write to i@665
-  if (b) for (var i = 0; i < list.length; i++) ...{list[i]: 1} else 0: 1
-                                           ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:66: Context: Write to i@665
-var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
-                                                                 ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:56: Context: Write to i@665
-var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
-                                                       ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:44:54: Context: Write to i@665
-  if (b) 0: 1 else for (var i = 0; i < list.length; i++) ...{list[i]}
-                                                     ^^
-pkg/front_end/testcases/unified_collections/mixed_entries.dart:47:44: Context: Write to i@665
-  if (b) for (var i = 0; i < list.length; i++) ...{list[i]} else 0: 1
-                                           ^^
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart
new file mode 100644
index 0000000..9400df5
--- /dev/null
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef ContraFunction<T> = void Function(T);
+typedef InvFunction<T> = T Function(T);
+class Contravariant<in T> {}
+class Invariant<inout T> {}
+
+class A<in T, out U, V> {
+  final void Function(T) field = null;
+  void method(T t, void Function(U) u, V v) {}
+  void method2(T x, [T y]) {}
+  void set x(T t) {}
+  Map<U, Contravariant<V>> get mapContra => new Map<U, Contravariant<V>>();
+  Map<U, ContraFunction<V>> get mapContraFn => new Map<U, ContraFunction<V>>();
+  Map<U, Invariant<V>> get mapInv => new Map<U, Invariant<V>>();
+  Map<U, InvFunction<V>> get mapInvFn => new Map<U, InvFunction<V>>();
+}
+
+class B<inout T> {
+  T x;
+  T method(T x) => null;
+  void set y(T x) {}
+}
+
+class C<in T> {
+  final void Function(T) field = null;
+  void method(T x, [T y]) {}
+  void set x(T t) {}
+}
+
+abstract class D<T> {
+  int method(T x);
+}
+
+class E<inout T> {
+  final void Function(T) f;
+  E(this.f);
+  int method(T x) {
+    f(x);
+  }
+}
+
+class F<inout T> extends E<T> implements D<T> {
+  F(void Function(T) f) : super(f);
+}
+
+main() {
+  A<int, num, String> a = new A();
+  expect(null, a.field);
+  a.method(3, (num) {}, "test");
+  a.method2(3);
+  a.x = 3;
+  Map<num, Contravariant<String>> mapContra = a.mapContra;
+  Map<num, ContraFunction<String>> mapContraFn = a.mapContraFn;
+  Map<num, Invariant<String>> mapInv = a.mapInv;
+  Map<num, InvFunction<String>> mapInvFn = a.mapInvFn;
+
+  B<int> b = new B();
+  b.x = 3;
+  expect(3, b.x);
+  expect(null, b.method(3));
+  b.y = 3;
+
+  C<int> c = new C();
+  expect(null, c.field);
+  c.method(3, 2);
+  c.x = 3;
+
+  D<Object> d = new F<String>((String s) {});
+  d.method("test");
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
new file mode 100644
index 0000000..6260243
--- /dev/null
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef ContraFunction<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef InvFunction<invariant T extends core::Object* = dynamic> = (T*) →* T*;
+class Contravariant<contravariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Contravariant<self::Contravariant::T*>*
+    ;
+}
+class Invariant<invariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Invariant<self::Invariant::T*>*
+    ;
+}
+class A<contravariant T extends core::Object* = dynamic, U extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
+  final field (self::A::T*) →* void field;
+  synthetic constructor •() → self::A<self::A::T*, self::A::U*, self::A::V*>*
+    ;
+  method method(self::A::T* t, (self::A::U*) →* void u, generic-covariant-impl self::A::V* v) → void
+    ;
+  method method2(self::A::T* x, [self::A::T* y]) → void
+    ;
+  set x(self::A::T* t) → void
+    ;
+  get mapContra() → core::Map<self::A::U*, self::Contravariant<self::A::V*>*>*
+    ;
+  get mapContraFn() → core::Map<self::A::U*, (self::A::V*) →* void>*
+    ;
+  get mapInv() → core::Map<self::A::U*, self::Invariant<self::A::V*>*>*
+    ;
+  get mapInvFn() → core::Map<self::A::U*, (self::A::V*) →* self::A::V*>*
+    ;
+}
+class B<invariant T extends core::Object* = dynamic> extends core::Object {
+  field self::B::T* x;
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method method(self::B::T* x) → self::B::T*
+    ;
+  set y(self::B::T* x) → void
+    ;
+}
+class C<contravariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::C::T*) →* void field;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method method(self::C::T* x, [self::C::T* y]) → void
+    ;
+  set x(self::C::T* t) → void
+    ;
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  abstract method method(generic-covariant-impl self::D::T* x) → core::int*;
+}
+class E<invariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::E::T*) →* void f;
+  constructor •((self::E::T*) →* void f) → self::E<self::E::T*>*
+    ;
+  method method(self::E::T* x) → core::int*
+    ;
+}
+class F<invariant T extends core::Object* = dynamic> extends self::E<self::F::T*> implements self::D<self::F::T*> {
+  constructor •((self::F::T*) →* void f) → self::F<self::F::T*>*
+    ;
+  forwarding-stub method method(generic-covariant-impl self::F::T* x) → core::int*
+    return super.{self::E::method}(x);
+}
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
new file mode 100644
index 0000000..0c751d4
--- /dev/null
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
@@ -0,0 +1,103 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef ContraFunction<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef InvFunction<invariant T extends core::Object* = dynamic> = (T*) →* T*;
+class Contravariant<contravariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Contravariant<self::Contravariant::T*>*
+    : super core::Object::•()
+    ;
+}
+class Invariant<invariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Invariant<self::Invariant::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<contravariant T extends core::Object* = dynamic, U extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
+  final field (self::A::T*) →* void field = null;
+  synthetic constructor •() → self::A<self::A::T*, self::A::U*, self::A::V*>*
+    : super core::Object::•()
+    ;
+  method method(self::A::T* t, (self::A::U*) →* void u, generic-covariant-impl self::A::V* v) → void {}
+  method method2(self::A::T* x, [self::A::T* y = #C1]) → void {}
+  set x(self::A::T* t) → void {}
+  get mapContra() → core::Map<self::A::U*, self::Contravariant<self::A::V*>*>*
+    return core::Map::•<self::A::U*, self::Contravariant<self::A::V*>*>();
+  get mapContraFn() → core::Map<self::A::U*, (self::A::V*) →* void>*
+    return core::Map::•<self::A::U*, (self::A::V*) →* void>();
+  get mapInv() → core::Map<self::A::U*, self::Invariant<self::A::V*>*>*
+    return core::Map::•<self::A::U*, self::Invariant<self::A::V*>*>();
+  get mapInvFn() → core::Map<self::A::U*, (self::A::V*) →* self::A::V*>*
+    return core::Map::•<self::A::U*, (self::A::V*) →* self::A::V*>();
+}
+class B<invariant T extends core::Object* = dynamic> extends core::Object {
+  field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method method(self::B::T* x) → self::B::T*
+    return null;
+  set y(self::B::T* x) → void {}
+}
+class C<contravariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::C::T*) →* void field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method method(self::C::T* x, [self::C::T* y = #C1]) → void {}
+  set x(self::C::T* t) → void {}
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract method method(generic-covariant-impl self::D::T* x) → core::int*;
+}
+class E<invariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::E::T*) →* void f;
+  constructor •((self::E::T*) →* void f) → self::E<self::E::T*>*
+    : self::E::f = f, super core::Object::•()
+    ;
+  method method(self::E::T* x) → core::int* {
+    this.{self::E::f}(x);
+  }
+}
+class F<invariant T extends core::Object* = dynamic> extends self::E<self::F::T*> implements self::D<self::F::T*> {
+  constructor •((self::F::T*) →* void f) → self::F<self::F::T*>*
+    : super self::E::•(f)
+    ;
+  forwarding-stub method method(generic-covariant-impl self::F::T* x) → core::int*
+    return super.{self::E::method}(x);
+}
+static method main() → dynamic {
+  self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
+  self::expect(null, a.{self::A::field});
+  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method2}(3);
+  a.{self::A::x} = 3;
+  core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError} core::Map<core::num*, self::Contravariant<core::String*>*>*;
+  core::Map<core::num*, (core::String*) →* void>* mapContraFn = a.{self::A::mapContraFn} as{TypeError} core::Map<core::num*, (core::String*) →* void>*;
+  core::Map<core::num*, self::Invariant<core::String*>*>* mapInv = a.{self::A::mapInv} as{TypeError} core::Map<core::num*, self::Invariant<core::String*>*>*;
+  core::Map<core::num*, (core::String*) →* core::String*>* mapInvFn = a.{self::A::mapInvFn} as{TypeError} core::Map<core::num*, (core::String*) →* core::String*>*;
+  self::B<core::int*>* b = new self::B::•<core::int*>();
+  b.{self::B::x} = 3;
+  self::expect(3, b.{self::B::x});
+  self::expect(null, b.{self::B::method}(3));
+  b.{self::B::y} = 3;
+  self::C<core::int*>* c = new self::C::•<core::int*>();
+  self::expect(null, c.{self::C::field});
+  c.{self::C::method}(3, 2);
+  c.{self::C::x} = 3;
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  d.{self::D::method}("test");
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
new file mode 100644
index 0000000..0c751d4
--- /dev/null
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
@@ -0,0 +1,103 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef ContraFunction<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef InvFunction<invariant T extends core::Object* = dynamic> = (T*) →* T*;
+class Contravariant<contravariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Contravariant<self::Contravariant::T*>*
+    : super core::Object::•()
+    ;
+}
+class Invariant<invariant T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Invariant<self::Invariant::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<contravariant T extends core::Object* = dynamic, U extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
+  final field (self::A::T*) →* void field = null;
+  synthetic constructor •() → self::A<self::A::T*, self::A::U*, self::A::V*>*
+    : super core::Object::•()
+    ;
+  method method(self::A::T* t, (self::A::U*) →* void u, generic-covariant-impl self::A::V* v) → void {}
+  method method2(self::A::T* x, [self::A::T* y = #C1]) → void {}
+  set x(self::A::T* t) → void {}
+  get mapContra() → core::Map<self::A::U*, self::Contravariant<self::A::V*>*>*
+    return core::Map::•<self::A::U*, self::Contravariant<self::A::V*>*>();
+  get mapContraFn() → core::Map<self::A::U*, (self::A::V*) →* void>*
+    return core::Map::•<self::A::U*, (self::A::V*) →* void>();
+  get mapInv() → core::Map<self::A::U*, self::Invariant<self::A::V*>*>*
+    return core::Map::•<self::A::U*, self::Invariant<self::A::V*>*>();
+  get mapInvFn() → core::Map<self::A::U*, (self::A::V*) →* self::A::V*>*
+    return core::Map::•<self::A::U*, (self::A::V*) →* self::A::V*>();
+}
+class B<invariant T extends core::Object* = dynamic> extends core::Object {
+  field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method method(self::B::T* x) → self::B::T*
+    return null;
+  set y(self::B::T* x) → void {}
+}
+class C<contravariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::C::T*) →* void field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method method(self::C::T* x, [self::C::T* y = #C1]) → void {}
+  set x(self::C::T* t) → void {}
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract method method(generic-covariant-impl self::D::T* x) → core::int*;
+}
+class E<invariant T extends core::Object* = dynamic> extends core::Object {
+  final field (self::E::T*) →* void f;
+  constructor •((self::E::T*) →* void f) → self::E<self::E::T*>*
+    : self::E::f = f, super core::Object::•()
+    ;
+  method method(self::E::T* x) → core::int* {
+    this.{self::E::f}(x);
+  }
+}
+class F<invariant T extends core::Object* = dynamic> extends self::E<self::F::T*> implements self::D<self::F::T*> {
+  constructor •((self::F::T*) →* void f) → self::F<self::F::T*>*
+    : super self::E::•(f)
+    ;
+  forwarding-stub method method(generic-covariant-impl self::F::T* x) → core::int*
+    return super.{self::E::method}(x);
+}
+static method main() → dynamic {
+  self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
+  self::expect(null, a.{self::A::field});
+  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method2}(3);
+  a.{self::A::x} = 3;
+  core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError} core::Map<core::num*, self::Contravariant<core::String*>*>*;
+  core::Map<core::num*, (core::String*) →* void>* mapContraFn = a.{self::A::mapContraFn} as{TypeError} core::Map<core::num*, (core::String*) →* void>*;
+  core::Map<core::num*, self::Invariant<core::String*>*>* mapInv = a.{self::A::mapInv} as{TypeError} core::Map<core::num*, self::Invariant<core::String*>*>*;
+  core::Map<core::num*, (core::String*) →* core::String*>* mapInvFn = a.{self::A::mapInvFn} as{TypeError} core::Map<core::num*, (core::String*) →* core::String*>*;
+  self::B<core::int*>* b = new self::B::•<core::int*>();
+  b.{self::B::x} = 3;
+  self::expect(3, b.{self::B::x});
+  self::expect(null, b.{self::B::method}(3));
+  b.{self::B::y} = 3;
+  self::C<core::int*>* c = new self::C::•<core::int*>();
+  self::expect(null, c.{self::C::field});
+  c.{self::C::method}(3, 2);
+  c.{self::C::x} = 3;
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  d.{self::D::method}("test");
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 73550ac..e2cbcce 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -374,23 +374,6 @@
       "command-lines": [
         "-cdart2js -rd8 --use-sdk --minified language language_2 dart2js_extra dart2js_native corelib corelib_2"
       ]
-    },
-    {
-      "name": "type_promotion_look_ahead",
-      "kind": "Chain",
-      "source": "test/fasta/type_promotion_look_ahead_suite.dart",
-      "path": "testcases/",
-      "status": "testcases/type_promotion_look_ahead.status",
-      "pattern": [
-        "\\.dart$"
-      ],
-      "exclude": [
-        "/testcases/.*_part[0-9]*\\.dart$",
-        "/testcases/.*_lib[0-9]*\\.dart$",
-        "/testcases/dartino/",
-        "/testcases/shaker/",
-        "/testcases/expression/"
-      ]
     }
   ],
   "analyze": {
diff --git a/pkg/front_end/tool/_fasta/dump_partial.dart b/pkg/front_end/tool/_fasta/dump_partial.dart
index 875e62b..af8db5a 100644
--- a/pkg/front_end/tool/_fasta/dump_partial.dart
+++ b/pkg/front_end/tool/_fasta/dump_partial.dart
@@ -70,6 +70,7 @@
   // partial.dill file.
   loadComponentFromBytes(partialDill, context);
   var result = context.libraries
+      // ignore: DEPRECATED_MEMBER_USE
       .where((l) => !l.isExternal)
       .map((l) => l.importUri)
       .toSet();
@@ -78,5 +79,6 @@
 }
 
 void _updateIsExternal(Component component, bool toValue) {
+  // ignore: DEPRECATED_MEMBER_USE
   component.libraries.forEach((lib) => lib.isExternal = toValue);
 }
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index b4c1cde..15e2e6e 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -344,6 +344,7 @@
   }
 
   await writeComponentToFile(component, fullOutput,
+      // ignore: DEPRECATED_MEMBER_USE
       filter: (lib) => !lib.isExternal);
 
   c.options.ticker.logMs("Wrote component to ${fullOutput.toFilePath()}");
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index a047f73..2037866 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -219,10 +219,6 @@
 class _PartialAstBuilder extends AstBuilder {
   _PartialAstBuilder(Uri uri)
       : super(null, null, true, FeatureSet.fromEnableFlags([]), uri);
-
-  // Note: this method converts the body to kernel, so we skip that here.
-  @override
-  finishFunction(formals, asyncModifier, body) {}
 }
 
 // Invoke the fasta kernel generator for the program starting in [entryUri]
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 852fb49..176909e 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -53,8 +53,6 @@
   ..addFlag('aot',
       help: 'Run compiler in AOT mode (enables whole-program transformations)',
       defaultsTo: false)
-// TODO(alexmarkov): Cleanup uses in Flutter and remove these obsolete flags.
-  ..addFlag('strong', help: 'Obsolete', defaultsTo: true)
   ..addFlag('tfa',
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
@@ -133,7 +131,7 @@
   ..addFlag('track-widget-creation',
       help: 'Run a kernel transformer to track creation locations for widgets.',
       defaultsTo: false)
-  ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: null)
+  ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false)
   ..addMultiOption('bytecode-options',
       help: 'Specify options for bytecode generation:',
       valueHelp: 'opt1,opt2,...',
@@ -360,7 +358,27 @@
       return false;
     }
 
-    compilerOptions.bytecode = options['gen-bytecode'] ?? options['aot'];
+    if (options['aot']) {
+      if (!options['link-platform']) {
+        print('Error: --no-link-platform option cannot be used with --aot');
+        return false;
+      }
+      if (options['split-output-by-packages']) {
+        print(
+            'Error: --split-output-by-packages option cannot be used with --aot');
+        return false;
+      }
+      if (options['incremental']) {
+        print('Error: --incremental option cannot be used with --aot');
+        return false;
+      }
+      if (options['import-dill'] != null) {
+        print('Error: --import-dill option cannot be used with --aot');
+        return false;
+      }
+    }
+
+    compilerOptions.bytecode = options['gen-bytecode'];
     final BytecodeOptions bytecodeOptions = BytecodeOptions(
       enableAsserts: options['enable-asserts'],
       emitSourceFiles: options['embed-source-text'],
@@ -581,7 +599,10 @@
         final IOSink sink = file.openWrite();
         final BinaryPrinter printer = filterExternal
             ? LimitedBinaryPrinter(
-                sink, (lib) => !lib.isExternal, true /* excludeUriToSource */)
+                sink,
+                // ignore: DEPRECATED_MEMBER_USE
+                (lib) => !lib.isExternal,
+                true /* excludeUriToSource */)
             : printerFactory.newBinaryPrinter(sink);
 
         sortComponent(component);
@@ -594,7 +615,10 @@
       final IOSink sink = File(filename).openWrite();
       final BinaryPrinter printer = filterExternal
           ? LimitedBinaryPrinter(
-              sink, (lib) => !lib.isExternal, true /* excludeUriToSource */)
+              sink,
+              // ignore: DEPRECATED_MEMBER_USE
+              (lib) => !lib.isExternal,
+              true /* excludeUriToSource */)
           : printerFactory.newBinaryPrinter(sink);
 
       sortComponent(component);
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index 63e5163..2ed86d3 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -57,6 +57,7 @@
     final manifest = <String, Map<String, List<int>>>{};
     final Set<Uri> visited = <Uri>{};
     for (Library library in _originalComponent.libraries) {
+      // ignore: DEPRECATED_MEMBER_USE
       if (library.isExternal || library.importUri.scheme == 'dart') {
         continue;
       }
diff --git a/pkg/frontend_server/lib/src/strong_components.dart b/pkg/frontend_server/lib/src/strong_components.dart
index 80cb7fa5..bf2cf8d6 100644
--- a/pkg/frontend_server/lib/src/strong_components.dart
+++ b/pkg/frontend_server/lib/src/strong_components.dart
@@ -157,6 +157,7 @@
   Iterable<Library> neighborsOf(Library vertex) {
     return <Library>[
       for (LibraryDependency dependency in vertex.dependencies)
+        // ignore: DEPRECATED_MEMBER_USE
         if (!dependency.targetLibrary.isExternal &&
             dependency.targetLibrary.importUri.scheme != 'dart')
           dependency.targetLibrary
diff --git a/pkg/frontend_server/test/frontend_server_flutter.dart b/pkg/frontend_server/test/frontend_server_flutter.dart
index ee88962..ad507fa 100644
--- a/pkg/frontend_server/test/frontend_server_flutter.dart
+++ b/pkg/frontend_server/test/frontend_server_flutter.dart
@@ -101,7 +101,6 @@
     '--sdk-root',
     flutterPlatformDirectory.path,
     '--incremental',
-    '--strong',
     '--target=flutter',
     '--packages',
     dotPackage.path,
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index b88dda9..26d94bd 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -862,6 +862,7 @@
         '--platform=${platformKernel.path}',
         '--output-dill=${dillFile.path}',
         '--unsafe-package-serialization',
+        '--no-incremental-serialization',
       ];
 
       final StreamController<List<int>> inputStreamController =
@@ -906,12 +907,13 @@
             Component component = loadComponentFromBinary(dillFile.path);
 
             // Contains (at least) the 2 files we want.
-            component.libraries
+            expect(
+                component.libraries
                     .where((l) =>
                         l.importUri.toString() == "package:pkgB/a.dart" ||
-                        l.fileUri.toString().contains(fileB.path))
-                    .length ==
-                2;
+                        l.fileUri == fileB.uri)
+                    .length,
+                2);
 
             // Verifiable (together with the platform file).
             component =
@@ -1015,12 +1017,13 @@
             Component component = loadComponentFromBinary(dillFile.path);
 
             // Contains (at least) the 2 files we want.
-            component.libraries
+            expect(
+                component.libraries
                     .where((l) =>
                         l.importUri.toString() == "package:pkgB/a.dart" ||
-                        l.fileUri.toString().contains(fileB.path))
-                    .length ==
-                2;
+                        l.fileUri == fileB.uri)
+                    .length,
+                2);
 
             // Verifiable (together with the platform file).
             component =
@@ -1032,6 +1035,120 @@
       inputStreamController.close();
     });
 
+    test('incremental-serialization with reject', () async {
+      // Basically a reproduction of
+      // https://github.com/flutter/flutter/issues/44384.
+      var file = new File('${tempDir.path}/pkgA/.packages')
+        ..createSync(recursive: true);
+      file.writeAsStringSync("pkgA:.");
+      file = new File('${tempDir.path}/pkgA/a.dart')
+        ..createSync(recursive: true);
+      file.writeAsStringSync("pkgA() {}");
+
+      var dillFile = new File('${tempDir.path}/app.dill');
+      expect(dillFile.existsSync(), equals(false));
+
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--incremental',
+        '--platform=${platformKernel.path}',
+        '--output-dill=${dillFile.path}',
+        '--incremental-serialization',
+      ];
+
+      final StreamController<List<int>> inputStreamController =
+          new StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          new StreamController<List<int>>();
+      final IOSink ioSink = new IOSink(stdoutStreamController.sink);
+      StreamController<Result> receivedResults = new StreamController<Result>();
+      final outputParser = new OutputParser(receivedResults);
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen(outputParser.listener);
+
+      Future<int> result =
+          starter(args, input: inputStreamController.stream, output: ioSink);
+      inputStreamController.add('compile ${file.path}\n'.codeUnits);
+      int count = 0;
+      receivedResults.stream.listen((Result compiledResult) {
+        CompilationResult result =
+            new CompilationResult.parse(compiledResult.status);
+        switch (count) {
+          case 0:
+            expect(dillFile.existsSync(), equals(true));
+            expect(result.filename, dillFile.path);
+            expect(result.errorsCount, 0);
+
+            // Loadable.
+            Component component = loadComponentFromBinary(dillFile.path);
+
+            // Contain the file we want.
+            var libs = component.libraries
+                .where((l) => l.importUri.toString() == "package:pkgA/a.dart");
+            expect(libs.length, 1);
+
+            // Has 1 procedure.
+            expect(libs.first.procedures.length, 1);
+
+            file.writeAsStringSync("pkgA() {} pkgA_2() {}");
+
+            count += 1;
+            inputStreamController.add('reject\n'.codeUnits);
+            inputStreamController.add('reset\n'.codeUnits);
+            inputStreamController.add('recompile ${file.path} abc\n'
+                    '${file.path}\n'
+                    'abc\n'
+                .codeUnits);
+            break;
+          case 1:
+            expect(dillFile.existsSync(), equals(true));
+            expect(result.filename, dillFile.path);
+            expect(result.errorsCount, 0);
+
+            // Loadable.
+            Component component = loadComponentFromBinary(dillFile.path);
+
+            // Contain the file we want.
+            var libs = component.libraries
+                .where((l) => l.importUri.toString() == "package:pkgA/a.dart");
+            expect(libs.length, 1);
+
+            // Has 2 procedure.
+            expect(libs.first.procedures.length, 2);
+
+            file.writeAsStringSync("pkgA() {} pkgA_2() {} pkgA_3() {}");
+
+            count += 1;
+            inputStreamController.add('accept\n'.codeUnits);
+            inputStreamController.add('reset\n'.codeUnits);
+            inputStreamController.add('recompile ${file.path} abc\n'
+                    '${file.path}\n'
+                    'abc\n'
+                .codeUnits);
+            break;
+          case 2:
+            expect(result.filename, dillFile.path);
+            expect(result.errorsCount, 0);
+            inputStreamController.add('quit\n'.codeUnits);
+
+            // Loadable.
+            Component component = loadComponentFromBinary(dillFile.path);
+
+            // Contain the file we want.
+            var libs = component.libraries
+                .where((l) => l.importUri.toString() == "package:pkgA/a.dart");
+            expect(libs.length, 1);
+
+            // Has 3 procedures.
+            expect(libs.first.procedures.length, 3);
+        }
+      });
+      expect(await result, 0);
+      inputStreamController.close();
+    });
+
     test('compile and recompile report non-zero error count', () async {
       var file = new File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() { foo(); bar(); }\n");
diff --git a/pkg/js/CHANGELOG.md b/pkg/js/CHANGELOG.md
index 800418a..821443e 100644
--- a/pkg/js/CHANGELOG.md
+++ b/pkg/js/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.3
+
+* Added promiseToFuture function.
+
 ## 0.6.2
 
 * Improved documentation.
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index a7a4e0a..d02009c 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -1,5 +1,5 @@
 name: js
-version: 0.6.2
+version: 0.6.3
 author: Dart Team <misc@dartlang.org>
 description: Access JavaScript from Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/js
diff --git a/pkg/kernel/bin/split.dart b/pkg/kernel/bin/split.dart
index fd7532c..d3abed4 100755
--- a/pkg/kernel/bin/split.dart
+++ b/pkg/kernel/bin/split.dart
@@ -28,26 +28,24 @@
   Component binary = CommandLineHelper.tryLoadDill(args[0]);
 
   int part = 1;
-  binary.libraries.forEach((lib) => lib.isExternal = true);
   for (int i = 0; i < binary.libraries.length; ++i) {
     Library lib = binary.libraries[i];
     if (lib.name?.startsWith("dart.") == true ||
         lib.name == "builtin" ||
         lib.name == "nativewrappers") continue;
-    lib.isExternal = false;
     String path = args[0] + ".part${part++}.dill";
-    await writeComponentToFile(binary, path);
+    await writeComponentToFile(binary, path, lib);
     print("Wrote $path");
-    lib.isExternal = true;
   }
 }
 
-Future<Null> writeComponentToFile(Component component, String path) async {
+Future<Null> writeComponentToFile(
+    Component component, String path, Library wantedLibrary) async {
   File output = new File(path);
   IOSink sink = output.openWrite();
   try {
     BinaryPrinter printer =
-        new LimitedBinaryPrinter(sink, (lib) => !lib.isExternal, false);
+        new LimitedBinaryPrinter(sink, (lib) => lib == wantedLibrary, false);
     printer.writeComponentFile(component);
   } finally {
     await sink.close();
diff --git a/pkg/kernel/doc/nnbd_api.md b/pkg/kernel/doc/nnbd_api.md
index 3b5757ec..a0b3781 100644
--- a/pkg/kernel/doc/nnbd_api.md
+++ b/pkg/kernel/doc/nnbd_api.md
@@ -8,6 +8,9 @@
 
 ## CHANGELOG
 
+2019.11.06:
+- Described required nullability parameter.
+
 2019.10.18:
 - Added information about `NeverType`.
 
@@ -16,8 +19,6 @@
 
 2019.10.15:
 - Added information about implementing the subtype relation.
-
-2019.10.15:
 - Added description of `DartType.withNullability`.
 
 2019.09.26:
@@ -290,7 +291,7 @@
 #### Nullability attribute on types
 
 - `DartType.nullability` is added to `DartType` and the implementations are added to the subclasses (fields for InterfaceType, FunctionType, TypedefType, and TypeParameterType, concrete getter for `TypeParameterType`).
-- Nullability parameter is added to constructors of InterfaceType, FunctionType, TypedefType, and TypeParameterType.
+- The required nullability parameter is added to constructors of InterfaceType, FunctionType, TypedefType, and TypeParameterType.  All of the call sites were modified so that `Nullability.legacy` is passed for the parameter.
 - `TypeParameterType.typeParameterTypeNullability` is added.  For details see section **Nullability of Intersection Types** of this document.
 - `TypeParameterType.computeNullabilityFromBound` is added.
 - `DartType.withNullability` method is added to `DartType` and is implemented in its subclasses.  The method takes a single parameter, the desired nullability, and returns the type that is the receiver with the given nullability.  If the receiver already has the nullability that is passed in as the parameter, the receiver object itself is returned, and a copy isn't created.  If the types that are represented by a particular `DartType` subclass always have a certain nullability, like `dynamic` or `void`, invocations of `withNullability` on them always return the receiver.
@@ -344,7 +345,7 @@
 
 #### Avoiding explicit legacy
 
-As described in section **Changes in caching of raw types**, all previously existing invocations of `Class.rawType` and of the related getters of `TypeEnvironment` were replaced with invocations of nullability-aware members of `CoreTypes`.  To keep the observable behavior of the client code, legacy types were used wherever before a raw type was used.  For example, `intClass.rawType` was replaced with `coreTypes.intLegacyRawType` and `cls.rawType` was replaced with `coreTypes.legacyRawType(cls)`.  All of those call sites should be updated as a part of the NNBD feature implementation because they are the source of legacy types regardless of the opted-in status of the library they are generated for.  Section **Library status and library-specific nullability treatment** describes the changes in the CFE public interface that are supposed to help with the process.
+As described in section **Nullability attribute on types**, all previously existing invocations of the constructors of `InterfaceType`, `TypedefType`, `TypeParameterType`, and `FunctionType` were given additional argument that specifies the nullability of the created type; `Nullability.legacy` was used in the cases that weren't migrated to the NNBD semantics yet.  Additionally, as described in section **Changes in caching of raw types**, all previously existing invocations of `Class.rawType` and of the related getters of `TypeEnvironment` were replaced with invocations of nullability-aware members of `CoreTypes`.  To keep the observable behavior of the client code, legacy types were used wherever before a raw type was used.  For example, `intClass.rawType` was replaced with `coreTypes.intLegacyRawType` and `cls.rawType` was replaced with `coreTypes.legacyRawType(cls)`.  All of those call sites should be updated as a part of the NNBD feature implementation because they are the source of legacy types regardless of the opted-in status of the library they are generated for.  Section **Library status and library-specific nullability treatment** describes the changes in the CFE public interface that are supposed to help with the process.
 
 The easiest way to avoid using explicitly legacy types is to do the following:
 
@@ -356,13 +357,13 @@
 - Replace `coreTypes.intLegacyRawType` with `coreTypes.intRawType(library.nonNullable)`.  Similarly for other built-in types.
 - Replace `coreTypes.legacyRawType(cls)` with `coreTypes.rawType(cls, library.nonNullable)`.
 - Replace `coreTypes.rawType(cls, Nullability.legacy)` with `coreTypes.rawType(cls, library.nonNullable)`.
-- Replace `new InterfaceType(cls, typeArgs)` with `new InterfaceType(cls, typeArgs, library.nonNullable)`.
-- Replace `new InterfaceType(cls)` with `new InterfaceType(cls, const <DartType>[], library.nonNullable)`.
-- Replace `new InterfaceType.byReference(clsRef, typeArgs)` with `new InterfaceType.byReference(clsRef, typeArgs, library.nonNullable)`.
-- Replace `new FunctionType(positional, retType, <NAMED>)` with `new FunctionType(positional, retType, nullability: library.nonNullable, <NAMED>)` where `<NAMED>` are the named arguments passed in.
-- Replace `new TypedefType(tdef, typeArgs)` with `new TypedefType(tdef, typeArgs, library.nonNullable)`.
-- Replace `new TypedefType(tdef)` with `new TypedefType(tdef, const <DartType>[], library.nonNullable)`.
-- Replace `new TypedefType.byReference(tdefRef, typeArgs)` with `new TypedefType.byReference(tdefRef, typeArgs, library.nonNullable)`.
+- Replace `new InterfaceType(cls, Nullability.legacy, typeArgs)` with `new InterfaceType(cls, library.nonNullable, typeArgs)`.
+- Replace `new InterfaceType(cls, Nullability.legacy)` with `new InterfaceType(cls, library.nonNullable)`.
+- Replace `new InterfaceType.byReference(clsRef, Nullability.legacy, typeArgs)` with `new InterfaceType.byReference(clsRef, library.nonNullable, typeArgs)`.
+- Replace `new FunctionType(positional, retType, Nullability.legacy, <NAMED>)` with `new FunctionType(positional, retType, library.nonNullable, <NAMED>)` where `<NAMED>` are the named arguments passed in.
+- Replace `new TypedefType(tdef, Nullability.legacy, typeArgs)` with `new TypedefType(tdef, library.nonNullable, typeArgs)`.
+- Replace `new TypedefType(tdef, Nullability.legacy)` with `new TypedefType(tdef, library.nonNullable)`.
+- Replace `new TypedefType.byReference(tdefRef, Nullability.legacy, typeArgs)` with `new TypedefType.byReference(tdefRef, library.nonNullable, typeArgs)`.
 
 The code updated this way will generate nullable and non-nullable types as desired for the opted-in libraries and will generate legacy types for the opted-out libraries.  It should also be easy to deprecate the weak-NNBD mode for such code: `Library.nonNullable` and `Library.nullable` will start returning the corresponding nullability constants.
 
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 0b5196d..8f97938 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -349,7 +349,10 @@
   ///
   /// If the library is non-external, then its classes are at [ClassLevel.Body]
   /// and all members are loaded.
+  @Deprecated("Library.isExternal is going away.")
   bool get isExternal => (flags & ExternalFlag) != 0;
+
+  @Deprecated("Library.isExternal is going away.")
   void set isExternal(bool value) {
     flags = value ? (flags | ExternalFlag) : (flags & ~ExternalFlag);
   }
@@ -416,6 +419,7 @@
         this.procedures = procedures ?? <Procedure>[],
         this.fields = fields ?? <Field>[],
         super(reference) {
+    // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
     this.isExternal = isExternal;
     setParents(this.dependencies, this);
     setParents(this.parts, this);
@@ -727,7 +731,8 @@
   Library get enclosingLibrary => parent;
 
   TypedefType get thisType {
-    return new TypedefType(this, _getAsTypeArguments(typeParameters));
+    return new TypedefType(
+        this, Nullability.legacy, _getAsTypeArguments(typeParameters));
   }
 
   R accept<R>(TreeVisitor<R> v) {
@@ -1215,13 +1220,6 @@
   R accept<R>(TreeVisitor<R> v) => v.visitClass(this);
   R acceptReference<R>(Visitor<R> v) => v.visitClassReference(this);
 
-  /// If true, the class is part of an external library, that is, it is defined
-  /// in another build unit.  Only a subset of its members are present.
-  ///
-  /// These classes should be loaded at either [ClassLevel.Type] or
-  /// [ClassLevel.Hierarchy] level.
-  bool get isInExternalLibrary => enclosingLibrary.isExternal;
-
   Supertype get asRawSupertype {
     return new Supertype(this,
         new List<DartType>.filled(typeParameters.length, const DynamicType()));
@@ -1233,13 +1231,13 @@
 
   InterfaceType _thisType;
   InterfaceType get thisType {
-    return _thisType ??=
-        new InterfaceType(this, _getAsTypeArguments(typeParameters));
+    return _thisType ??= new InterfaceType(
+        this, Nullability.legacy, _getAsTypeArguments(typeParameters));
   }
 
   InterfaceType _bottomType;
   InterfaceType get bottomType {
-    return _bottomType ??= new InterfaceType(this,
+    return _bottomType ??= new InterfaceType(this, Nullability.legacy,
         new List<DartType>.filled(typeParameters.length, const BottomType()));
   }
 
@@ -1453,11 +1451,6 @@
   R accept<R>(MemberVisitor<R> v);
   acceptReference(MemberReferenceVisitor v);
 
-  /// If true, the member is part of an external library, that is, it is defined
-  /// in another build unit.  Such members have no body or initializer present
-  /// in the IR.
-  bool get isInExternalLibrary => enclosingLibrary.isExternal;
-
   /// Returns true if this is an abstract procedure.
   bool get isAbstract => false;
 
@@ -2484,6 +2477,7 @@
     return new FunctionType(
         positionalParameters.map(_getTypeOfVariable).toList(growable: false),
         returnType,
+        Nullability.legacy,
         namedParameters: named,
         typeParameters: typeParametersCopy,
         requiredParameterCount: requiredParameterCount);
@@ -3140,7 +3134,7 @@
             .map((p) => new NamedExpression(p.name, new VariableGet(p)))
             .toList(),
         types: function.typeParameters
-            .map((p) => new TypeParameterType(p))
+            .map((p) => new TypeParameterType(p, Nullability.legacy))
             .toList());
   }
 
@@ -3417,7 +3411,7 @@
     return arguments.types.isEmpty
         ? types.coreTypes.legacyRawType(target.enclosingClass)
         : new InterfaceType(
-            target.enclosingClass, arguments.types, Nullability.legacy);
+            target.enclosingClass, Nullability.legacy, arguments.types);
   }
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitConstructorInvocation(this);
@@ -3443,9 +3437,9 @@
     // empty.
     return arguments.types.isEmpty
         ? new InterfaceType(
-            enclosingClass, const <DartType>[], Nullability.legacy)
+            enclosingClass, Nullability.legacy, const <DartType>[])
         : new InterfaceType(
-            enclosingClass, arguments.types, Nullability.legacy);
+            enclosingClass, Nullability.legacy, arguments.types);
   }
 }
 
@@ -3751,14 +3745,18 @@
   final List<Expression> unusedArguments;
 
   InstanceCreation(this.classReference, this.typeArguments, this.fieldValues,
-      this.asserts, this.unusedArguments);
+      this.asserts, this.unusedArguments) {
+    setParents(fieldValues.values.toList(), this);
+    setParents(asserts, this);
+    setParents(unusedArguments, this);
+  }
 
   Class get classNode => classReference.asClass;
 
   DartType getStaticType(TypeEnvironment types) {
     return typeArguments.isEmpty
         ? types.coreTypes.legacyRawType(classNode)
-        : new InterfaceType(classNode, typeArguments);
+        : new InterfaceType(classNode, Nullability.legacy, typeArguments);
   }
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceCreation(this);
@@ -4520,7 +4518,15 @@
 class AssertStatement extends Statement {
   Expression condition;
   Expression message; // May be null.
+
+  /// Character offset in the source where the assertion condition begins.
+  ///
+  /// Note: This is not the offset into the UTF8 encoded `List<int>` source.
   int conditionStartOffset;
+
+  /// Character offset in the source where the assertion condition ends.
+  ///
+  /// Note: This is not the offset into the UTF8 encoded `List<int>` source.
   int conditionEndOffset;
 
   AssertStatement(this.condition,
@@ -5556,14 +5562,13 @@
 
   /// The [typeArguments] list must not be modified after this call. If the
   /// list is omitted, 'dynamic' type arguments are filled in.
-  InterfaceType(Class classNode,
-      [List<DartType> typeArguments,
-      Nullability nullability = Nullability.legacy])
-      : this.byReference(getClassReference(classNode),
-            typeArguments ?? _defaultTypeArguments(classNode), nullability);
+  InterfaceType(Class classNode, Nullability nullability,
+      [List<DartType> typeArguments])
+      : this.byReference(getClassReference(classNode), nullability,
+            typeArguments ?? _defaultTypeArguments(classNode));
 
-  InterfaceType.byReference(this.className, this.typeArguments,
-      [this.nullability = Nullability.legacy]);
+  InterfaceType.byReference(
+      this.className, this.nullability, this.typeArguments);
 
   Class get classNode => className.asClass;
 
@@ -5614,7 +5619,7 @@
   InterfaceType withNullability(Nullability nullability) {
     return nullability == this.nullability
         ? this
-        : new InterfaceType.byReference(className, typeArguments, nullability);
+        : new InterfaceType.byReference(className, nullability, typeArguments);
   }
 }
 
@@ -5632,10 +5637,10 @@
   final DartType returnType;
   int _hashCode;
 
-  FunctionType(List<DartType> positionalParameters, this.returnType,
+  FunctionType(
+      List<DartType> positionalParameters, this.returnType, this.nullability,
       {this.namedParameters: const <NamedType>[],
       this.typeParameters: const <TypeParameter>[],
-      this.nullability: Nullability.legacy,
       int requiredParameterCount,
       this.typedefType})
       : this.positionalParameters = positionalParameters,
@@ -5698,7 +5703,8 @@
   /// type.
   FunctionType get withoutTypeParameters {
     if (typeParameters.isEmpty) return this;
-    return new FunctionType(positionalParameters, returnType,
+    return new FunctionType(
+        positionalParameters, returnType, Nullability.legacy,
         requiredParameterCount: requiredParameterCount,
         namedParameters: namedParameters,
         typedefType: null);
@@ -5752,10 +5758,10 @@
 
   FunctionType withNullability(Nullability nullability) {
     if (nullability == this.nullability) return this;
-    FunctionType result = FunctionType(positionalParameters, returnType,
+    FunctionType result = FunctionType(
+        positionalParameters, returnType, nullability,
         namedParameters: namedParameters,
         typeParameters: typeParameters,
-        nullability: nullability,
         requiredParameterCount: requiredParameterCount,
         typedefType: typedefType?.withNullability(nullability));
     if (typeParameters.isEmpty) return result;
@@ -5771,14 +5777,13 @@
   final Reference typedefReference;
   final List<DartType> typeArguments;
 
-  TypedefType(Typedef typedefNode,
-      [List<DartType> typeArguments,
-      Nullability nullability = Nullability.legacy])
-      : this.byReference(typedefNode.reference,
-            typeArguments ?? const <DartType>[], nullability);
+  TypedefType(Typedef typedefNode, Nullability nullability,
+      [List<DartType> typeArguments])
+      : this.byReference(typedefNode.reference, nullability,
+            typeArguments ?? const <DartType>[]);
 
-  TypedefType.byReference(this.typedefReference, this.typeArguments,
-      [this.nullability = Nullability.legacy]);
+  TypedefType.byReference(
+      this.typedefReference, this.nullability, this.typeArguments);
 
   Typedef get typedefNode => typedefReference.asTypedef;
 
@@ -5832,7 +5837,7 @@
     return nullability == this.nullability
         ? this
         : new TypedefType.byReference(
-            typedefReference, typeArguments, nullability);
+            typedefReference, nullability, typeArguments);
   }
 }
 
@@ -5904,9 +5909,8 @@
   /// is therefore the same as the bound of [parameter].
   DartType promotedBound;
 
-  TypeParameterType(this.parameter,
-      [this.promotedBound,
-      this.typeParameterTypeNullability = Nullability.legacy]);
+  TypeParameterType(this.parameter, this.typeParameterTypeNullability,
+      [this.promotedBound]);
 
   R accept<R>(DartTypeVisitor<R> v) => v.visitTypeParameterType(this);
   R accept1<R, A>(DartTypeVisitor1<R, A> v, A arg) =>
@@ -5917,13 +5921,15 @@
   bool operator ==(Object other) {
     return other is TypeParameterType &&
         parameter == other.parameter &&
-        nullability == other.nullability;
+        nullability == other.nullability &&
+        promotedBound == other.promotedBound;
   }
 
   int get hashCode {
     int hash = _temporaryHashCodeTable[parameter] ?? parameter.hashCode;
     int nullabilityHash = (0x33333333 >> nullability.index) ^ 0x33333333;
     hash = 0x3fffffff & (hash * 31 + (hash ^ nullabilityHash));
+    hash = 0x3fffffff & (hash * 31 + (hash ^ promotedBound.hashCode));
     return hash;
   }
 
@@ -5965,7 +5971,7 @@
     return typeParameterTypeNullability == this.typeParameterTypeNullability
         ? this
         : new TypeParameterType(
-            parameter, promotedBound, typeParameterTypeNullability);
+            parameter, typeParameterTypeNullability, promotedBound);
   }
 
   /// Gets the nullability of a type-parameter type based on the bound.
@@ -6297,7 +6303,7 @@
   }
 
   InterfaceType get asInterfaceType {
-    return new InterfaceType(classNode, typeArguments);
+    return new InterfaceType(classNode, Nullability.legacy, typeArguments);
   }
 
   bool operator ==(Object other) {
@@ -6631,7 +6637,7 @@
   }
 
   DartType getType(TypeEnvironment types) =>
-      new InterfaceType(classNode, typeArguments);
+      new InterfaceType(classNode, Nullability.legacy, typeArguments);
 }
 
 class PartialInstantiationConstant extends Constant {
@@ -7029,8 +7035,8 @@
 
 List<DartType> _getAsTypeArguments(List<TypeParameter> typeParameters) {
   if (typeParameters.isEmpty) return const <DartType>[];
-  return new List<DartType>.generate(
-      typeParameters.length, (i) => new TypeParameterType(typeParameters[i]),
+  return new List<DartType>.generate(typeParameters.length,
+      (i) => new TypeParameterType(typeParameters[i], Nullability.legacy),
       growable: false);
 }
 
@@ -7053,6 +7059,7 @@
 class Source {
   final List<int> lineStarts;
 
+  /// A UTF8 encoding of the original source file.
   final List<int> source;
 
   final Uri importUri;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 11695a2..2178093 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -2101,6 +2101,11 @@
 
   Supertype readSupertype() {
     InterfaceType type = readDartType();
+    assert(
+        type.nullability == _currentLibrary.nonNullable,
+        "In serialized form supertypes should have Nullability.legacy if they "
+        "are in a library that is opted out of the NNBD feature.  If they are "
+        "in an opted-in library, they should have Nullability.nonNullable.");
     return new Supertype.byReference(type.className, type.typeArguments);
   }
 
@@ -2156,7 +2161,7 @@
       case Tag.TypedefType:
         int nullabilityIndex = readByte();
         return new TypedefType.byReference(readTypedefReference(),
-            readDartTypeList(), Nullability.values[nullabilityIndex]);
+            Nullability.values[nullabilityIndex], readDartTypeList());
       case Tag.BottomType:
         return const BottomType();
       case Tag.InvalidType:
@@ -2171,11 +2176,11 @@
       case Tag.InterfaceType:
         int nullabilityIndex = readByte();
         return new InterfaceType.byReference(readClassReference(),
-            readDartTypeList(), Nullability.values[nullabilityIndex]);
+            Nullability.values[nullabilityIndex], readDartTypeList());
       case Tag.SimpleInterfaceType:
         int nullabilityIndex = readByte();
         return new InterfaceType.byReference(readClassReference(),
-            const <DartType>[], Nullability.values[nullabilityIndex]);
+            Nullability.values[nullabilityIndex], const <DartType>[]);
       case Tag.FunctionType:
         int typeParameterStackHeight = typeParameterStack.length;
         int nullabilityIndex = readByte();
@@ -2188,24 +2193,24 @@
         assert(positional.length + named.length == totalParameterCount);
         var returnType = readDartType();
         typeParameterStack.length = typeParameterStackHeight;
-        return new FunctionType(positional, returnType,
+        return new FunctionType(
+            positional, returnType, Nullability.values[nullabilityIndex],
             typeParameters: typeParameters,
             requiredParameterCount: requiredParameterCount,
             namedParameters: named,
-            typedefType: typedefType,
-            nullability: Nullability.values[nullabilityIndex]);
+            typedefType: typedefType);
       case Tag.SimpleFunctionType:
         int nullabilityIndex = readByte();
         var positional = readDartTypeList();
         var returnType = readDartType();
-        return new FunctionType(positional, returnType,
-            nullability: Nullability.values[nullabilityIndex]);
+        return new FunctionType(
+            positional, returnType, Nullability.values[nullabilityIndex]);
       case Tag.TypeParameterType:
         int declaredNullabilityIndex = readByte();
         int index = readUInt();
         var bound = readDartTypeOption();
-        return new TypeParameterType(typeParameterStack[index], bound,
-            Nullability.values[declaredNullabilityIndex]);
+        return new TypeParameterType(typeParameterStack[index],
+            Nullability.values[declaredNullabilityIndex], bound);
       default:
         throw fail('unexpected dart type tag: $tag');
     }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index da2fd24..141f142 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -54,6 +54,8 @@
   Set<CanonicalName> _knownCanonicalNameNonRootTops = new Set<CanonicalName>();
   Set<CanonicalName> _reindexedCanonicalNames = new Set<CanonicalName>();
 
+  Library _currentLibrary;
+
   /// Create a printer that writes to the given [sink].
   ///
   /// The BinaryPrinter will use its own buffer, so the [sink] does not need
@@ -930,6 +932,9 @@
 
   @override
   void visitLibrary(Library node) {
+    _currentLibrary = node;
+
+    // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
     insideExternalLibrary = node.isExternal;
     libraryOffsets.add(getBufferOffset());
     writeByte(node.flags);
@@ -991,6 +996,8 @@
       writeUInt32(offset);
     }
     writeUInt32(procedureOffsets.length - 1);
+
+    _currentLibrary = null;
   }
 
   void writeLibraryDependencies(Library library) {
@@ -2067,11 +2074,11 @@
     // requires the nullability byte.
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
-      writeByte(Nullability.nonNullable.index);
+      writeByte(_currentLibrary.nonNullable.index);
       writeNonNullReference(node.className);
     } else {
       writeByte(Tag.InterfaceType);
-      writeByte(Nullability.nonNullable.index);
+      writeByte(_currentLibrary.nonNullable.index);
       writeNonNullReference(node.className);
       writeNodeList(node.typeArguments);
     }
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 1f846ce..dc958c9 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -521,7 +521,8 @@
       if (newNode == null) {
         newNode = new TypeParameter(node.name);
         typeParams[node] = newNode;
-        typeSubstitution[node] = new TypeParameterType(newNode);
+        typeSubstitution[node] =
+            new TypeParameterType(newNode, Nullability.legacy);
       }
     }
   }
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index d18d3aa..7524a6d 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -465,19 +465,19 @@
 
   InterfaceType get objectLegacyRawType {
     return _objectLegacyRawType ??= _legacyRawTypes[objectClass] ??=
-        new InterfaceType(objectClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(objectClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get objectNullableRawType {
     return _objectNullableRawType ??= _nullableRawTypes[objectClass] ??=
         new InterfaceType(
-            objectClass, const <DartType>[], Nullability.nullable);
+            objectClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get objectNonNullableRawType {
     return _objectNonNullableRawType ??= _nonNullableRawTypes[objectClass] ??=
         new InterfaceType(
-            objectClass, const <DartType>[], Nullability.nonNullable);
+            objectClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType objectRawType(Nullability nullability) {
@@ -498,23 +498,23 @@
   /// Null is always nullable, so there's only one raw type for that class.
   InterfaceType get nullType {
     return _nullType ??= _nullableRawTypes[nullClass] ??=
-        new InterfaceType(nullClass, const <DartType>[], Nullability.nullable);
+        new InterfaceType(nullClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get boolLegacyRawType {
     return _boolLegacyRawType ??= _legacyRawTypes[boolClass] ??=
-        new InterfaceType(boolClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(boolClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get boolNullableRawType {
     return _boolNullableRawType ??= _nullableRawTypes[boolClass] ??=
-        new InterfaceType(boolClass, const <DartType>[], Nullability.nullable);
+        new InterfaceType(boolClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get boolNonNullableRawType {
     return _boolNonNullableRawType ??= _nonNullableRawTypes[boolClass] ??=
         new InterfaceType(
-            boolClass, const <DartType>[], Nullability.nonNullable);
+            boolClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType boolRawType(Nullability nullability) {
@@ -534,18 +534,18 @@
 
   InterfaceType get intLegacyRawType {
     return _intLegacyRawType ??= _legacyRawTypes[intClass] ??=
-        new InterfaceType(intClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(intClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get intNullableRawType {
     return _intNullableRawType ??= _nullableRawTypes[intClass] ??=
-        new InterfaceType(intClass, const <DartType>[], Nullability.nullable);
+        new InterfaceType(intClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get intNonNullableRawType {
     return _intNonNullableRawType ??= _nonNullableRawTypes[intClass] ??=
         new InterfaceType(
-            intClass, const <DartType>[], Nullability.nonNullable);
+            intClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType intRawType(Nullability nullability) {
@@ -565,18 +565,18 @@
 
   InterfaceType get numLegacyRawType {
     return _numLegacyRawType ??= _legacyRawTypes[numClass] ??=
-        new InterfaceType(numClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(numClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get numNullableRawType {
     return _numNullableRawType ??= _nullableRawTypes[numClass] ??=
-        new InterfaceType(numClass, const <DartType>[], Nullability.nullable);
+        new InterfaceType(numClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get numNonNullableRawType {
     return _numNonNullableRawType ??= _nonNullableRawTypes[numClass] ??=
         new InterfaceType(
-            numClass, const <DartType>[], Nullability.nonNullable);
+            numClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType numRawType(Nullability nullability) {
@@ -596,19 +596,19 @@
 
   InterfaceType get doubleLegacyRawType {
     return _doubleLegacyRawType ??= _legacyRawTypes[doubleClass] ??=
-        new InterfaceType(doubleClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(doubleClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get doubleNullableRawType {
     return _doubleNullableRawType ??= _nullableRawTypes[doubleClass] ??=
         new InterfaceType(
-            doubleClass, const <DartType>[], Nullability.nullable);
+            doubleClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get doubleNonNullableRawType {
     return _doubleNonNullableRawType ??= _nonNullableRawTypes[doubleClass] ??=
         new InterfaceType(
-            doubleClass, const <DartType>[], Nullability.nonNullable);
+            doubleClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType doubleRawType(Nullability nullability) {
@@ -628,19 +628,19 @@
 
   InterfaceType get stringLegacyRawType {
     return _stringLegacyRawType ??= _legacyRawTypes[stringClass] ??=
-        new InterfaceType(stringClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(stringClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get stringNullableRawType {
     return _stringNullableRawType ??= _nullableRawTypes[stringClass] ??=
         new InterfaceType(
-            stringClass, const <DartType>[], Nullability.nullable);
+            stringClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get stringNonNullableRawType {
     return _stringNonNullableRawType ??= _nonNullableRawTypes[stringClass] ??=
         new InterfaceType(
-            stringClass, const <DartType>[], Nullability.nonNullable);
+            stringClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType stringRawType(Nullability nullability) {
@@ -660,20 +660,20 @@
 
   InterfaceType get listLegacyRawType {
     return _listLegacyRawType ??= _legacyRawTypes[listClass] ??=
-        new InterfaceType(listClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(listClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get listNullableRawType {
     return _listNullableRawType ??= _nullableRawTypes[listClass] ??=
-        new InterfaceType(listClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(listClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get listNonNullableRawType {
     return _listNonNullableRawType ??= _nonNullableRawTypes[listClass] ??=
-        new InterfaceType(listClass, const <DartType>[const DynamicType()],
-            Nullability.nonNullable);
+        new InterfaceType(listClass, Nullability.nonNullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType listRawType(Nullability nullability) {
@@ -693,20 +693,20 @@
 
   InterfaceType get setLegacyRawType {
     return _setLegacyRawType ??= _legacyRawTypes[setClass] ??=
-        new InterfaceType(setClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(setClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get setNullableRawType {
     return _setNullableRawType ??= _nullableRawTypes[setClass] ??=
-        new InterfaceType(setClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(setClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get setNonNullableRawType {
     return _setNonNullableRawType ??= _nonNullableRawTypes[setClass] ??=
-        new InterfaceType(setClass, const <DartType>[const DynamicType()],
-            Nullability.nonNullable);
+        new InterfaceType(setClass, Nullability.nonNullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType setRawType(Nullability nullability) {
@@ -726,26 +726,20 @@
 
   InterfaceType get mapLegacyRawType {
     return _mapLegacyRawType ??= _legacyRawTypes[mapClass] ??=
-        new InterfaceType(
-            mapClass,
-            const <DartType>[const DynamicType(), const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(mapClass, Nullability.legacy,
+            const <DartType>[const DynamicType(), const DynamicType()]);
   }
 
   InterfaceType get mapNullableRawType {
     return _mapNullableRawType ??= _nullableRawTypes[mapClass] ??=
-        new InterfaceType(
-            mapClass,
-            const <DartType>[const DynamicType(), const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(mapClass, Nullability.nullable,
+            const <DartType>[const DynamicType(), const DynamicType()]);
   }
 
   InterfaceType get mapNonNullableRawType {
     return _mapNonNullableRawType ??= _nonNullableRawTypes[mapClass] ??=
-        new InterfaceType(
-            mapClass,
-            const <DartType>[const DynamicType(), const DynamicType()],
-            Nullability.nonNullable);
+        new InterfaceType(mapClass, Nullability.nonNullable,
+            const <DartType>[const DynamicType(), const DynamicType()]);
   }
 
   InterfaceType mapRawType(Nullability nullability) {
@@ -765,20 +759,20 @@
 
   InterfaceType get iterableLegacyRawType {
     return _iterableLegacyRawType ??= _legacyRawTypes[iterableClass] ??=
-        new InterfaceType(iterableClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(iterableClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get iterableNullableRawType {
     return _iterableNullableRawType ??= _nullableRawTypes[iterableClass] ??=
-        new InterfaceType(iterableClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(iterableClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get iterableNonNullableRawType {
     return _iterableNonNullableRawType ??=
         _nonNullableRawTypes[iterableClass] ??= new InterfaceType(iterableClass,
-            const <DartType>[const DynamicType()], Nullability.nonNullable);
+            Nullability.nonNullable, const <DartType>[const DynamicType()]);
   }
 
   InterfaceType iterableRawType(Nullability nullability) {
@@ -798,20 +792,20 @@
 
   InterfaceType get iteratorLegacyRawType {
     return _iteratorLegacyRawType ??= _legacyRawTypes[iteratorClass] ??=
-        new InterfaceType(iteratorClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(iteratorClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get iteratorNullableRawType {
     return _iteratorNullableRawType ??= _nullableRawTypes[iteratorClass] ??=
-        new InterfaceType(iteratorClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(iteratorClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get iteratorNonNullableRawType {
     return _iteratorNonNullableRawType ??=
         _nonNullableRawTypes[iteratorClass] ??= new InterfaceType(iteratorClass,
-            const <DartType>[const DynamicType()], Nullability.nonNullable);
+            Nullability.nonNullable, const <DartType>[const DynamicType()]);
   }
 
   InterfaceType iteratorRawType(Nullability nullability) {
@@ -831,19 +825,19 @@
 
   InterfaceType get symbolLegacyRawType {
     return _symbolLegacyRawType ??= _legacyRawTypes[symbolClass] ??=
-        new InterfaceType(symbolClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(symbolClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get symbolNullableRawType {
     return _symbolNullableRawType ??= _nullableRawTypes[symbolClass] ??=
         new InterfaceType(
-            symbolClass, const <DartType>[], Nullability.nullable);
+            symbolClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get symbolNonNullableRawType {
     return _symbolNonNullableRawType ??= _nonNullableRawTypes[symbolClass] ??=
         new InterfaceType(
-            symbolClass, const <DartType>[], Nullability.nonNullable);
+            symbolClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType symbolRawType(Nullability nullability) {
@@ -863,18 +857,18 @@
 
   InterfaceType get typeLegacyRawType {
     return _typeLegacyRawType ??= _legacyRawTypes[typeClass] ??=
-        new InterfaceType(typeClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(typeClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get typeNullableRawType {
     return _typeNullableRawType ??= _nullableRawTypes[typeClass] ??=
-        new InterfaceType(typeClass, const <DartType>[], Nullability.nullable);
+        new InterfaceType(typeClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get typeNonNullableRawType {
     return _typeNonNullableRawType ??= _nonNullableRawTypes[typeClass] ??=
         new InterfaceType(
-            typeClass, const <DartType>[], Nullability.nonNullable);
+            typeClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType typeRawType(Nullability nullability) {
@@ -895,19 +889,19 @@
   InterfaceType get functionLegacyRawType {
     return _functionLegacyRawType ??= _legacyRawTypes[functionClass] ??=
         new InterfaceType(
-            functionClass, const <DartType>[], Nullability.legacy);
+            functionClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get functionNullableRawType {
     return _functionNullableRawType ??= _nullableRawTypes[functionClass] ??=
         new InterfaceType(
-            functionClass, const <DartType>[], Nullability.nullable);
+            functionClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get functionNonNullableRawType {
     return _functionNonNullableRawType ??=
         _nonNullableRawTypes[functionClass] ??= new InterfaceType(
-            functionClass, const <DartType>[], Nullability.nonNullable);
+            functionClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType functionRawType(Nullability nullability) {
@@ -928,19 +922,19 @@
   InterfaceType get invocationLegacyRawType {
     return _invocationLegacyRawType ??= _legacyRawTypes[invocationClass] ??=
         new InterfaceType(
-            invocationClass, const <DartType>[], Nullability.legacy);
+            invocationClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get invocationNullableRawType {
     return _invocationNullableRawType ??= _nullableRawTypes[invocationClass] ??=
         new InterfaceType(
-            invocationClass, const <DartType>[], Nullability.nullable);
+            invocationClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get invocationNonNullableRawType {
     return _invocationNonNullableRawType ??=
         _nonNullableRawTypes[invocationClass] ??= new InterfaceType(
-            invocationClass, const <DartType>[], Nullability.nonNullable);
+            invocationClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType invocationRawType(Nullability nullability) {
@@ -961,19 +955,19 @@
   InterfaceType get invocationMirrorLegacyRawType {
     return _invocationMirrorLegacyRawType ??=
         _legacyRawTypes[invocationMirrorClass] ??= new InterfaceType(
-            invocationMirrorClass, const <DartType>[], Nullability.legacy);
+            invocationMirrorClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get invocationMirrorNullableRawType {
     return _invocationMirrorNullableRawType ??=
         _nullableRawTypes[invocationMirrorClass] ??= new InterfaceType(
-            invocationMirrorClass, const <DartType>[], Nullability.nullable);
+            invocationMirrorClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get invocationMirrorNonNullableRawType {
     return _invocationMirrorNonNullableRawType ??=
         _nonNullableRawTypes[invocationMirrorClass] ??= new InterfaceType(
-            invocationMirrorClass, const <DartType>[], Nullability.nonNullable);
+            invocationMirrorClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType invocationMirrorRawType(Nullability nullability) {
@@ -993,20 +987,20 @@
 
   InterfaceType get futureLegacyRawType {
     return _futureLegacyRawType ??= _legacyRawTypes[futureClass] ??=
-        new InterfaceType(futureClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(futureClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get futureNullableRawType {
     return _futureNullableRawType ??= _nullableRawTypes[futureClass] ??=
-        new InterfaceType(futureClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(futureClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get futureNonNullableRawType {
     return _futureNonNullableRawType ??= _nonNullableRawTypes[futureClass] ??=
-        new InterfaceType(futureClass, const <DartType>[const DynamicType()],
-            Nullability.nonNullable);
+        new InterfaceType(futureClass, Nullability.nonNullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType futureRawType(Nullability nullability) {
@@ -1027,19 +1021,19 @@
   InterfaceType get stackTraceLegacyRawType {
     return _stackTraceLegacyRawType ??= _legacyRawTypes[stackTraceClass] ??=
         new InterfaceType(
-            stackTraceClass, const <DartType>[], Nullability.legacy);
+            stackTraceClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get stackTraceNullableRawType {
     return _stackTraceNullableRawType ??= _nullableRawTypes[stackTraceClass] ??=
         new InterfaceType(
-            stackTraceClass, const <DartType>[], Nullability.nullable);
+            stackTraceClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get stackTraceNonNullableRawType {
     return _stackTraceNonNullableRawType ??=
         _nonNullableRawTypes[stackTraceClass] ??= new InterfaceType(
-            stackTraceClass, const <DartType>[], Nullability.nonNullable);
+            stackTraceClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType stackTraceRawType(Nullability nullability) {
@@ -1059,20 +1053,20 @@
 
   InterfaceType get streamLegacyRawType {
     return _streamLegacyRawType ??= _legacyRawTypes[streamClass] ??=
-        new InterfaceType(streamClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(streamClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get streamNullableRawType {
     return _streamNullableRawType ??= _nullableRawTypes[streamClass] ??=
-        new InterfaceType(streamClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(streamClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get streamNonNullableRawType {
     return _streamNonNullableRawType ??= _nonNullableRawTypes[streamClass] ??=
-        new InterfaceType(streamClass, const <DartType>[const DynamicType()],
-            Nullability.nonNullable);
+        new InterfaceType(streamClass, Nullability.nonNullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType streamRawType(Nullability nullability) {
@@ -1094,24 +1088,24 @@
     return _asyncAwaitCompleterLegacyRawType ??=
         _legacyRawTypes[asyncAwaitCompleterClass] ??= new InterfaceType(
             asyncAwaitCompleterClass,
-            const <DartType>[const DynamicType()],
-            Nullability.legacy);
+            Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get asyncAwaitCompleterNullableRawType {
     return _asyncAwaitCompleterNullableRawType ??=
         _nullableRawTypes[asyncAwaitCompleterClass] ??= new InterfaceType(
             asyncAwaitCompleterClass,
-            const <DartType>[const DynamicType()],
-            Nullability.nullable);
+            Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get asyncAwaitCompleterNonNullableRawType {
     return _asyncAwaitCompleterNonNullableRawType ??=
         _nonNullableRawTypes[asyncAwaitCompleterClass] ??= new InterfaceType(
             asyncAwaitCompleterClass,
-            const <DartType>[const DynamicType()],
-            Nullability.nonNullable);
+            Nullability.nonNullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType asyncAwaitCompleterRawType(Nullability nullability) {
@@ -1131,20 +1125,20 @@
 
   InterfaceType get futureOrLegacyRawType {
     return _futureOrLegacyRawType ??= _legacyRawTypes[futureOrClass] ??=
-        new InterfaceType(futureOrClass, const <DartType>[const DynamicType()],
-            Nullability.legacy);
+        new InterfaceType(futureOrClass, Nullability.legacy,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get futureOrNullableRawType {
     return _futureOrNullableRawType ??= _nullableRawTypes[futureOrClass] ??=
-        new InterfaceType(futureOrClass, const <DartType>[const DynamicType()],
-            Nullability.nullable);
+        new InterfaceType(futureOrClass, Nullability.nullable,
+            const <DartType>[const DynamicType()]);
   }
 
   InterfaceType get futureOrNonNullableRawType {
     return _futureOrNonNullableRawType ??=
         _nonNullableRawTypes[futureOrClass] ??= new InterfaceType(futureOrClass,
-            const <DartType>[const DynamicType()], Nullability.nonNullable);
+            Nullability.nonNullable, const <DartType>[const DynamicType()]);
   }
 
   InterfaceType futureOrRawType(Nullability nullability) {
@@ -1164,19 +1158,19 @@
 
   InterfaceType get pragmaLegacyRawType {
     return _pragmaLegacyRawType ??= _legacyRawTypes[pragmaClass] ??=
-        new InterfaceType(pragmaClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(pragmaClass, Nullability.legacy, const <DartType>[]);
   }
 
   InterfaceType get pragmaNullableRawType {
     return _pragmaNullableRawType ??= _nullableRawTypes[pragmaClass] ??=
         new InterfaceType(
-            pragmaClass, const <DartType>[], Nullability.nullable);
+            pragmaClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get pragmaNonNullableRawType {
     return _pragmaNonNullableRawType ??= _nonNullableRawTypes[pragmaClass] ??=
         new InterfaceType(
-            pragmaClass, const <DartType>[], Nullability.nonNullable);
+            pragmaClass, Nullability.nonNullable, const <DartType>[]);
   }
 
   InterfaceType pragmaRawType(Nullability nullability) {
@@ -1198,27 +1192,27 @@
     // TODO(dmitryas): Consider using computeBounds instead of DynamicType here.
     return _legacyRawTypes[klass] ??= new InterfaceType(
         klass,
+        Nullability.legacy,
         new List<DartType>.filled(
-            klass.typeParameters.length, const DynamicType()),
-        Nullability.legacy);
+            klass.typeParameters.length, const DynamicType()));
   }
 
   InterfaceType nullableRawType(Class klass) {
     // TODO(dmitryas): Consider using computeBounds instead of DynamicType here.
     return _nullableRawTypes[klass] ??= new InterfaceType(
         klass,
+        Nullability.nullable,
         new List<DartType>.filled(
-            klass.typeParameters.length, const DynamicType()),
-        Nullability.nullable);
+            klass.typeParameters.length, const DynamicType()));
   }
 
   InterfaceType nonNullableRawType(Class klass) {
     // TODO(dmitryas): Consider using computeBounds instead of DynamicType here.
     return _nonNullableRawTypes[klass] ??= new InterfaceType(
         klass,
+        Nullability.nonNullable,
         new List<DartType>.filled(
-            klass.typeParameters.length, const DynamicType()),
-        Nullability.nonNullable);
+            klass.typeParameters.length, const DynamicType()));
   }
 
   InterfaceType rawType(Class klass, Nullability nullability) {
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index abebaa4..ce66691 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -156,6 +156,7 @@
     // is external.  If a class or member was not found in an external library,
     // it might be that it exists in the actual library, but its interface was
     // not included in this build unit.
+    // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
     return library.isExternal
         ? "external library '${library.importUri}'"
         : "library '${library.importUri}'";
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 27985e7..4f78734 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -148,7 +148,8 @@
       for (int i = 0; i < ownFunction.typeParameters.length; ++i) {
         var subParameter = ownFunction.typeParameters[i];
         var superParameter = superFunction.typeParameters[i];
-        typeParameterMap[subParameter] = new TypeParameterType(superParameter);
+        typeParameterMap[subParameter] =
+            new TypeParameterType(superParameter, Nullability.legacy);
       }
 
       ownSubstitution = Substitution.combine(
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 2710985..0096017 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -13,6 +13,7 @@
         InvalidType,
         NamedType,
         NeverType,
+        Nullability,
         TypeParameter,
         TypeParameterType,
         Typedef,
@@ -124,10 +125,8 @@
         return type;
       }
     }
-    return new InterfaceType.byReference(
-        type.className,
-        calculateBounds(type.classNode.typeParameters, objectClass),
-        type.nullability);
+    return new InterfaceType.byReference(type.className, type.nullability,
+        calculateBounds(type.classNode.typeParameters, objectClass));
   }
   if (type is TypedefType) {
     if (type.typeArguments.isEmpty) return type;
@@ -136,10 +135,8 @@
         return type;
       }
     }
-    return new TypedefType.byReference(
-        type.typedefReference,
-        calculateBounds(type.typedefNode.typeParameters, objectClass),
-        type.nullability);
+    return new TypedefType.byReference(type.typedefReference, type.nullability,
+        calculateBounds(type.typedefNode.typeParameters, objectClass));
   }
   return type;
 }
@@ -231,8 +228,8 @@
     // definition in that case.  For details, see [link]
     // (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).
     FunctionType functionType = type;
-    FunctionType cloned = new FunctionType(
-        functionType.positionalParameters, functionType.returnType,
+    FunctionType cloned = new FunctionType(functionType.positionalParameters,
+        functionType.returnType, Nullability.legacy,
         namedParameters: functionType.namedParameters,
         typeParameters: functionType.typeParameters,
         requiredParameterCount: functionType.requiredParameterCount,
@@ -426,7 +423,8 @@
           typeEnvironment, type.typeArguments[i],
           isCovariant: isCovariant);
     }
-    return new InterfaceType(type.classNode, replacedTypeArguments);
+    return new InterfaceType(
+        type.classNode, Nullability.legacy, replacedTypeArguments);
   } else if (type is TypedefType && type.typedefNode.typeParameters != null) {
     List<DartType> replacedTypeArguments =
         new List<DartType>(type.typeArguments.length);
@@ -435,7 +433,8 @@
           typeEnvironment, type.typeArguments[i],
           isCovariant: isCovariant);
     }
-    return new TypedefType(type.typedefNode, replacedTypeArguments);
+    return new TypedefType(
+        type.typedefNode, Nullability.legacy, replacedTypeArguments);
   } else if (type is FunctionType) {
     var replacedReturnType = convertSuperBoundedToRegularBounded(
         typeEnvironment, type.returnType,
@@ -456,7 +455,8 @@
               typeEnvironment, type.namedParameters[i].type,
               isCovariant: !isCovariant));
     }
-    return new FunctionType(replacedPositionalParameters, replacedReturnType,
+    return new FunctionType(
+        replacedPositionalParameters, replacedReturnType, Nullability.legacy,
         namedParameters: replacedNamedParameters,
         typeParameters: type.typeParameters,
         requiredParameterCount: type.requiredParameterCount,
diff --git a/pkg/kernel/lib/src/future_or.dart b/pkg/kernel/lib/src/future_or.dart
new file mode 100644
index 0000000..fd2d9d0
--- /dev/null
+++ b/pkg/kernel/lib/src/future_or.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(dmitryas):  Delete the file when a special representation for FutureOr
+// is landed.
+
+import '../ast.dart';
+
+Nullability uniteNullabilities(Nullability a, Nullability b) {
+  if (a == Nullability.nullable || b == Nullability.nullable) {
+    return Nullability.nullable;
+  }
+  if (a == Nullability.legacy || b == Nullability.legacy) {
+    return Nullability.legacy;
+  }
+  if (a == Nullability.undetermined || b == Nullability.undetermined) {
+    return Nullability.undetermined;
+  }
+  return Nullability.nonNullable;
+}
+
+Nullability intersectNullabilities(Nullability a, Nullability b) {
+  if (a == Nullability.nonNullable || b == Nullability.nonNullable) {
+    return Nullability.nonNullable;
+  }
+  if (a == Nullability.undetermined || b == Nullability.undetermined) {
+    return Nullability.undetermined;
+  }
+  if (a == Nullability.legacy || b == Nullability.legacy) {
+    return Nullability.legacy;
+  }
+  return Nullability.nonNullable;
+}
+
+Nullability computeNullabilityOfFutureOr(
+    InterfaceType futureOr, Class futureOrClass) {
+  assert(futureOr.classNode == futureOrClass);
+
+  // Performance note: the algorithm is linear.
+  DartType argument = futureOr.typeArguments.single;
+  if (argument is InterfaceType && argument.classNode == futureOrClass) {
+    return uniteNullabilities(
+        computeNullabilityOfFutureOr(argument, futureOrClass),
+        futureOr.nullability);
+  }
+  if (argument is TypeParameterType && argument.promotedBound != null) {
+    DartType promotedBound = argument.promotedBound;
+    if (promotedBound is InterfaceType &&
+        promotedBound.className == futureOrClass) {
+      return uniteNullabilities(
+          intersectNullabilities(argument.typeParameterTypeNullability,
+              computeNullabilityOfFutureOr(promotedBound, futureOrClass)),
+          futureOr.nullability);
+    }
+  }
+  Nullability argumentNullability =
+      argument is InvalidType ? Nullability.undetermined : argument.nullability;
+  return uniteNullabilities(argumentNullability, futureOr.nullability);
+}
+
+Nullability computeNullability(DartType type, Class futureOrClass) {
+  if (type is InterfaceType && type.classNode == futureOrClass) {
+    return computeNullabilityOfFutureOr(type, futureOrClass);
+  }
+  return type.nullability;
+}
diff --git a/pkg/kernel/lib/testing/mock_sdk_component.dart b/pkg/kernel/lib/testing/mock_sdk_component.dart
index 17be30b..f37b01c 100644
--- a/pkg/kernel/lib/testing/mock_sdk_component.dart
+++ b/pkg/kernel/lib/testing/mock_sdk_component.dart
@@ -17,7 +17,7 @@
   }
 
   var objectClass = addClass(coreLib, new Class(name: 'Object'));
-  var objectType = new InterfaceType(objectClass);
+  var objectType = new InterfaceType(objectClass, Nullability.legacy);
 
   TypeParameter typeParam(String name, [DartType bound]) {
     return new TypeParameter(name, bound ?? objectType);
@@ -47,7 +47,8 @@
         class_('List', typeParameters: [
           T
         ], implementedTypes: [
-          new Supertype(iterable, [new TypeParameterType(T)])
+          new Supertype(
+              iterable, [new TypeParameterType(T, Nullability.legacy)])
         ]));
   }
   addClass(
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 750cc48..88e1512 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -509,6 +509,7 @@
     }
     writeComponentProblems(component);
     for (var library in component.libraries) {
+      // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
       if (library.isExternal) {
         if (!showExternal) {
           continue;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index f13dc82..6aa0943 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -932,8 +932,8 @@
     Tuple2<List<TypeParameter>,
             Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>
         tuple) {
-  return new FunctionType(
-      tuple.second.first + tuple.second.second, tuple.second.fourth,
+  return new FunctionType(tuple.second.first + tuple.second.second,
+      tuple.second.fourth, Nullability.legacy,
       requiredParameterCount: tuple.second.first.length,
       typeParameters: tuple.first,
       namedParameters: tuple.second.third);
@@ -962,7 +962,7 @@
 }
 
 TypeParameterType wrapTypeParameterType(Tuple2<TypeParameter, DartType> tuple) {
-  return new TypeParameterType(tuple.first, tuple.second);
+  return new TypeParameterType(tuple.first, Nullability.legacy, tuple.second);
 }
 
 Case<DartType> dartTypeSerializer =
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index d6bf44f..d77ba82 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -186,7 +186,8 @@
 
   SyncStarFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction)
       : iteratorVariable = new VariableDeclaration(':iterator')
-          ..type = new InterfaceType(helper.syncIteratorClass, [
+          ..type =
+              new InterfaceType(helper.syncIteratorClass, Nullability.legacy, [
             ContinuationRewriterBase.elementTypeFrom(
                 helper.iterableClass, enclosingFunction.returnType)
           ]),
@@ -749,8 +750,8 @@
               helper.streamIteratorConstructor,
               new Arguments(<Expression>[new VariableGet(streamVariable)],
                   types: [valueVariable.type])),
-          type: new InterfaceType(
-              helper.streamIteratorClass, [valueVariable.type]));
+          type: new InterfaceType(helper.streamIteratorClass,
+              Nullability.legacy, [valueVariable.type]));
 
       // await :for-iterator.moveNext()
       var condition = new AwaitExpression(new MethodInvocation(
@@ -914,8 +915,8 @@
 
     // _AsyncStarStreamController<T> :controller;
     controllerVariable = new VariableDeclaration(":controller",
-        type: new InterfaceType(
-            helper.asyncStarStreamControllerClass, [elementType]));
+        type: new InterfaceType(helper.asyncStarStreamControllerClass,
+            Nullability.legacy, [elementType]));
     statements.add(controllerVariable);
 
     // dynamic :controller_stream;
@@ -1036,12 +1037,12 @@
     if (valueType == const DynamicType()) {
       valueType = elementTypeFromReturnType(helper.futureOrClass);
     }
-    final DartType returnType =
-        new InterfaceType(helper.futureOrClass, <DartType>[valueType]);
+    final DartType returnType = new InterfaceType(
+        helper.futureOrClass, Nullability.legacy, <DartType>[valueType]);
     var completerTypeArguments = <DartType>[valueType];
 
-    final completerType = new InterfaceType(
-        helper.asyncAwaitCompleterClass, completerTypeArguments);
+    final completerType = new InterfaceType(helper.asyncAwaitCompleterClass,
+        Nullability.legacy, completerTypeArguments);
     // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
     completerVariable = new VariableDeclaration(":async_completer",
         initializer: new ConstructorInvocation(
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 2aa31c6..cbeb3d1 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -55,6 +55,7 @@
     // the mixin and constructors from the base class.
     var processedClasses = new Set<Class>();
     for (var library in libraries) {
+      // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
       if (library.isExternal) continue;
 
       for (var class_ in library.classes) {
@@ -71,6 +72,7 @@
     }
     // Resolve all super call expressions and super initializers.
     for (var library in libraries) {
+      // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
       if (library.isExternal) continue;
 
       for (var class_ in library.classes) {
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 13bde9a..c2289a5 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -345,7 +345,7 @@
       _hasCreationLocationClass.enclosingLibrary,
     );
     final Field locationField = new Field(fieldName,
-        type: new InterfaceType(_locationClass),
+        type: new InterfaceType(_locationClass, Nullability.legacy),
         isFinal: true,
         reference: clazz.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
@@ -433,6 +433,7 @@
       ..addAll(libraries);
 
     for (Library library in libraries) {
+      // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
       if (library.isExternal) {
         continue;
       }
@@ -453,6 +454,7 @@
             tracker: this);
 
     for (Library library in libraries) {
+      // ignore: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
       if (library.isExternal) {
         continue;
       }
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index f1d903e..e7b810b 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -114,7 +114,8 @@
       growable: true);
   var map = <TypeParameter, DartType>{};
   for (int i = 0; i < typeParameters.length; ++i) {
-    map[typeParameters[i]] = new TypeParameterType(freshParameters[i]);
+    map[typeParameters[i]] =
+        new TypeParameterType(freshParameters[i], Nullability.legacy);
   }
   CloneVisitor cloner;
   for (int i = 0; i < typeParameters.length; ++i) {
@@ -125,6 +126,8 @@
     freshTypeParameter.defaultType = typeParameter.defaultType != null
         ? substitute(typeParameter.defaultType, map)
         : null;
+    freshTypeParameter.variance =
+        typeParameter.isLegacyCovariant ? null : typeParameter.variance;
     if (typeParameter.annotations.isNotEmpty) {
       // Annotations can't refer to type parameters, so the cloner shouldn't
       // perform the substitution.
@@ -148,12 +151,12 @@
   FunctionType applyToFunctionType(FunctionType type) => new FunctionType(
       type.positionalParameters.map(substitute).toList(),
       substitute(type.returnType),
+      type.nullability,
       namedParameters: type.namedParameters.map(substituteNamed).toList(),
       typeParameters: freshTypeParameters,
       requiredParameterCount: type.requiredParameterCount,
       typedefType:
-          type.typedefType == null ? null : substitute(type.typedefType),
-      nullability: type.nullability);
+          type.typedefType == null ? null : substitute(type.typedefType));
 
   DartType substitute(DartType type) => substitution.substituteType(type);
 
@@ -290,7 +293,7 @@
   const _NullSubstitution();
 
   DartType getSubstitute(TypeParameter parameter, bool upperBound) {
-    return new TypeParameterType(parameter);
+    return new TypeParameterType(parameter, Nullability.legacy);
   }
 
   @override
@@ -385,7 +388,7 @@
 
   TypeParameter freshTypeParameter(TypeParameter node) {
     var fresh = new TypeParameter(node.name);
-    substitution[node] = new TypeParameterType(fresh);
+    substitution[node] = new TypeParameterType(fresh, Nullability.legacy);
     fresh.bound = visit(node.bound);
     if (node.defaultType != null) {
       fresh.defaultType = visit(node.defaultType);
@@ -492,7 +495,7 @@
     int before = useCounter;
     var typeArguments = node.typeArguments.map(visit).toList();
     if (useCounter == before) return node;
-    return new InterfaceType(node.classNode, typeArguments, node.nullability);
+    return new InterfaceType(node.classNode, node.nullability, typeArguments);
   }
 
   DartType visitTypedefType(TypedefType node) {
@@ -500,7 +503,7 @@
     int before = useCounter;
     var typeArguments = node.typeArguments.map(visit).toList();
     if (useCounter == before) return node;
-    return new TypedefType(node.typedefNode, typeArguments, node.nullability);
+    return new TypedefType(node.typedefNode, node.nullability, typeArguments);
   }
 
   List<TypeParameter> freshTypeParameters(List<TypeParameter> parameters) {
@@ -545,12 +548,11 @@
     DartType typedefType =
         node.typedefType == null ? null : inner.visit(node.typedefType);
     if (this.useCounter == before) return node;
-    return new FunctionType(positionalParameters, returnType,
+    return new FunctionType(positionalParameters, returnType, node.nullability,
         namedParameters: namedParameters,
         typeParameters: typeParameters,
         requiredParameterCount: node.requiredParameterCount,
-        typedefType: typedefType,
-        nullability: node.nullability);
+        typedefType: typedefType);
   }
 
   void bumpCountersUntil(_TypeSubstitutor target) {
@@ -717,7 +719,8 @@
       var rightInstance = <TypeParameter, DartType>{};
       for (int i = 0; i < type1.typeParameters.length; ++i) {
         var instantiator = new TypeParameter(type1.typeParameters[i].name);
-        var instantiatorType = new TypeParameterType(instantiator);
+        var instantiatorType =
+            new TypeParameterType(instantiator, Nullability.legacy);
         leftInstance[type1.typeParameters[i]] = instantiatorType;
         rightInstance[type2.typeParameters[i]] = instantiatorType;
         _universallyQuantifiedVariables.add(instantiator);
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 6024d89..53eec114 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -426,7 +426,8 @@
     Class class_ = target.enclosingClass;
     handleCall(arguments, target.function.thisFunctionType,
         typeParameters: class_.typeParameters);
-    return new InterfaceType(target.enclosingClass, arguments.types);
+    return new InterfaceType(
+        target.enclosingClass, Nullability.legacy, arguments.types);
   }
 
   @override
@@ -729,7 +730,8 @@
       DartType valueType = visitExpression(value);
       checkAssignable(node, fieldType, valueType);
     });
-    return new InterfaceType(node.classNode, node.typeArguments);
+    return new InterfaceType(
+        node.classNode, Nullability.legacy, node.typeArguments);
   }
 
   @override
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index de454c1..028df5e 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -8,6 +8,7 @@
 import 'core_types.dart';
 import 'type_algebra.dart';
 
+import 'src/future_or.dart';
 import 'src/hierarchy_based_type_environment.dart'
     show HierarchyBasedTypeEnvironment;
 
@@ -44,29 +45,34 @@
   InterfaceType get functionLegacyRawType => coreTypes.functionLegacyRawType;
 
   InterfaceType literalListType(DartType elementType) {
-    return new InterfaceType(coreTypes.listClass, <DartType>[elementType]);
+    return new InterfaceType(
+        coreTypes.listClass, Nullability.legacy, <DartType>[elementType]);
   }
 
   InterfaceType literalSetType(DartType elementType) {
-    return new InterfaceType(coreTypes.setClass, <DartType>[elementType]);
+    return new InterfaceType(
+        coreTypes.setClass, Nullability.legacy, <DartType>[elementType]);
   }
 
   InterfaceType literalMapType(DartType key, DartType value) {
-    return new InterfaceType(coreTypes.mapClass, <DartType>[key, value]);
+    return new InterfaceType(
+        coreTypes.mapClass, Nullability.legacy, <DartType>[key, value]);
   }
 
   InterfaceType iterableType(DartType type) {
-    return new InterfaceType(coreTypes.iterableClass, <DartType>[type]);
+    return new InterfaceType(
+        coreTypes.iterableClass, Nullability.legacy, <DartType>[type]);
   }
 
   InterfaceType streamType(DartType type) {
-    return new InterfaceType(coreTypes.streamClass, <DartType>[type]);
+    return new InterfaceType(
+        coreTypes.streamClass, Nullability.legacy, <DartType>[type]);
   }
 
   InterfaceType futureType(DartType type,
       [Nullability nullability = Nullability.legacy]) {
     return new InterfaceType(
-        coreTypes.futureClass, <DartType>[type], nullability);
+        coreTypes.futureClass, nullability, <DartType>[type]);
   }
 
   /// Removes a level of `Future<>` types wrapping a type.
@@ -155,20 +161,13 @@
   }
 }
 
-/// Result of a nullability-aware subtype check.
-///
-/// It is assumed that if a subtype check succeeds for two types in full-NNBD
-/// mode, it also succeeds for those two types if the nullability markers on the
-/// types and all of their sub-terms are ignored (that is, in the pre-NNBD
-/// mode).  By contraposition, if a subtype check fails for two types when the
-/// nullability markers are ignored, it should also fail for those types in
-/// full-NNBD mode.
+/// Tri-state logical result of a nullability-aware subtype check.
 class IsSubtypeOf {
   /// Internal value constructed via [IsSubtypeOf.never].
   ///
   /// The integer values of [_valueNever], [_valueOnlyIfIgnoringNullabilities],
-  /// and [_valueAlways] are important for the implementations of [_joinValues],
-  /// [_all], and [join].  They should be kept in sync.
+  /// and [_valueAlways] are important for the implementations of [_andValues],
+  /// [_all], and [and].  They should be kept in sync.
   static const int _valueNever = 0;
 
   /// Internal value constructed via [IsSubtypeOf.onlyIfIgnoringNullabilities].
@@ -184,13 +183,23 @@
     const IsSubtypeOf.always()
   ];
 
-  /// Joins results of subtype checks on parts into the overall result.
+  /// Combines results of subtype checks on parts into the overall result.
   ///
-  /// Both [value1] and [value2] should be chosen from
+  /// It's an implementation detail for [and].  See the comment on [and] for
+  /// more details and examples.  Both [value1] and [value2] should be chosen
+  /// from [_valueNever], [_valueOnlyIfIgnoringNullabilities], and
+  /// [_valueAlways].  The method produces the result which is one of
+  /// [_valueNever], [_valueOnlyIfIgnoringNullabilities], and [_valueAlways].
+  static int _andValues(int value1, int value2) => value1 & value2;
+
+  /// Combines results of the checks on alternatives into the overall result.
+  ///
+  /// It's an implementation detail for [or].  See the comment on [or] for more
+  /// details and examples.  Both [value1] and [value2] should be chosen from
   /// [_valueNever], [_valueOnlyIfIgnoringNullabilities], and [_valueAlways].
   /// The method produces the result which is one of [_valueNever],
   /// [_valueOnlyIfIgnoringNullabilities], and [_valueAlways].
-  static int _joinValues(int value1, int value2) => value1 & value2;
+  static int _orValues(int value1, int value2) => value1 | value2;
 
   /// The only state of an [IsSubtypeOf] object.
   final int _value;
@@ -202,8 +211,12 @@
 
   /// Subtype check succeeds only if the nullability markers are ignored.
   ///
-  /// This implies that if the nullability markers aren't ignored, the subtype
-  /// check fails.
+  /// It is assumed that if a subtype check succeeds for two types in full-NNBD
+  /// mode, it also succeeds for those two types if the nullability markers on
+  /// the types and all of their sub-terms are ignored (that is, in the pre-NNBD
+  /// mode).  By contraposition, if a subtype check fails for two types when the
+  /// nullability markers are ignored, it should also fail for those types in
+  /// full-NNBD mode.
   const IsSubtypeOf.onlyIfIgnoringNullabilities()
       : this._internal(_valueOnlyIfIgnoringNullabilities);
 
@@ -211,6 +224,15 @@
   const IsSubtypeOf.never() : this._internal(_valueNever);
 
   /// Checks if two types are in relation based solely on their nullabilities.
+  ///
+  /// This is useful on its own if the types are known to be the same modulo the
+  /// nullability attribute, but mostly it's useful to combine the result from
+  /// [IsSubtypeOf.basedSolelyOnNullabilities] via [and] with the partial
+  /// results obtained from other type parts. For example, the overall result
+  /// for `List<int>? <: List<num>*` can be computed as `Ra.join(Rn)` where `Ra`
+  /// is the result of a subtype check on the arguments `int` and `num`, and
+  /// `Rn` is the result of [IsSubtypeOf.basedSolelyOnNullabilities] on the
+  /// types `List<int>?` and `List<num>*`.
   factory IsSubtypeOf.basedSolelyOnNullabilities(
       DartType subtype, DartType supertype) {
     if (subtype.isPotentiallyNullable && supertype.isPotentiallyNonNullable) {
@@ -221,26 +243,56 @@
 
   /// Combines results for the type parts into the overall result for the type.
   ///
-  /// For example, the result of `A<B1, C1>? <: A<B2, C2>*` can be computed as
-  /// `Rb.join(Rc).join(Rn)` where `Rb` is the result of `B1 <: B2`, `Rc` is the
-  /// result of `C1 <: C2`, and `Rn` is
-  /// `new IsSubtypeOf.basedSolelyOnNullabilities(A<B1, C1>?, A<B2, C2>*)`.
-  IsSubtypeOf join(IsSubtypeOf other) {
-    return _all[_joinValues(_value, other._value)];
+  /// For example, the result of `A<B1, C1> <: A<B2, C2>` can be computed from
+  /// the results of the checks `B1 <: B2` and `C1 <: C2`.  Using the binary
+  /// outcome of the checks, the combination of the check results on parts is
+  /// simply done via `&&`, and [and] is the analog to `&&` for the ternary
+  /// outcome.  So, in the example above the overall result is computed as
+  /// `Rb.and(Rc)` where `Rb` is the result of `B1 <: B2`, `Rc` is the result
+  /// of `C1 <: C2`.
+  IsSubtypeOf and(IsSubtypeOf other) {
+    return _all[_andValues(_value, other._value)];
   }
 
-  /// Shorts the computation of [join] if `this` is [IsSubtypeOf.never].
+  /// Shorts the computation of [and] if `this` is [IsSubtypeOf.never].
   ///
-  /// Use this instead of [join] for optimization in case the argument to [join]
-  /// is, for example, a potentially expensive subtype check.  Unlike [join],
-  /// [joinWithSubtypeCheckFor] will immediately return if [this] was
-  /// constructed as [IsSubtypeOf.never] because the right-hand side will not
-  /// change the result anyway.
-  IsSubtypeOf joinWithSubtypeCheckFor(
+  /// Use this instead of [and] for optimization in case the argument to [and]
+  /// is, for example, a potentially expensive subtype check.  Unlike [and],
+  /// [andSubtypeCheckFor] will immediately return if `this` was constructed as
+  /// [IsSubtypeOf.never] because the right-hand side will not change the
+  /// overall result anyway.
+  IsSubtypeOf andSubtypeCheckFor(
       DartType subtype, DartType supertype, SubtypeTester tester) {
     if (_value == _valueNever) return this;
     return this
-        .join(tester.performNullabilityAwareSubtypeCheck(subtype, supertype));
+        .and(tester.performNullabilityAwareSubtypeCheck(subtype, supertype));
+  }
+
+  /// Combines results of the checks on alternatives into the overall result.
+  ///
+  /// For example, the result of `T <: FutureOr<S>` can be computed from the
+  /// results of the checks `T <: S` and `T <: Future<S>`.  Using the binary
+  /// outcome of the checks, the combination of the check results on parts is
+  /// simply done via logical "or", and [or] is the analog to "or" for the
+  /// ternary outcome.  So, in the example above the overall result is computed
+  /// as `Rs.or(Rf)` where `Rs` is the result of `T <: S`, `Rf` is the result of
+  /// `T <: Future<S>`.
+  IsSubtypeOf or(IsSubtypeOf other) {
+    return _all[_orValues(_value, other._value)];
+  }
+
+  /// Shorts the computation of [or] if `this` is [IsSubtypeOf.always].
+  ///
+  /// Use this instead of [or] for optimization in case the argument to [or] is,
+  /// for example, a potentially expensive subtype check.  Unlike [or],
+  /// [orSubtypeCheckFor] will immediately return if `this` was constructed
+  /// as [IsSubtypeOf.always] because the right-hand side will not change the
+  /// overall result anyway.
+  IsSubtypeOf orSubtypeCheckFor(
+      DartType subtype, DartType supertype, SubtypeTester tester) {
+    if (_value == _valueAlways) return this;
+    return this
+        .or(tester.performNullabilityAwareSubtypeCheck(subtype, supertype));
   }
 
   bool isSubtypeWhenIgnoringNullabilities() {
@@ -250,6 +302,18 @@
   bool isSubtypeWhenUsingNullabilities() {
     return _value == _valueAlways;
   }
+
+  String toString() {
+    switch (_value) {
+      case _valueAlways:
+        return "IsSubtypeOf.always";
+      case _valueNever:
+        return "IsSubtypeOf.never";
+      case _valueOnlyIfIgnoringNullabilities:
+        return "IsSubtypeOf.onlyIfIgnoringNullabilities";
+    }
+    return "IsSubtypeOf.<unknown value '${_value}'>";
+  }
 }
 
 enum SubtypeCheckMode {
@@ -334,8 +398,10 @@
         return const IsSubtypeOf.always();
       }
 
-      if (supertype.nullability == Nullability.nullable ||
-          supertype.nullability == Nullability.legacy) {
+      Nullability supertypeNullability =
+          computeNullability(supertype, futureOrClass);
+      if (supertypeNullability == Nullability.nullable ||
+          supertypeNullability == Nullability.legacy) {
         return const IsSubtypeOf.always();
       }
       // See rule 4 of the subtype rules from the Dart Language Specification.
@@ -359,9 +425,9 @@
       // given t1 is Future<A> | A, then:
       // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
       return performNullabilityAwareSubtypeCheck(subtypeArg, supertype)
-          .joinWithSubtypeCheckFor(
+          .andSubtypeCheckFor(
               futureType(subtypeArg, Nullability.nonNullable), supertype, this)
-          .join(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
+          .and(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
     }
 
     if (supertype is InterfaceType && supertype.classNode == objectClass) {
@@ -373,14 +439,13 @@
         identical(supertype.classNode, futureOrClass)) {
       // given t2 is Future<A> | A, then:
       // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
-      var supertypeArg = supertype.typeArguments[0];
-      var supertypeFuture = futureType(supertypeArg, Nullability.legacy);
+      Nullability unitedNullability =
+          computeNullabilityOfFutureOr(supertype, futureOrClass);
+      DartType supertypeArg = supertype.typeArguments[0];
+      DartType supertypeFuture = futureType(supertypeArg, unitedNullability);
       return performNullabilityAwareSubtypeCheck(subtype, supertypeFuture)
-                  .isSubtypeWhenIgnoringNullabilities() ||
-              performNullabilityAwareSubtypeCheck(subtype, supertypeArg)
-                  .isSubtypeWhenIgnoringNullabilities()
-          ? const IsSubtypeOf.always()
-          : const IsSubtypeOf.never();
+          .orSubtypeCheckFor(
+              subtype, supertypeArg.withNullability(unitedNullability), this);
     }
 
     if (subtype is InterfaceType && supertype is InterfaceType) {
@@ -394,47 +459,69 @@
         DartType rightType = supertype.typeArguments[i];
         if (variance == Variance.contravariant) {
           result = result
-              .join(performNullabilityAwareSubtypeCheck(rightType, leftType));
+              .and(performNullabilityAwareSubtypeCheck(rightType, leftType));
           if (!result.isSubtypeWhenIgnoringNullabilities()) {
             return const IsSubtypeOf.never();
           }
         } else if (variance == Variance.invariant) {
-          result = result.join(
+          result = result.and(
               performNullabilityAwareMutualSubtypesCheck(leftType, rightType));
           if (!result.isSubtypeWhenIgnoringNullabilities()) {
             return const IsSubtypeOf.never();
           }
         } else {
           result = result
-              .join(performNullabilityAwareSubtypeCheck(leftType, rightType));
+              .and(performNullabilityAwareSubtypeCheck(leftType, rightType));
           if (!result.isSubtypeWhenIgnoringNullabilities()) {
             return const IsSubtypeOf.never();
           }
         }
       }
       return result
-          .join(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
+          .and(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
     }
     if (subtype is TypeParameterType) {
-      if (supertype is TypeParameterType &&
-          subtype.parameter == supertype.parameter) {
-        if (supertype.promotedBound != null) {
-          return performNullabilityAwareSubtypeCheck(
-              subtype.bound, supertype.bound);
+      if (supertype is TypeParameterType) {
+        IsSubtypeOf result = const IsSubtypeOf.always();
+        if (subtype.parameter == supertype.parameter) {
+          if (supertype.promotedBound != null) {
+            return performNullabilityAwareSubtypeCheck(
+                    subtype,
+                    new TypeParameterType(supertype.parameter,
+                        supertype.typeParameterTypeNullability))
+                .andSubtypeCheckFor(subtype, supertype.bound, this);
+          } else {
+            // Promoted bound should always be a subtype of the declared bound.
+            // TODO(dmitryas): Use the following assertion when type promotion
+            // is updated.
+            // assert(subtype.promotedBound == null ||
+            //     performNullabilityAwareSubtypeCheck(
+            //         subtype.bound, supertype.bound)
+            //         .isSubtypeWhenUsingNullabilities());
+            assert(subtype.promotedBound == null ||
+                performNullabilityAwareSubtypeCheck(
+                        subtype.bound, supertype.bound)
+                    .isSubtypeWhenIgnoringNullabilities());
+            result = const IsSubtypeOf.always();
+          }
         } else {
-          // Promoted bound should always be a subtype of the declared bound.
-          assert(subtype.promotedBound == null ||
-              performNullabilityAwareSubtypeCheck(
-                      subtype.bound, supertype.bound)
-                  .isSubtypeWhenIgnoringNullabilities());
-          return const IsSubtypeOf.always();
+          result =
+              performNullabilityAwareSubtypeCheck(subtype.bound, supertype);
         }
+        if (subtype.nullability == Nullability.undetermined &&
+            supertype.nullability == Nullability.undetermined) {
+          // The two nullabilities are undetermined, but are connected via
+          // additional constraint, namely that they will be equal at run time.
+          return result;
+        }
+        return result.and(
+            new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
       }
       // Termination: if there are no cyclically bound type parameters, this
       // recursive call can only occur a finite number of times, before reaching
       // a shrinking recursive call (or terminating).
       return performNullabilityAwareSubtypeCheck(subtype.bound, supertype)
-          .join(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
+          .and(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
     }
     if (subtype is FunctionType) {
       if (supertype is InterfaceType && supertype.classNode == functionClass) {
@@ -449,8 +536,9 @@
 
   IsSubtypeOf performNullabilityAwareMutualSubtypesCheck(
       DartType type1, DartType type2) {
+    // TODO(dmitryas): Replace it with one recursive descent instead of two.
     return performNullabilityAwareSubtypeCheck(type1, type2)
-        .joinWithSubtypeCheckFor(type2, type1, this);
+        .andSubtypeCheckFor(type2, type1, this);
   }
 
   IsSubtypeOf _performNullabilityAwareFunctionSubtypeCheck(
@@ -465,12 +553,15 @@
     if (subtype.typeParameters.length != supertype.typeParameters.length) {
       return const IsSubtypeOf.never();
     }
+
+    IsSubtypeOf result = const IsSubtypeOf.always();
     if (subtype.typeParameters.isNotEmpty) {
       var substitution = <TypeParameter, DartType>{};
       for (int i = 0; i < subtype.typeParameters.length; ++i) {
         var subParameter = subtype.typeParameters[i];
         var superParameter = supertype.typeParameters[i];
-        substitution[subParameter] = new TypeParameterType(superParameter);
+        substitution[subParameter] =
+            new TypeParameterType(superParameter, Nullability.legacy);
       }
       for (int i = 0; i < subtype.typeParameters.length; ++i) {
         var subParameter = subtype.typeParameters[i];
@@ -479,28 +570,26 @@
         // Termination: if there are no cyclically bound type parameters, this
         // recursive call can only occur a finite number of times before
         // reaching a shrinking recursive call (or terminating).
-        // TODO(dmitryas): Replace it with one recursive descent instead of two.
-        if (!performNullabilityAwareSubtypeCheck(superParameter.bound, subBound)
-                .isSubtypeWhenIgnoringNullabilities() ||
-            !performNullabilityAwareSubtypeCheck(subBound, superParameter.bound)
-                .isSubtypeWhenIgnoringNullabilities()) {
+        result = result.and(performNullabilityAwareMutualSubtypesCheck(
+            superParameter.bound, subBound));
+        if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
       }
       subtype = substitute(subtype.withoutTypeParameters, substitution);
     }
-    if (!performNullabilityAwareSubtypeCheck(
-            subtype.returnType, supertype.returnType)
-        .isSubtypeWhenIgnoringNullabilities()) {
+    result = result.and(performNullabilityAwareSubtypeCheck(
+        subtype.returnType, supertype.returnType));
+    if (!result.isSubtypeWhenIgnoringNullabilities()) {
       return const IsSubtypeOf.never();
     }
     for (int i = 0; i < supertype.positionalParameters.length; ++i) {
       var supertypeParameter = supertype.positionalParameters[i];
       var subtypeParameter = subtype.positionalParameters[i];
       // Termination: Both types shrink in size.
-      if (!performNullabilityAwareSubtypeCheck(
-              supertypeParameter, subtypeParameter)
-          .isSubtypeWhenIgnoringNullabilities()) {
+      result = result.and(performNullabilityAwareSubtypeCheck(
+          supertypeParameter, subtypeParameter));
+      if (!result.isSubtypeWhenIgnoringNullabilities()) {
         return const IsSubtypeOf.never();
       }
     }
@@ -516,12 +605,13 @@
       }
       NamedType subtypeParameter = subtype.namedParameters[subtypeNameIndex];
       // Termination: Both types shrink in size.
-      if (!performNullabilityAwareSubtypeCheck(
-              supertypeParameter.type, subtypeParameter.type)
-          .isSubtypeWhenIgnoringNullabilities()) {
+      result = result.and(performNullabilityAwareSubtypeCheck(
+          supertypeParameter.type, subtypeParameter.type));
+      if (!result.isSubtypeWhenIgnoringNullabilities()) {
         return const IsSubtypeOf.never();
       }
     }
-    return const IsSubtypeOf.always();
+    return result
+        .and(new IsSubtypeOf.basedSolelyOnNullabilities(subtype, supertype));
   }
 }
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 503655e..f47c3e7 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -6,8 +6,9 @@
 import 'ast.dart';
 import 'transformations/flags.dart';
 
-void verifyComponent(Component component) {
-  VerifyingVisitor.check(component);
+void verifyComponent(Component component, {bool isOutline, bool afterConst}) {
+  VerifyingVisitor.check(component,
+      isOutline: isOutline, afterConst: afterConst);
 }
 
 class VerificationError {
@@ -49,14 +50,22 @@
   Set<TypeParameter> typeParametersInScope = new Set<TypeParameter>();
   final List<VariableDeclaration> variableStack = <VariableDeclaration>[];
   final Map<Typedef, TypedefState> typedefState = <Typedef, TypedefState>{};
+  final Set<Constant> seenConstants = <Constant>{};
   bool classTypeParametersAreInScope = false;
 
   /// If true, relax certain checks for *outline* mode. For example, don't
   /// attempt to validate constructor initializers.
-  bool isOutline = false;
+  final bool isOutline;
+
+  /// If true, assume that constant evaluation has been performed (with a
+  /// target that did not opt out of any of the constant inlining) and report
+  /// a verification error for anything that should have been removed by it.
+  final bool afterConst;
 
   bool inCatchBlock = false;
 
+  bool inUnevaluatedConstant = false;
+
   Library currentLibrary;
 
   Member currentMember;
@@ -67,14 +76,32 @@
 
   TreeNode get context => currentMember ?? currentClass;
 
-  static void check(Component component) {
-    component.accept(new VerifyingVisitor());
+  static void check(Component component, {bool isOutline, bool afterConst}) {
+    component.accept(
+        new VerifyingVisitor(isOutline: isOutline, afterConst: afterConst));
   }
 
+  VerifyingVisitor({bool isOutline, bool afterConst})
+      : isOutline = isOutline ?? false,
+        afterConst = afterConst ?? !(isOutline ?? false);
+
+  @override
   defaultTreeNode(TreeNode node) {
     visitChildren(node);
   }
 
+  @override
+  defaultConstantReference(Constant constant) {
+    if (seenConstants.add(constant)) {
+      constant.accept(this);
+    }
+  }
+
+  @override
+  defaultConstant(Constant constant) {
+    constant.visitChildren(this);
+  }
+
   problem(TreeNode node, String details, {TreeNode context}) {
     context ??= this.context;
     throw new VerificationError(context, node, details);
@@ -392,11 +419,22 @@
     }
     visitChildren(node);
     declareVariable(node);
+    if (afterConst && node.isConst) {
+      Expression initializer = node.initializer;
+      if (!(initializer is InvalidExpression ||
+          initializer is ConstantExpression &&
+              initializer.constant is UnevaluatedConstant)) {
+        problem(node, "Constant VariableDeclaration");
+      }
+    }
   }
 
   visitVariableGet(VariableGet node) {
     checkVariableInScope(node.variable, node);
     visitChildren(node);
+    if (afterConst && node.variable.isConst) {
+      problem(node, "VariableGet of const variable '${node.variable}'.");
+    }
   }
 
   visitVariableSet(VariableSet node) {
@@ -424,6 +462,9 @@
     if (node.target.isInstanceMember) {
       problem(node, "StaticGet of '${node.target}' that's an instance member.");
     }
+    if (afterConst && node.target is Field && node.target.isConst) {
+      problem(node, "StaticGet of const field '${node.target}'.");
+    }
   }
 
   @override
@@ -456,6 +497,9 @@
           "Constant StaticInvocation of '${node.target}' that isn't"
           " a const external factory.");
     }
+    if (afterConst && node.isConst && !inUnevaluatedConstant) {
+      problem(node, "Constant StaticInvocation.");
+    }
   }
 
   void checkTargetedInvocation(Member target, InvocationExpression node) {
@@ -532,6 +576,9 @@
           "Constant ConstructorInvocation fo '${node.target}' that"
           " isn't const.");
     }
+    if (afterConst && node.isConst) {
+      problem(node, "Invocation of const constructor '${node.target}'.");
+    }
   }
 
   bool areArgumentsCompatible(Arguments arguments, FunctionNode function) {
@@ -554,6 +601,37 @@
   }
 
   @override
+  visitListLiteral(ListLiteral node) {
+    visitChildren(node);
+    if (afterConst && node.isConst) {
+      problem(node, "Constant list literal.");
+    }
+  }
+
+  @override
+  visitSetLiteral(SetLiteral node) {
+    visitChildren(node);
+    if (afterConst && node.isConst) {
+      problem(node, "Constant set literal.");
+    }
+  }
+
+  @override
+  visitMapLiteral(MapLiteral node) {
+    visitChildren(node);
+    if (afterConst && node.isConst) {
+      problem(node, "Constant map literal.");
+    }
+  }
+
+  @override
+  visitSymbolLiteral(SymbolLiteral node) {
+    if (afterConst) {
+      problem(node, "Symbol literal.");
+    }
+  }
+
+  @override
   visitContinueSwitchStatement(ContinueSwitchStatement node) {
     if (node.target == null) {
       problem(node, "No target.");
@@ -569,6 +647,57 @@
   }
 
   @override
+  visitInstanceConstant(InstanceConstant constant) {
+    constant.visitChildren(this);
+    if (constant.typeArguments.length !=
+        constant.classNode.typeParameters.length) {
+      problem(
+          currentParent,
+          "Constant $constant provides ${constant.typeArguments.length}"
+          " type arguments, but the class declares"
+          " ${constant.classNode.typeParameters.length} parameters.");
+    }
+    Set<Class> superClasses = <Class>{};
+    int fieldCount = 0;
+    for (Class cls = constant.classNode; cls != null; cls = cls.superclass) {
+      superClasses.add(cls);
+      for (Field f in cls.fields) {
+        if (!f.isStatic && !f.isConst) fieldCount++;
+      }
+    }
+    if (constant.fieldValues.length != fieldCount) {
+      problem(
+          currentParent,
+          "Constant $constant provides ${constant.fieldValues.length}"
+          " field values, but the class declares"
+          " $fieldCount fields.");
+    }
+    constant.fieldValues.forEach((Reference fieldRef, Constant value) {
+      Field field = fieldRef.asField;
+      if (!superClasses.contains(field.enclosingClass)) {
+        problem(
+            currentParent,
+            "Constant $constant refers to field $field,"
+            " which does not belong to the right class.");
+      }
+    });
+  }
+
+  @override
+  visitUnevaluatedConstant(UnevaluatedConstant constant) {
+    if (inUnevaluatedConstant) {
+      problem(currentParent, "UnevaluatedConstant in UnevaluatedConstant.");
+    }
+    bool savedInUnevaluatedConstant = inUnevaluatedConstant;
+    inUnevaluatedConstant = true;
+    TreeNode oldParent = currentParent;
+    currentParent = null;
+    constant.expression.accept(this);
+    currentParent = oldParent;
+    inUnevaluatedConstant = savedInUnevaluatedConstant;
+  }
+
+  @override
   defaultMemberReference(Member node) {
     if (node.transformerFlags & TransformerFlag.seenByVerifier == 0) {
       problem(
@@ -616,7 +745,7 @@
       problem(
           currentParent,
           "Type $node provides ${node.typeArguments.length}"
-          " type arguments but the class declares"
+          " type arguments, but the class declares"
           " ${node.classNode.typeParameters.length} parameters.");
     }
   }
@@ -629,7 +758,7 @@
       problem(
           currentParent,
           "The typedef type $node provides ${node.typeArguments.length}"
-          " type arguments but the typedef declares"
+          " type arguments, but the typedef declares"
           " ${node.typedefNode.typeParameters.length} parameters.");
     }
   }
diff --git a/pkg/kernel/runtime/reify/README.md b/pkg/kernel/runtime/reify/README.md
deleted file mode 100644
index d3371fb..0000000
--- a/pkg/kernel/runtime/reify/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-for details. All rights reserved. Use of this source code is governed by a
-BSD-style license that can be found in the LICENSE file.
--->
-# Runtime Support for Reified Generic Types
-
-This subdirectory contains files used at runtime by the code generated by
-[../reify_transformer.dart].
-
-The files in this directory can be imported by anyone, but files in this
-directory should be frugal about importing anything themselves. This is because
-this library is used by all programs that are tranformed and contributes to
-code size.
diff --git a/pkg/kernel/runtime/reify/declarations.dart b/pkg/kernel/runtime/reify/declarations.dart
deleted file mode 100644
index 7aeb474..0000000
--- a/pkg/kernel/runtime/reify/declarations.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library kernel.transformations.reify.runtime.declarations;
-
-import 'types.dart' show FunctionType, Interface, ReifiedType, TypeVariable;
-
-typedef String Id2String(Object id);
-
-/// Represents a class.
-///
-/// There's one instance of this class for each class in the program.
-///
-/// Note: not all classes can be represented as a compile-time constants. For
-/// example, most core classes, such as, `String`, `int`, and `double`
-/// implement `Comparable` in a way that cannot be expressed as a constant.
-class Class {
-  final id;
-
-  Interface supertype;
-
-  FunctionType callableType;
-
-  final List<TypeVariable> variables;
-
-  List<Interface> interfaces;
-
-  static Id2String debugId2String;
-
-  Class(this.id, this.supertype,
-      {this.callableType,
-      this.variables: const <TypeVariable>[],
-      this.interfaces /* set in init */});
-
-  Interface get thisType {
-    return new Interface(this, variables);
-  }
-
-  String get name => debugId2String == null ? "$id" : debugId2String(id);
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("class $name");
-    if (variables.isNotEmpty) {
-      sb.write("<");
-      bool first = true;
-      for (TypeVariable tv in variables) {
-        if (!first) {
-          sb.write(", ");
-        }
-        sb.write(tv);
-        sb.write(" extends ");
-        sb.write(tv.bound);
-      }
-      sb.write(">");
-    }
-    if (supertype != null) {
-      sb.write(" extends $supertype");
-    }
-    if (interfaces.isNotEmpty) {
-      sb.write(" implements ");
-      sb.writeAll(interfaces, ", ");
-    }
-    return "$sb";
-  }
-}
-
-/// Allocates a (non-growable) list of [amount] class declarations with ids `0`
-/// to `amount - 1`. This function is called from the generated code that
-/// initializes the type information.
-List<Class> allocateDeclarations(List<String> names, List<int> typeParameters) {
-  List<TypeVariable> allocateVariables(int amount) {
-    if (amount == 0) return const <TypeVariable>[];
-    return new List<TypeVariable>.generate(
-        amount, (int i) => new TypeVariable(i),
-        growable: false);
-  }
-
-  return new List<Class>.generate(
-      names.length,
-      (int i) => new Class(names[i], null,
-          variables: allocateVariables(typeParameters[i])),
-      growable: false);
-}
-
-/// Initializes the supertype and interfaces of `classes[index]`.
-/// This function is called from generated code.
-void init(List<Class> classes, int index, ReifiedType supertype,
-    [List<Interface> interfaces = const <Interface>[],
-    FunctionType callableType]) {
-  Class declaration = classes[index];
-  assert(supertype == null);
-  declaration.supertype = supertype;
-  assert(interfaces == null);
-  declaration.interfaces = interfaces;
-  declaration.callableType = callableType;
-}
diff --git a/pkg/kernel/runtime/reify/interceptors.dart b/pkg/kernel/runtime/reify/interceptors.dart
deleted file mode 100644
index af4368d..0000000
--- a/pkg/kernel/runtime/reify/interceptors.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library kernel.transformations.reify.runtime.interceptors;
-
-import 'types.dart' show ReifiedType;
-
-/// Helper method that generates a [ReifiedType] corresponding to the literal
-/// type [type].
-///
-/// Calls to this method are recognized in the transformation and replaced by
-/// code that constructs the correct type.
-ReifiedType reify(Type type) {
-  throw "This method should never be called in translated code";
-}
-
-/// Marker interface to indicate that we can extract the runtime type using
-/// a property getter.
-abstract class HasRuntimeTypeGetter {
-  ReifiedType get $type;
-}
-
-/// Interceptor to safely access the type of an object.
-///
-/// For native objects that do not have the `$type` field on them, the
-/// interceptor directly returns the type, otherwise the value of the field is
-/// returned.
-ReifiedType type(dynamic o) {
-  if (o == null) {
-    return reify(Null);
-  } else if (o is HasRuntimeTypeGetter) {
-    return o.$type;
-  } else if (o is bool) {
-    return reify(bool);
-  } else if (o is String) {
-    return reify(String);
-  } else if (o is int) {
-    return reify(int);
-  } else if (o is double) {
-    return reify(double);
-  } else if (o is Type) {
-    return reify(Type);
-  } else if (o is AbstractClassInstantiationError) {
-    return reify(AbstractClassInstantiationError);
-  } else if (o is NoSuchMethodError) {
-    return reify(NoSuchMethodError);
-  } else if (o is CyclicInitializationError) {
-    return reify(CyclicInitializationError);
-  } else if (o is UnsupportedError) {
-    return reify(UnsupportedError);
-  } else if (o is IntegerDivisionByZeroException) {
-    return reify(IntegerDivisionByZeroException);
-  } else if (o is RangeError) {
-    return reify(RangeError);
-  } else if (o is ArgumentError) {
-    return reify(ArgumentError);
-  }
-  ReifiedType type = _type[o];
-  if (type != null) {
-    return type;
-  }
-  throw 'Unable to get runtime type of ${o.runtimeType}';
-}
-
-// This constructor call is not intercepted with [attachType] since the runtime
-// library is currently never transformed.
-final Expando _type = new Expando();
-
-dynamic attachType(Object o, ReifiedType t) {
-  _type[o] = t;
-  return o;
-}
diff --git a/pkg/kernel/runtime/reify/types.dart b/pkg/kernel/runtime/reify/types.dart
deleted file mode 100644
index f119342..0000000
--- a/pkg/kernel/runtime/reify/types.dart
+++ /dev/null
@@ -1,678 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Notation:
-///
-/// * `[[T]]` is the runtime representation of type `T` (that is, `T` reified).
-library kernel.transformations.reify.runtime.types;
-
-import 'declarations.dart' show Class;
-
-export 'declarations.dart';
-
-export 'interceptors.dart';
-
-// The public interface of this library are static functions to access parts of
-// reified type objects and the constructors on the ReifiedType subclasses.
-
-bool isSubtypeOf(ReifiedType a, ReifiedType b) => a._isSubtypeOf(b);
-
-bool isMoreSpecificThan(ReifiedType a, ReifiedType b) {
-  return a._isMoreSpecificThan(b);
-}
-
-Kind getKind(ReifiedType type) => type._kind;
-
-ReifiedType asInstanceOf(Interface type, Class declaration) {
-  return type.asInstanceOf(declaration);
-}
-
-List<ReifiedType> getTypeArguments(Interface type) => type._typeArguments;
-
-bool isDynamic(ReifiedType type) => type._isDynamic;
-
-bool isFunction(ReifiedType type) => type._isFunction;
-
-bool isInterface(ReifiedType type) => type._isInterface;
-
-bool isIntersection(ReifiedType type) => type._isIntersection;
-
-bool isVariable(ReifiedType type) => type._isVariable;
-
-bool isVoid(ReifiedType type) => type._isVoid;
-
-bool isObject(ReifiedType type) => false;
-
-ReifiedType getSupertype(var type) => type._supertype;
-
-Iterable<ReifiedType> getInterfaces(Interface type) => type._interfaces;
-
-ReifiedType subst(ReifiedType type, List<ReifiedType> arguments,
-    List<ReifiedType> parameters) {
-  return type._subst(arguments, parameters);
-}
-
-// TODO(ahe): Do we need ReifiedNullType?
-
-ReifiedType _intersection(ReifiedType a, ReifiedType b) {
-  if (a == null) return b;
-  if (b == null) return a;
-  if (a == b) return a;
-  return new Intersection(a, b);
-}
-
-enum Kind {
-  Bottom,
-  Dynamic,
-  Function,
-  Interface,
-  Intersection,
-  Variable,
-  Void,
-}
-
-abstract class ReifiedType {
-  // TODO(ahe): Should this be a getter to save memory? Which is faster?
-  final Kind _kind;
-
-  const ReifiedType(this._kind);
-
-  bool get _isDynamic => _kind == Kind.Dynamic;
-
-  bool get _isFunction => _kind == Kind.Function;
-
-  bool get _isInterface => _kind == Kind.Interface;
-
-  bool get _isIntersection => _kind == Kind.Intersection;
-
-  bool get _isVariable => _kind == Kind.Variable;
-
-  bool get _isVoid => _kind == Kind.Void;
-
-  bool get _isObject => false;
-
-  /// Returns true if [this] is more specific than [type].
-  bool _isMoreSpecificThan(ReifiedType type);
-
-  /// Performs the substitution `[arguments[i]/parameters[i]]this`.
-  ///
-  /// The notation is known from this lambda calculus rule:
-  ///
-  ///     (lambda x.e0)e1 -> [e1/x]e0.
-  ///
-  /// Invariant: There must be the same number of [arguments] and [parameters].
-  ReifiedType _subst(List<ReifiedType> arguments, List<ReifiedType> parameters);
-
-  /// Returns true if [this] is a subtype of [type].
-  bool _isSubtypeOf(ReifiedType type) {
-    return _subst(const <ReifiedType>[const Bottom()],
-        const <ReifiedType>[const Dynamic()])._isMoreSpecificThan(type);
-  }
-
-  bool _isAssignableTo(ReifiedType type) {
-    if (type._isDynamic) return true;
-    return this._isSubtypeOf(type) || type._isSubtypeOf(this);
-  }
-}
-
-/// Represents the type `dynamic`.
-class Dynamic extends ReifiedType {
-  const Dynamic() : super(Kind.Dynamic);
-
-  bool _isMoreSpecificThan(ReifiedType type) => type._isDynamic;
-
-  ReifiedType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    int index = 0;
-    for (ReifiedType parameter in parameters) {
-      if (parameter._isDynamic) return arguments[index];
-      index++;
-    }
-    return this;
-  }
-
-  String toString() => "dynamic";
-}
-
-/// Represents the bottom type.
-class Bottom extends ReifiedType {
-  const Bottom() : super(Kind.Bottom);
-
-  bool _isMoreSpecificThan(ReifiedType type) => true;
-
-  ReifiedType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    return this;
-  }
-
-  String toString() => "<bottom>";
-}
-
-/// Represents the type `void`.
-class Void extends ReifiedType {
-  const Void() : super(Kind.Void);
-
-  bool _isMoreSpecificThan(ReifiedType type) {
-    // `void` isn't more specific than anything but itself.
-    return type._isVoid;
-  }
-
-  bool _isSubtypeOf(ReifiedType type) {
-    // `void` isn't the subtype of anything besides `dynamic` and itself.
-    return type._isVoid || type._isDynamic;
-  }
-
-  ReifiedType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    return this;
-  }
-
-  String toString() => "void";
-}
-
-/// Represents an interface type. That is, the type of any class.
-///
-/// For example, the type
-///
-///     String
-///
-/// Would be represented as:
-///
-///    new Interface(stringDeclaration);
-///
-/// Where `stringDeclaration` is an instance of [Class] which contains
-/// information about [String]'s supertype and implemented interfaces.
-///
-/// A parameterized type, for example:
-///
-///     Box<int>
-///
-/// Would be represented as:
-///
-///     new Interface(boxDeclaration,
-///         [new Interface(intDeclaration)]);
-///
-/// Implementation notes and considerations:
-///
-/// * It's possible that we want to split this class in two to save memory: one
-///   for non-generic classes and one for generic classes. Only the latter
-///   would need [_typeArguments]. However, this must be weighed against the
-///   additional polymorphism.
-/// * Generally, we don't canonicalize types. However, simple types like `new
-///   Interface(intDeclaration)` should be canonicalized to save
-///   memory. Precisely how this canonicalization will happen is TBD, but it
-///   may simply be by using compile-time constants.
-class Interface extends ReifiedType implements Type {
-  final Class _declaration;
-
-  final List<ReifiedType> _typeArguments;
-
-  const Interface(this._declaration,
-      [this._typeArguments = const <ReifiedType>[]])
-      : super(Kind.Interface);
-
-  bool get _isObject => _declaration.supertype == null;
-
-  Interface get _supertype {
-    return _declaration.supertype
-        ?._subst(_typeArguments, _declaration.variables);
-  }
-
-  Iterable<Interface> get _interfaces {
-    return _declaration.interfaces.map((Interface type) {
-      return type._subst(_typeArguments, _declaration.variables);
-    });
-  }
-
-  FunctionType get _callableType {
-    return _declaration.callableType
-        ?._subst(_typeArguments, _declaration.variables);
-  }
-
-  bool _isMoreSpecificThan(ReifiedType type) {
-    if (type._isDynamic) return true;
-    // Intersection types can only occur as the result of calling
-    // [asInstanceOf], they should never be passed in to this method.
-    assert(!type._isIntersection);
-    if (type._isFunction) {
-      return _callableType?._isMoreSpecificThan(type) ?? false;
-    }
-    if (!type._isInterface) return false;
-    if (this == type) return true;
-    ReifiedType supertype = asInstanceOfType(type);
-    if (supertype == null) {
-      // Special case: A callable class is a subtype of [Function], regardless
-      // if it implements [Function]. It isn't more specific than
-      // [Function]. The type representing [Function] is the supertype of
-      // `declaration.callableType`.
-      return _declaration.callableType?._supertype?._isSubtypeOf(type) ?? false;
-    }
-    if (type == supertype) return true;
-    switch (supertype._kind) {
-      case Kind.Dynamic:
-      case Kind.Variable:
-        // Shouldn't happen. See switch in [asInstanceOf].
-        throw "internal error: $supertype";
-
-      case Kind.Interface:
-        Interface s = supertype;
-        Interface t = type;
-        for (int i = 0; i < s._typeArguments.length; i++) {
-          if (!s._typeArguments[i]._isMoreSpecificThan(t._typeArguments[i])) {
-            return false;
-          }
-        }
-        return true;
-
-      case Kind.Intersection:
-        return supertype._isMoreSpecificThan(type);
-
-      default:
-        throw "Internal error: unhandled kind '${type._kind}'";
-    }
-  }
-
-  bool _isSubtypeOf(ReifiedType type) {
-    if (type._isInterface) {
-      Interface interface = type;
-      if (interface._declaration != this._declaration) {
-        // This addition to the specified rules allows us to handle cases like
-        //     class D extends A<dynamic> {}
-        //     new D() is A<A>
-        // where directly going to `isMoreSpecific` would leave `dynamic` in the
-        // result of `asInstanceOf(A)` instead of bottom.
-        ReifiedType that = asInstanceOf(interface._declaration);
-        if (that != null) {
-          return that._isSubtypeOf(type);
-        }
-      }
-    }
-    return super._isSubtypeOf(type) ||
-        (_callableType?._isSubtypeOf(type) ?? false);
-  }
-
-  /// Returns [this] translated to [type] if [type] is a supertype of
-  /// [this]. Otherwise null.
-  ///
-  /// For example, given:
-  ///
-  ///     class Box<T> {}
-  ///     class BeatBox extends Box<Beat> {}
-  ///     class Beat {}
-  ///
-  /// We have:
-  ///
-  ///     [[BeatBox]].asInstanceOf([[Box]]) -> [[Box<Beat>]].
-  ReifiedType asInstanceOf(Class other) {
-    if (_declaration == other) return this;
-    ReifiedType result = _declaration.supertype
-        ?._subst(_typeArguments, _declaration.variables)
-        ?.asInstanceOf(other);
-    for (Interface interface in _declaration.interfaces) {
-      result = _intersection(
-          result,
-          interface
-              ._subst(_typeArguments, _declaration.variables)
-              .asInstanceOf(other));
-    }
-    return result;
-  }
-
-  ReifiedType asInstanceOfType(Interface type) {
-    return asInstanceOf(type._declaration);
-  }
-
-  Interface _subst(List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    List<ReifiedType> copy;
-    int index = 0;
-    for (ReifiedType typeArgument in _typeArguments) {
-      ReifiedType substitution = typeArgument._subst(arguments, parameters);
-      if (substitution != typeArgument) {
-        if (copy == null) {
-          copy = new List<ReifiedType>.from(_typeArguments);
-        }
-        copy[index] = substitution;
-      }
-      index++;
-    }
-    return copy == null ? this : new Interface(_declaration, copy);
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write(_declaration.name);
-    if (_typeArguments.isNotEmpty) {
-      sb.write("<");
-      sb.writeAll(_typeArguments, ", ");
-      sb.write(">");
-    }
-    return "$sb";
-  }
-
-  int get hashCode {
-    int code = 23;
-    code = (71 * code + _declaration.hashCode) & 0x3fffffff;
-    for (ReifiedType typeArgument in _typeArguments) {
-      code = (71 * code + typeArgument.hashCode) & 0x3fffffff;
-    }
-    return code;
-  }
-
-  bool operator ==(other) {
-    if (other is Interface) {
-      if (_declaration != other._declaration) return false;
-      if (identical(_typeArguments, other._typeArguments)) return true;
-      assert(_typeArguments.length == other._typeArguments.length);
-      for (int i = 0; i < _typeArguments.length; i++) {
-        if (_typeArguments[i] != other._typeArguments[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-    return false;
-  }
-}
-
-/// Represents the intersection type of [typeA] and [typeB]. The intersection
-/// type represents a type that is a subtype of both [typeA] and [typeB].
-///
-/// This type is produced when a class implements the same interface twice with
-/// different type arguments. For example:
-///
-///     abstract class MyNumberList implements List<int>, List<double> {}
-///
-/// Can lead to this intersection type:
-///
-///     new Intersection([[List<int>]], [[List<double>]])
-///
-/// For example,
-///
-///     [[MyNumberList]].asInstanceOf([[List]]) ->
-///         new Intersection([[List<int>]], [[List<double>]])
-///
-/// Note: sometimes, people confuse this with union types. However the union
-/// type of `A` and `B` would be anything that is a subtype of either `A` or
-/// `B`.
-///
-/// See [Intersection types]
-/// (https://en.wikipedia.org/wiki/Type_system#Intersection_types).
-class Intersection extends ReifiedType {
-  final ReifiedType typeA;
-  final ReifiedType typeB;
-
-  const Intersection(this.typeA, this.typeB) : super(Kind.Intersection);
-
-  bool _isMoreSpecificThan(ReifiedType type) {
-    // In the above example, `MyNumberList` is a subtype of List<int> *or*
-    // List<double>.
-    return typeA._isMoreSpecificThan(type) || typeB._isMoreSpecificThan(type);
-  }
-
-  ReifiedType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    ReifiedType aSubstitution = typeA._subst(arguments, parameters);
-    ReifiedType bSubstitution = typeB._subst(arguments, parameters);
-    return (aSubstitution == typeA && bSubstitution == typeB)
-        ? this
-        : _intersection(aSubstitution, bSubstitution);
-  }
-
-  String toString() => "{ $typeA, $typeB }";
-}
-
-/// Represents a type variable aka type parameter.
-///
-/// For example, this class:
-///
-///     class Box<T> {}
-///
-/// Defines one type variable. In the type `Box<int>`, there are no type
-/// variables.  However, `int` is a type argument to the type
-/// parameter/variable `T`.
-class TypeVariable extends ReifiedType {
-  final int _id;
-
-  // TODO(ahe): Do we need to reify bounds?
-  ReifiedType bound;
-
-  TypeVariable(this._id) : super(Kind.Variable);
-
-  bool _isMoreSpecificThan(ReifiedType type) {
-    if (type == this || type._isDynamic || type._isObject) return true;
-    // The bounds of a type variable may contain a cycle, such as:
-    //
-    //     class C<T extends S, S extends T> {}
-    //
-    // We use the [tortoise and hare algorithm]
-    // (https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare) to
-    // handle cycles.
-    ReifiedType tortoise = bound;
-    if (tortoise == type) return true;
-    ReifiedType hare = getBoundOrNull(bound);
-    while (tortoise != hare) {
-      tortoise = getBoundOrNull(tortoise);
-      if (tortoise == type) return true;
-      hare = getBoundOrNull(getBoundOrNull(hare));
-    }
-    // Here we know that `tortoise == hare`. Either they're both `null` or we
-    // detected a cycle.
-    if (tortoise != null) {
-      // There was a cycle of type variables in the bounds, but it didn't
-      // involve [type]. The variable [tortoise] visited all the type variables
-      // in the cycle (at least once), and each time we compared it to [type].
-      return false;
-    }
-    // There are no cycles and it's safe to recurse on [bound].
-    return bound._isMoreSpecificThan(type);
-  }
-
-  ReifiedType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    int index = 0;
-    for (ReifiedType parameter in parameters) {
-      if (this == parameter) return arguments[index];
-      index++;
-    }
-    return this;
-  }
-
-  String toString() => "#$_id";
-}
-
-/// Represents a function type.
-class FunctionType extends ReifiedType {
-  /// Normally, the [Interface] representing [Function]. But an
-  /// implementation-specific subtype of [Function] may also be used.
-  final ReifiedType _supertype;
-
-  final ReifiedType _returnType;
-
-  /// Encodes number of optional parameters and if the optional parameters are
-  /// named.
-  final int _data;
-
-  /// Encodes the argument types. Positional parameters use one element, the
-  /// type; named parameters use two, the name [String] and type. Named
-  /// parameters must be sorted by name.
-  final List _encodedParameters;
-
-  static const FunctionTypeRelation subtypeRelation =
-      const FunctionSubtypeRelation();
-
-  static const FunctionTypeRelation moreSpecificRelation =
-      const FunctionMoreSpecificRelation();
-
-  const FunctionType(
-      this._supertype, this._returnType, this._data, this._encodedParameters)
-      : super(Kind.Function);
-
-  bool get hasNamedParameters => (_data & 1) == 1;
-
-  int get optionalParameters => _data >> 1;
-
-  int get parameters {
-    return hasNamedParameters
-        ? _encodedParameters.length - optionalParameters
-        : _encodedParameters.length;
-  }
-
-  int get requiredParameters {
-    return hasNamedParameters
-        ? _encodedParameters.length - optionalParameters * 2
-        : _encodedParameters.length - optionalParameters;
-  }
-
-  bool _isSubtypeOf(ReifiedType type) => subtypeRelation.areRelated(this, type);
-
-  bool _isMoreSpecificThan(ReifiedType type) {
-    return moreSpecificRelation.areRelated(this, type);
-  }
-
-  FunctionType _subst(
-      List<ReifiedType> arguments, List<ReifiedType> parameters) {
-    List substitutedParameters;
-    int positionalParameters =
-        hasNamedParameters ? requiredParameters : this.parameters;
-    for (int i = 0; i < _encodedParameters.length; i++) {
-      if (i >= positionalParameters) {
-        // Skip the name of a named parameter.
-        i++;
-      }
-      ReifiedType type = _encodedParameters[i];
-      ReifiedType substitution = type._subst(arguments, parameters);
-      if (substitution != type) {
-        if (substitutedParameters == null) {
-          substitutedParameters = new List.from(_encodedParameters);
-        }
-        substitutedParameters[i] = substitution;
-      }
-    }
-    ReifiedType substitutedReturnType =
-        _returnType._subst(arguments, parameters);
-    if (substitutedParameters == null) {
-      if (_returnType == substitutedReturnType) return this;
-      substitutedParameters = _encodedParameters;
-    }
-    return new FunctionType(
-        _supertype, substitutedReturnType, _data, substitutedParameters);
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("(");
-    bool first = true;
-    for (int i = 0; i < requiredParameters; i++) {
-      if (!first) {
-        sb.write(", ");
-      }
-      sb.write(_encodedParameters[i]);
-      first = false;
-    }
-    if (requiredParameters != parameters) {
-      if (!first) {
-        sb.write(", ");
-      }
-      if (hasNamedParameters) {
-        sb.write("{");
-        first = true;
-        for (int i = requiredParameters;
-            i < _encodedParameters.length;
-            i += 2) {
-          if (!first) {
-            sb.write(", ");
-          }
-          sb.write(_encodedParameters[i + 1]);
-          sb.write(" ");
-          sb.write(_encodedParameters[i]);
-          first = false;
-        }
-        sb.write("}");
-      } else {
-        sb.write("[");
-        first = true;
-        for (int i = requiredParameters; i < _encodedParameters.length; i++) {
-          if (!first) {
-            sb.write(", ");
-          }
-          sb.write(_encodedParameters[i]);
-          first = false;
-        }
-        sb.write("]");
-      }
-    }
-    sb.write(") -> ");
-    sb.write(_returnType);
-    return "$sb";
-  }
-}
-
-abstract class FunctionTypeRelation {
-  const FunctionTypeRelation();
-
-  bool areRelated(FunctionType self, ReifiedType type, {bool isMoreSpecific}) {
-    if (!type._isFunction) {
-      return arePartsRelated(self._supertype, type);
-    }
-    FunctionType other = type;
-    if (!other._returnType._isVoid) {
-      if (!arePartsRelated(self._returnType, other._returnType)) return false;
-    }
-    int positionalParameters =
-        self.hasNamedParameters ? self.requiredParameters : self.parameters;
-    int otherPositionalParameters =
-        other.hasNamedParameters ? other.requiredParameters : other.parameters;
-    if (self.requiredParameters > other.requiredParameters) return false;
-    if (positionalParameters < otherPositionalParameters) return false;
-
-    for (int i = 0; i < otherPositionalParameters; i++) {
-      if (!arePartsRelated(
-          self._encodedParameters[i], other._encodedParameters[i])) {
-        return false;
-      }
-    }
-
-    if (!other.hasNamedParameters) return true;
-
-    int j = positionalParameters;
-    for (int i = otherPositionalParameters;
-        i < other._encodedParameters.length;
-        i += 2) {
-      String name = other._encodedParameters[i];
-      for (; j < self._encodedParameters.length; j += 2) {
-        if (self._encodedParameters[j] == name) break;
-      }
-      if (j == self._encodedParameters.length) return false;
-      if (!arePartsRelated(
-          self._encodedParameters[j + 1], other._encodedParameters[i + 1])) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  bool arePartsRelated(ReifiedType a, ReifiedType b);
-}
-
-class FunctionSubtypeRelation extends FunctionTypeRelation {
-  const FunctionSubtypeRelation();
-
-  bool arePartsRelated(ReifiedType a, ReifiedType b) => a._isAssignableTo(b);
-}
-
-class FunctionMoreSpecificRelation extends FunctionTypeRelation {
-  const FunctionMoreSpecificRelation();
-
-  bool arePartsRelated(ReifiedType a, ReifiedType b) =>
-      a._isMoreSpecificThan(b);
-}
-
-/// If [type] is a type variable, return its bound. Otherwise `null`.
-ReifiedType getBoundOrNull(ReifiedType type) {
-  if (type == null) return null;
-  if (!type._isVariable) return null;
-  TypeVariable tv = type;
-  return tv.bound;
-}
diff --git a/pkg/kernel/test/binary/library_flags_test.dart b/pkg/kernel/test/binary/library_flags_test.dart
index 9389b21..bca2e52 100644
--- a/pkg/kernel/test/binary/library_flags_test.dart
+++ b/pkg/kernel/test/binary/library_flags_test.dart
@@ -4,6 +4,8 @@
 
 import 'utils.dart';
 
+// ignore_for_file: DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
+
 /// Test that library flags (external, synthetic)
 /// are serialized and read correctly.
 main() {
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 0d53973..d6be1b2 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -309,7 +309,8 @@
         .map((name) => new TypeParameter(name, coreTypes.objectLegacyRawType))
         .toList();
     var typeParameterTypes = typeParameters
-        .map((parameter) => new TypeParameterType(parameter))
+        .map(
+            (parameter) => new TypeParameterType(parameter, Nullability.legacy))
         .toList();
     var supertype =
         extends_ != null ? extends_(typeParameterTypes) : objectSuper;
@@ -527,7 +528,7 @@
     var a = addGenericClass('A', ['T', 'U']);
 
     var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
-    var bTT = new TypeParameterType(bT);
+    var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
         typeParameters: [bT],
@@ -555,7 +556,7 @@
     var a = addGenericClass('A', ['T', 'U']);
 
     var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
-    var bTT = new TypeParameterType(bT);
+    var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
         typeParameters: [bT],
@@ -589,7 +590,7 @@
     var a = addGenericClass('A', ['T', 'U']);
 
     var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
-    var bTT = new TypeParameterType(bT);
+    var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
         typeParameters: [bT],
@@ -1201,7 +1202,7 @@
     var a = addGenericClass('A', ['T', 'U']);
 
     var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
-    var bTT = new TypeParameterType(bT);
+    var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
         typeParameters: [bT],
@@ -1212,11 +1213,11 @@
 class B<T*> extends self::A<self::B::T*, core::bool*> {}
 ''');
 
-    var b_int = new InterfaceType(b, [int]);
+    var b_int = new InterfaceType(b, Nullability.legacy, [int]);
     expect(hierarchy.getTypeAsInstanceOf(b_int, a),
-        new InterfaceType(a, [int, bool]));
+        new InterfaceType(a, Nullability.legacy, [int, bool]));
     expect(hierarchy.getTypeAsInstanceOf(b_int, objectClass),
-        new InterfaceType(objectClass));
+        new InterfaceType(objectClass, Nullability.legacy));
   }
 
   void _assertOverridePairs(Class class_, List<String> expected) {
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index d544535..87ed4e9 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -45,7 +45,7 @@
     if (parent.typeParameters.isEmpty) {
       return const VoidType();
     }
-    return new TypeParameterType(parent.typeParameters[0]);
+    return new TypeParameterType(parent.typeParameters[0], Nullability.legacy);
   }
   return getTypeForMetadata(parent);
 }
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
index 9603db8..ad2354e 100644
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -329,10 +329,14 @@
           name: "/* T Function<T>(T Function<T>()); */",
           node: new ExpressionStatement(new TypeLiteral(new FunctionType(
               [
-                new FunctionType([], new TypeParameterType(innerParam),
+                new FunctionType(
+                    [],
+                    new TypeParameterType(innerParam, Nullability.legacy),
+                    Nullability.legacy,
                     typeParameters: [innerParam])
               ],
-              new TypeParameterType(outterParam),
+              new TypeParameterType(outterParam, Nullability.legacy),
+              Nullability.legacy,
               typeParameters: [outterParam]))),
           expectation: ""
               "(expr (type (-> (\"T^0\") ((dynamic)) ((dynamic)) "
diff --git a/pkg/kernel/test/type_parser.dart b/pkg/kernel/test/type_parser.dart
index e4b88ae..cb4856f 100644
--- a/pkg/kernel/test/type_parser.dart
+++ b/pkg/kernel/test/type_parser.dart
@@ -165,11 +165,11 @@
         } else if (target is Class) {
           List<DartType> typeArguments = parseOptionalTypeArgumentList();
           Nullability nullability = parseOptionalNullability();
-          return new InterfaceType(target, typeArguments, nullability);
+          return new InterfaceType(target, nullability, typeArguments);
         } else if (target is Typedef) {
           List<DartType> typeArguments = parseOptionalTypeArgumentList();
           Nullability nullability = parseOptionalNullability();
-          return new TypedefType(target, typeArguments, nullability);
+          return new TypedefType(target, nullability, typeArguments);
         } else if (target is TypeParameter) {
           Nullability nullability = parseOptionalNullability();
           DartType promotedBound;
@@ -183,7 +183,7 @@
             default:
               break;
           }
-          return new TypeParameterType(target, promotedBound, nullability);
+          return new TypeParameterType(target, nullability, promotedBound);
         }
         return fail("Unexpected lookup result for $name: $target");
 
@@ -194,8 +194,8 @@
         consumeString('=>');
         Nullability nullability = parseOptionalNullability();
         var returnType = parseType();
-        return new FunctionType(parameters, returnType,
-            namedParameters: namedParameters, nullability: nullability);
+        return new FunctionType(parameters, returnType, nullability,
+            namedParameters: namedParameters);
 
       case Token.LeftAngle:
         var typeParameters = parseAndPushTypeParameterList();
@@ -206,10 +206,8 @@
         Nullability nullability = parseOptionalNullability();
         var returnType = parseType();
         popTypeParameters(typeParameters);
-        return new FunctionType(parameters, returnType,
-            typeParameters: typeParameters,
-            namedParameters: namedParameters,
-            nullability: nullability);
+        return new FunctionType(parameters, returnType, nullability,
+            typeParameters: typeParameters, namedParameters: namedParameters);
 
       default:
         return fail('Unexpected token: $tokenText');
@@ -303,7 +301,8 @@
       scanToken();
       typeParameter.bound = parseType();
     } else {
-      typeParameter.bound = new InterfaceType(lookupType('Object'));
+      typeParameter.bound =
+          new InterfaceType(lookupType('Object'), Nullability.legacy);
     }
     return typeParameter;
   }
@@ -329,8 +328,8 @@
     return name.length == 1
         ? typeParameters.putIfAbsent(
             name,
-            () => new TypeParameter(
-                name, new InterfaceType(lookupClass('Object'))))
+            () => new TypeParameter(name,
+                new InterfaceType(lookupClass('Object'), Nullability.legacy)))
         : lookupClass(name);
   }
 
diff --git a/pkg/kernel/test/typedef_unalias_test.dart b/pkg/kernel/test/typedef_unalias_test.dart
index f9d448b..4f70f04 100644
--- a/pkg/kernel/test/typedef_unalias_test.dart
+++ b/pkg/kernel/test/typedef_unalias_test.dart
@@ -17,18 +17,21 @@
   harnessTest('`Foo` where typedef Foo = C', (TestHarness harness) {
     var foo = new Typedef('Foo', harness.otherLegacyRawType);
     harness.enclosingLibrary.addTypedef(foo);
-    var type = new TypedefType(foo);
+    var type = new TypedefType(foo, Nullability.legacy);
     expect(type.unalias, equals(harness.otherLegacyRawType));
   });
   harnessTest('`Foo<Obj>` where typedef Foo<T> = C<T>', (TestHarness harness) {
     var param = harness.makeTypeParameter('T');
-    var foo = new Typedef('Foo',
-        new InterfaceType(harness.otherClass, [new TypeParameterType(param)]),
+    var foo = new Typedef(
+        'Foo',
+        new InterfaceType(harness.otherClass, Nullability.legacy,
+            [new TypeParameterType(param, Nullability.legacy)]),
         typeParameters: [param]);
     harness.enclosingLibrary.addTypedef(foo);
-    var input = new TypedefType(foo, [harness.objectLegacyRawType]);
-    var expected =
-        new InterfaceType(harness.otherClass, [harness.objectLegacyRawType]);
+    var input =
+        new TypedefType(foo, Nullability.legacy, [harness.objectLegacyRawType]);
+    var expected = new InterfaceType(
+        harness.otherClass, Nullability.legacy, [harness.objectLegacyRawType]);
     expect(input.unalias, equals(expected));
   });
   harnessTest('`Bar<Obj>` where typedef Bar<T> = Foo<T>, Foo<T> = C<T>',
@@ -36,32 +39,37 @@
     var fooParam = harness.makeTypeParameter('T');
     var foo = new Typedef(
         'Foo',
-        new InterfaceType(
-            harness.otherClass, [new TypeParameterType(fooParam)]),
+        new InterfaceType(harness.otherClass, Nullability.legacy,
+            [new TypeParameterType(fooParam, Nullability.legacy)]),
         typeParameters: [fooParam]);
     var barParam = harness.makeTypeParameter('T');
     var bar = new Typedef(
-        'Bar', new TypedefType(foo, [new TypeParameterType(barParam)]),
+        'Bar',
+        new TypedefType(foo, Nullability.legacy,
+            [new TypeParameterType(barParam, Nullability.legacy)]),
         typeParameters: [barParam]);
     harness.enclosingLibrary.addTypedef(foo);
     harness.enclosingLibrary.addTypedef(bar);
-    var input = new TypedefType(bar, [harness.objectLegacyRawType]);
-    var expected =
-        new InterfaceType(harness.otherClass, [harness.objectLegacyRawType]);
+    var input =
+        new TypedefType(bar, Nullability.legacy, [harness.objectLegacyRawType]);
+    var expected = new InterfaceType(
+        harness.otherClass, Nullability.legacy, [harness.objectLegacyRawType]);
     expect(input.unalias, equals(expected));
   });
   harnessTest('`Foo<Foo<C>>` where typedef Foo<T> = C<T>',
       (TestHarness harness) {
     var param = harness.makeTypeParameter('T');
-    var foo = new Typedef('Foo',
-        new InterfaceType(harness.otherClass, [new TypeParameterType(param)]),
+    var foo = new Typedef(
+        'Foo',
+        new InterfaceType(harness.otherClass, Nullability.legacy,
+            [new TypeParameterType(param, Nullability.legacy)]),
         typeParameters: [param]);
     harness.enclosingLibrary.addTypedef(foo);
-    var input = new TypedefType(foo, [
-      new TypedefType(foo, [harness.objectLegacyRawType])
+    var input = new TypedefType(foo, Nullability.legacy, [
+      new TypedefType(foo, Nullability.legacy, [harness.objectLegacyRawType])
     ]);
-    var expected = new InterfaceType(harness.otherClass, [
-      new TypedefType(foo, [harness.objectLegacyRawType])
+    var expected = new InterfaceType(harness.otherClass, Nullability.legacy, [
+      new TypedefType(foo, Nullability.legacy, [harness.objectLegacyRawType])
     ]);
     expect(input.unalias, equals(expected));
   });
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 56498c6..c69b044 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -93,15 +93,15 @@
       matches("Type parameter '$tvarRegexp' referenced out of scope,"
           " parent is: 'null'\\."), (TestHarness test) {
     var parameter = test.makeTypeParameter();
-    test.addNode(
-        ListLiteral([], typeArgument: new TypeParameterType(parameter)));
+    test.addNode(ListLiteral([],
+        typeArgument: new TypeParameterType(parameter, Nullability.legacy)));
   });
   negativeTest(
       'Class type parameter from another class',
       "Type parameter 'test_lib::OtherClass::OtherT' referenced out of scope,"
           " parent is: 'test_lib::OtherClass'.", (TestHarness test) {
-    test.addNode(
-        TypeLiteral(new TypeParameterType(test.otherClass.typeParameters[0])));
+    test.addNode(TypeLiteral(new TypeParameterType(
+        test.otherClass.typeParameters[0], Nullability.legacy)));
   });
   negativeTest(
       'Class type parameter in static method',
@@ -110,8 +110,9 @@
     test.addNode(Procedure(
         new Name('bar'),
         ProcedureKind.Method,
-        new FunctionNode(new ReturnStatement(
-            new TypeLiteral(new TypeParameterType(test.classTypeParameter)))),
+        new FunctionNode(new ReturnStatement(new TypeLiteral(
+            new TypeParameterType(
+                test.classTypeParameter, Nullability.legacy)))),
         isStatic: true));
   });
   negativeTest(
@@ -119,8 +120,8 @@
       "Type parameter 'test_lib::TestClass::T' referenced from static context,"
           " parent is: 'test_lib::TestClass'.", (TestHarness test) {
     test.addNode(Field(new Name('field'),
-        initializer:
-            new TypeLiteral(new TypeParameterType(test.classTypeParameter)),
+        initializer: new TypeLiteral(
+            new TypeParameterType(test.classTypeParameter, Nullability.legacy)),
         isStatic: true));
   });
   negativeTest(
@@ -140,29 +141,30 @@
           new Procedure(
               new Name('use'),
               ProcedureKind.Method,
-              new FunctionNode(new ReturnStatement(
-                  new TypeLiteral(new TypeParameterType(parameter)))))
+              new FunctionNode(new ReturnStatement(new TypeLiteral(
+                  new TypeParameterType(parameter, Nullability.legacy)))))
         ]));
   });
   negativeTest(
       'Interface type arity too low',
-      "Type test_lib::OtherClass* provides 0 type arguments"
+      "Type test_lib::OtherClass* provides 0 type arguments,"
           " but the class declares 1 parameters.", (TestHarness test) {
-    test.addNode(TypeLiteral(new InterfaceType(test.otherClass, [])));
+    test.addNode(TypeLiteral(
+        new InterfaceType(test.otherClass, Nullability.legacy, [])));
   });
   negativeTest(
       'Interface type arity too high',
-      "Type test_lib::OtherClass<dynamic, dynamic>* provides 2 type arguments"
+      "Type test_lib::OtherClass<dynamic, dynamic>* provides 2 type arguments,"
           " but the class declares 1 parameters.", (TestHarness test) {
-    test.addNode(TypeLiteral(new InterfaceType(
-        test.otherClass, [new DynamicType(), new DynamicType()])));
+    test.addNode(TypeLiteral(new InterfaceType(test.otherClass,
+        Nullability.legacy, [new DynamicType(), new DynamicType()])));
   });
   negativeTest(
       'Dangling interface type',
       matches("Dangling reference to 'null::#class[0-9]+',"
           " parent is: 'null'\\."), (TestHarness test) {
     var orphan = new Class();
-    test.addNode(TypeLiteral(new InterfaceType(orphan)));
+    test.addNode(TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
   });
   negativeTest('Dangling field get',
       "Dangling reference to 'null::foo', parent is: 'null'.",
@@ -274,18 +276,22 @@
   });
   positiveTest('Valid typedef Foo = `(C) => void`', (TestHarness test) {
     var typedef_ = new Typedef(
-        'Foo', new FunctionType([test.otherLegacyRawType], const VoidType()));
+        'Foo',
+        new FunctionType(
+            [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
     test.addNode(typedef_);
   });
   positiveTest('Valid typedef Foo = C<dynamic>', (TestHarness test) {
     var typedef_ = new Typedef(
-        'Foo', new InterfaceType(test.otherClass, [const DynamicType()]));
+        'Foo',
+        new InterfaceType(
+            test.otherClass, Nullability.legacy, [const DynamicType()]));
     test.addNode(typedef_);
   });
   positiveTest('Valid typedefs Foo = Bar, Bar = C', (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar);
+    foo.type = new TypedefType(bar, Nullability.legacy);
     bar.type = test.otherLegacyRawType;
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
@@ -293,16 +299,19 @@
   positiveTest('Valid typedefs Foo = C<Bar>, Bar = C', (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
-    foo.type = new InterfaceType(test.otherClass, [new TypedefType(bar)]);
+    foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypedefType(bar, Nullability.legacy)]);
     bar.type = test.otherLegacyRawType;
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
   });
   positiveTest('Valid typedef type in field', (TestHarness test) {
     var typedef_ = new Typedef(
-        'Foo', new FunctionType([test.otherLegacyRawType], const VoidType()));
+        'Foo',
+        new FunctionType(
+            [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
     var field = new Field(new Name('field'),
-        type: new TypedefType(typedef_), isStatic: true);
+        type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
     test.enclosingLibrary.addTypedef(typedef_);
     test.enclosingLibrary.addMember(field);
   });
@@ -311,7 +320,7 @@
       "The typedef 'typedef Foo = test_lib::Foo;\n'"
           " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new TypedefType(typedef_);
+    typedef_.type = new TypedefType(typedef_, Nullability.legacy);
     test.addNode(typedef_);
   });
   negativeTest(
@@ -319,8 +328,10 @@
       "The typedef 'typedef Foo = (test_lib::Foo) →* void;\n'"
           " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
-    typedef_.type =
-        new FunctionType([new TypedefType(typedef_)], const VoidType());
+    typedef_.type = new FunctionType(
+        [new TypedefType(typedef_, Nullability.legacy)],
+        const VoidType(),
+        Nullability.legacy);
     test.addNode(typedef_);
   });
   negativeTest(
@@ -328,7 +339,8 @@
       "The typedef 'typedef Foo = () →* test_lib::Foo;\n'"
           " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new FunctionType([], new TypedefType(typedef_));
+    typedef_.type = new FunctionType(
+        [], new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
     test.addNode(typedef_);
   });
   negativeTest(
@@ -336,8 +348,8 @@
       "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Foo>*;\n'"
           " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
-    typedef_.type =
-        new InterfaceType(test.otherClass, [new TypedefType(typedef_)]);
+    typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypedefType(typedef_, Nullability.legacy)]);
     test.addNode(typedef_);
   });
   negativeTest(
@@ -346,8 +358,8 @@
           " refers to itself", (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar);
-    bar.type = new TypedefType(foo);
+    foo.type = new TypedefType(bar, Nullability.legacy);
+    bar.type = new TypedefType(foo, Nullability.legacy);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
   });
@@ -357,8 +369,9 @@
           " refers to itself", (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar);
-    bar.type = new InterfaceType(test.otherClass, [new TypedefType(foo)]);
+    foo.type = new TypedefType(bar, Nullability.legacy);
+    bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypedefType(foo, Nullability.legacy)]);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
   });
@@ -368,8 +381,10 @@
           " refers to itself", (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
-    foo.type = new InterfaceType(test.otherClass, [new TypedefType(bar)]);
-    bar.type = new InterfaceType(test.otherClass, [new TypedefType(foo)]);
+    foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypedefType(bar, Nullability.legacy)]);
+    bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypedefType(foo, Nullability.legacy)]);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
   });
@@ -378,7 +393,8 @@
     var typedef_ = new Typedef('C0', const DynamicType());
     test.enclosingLibrary.addTypedef(typedef_);
     for (int i = 1; i < 20; ++i) {
-      typedef_ = new Typedef('C$i', new TypedefType(typedef_));
+      typedef_ =
+          new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
       test.enclosingLibrary.addTypedef(typedef_);
     }
   });
@@ -390,24 +406,29 @@
     test.enclosingLibrary.addTypedef(typedef_);
     var first = typedef_;
     for (int i = 1; i < 20; ++i) {
-      typedef_ = new Typedef('C$i', new TypedefType(typedef_));
+      typedef_ =
+          new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
       test.enclosingLibrary.addTypedef(typedef_);
     }
-    first.type = new TypedefType(typedef_);
+    first.type = new TypedefType(typedef_, Nullability.legacy);
   });
   positiveTest('Valid typedef Foo<T extends C> = C<T>', (TestHarness test) {
     var param = new TypeParameter('T', test.otherLegacyRawType);
-    var foo = new Typedef('Foo',
-        new InterfaceType(test.otherClass, [new TypeParameterType(param)]),
+    var foo = new Typedef(
+        'Foo',
+        new InterfaceType(test.otherClass, Nullability.legacy,
+            [new TypeParameterType(param, Nullability.legacy)]),
         typeParameters: [param]);
     test.addNode(foo);
   });
   positiveTest('Valid typedef Foo<T extends C<T>> = C<T>', (TestHarness test) {
     var param = new TypeParameter('T', test.otherLegacyRawType);
-    param.bound =
-        new InterfaceType(test.otherClass, [new TypeParameterType(param)]);
-    var foo = new Typedef('Foo',
-        new InterfaceType(test.otherClass, [new TypeParameterType(param)]),
+    param.bound = new InterfaceType(test.otherClass, Nullability.legacy,
+        [new TypeParameterType(param, Nullability.legacy)]);
+    var foo = new Typedef(
+        'Foo',
+        new InterfaceType(test.otherClass, Nullability.legacy,
+            [new TypeParameterType(param, Nullability.legacy)]),
         typeParameters: [param]);
     test.addNode(foo);
   });
@@ -417,9 +438,12 @@
     var foo =
         new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
     var barParam = new TypeParameter('T', null);
-    barParam.bound = new TypedefType(foo, [new TypeParameterType(barParam)]);
-    var bar = new Typedef('Bar',
-        new InterfaceType(test.otherClass, [new TypeParameterType(barParam)]),
+    barParam.bound = new TypedefType(foo, Nullability.legacy,
+        [new TypeParameterType(barParam, Nullability.legacy)]);
+    var bar = new Typedef(
+        'Bar',
+        new InterfaceType(test.otherClass, Nullability.legacy,
+            [new TypeParameterType(barParam, Nullability.legacy)]),
         typeParameters: [barParam]);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
@@ -432,11 +456,15 @@
     var foo =
         new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
     var barParam = new TypeParameter('T', null);
-    barParam.bound = new TypedefType(foo, [new TypeParameterType(barParam)]);
-    var bar = new Typedef('Bar',
-        new InterfaceType(test.otherClass, [new TypeParameterType(barParam)]),
+    barParam.bound = new TypedefType(foo, Nullability.legacy,
+        [new TypeParameterType(barParam, Nullability.legacy)]);
+    var bar = new Typedef(
+        'Bar',
+        new InterfaceType(test.otherClass, Nullability.legacy,
+            [new TypeParameterType(barParam, Nullability.legacy)]),
         typeParameters: [barParam]);
-    fooParam.bound = new TypedefType(bar, [new TypeParameterType(fooParam)]);
+    fooParam.bound = new TypedefType(bar, Nullability.legacy,
+        [new TypeParameterType(fooParam, Nullability.legacy)]);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addTypedef(bar);
   });
@@ -446,21 +474,24 @@
           "test_lib::OtherClass<T*>*;\n'"
           " refers to itself", (TestHarness test) {
     var param = new TypeParameter('T', null);
-    var foo = new Typedef('Foo',
-        new InterfaceType(test.otherClass, [new TypeParameterType(param)]),
+    var foo = new Typedef(
+        'Foo',
+        new InterfaceType(test.otherClass, Nullability.legacy,
+            [new TypeParameterType(param, Nullability.legacy)]),
         typeParameters: [param]);
-    param.bound = new TypedefType(foo, [const DynamicType()]);
+    param.bound =
+        new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
     test.addNode(foo);
   });
   negativeTest(
       'Typedef arity error',
-      "The typedef type test_lib::Foo provides 0 type arguments"
+      "The typedef type test_lib::Foo provides 0 type arguments,"
           " but the typedef declares 1 parameters.", (TestHarness test) {
     var param = test.makeTypeParameter('T');
     var foo =
         new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
     var field = new Field(new Name('field'),
-        type: new TypedefType(foo, []), isStatic: true);
+        type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
     test.enclosingLibrary.addTypedef(foo);
     test.enclosingLibrary.addMember(field);
   });
@@ -470,7 +501,7 @@
           ", parent is: 'null'", (TestHarness test) {
     var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
     var field = new Field(new Name('field'),
-        type: new TypedefType(foo, []), isStatic: true);
+        type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
     test.enclosingLibrary.addMember(field);
   });
   negativeTest('Non-static top-level field',
@@ -563,7 +594,7 @@
     stubLibrary.name = 'dart.core';
     objectClass = new Class(name: 'Object');
     objectLegacyRawType =
-        new InterfaceType(objectClass, const <DartType>[], Nullability.legacy);
+        new InterfaceType(objectClass, Nullability.legacy, const <DartType>[]);
     stubLibrary.addClass(objectClass);
     enclosingLibrary = new Library(Uri.parse('file://test.dart'));
     component.libraries.add(enclosingLibrary..parent = component);
@@ -574,7 +605,7 @@
         typeParameters: [classTypeParameter],
         supertype: objectClass.asRawSupertype);
     enclosingLegacyRawType = new InterfaceType(enclosingClass,
-        const <DartType>[const DynamicType()], Nullability.legacy);
+        Nullability.legacy, const <DartType>[const DynamicType()]);
     enclosingLibrary.addClass(enclosingClass);
     enclosingMember = new Procedure(new Name('test'), ProcedureKind.Method,
         new FunctionNode(new EmptyStatement()));
@@ -584,7 +615,7 @@
         typeParameters: [makeTypeParameter('OtherT')],
         supertype: objectClass.asRawSupertype);
     otherLegacyRawType = new InterfaceType(
-        otherClass, const <DartType>[const DynamicType()], Nullability.legacy);
+        otherClass, Nullability.legacy, const <DartType>[const DynamicType()]);
     enclosingLibrary.addClass(otherClass);
   }
 }
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 35b8c5e..31872c2 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -99,23 +99,36 @@
 /// Information exposed to the migration client about the location in source
 /// code that led an edge to be introduced into the nullability graph.
 abstract class EdgeOriginInfo {
+  /// If the proximate cause of the edge being introduced into the graph
+  /// corresponds to the type of an element in an already migrated-library, the
+  /// corresponding element; otherwise `null`.
+  ///
+  /// Note that either [node] or [element] will always be non-null.
+  Element get element;
+
   /// The kind of origin represented by this info.
   EdgeOriginKind get kind;
 
-  /// The AST node that led the edge to be introduced into the nullability
-  /// graph.
+  /// If the proximate cause of the edge being introduced into the graph
+  /// corresponds to an AST node in a source file that is being migrated, the
+  /// corresponding AST node; otherwise `null`.
+  ///
+  /// Note that either [node] or [element] will always be non-null.
   AstNode get node;
 
-  /// The source file that [node] appears in.
+  /// If [node] is non-null, the source file that it appears in.  Otherwise
+  /// `null`.
   Source get source;
 }
 
 /// An enumeration of the various kinds of edge origins created by the migration
 /// engine.
 enum EdgeOriginKind {
+  alreadyMigratedType,
   alwaysNullableType,
   compoundAssignment,
   defaultValue,
+  dynamicAssignment,
   expressionChecks,
   fieldFormalParameter,
   forEachVariable,
@@ -153,6 +166,12 @@
   /// of the element.
   void externalDecoratedType(Element element, DecoratedTypeInfo decoratedType);
 
+  /// Called whenever reference is made to an [typeParameter] outside of the
+  /// code being migrated, to report the nullability nodes associated with the
+  /// bound of the type parameter.
+  void externalDecoratedTypeParameterBound(
+      TypeParameterElement typeParameter, DecoratedTypeInfo decoratedType);
+
   /// Called whenever a fix is decided upon, to report the reasons for the fix.
   void fix(SingleNullabilityFix fix, Iterable<FixReasonInfo> reasons);
 
diff --git a/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart b/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
index 9890f67..8d1d030 100644
--- a/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
+++ b/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
+import 'package:nnbd_migration/src/edge_origin.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 
 /// This class transforms ordinary [DartType]s into their corresponding
@@ -22,53 +23,55 @@
 
   /// Transforms [type], which should have come from code that has already been
   /// migrated to NNBD, into the corresponding [DecoratedType].
-  DecoratedType decorate(DartType type) {
+  DecoratedType decorate(DartType type, Element element) {
     if (type.isVoid || type.isDynamic) {
-      return DecoratedType(type, _graph.always);
+      var node = NullabilityNode.forAlreadyMigrated();
+      _graph.makeNullable(node, AlwaysNullableTypeOrigin.forElement(element));
+      return DecoratedType(type, node);
     }
     NullabilityNode node;
     var nullabilitySuffix = (type as TypeImpl).nullabilitySuffix;
     if (nullabilitySuffix == NullabilitySuffix.question) {
-      node = _graph.always;
+      node = NullabilityNode.forAlreadyMigrated();
+      _graph.makeNullable(node, AlreadyMigratedTypeOrigin.forElement(element));
     } else {
-      // Currently, all types passed to this method have nullability suffix `star`
-      // because (a) we don't yet have a migrated SDK, and (b) we haven't added
-      // support to the migrator for analyzing packages that have already been
-      // migrated with NNBD enabled.
-      // TODO(paulberry): fix this assertion when things change.
-      assert(nullabilitySuffix == NullabilitySuffix.star);
-      node = _graph.never;
+      node = NullabilityNode.forAlreadyMigrated();
+      _graph.makeNonNullable(
+          node, AlreadyMigratedTypeOrigin.forElement(element));
     }
     if (type is FunctionType) {
       var typeFormalBounds = type.typeFormals.map((e) {
         var bound = e.bound;
         if (bound == null) {
-          return decorate((_typeProvider.objectType as TypeImpl)
-              .withNullability(NullabilitySuffix.question));
+          return decorate(
+              (_typeProvider.objectType as TypeImpl)
+                  .withNullability(NullabilitySuffix.question),
+              element);
         } else {
-          return decorate(bound);
+          return decorate(bound, element);
         }
       }).toList();
       var positionalParameters = <DecoratedType>[];
       var namedParameters = <String, DecoratedType>{};
       for (var parameter in type.parameters) {
         if (parameter.isPositional) {
-          positionalParameters.add(decorate(parameter.type));
+          positionalParameters.add(decorate(parameter.type, element));
         } else {
-          namedParameters[parameter.name] = decorate(parameter.type);
+          namedParameters[parameter.name] = decorate(parameter.type, element);
         }
       }
       return DecoratedType(type, node,
           typeFormalBounds: typeFormalBounds,
-          returnType: decorate(type.returnType),
+          returnType: decorate(type.returnType, element),
           namedParameters: namedParameters,
           positionalParameters: positionalParameters);
     } else if (type is InterfaceType) {
       var typeParameters = type.element.typeParameters;
       if (typeParameters.isNotEmpty) {
         assert(type.typeArguments.length == typeParameters.length);
-        return DecoratedType(type, node,
-            typeArguments: type.typeArguments.map(decorate).toList());
+        return DecoratedType(type, node, typeArguments: [
+          for (var t in type.typeArguments) decorate(t, element)
+        ]);
       }
       return DecoratedType(type, node);
     } else if (type is TypeParameterType) {
@@ -96,6 +99,6 @@
       // Add FutureOr<T> as a supertype of Future<T>.
       allSupertypes.add(_typeProvider.futureOrType2(type.typeArguments.single));
     }
-    return allSupertypes.map(decorate);
+    return [for (var t in allSupertypes) decorate(t, class_)];
   }
 }
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 3378ce5..a7a3a60 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -177,7 +177,7 @@
     } else if (type is TypeParameterType) {
       assert(typeArguments == null);
       return DecoratedType(type, NullabilityNode.forInferredType());
-    } else if (type is BottomTypeImpl) {
+    } else if (type is NeverTypeImpl) {
       assert(typeArguments == null);
       return DecoratedType(type, NullabilityNode.forInferredType());
     }
@@ -324,7 +324,7 @@
         return (typeProvider.nullType as TypeImpl)
             .withNullability(NullabilitySuffix.none);
       } else {
-        return BottomTypeImpl.instance;
+        return NeverTypeImpl.instance;
       }
     }
     var nullabilitySuffix =
@@ -367,12 +367,15 @@
                 typeFormalSubstitution),
             parameterKind));
       }
-      return FunctionTypeImpl.synthetic(
-          type_algebra.substitute(
-              returnType.toFinalType(typeProvider), typeFormalSubstitution),
-          newTypeFormals,
-          parameters,
-          nullabilitySuffix: nullabilitySuffix);
+      return FunctionTypeImpl(
+        typeFormals: newTypeFormals,
+        parameters: parameters,
+        returnType: type_algebra.substitute(
+          returnType.toFinalType(typeProvider),
+          typeFormalSubstitution,
+        ),
+        nullabilitySuffix: nullabilitySuffix,
+      );
     } else if (type is InterfaceType) {
       return InterfaceTypeImpl.explicit(type.element,
           [for (var arg in typeArguments) arg.toFinalType(typeProvider)],
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 11598f2..ac9aecd 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -128,9 +128,6 @@
   /// For convenience, a [DecoratedType] representing non-nullable `Type`.
   final DecoratedType _nonNullableTypeType;
 
-  /// For convenience, a [DecoratedType] representing `Null`.
-  final DecoratedType _nullType;
-
   /// For convenience, a [DecoratedType] representing `dynamic`.
   final DecoratedType _dynamicType;
 
@@ -203,7 +200,6 @@
             DecoratedType(typeProvider.boolType, _graph.never),
         _nonNullableTypeType =
             DecoratedType(typeProvider.typeType, _graph.never),
-        _nullType = DecoratedType(typeProvider.nullType, _graph.always),
         _dynamicType = DecoratedType(typeProvider.dynamicType, _graph.always);
 
   /// Gets the decorated type of [element] from [_variables], performing any
@@ -211,7 +207,7 @@
   DecoratedType getOrComputeElementType(Element element,
       {DecoratedType targetType}) {
     Map<TypeParameterElement, DecoratedType> substitution;
-    Element baseElement = element is Member ? element.baseElement : element;
+    Element baseElement = element.declaration;
     if (targetType != null) {
       var classElement = baseElement.enclosingElement as ClassElement;
       if (classElement.typeParameters.isNotEmpty) {
@@ -970,7 +966,11 @@
   @override
   DecoratedType visitNullLiteral(NullLiteral node) {
     _flowAnalysis.nullLiteral(node);
-    return _nullType;
+    var decoratedType =
+        DecoratedType.forImplicitType(typeProvider, node.staticType, _graph);
+    _graph.makeNullable(
+        decoratedType.node, AlwaysNullableTypeOrigin(source, node));
+    return decoratedType;
   }
 
   @override
@@ -1094,8 +1094,12 @@
     Expression returnValue = node.expression;
     final isAsync = node.thisOrAncestorOfType<FunctionBody>().isAsynchronous;
     if (returnValue == null) {
+      var implicitNullType = DecoratedType.forImplicitType(
+          typeProvider, typeProvider.nullType, _graph);
+      _graph.makeNullable(
+          implicitNullType.node, AlwaysNullableTypeOrigin(source, node));
       _checkAssignment(null,
-          source: isAsync ? _futureOf(_nullType) : _nullType,
+          source: isAsync ? _futureOf(implicitNullType) : implicitNullType,
           destination: returnType,
           hard: false);
     } else {
@@ -1622,7 +1626,9 @@
             '(${expression.toSource()}) offset=${expression.offset}');
       }
       EdgeOrigin edgeOrigin;
-      if (!sourceType.type.isDynamic) {
+      if (sourceType.type.isDynamic) {
+        edgeOrigin = DynamicAssignmentOrigin(source, expression);
+      } else {
         if (fromDefaultValue) {
           edgeOrigin = DefaultValueOrigin(source, expression);
         } else {
@@ -1702,10 +1708,7 @@
 
   void _handleConstructorRedirection(
       FormalParameterList parameters, ConstructorName redirectedConstructor) {
-    var callee = redirectedConstructor.staticElement;
-    if (callee is ConstructorMember) {
-      callee = (callee as ConstructorMember).baseElement;
-    }
+    var callee = redirectedConstructor.staticElement.declaration;
     var redirectedClass = callee.enclosingElement;
     var calleeType = _variables.decoratedElementType(callee);
     var typeArguments = redirectedConstructor.type.typeArguments;
@@ -1751,10 +1754,7 @@
                 classElement.thisType,
                 Name(classElement.library.source.uri, declaredElement.name)) ??
             const <ExecutableElement>[]) {
-          if (overriddenElement is ExecutableMember) {
-            var member = overriddenElement as ExecutableMember;
-            overriddenElement = member.baseElement;
-          }
+          overriddenElement = overriddenElement.declaration;
           var overriddenClass =
               overriddenElement.enclosingElement as ClassElement;
           var decoratedOverriddenFunctionType =
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index ec94adce..2899ee8a 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -3,9 +3,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 
+/// Edge origin resulting from a type in already-migrated code.
+///
+/// For example, in the Map class in dart:core:
+///   V? operator [](Object key);
+///
+/// this class is used for the edge connecting `always` to the return type of
+/// `operator []`, due to the fact that dart:core has already been migrated and
+/// the type is explicitly nullable.
+///
+/// Note that since a single element can have a complex type, it is likely that
+/// multiple edges will be created with an [AlreadyMigratedTypeOrigin] pointing
+/// to the same type.  To distinguish which edge corresponds to which part of
+/// the element's type, use the callbacks
+/// [NullabilityMigrationInstrumentation.externalDecoratedType] and
+/// [NullabilityMigrationInstrumentation.externalDecoratedTypeParameterBound].
+class AlreadyMigratedTypeOrigin extends EdgeOrigin {
+  AlreadyMigratedTypeOrigin.forElement(Element element)
+      : super.forElement(element);
+
+  @override
+  EdgeOriginKind get kind => EdgeOriginKind.alreadyMigratedType;
+}
+
 /// Edge origin resulting from the use of a type that is always nullable.
 ///
 /// For example, in the following code snippet:
@@ -17,6 +41,9 @@
 class AlwaysNullableTypeOrigin extends EdgeOrigin {
   AlwaysNullableTypeOrigin(Source source, AstNode node) : super(source, node);
 
+  AlwaysNullableTypeOrigin.forElement(Element element)
+      : super.forElement(element);
+
   @override
   EdgeOriginKind get kind => EdgeOriginKind.alwaysNullableType;
 }
@@ -43,6 +70,15 @@
   EdgeOriginKind get kind => EdgeOriginKind.defaultValue;
 }
 
+/// An edge origin used for edges that originated because of an assignment
+/// involving a value with a dynamic type.
+class DynamicAssignmentOrigin extends EdgeOrigin {
+  DynamicAssignmentOrigin(Source source, AstNode node) : super(source, node);
+
+  @override
+  EdgeOriginKind get kind => EdgeOriginKind.dynamicAssignment;
+}
+
 /// Common interface for classes providing information about how an edge came
 /// to be; that is, what was found in the source code that led the migration
 /// tool to create the edge.
@@ -53,7 +89,14 @@
   @override
   final AstNode node;
 
-  EdgeOrigin(this.source, this.node);
+  @override
+  final Element element;
+
+  EdgeOrigin(this.source, this.node) : element = null;
+
+  EdgeOrigin.forElement(this.element)
+      : source = null,
+        node = null;
 }
 
 /// Edge origin resulting from the relationship between a field formal parameter
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index eae5178..b812254 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
@@ -629,34 +628,27 @@
   /// type of the class within which [element] is being accessed; this is used
   /// to perform the correct substitutions.
   DartType _computeMigratedType(Element element, {DartType targetType}) {
-    Element baseElement;
-    if (element is Member) {
-      baseElement = element.baseElement;
-    } else {
-      baseElement = element;
-    }
+    element = element.declaration;
     DartType type;
-    if (baseElement is ClassElement || baseElement is TypeParameterElement) {
+    if (element is ClassElement || element is TypeParameterElement) {
       return typeProvider.typeType;
-    } else if (baseElement is PropertyAccessorElement) {
-      if (baseElement.isSynthetic) {
+    } else if (element is PropertyAccessorElement) {
+      if (element.isSynthetic) {
         type = _variables
-            .decoratedElementType(baseElement.variable)
+            .decoratedElementType(element.variable)
             .toFinalType(typeProvider);
       } else {
-        var functionType = _variables.decoratedElementType(baseElement);
-        var decoratedType = baseElement.isGetter
+        var functionType = _variables.decoratedElementType(element);
+        var decoratedType = element.isGetter
             ? functionType.returnType
             : functionType.positionalParameters[0];
         type = decoratedType.toFinalType(typeProvider);
       }
     } else {
-      type = _variables
-          .decoratedElementType(baseElement)
-          .toFinalType(typeProvider);
+      type = _variables.decoratedElementType(element).toFinalType(typeProvider);
     }
     if (targetType is InterfaceType && targetType.typeArguments.isNotEmpty) {
-      var superclass = baseElement.enclosingElement as ClassElement;
+      var superclass = element.enclosingElement as ClassElement;
       var class_ = targetType.element;
       if (class_ != superclass) {
         var supertype = _decoratedClassHierarchy
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 48d5425..c0d1938 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -126,7 +126,7 @@
             _createDecoratedTypeForClass(classElement, node);
         var functionType = DecoratedType(constructorElement.type, _graph.never,
             returnType: decoratedReturnType,
-            positionalParameters: [],
+            positionalParameters: const [],
             namedParameters: {});
         _variables.recordDecoratedElementType(constructorElement, functionType);
       }
@@ -156,7 +156,7 @@
 
   @override
   DecoratedType visitCompilationUnit(CompilationUnit node) {
-    _graph.migrating(source);
+    _graph.migrating(node.declaredElement.library.source);
     return super.visitCompilationUnit(node);
   }
 
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index d974c23..8812789 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -158,6 +158,19 @@
     return _sourcesBeingMigrated.contains(source);
   }
 
+  /// Creates a graph edge that will try to force the given [node] to be
+  /// non-nullable.
+  void makeNonNullable(NullabilityNode node, EdgeOrigin origin) {
+    connect(node, never, origin, hard: true);
+  }
+
+  /// Creates a graph edge that will try to force the given [node] to be
+  /// nullable.
+  void makeNullable(NullabilityNode node, EdgeOrigin origin,
+      {List<NullabilityNode> guards: const []}) {
+    connect(always, node, origin, guards: guards);
+  }
+
   /// Record source as code that is being migrated.
   void migrating(Source source) {
     _sourcesBeingMigrated.add(source);
@@ -447,6 +460,11 @@
   /// List of edges that have this node as their destination.
   final _upstreamEdges = <NullabilityEdge>[];
 
+  /// Creates a [NullabilityNode] representing the nullability of a variable
+  /// whose type comes from an already-migrated library.
+  factory NullabilityNode.forAlreadyMigrated() =>
+      _NullabilityNodeSimple('migrated');
+
   /// Creates a [NullabilityNode] representing the nullability of an expression
   /// which is nullable iff two other nullability nodes are both nullable.
   ///
@@ -494,6 +512,8 @@
   /// annotate the nullability of that type.
   String get debugSuffix => '?($this)';
 
+  Iterable<EdgeInfo> get downstreamEdges => _downstreamEdges;
+
   /// After nullability propagation, this getter can be used to query whether
   /// the type associated with this node should be considered "exact nullable".
   @visibleForTesting
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index 057fc52..20bc39a 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -92,8 +92,10 @@
               'have been stored by the NodeBuilder via '
               'recordTypeParameterBound');
         }
-        decoratedType = _alreadyMigratedCodeDecorator
-            .decorate(typeParameter.bound ?? DynamicTypeImpl.instance);
+        decoratedType = _alreadyMigratedCodeDecorator.decorate(
+            typeParameter.bound ?? DynamicTypeImpl.instance, typeParameter);
+        instrumentation?.externalDecoratedTypeParameterBound(
+            typeParameter, decoratedType);
         _decoratedTypeParameterBounds[typeParameter] = decoratedType;
       }
       return decoratedType;
@@ -181,9 +183,11 @@
 
     DecoratedType decoratedType;
     if (element is FunctionTypedElement) {
-      decoratedType = _alreadyMigratedCodeDecorator.decorate(element.type);
+      decoratedType =
+          _alreadyMigratedCodeDecorator.decorate(element.type, element);
     } else if (element is VariableElement) {
-      decoratedType = _alreadyMigratedCodeDecorator.decorate(element.type);
+      decoratedType =
+          _alreadyMigratedCodeDecorator.decorate(element.type, element);
     } else {
       // TODO(paulberry)
       throw UnimplementedError('Decorating ${element.runtimeType}');
@@ -199,7 +203,6 @@
     var result = <ClassElement, DecoratedType>{};
     for (var decoratedSupertype
         in _alreadyMigratedCodeDecorator.getImmediateSupertypes(class_)) {
-      assert(identical(decoratedSupertype.node, _graph.never));
       var class_ = (decoratedSupertype.type as InterfaceType).element;
       result[class_] = decoratedSupertype;
     }
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index fc51ced..d8131a2 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
@@ -11,96 +11,124 @@
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/already_migrated_code_decorator.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'migration_visitor_test_base.dart';
+
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(_AlreadyMigratedCodeDecoratorTest);
+    defineReflectiveTests(_AlreadyMigratedCodeDecoratorTestNormal);
+    defineReflectiveTests(_AlreadyMigratedCodeDecoratorTestProvisional);
   });
 }
 
-@reflectiveTest
-class _AlreadyMigratedCodeDecoratorTest {
+class _AlreadyMigratedCodeDecoratorTestBase extends Object with EdgeTester {
   final TypeProvider typeProvider;
 
   final AlreadyMigratedCodeDecorator decorator;
 
   final NullabilityGraphForTesting graph;
 
-  factory _AlreadyMigratedCodeDecoratorTest() {
-    return _AlreadyMigratedCodeDecoratorTest._(
-        NullabilityGraphForTesting(), TestTypeProvider());
-  }
+  final NullabilitySuffix suffix;
 
-  _AlreadyMigratedCodeDecoratorTest._(this.graph, this.typeProvider)
+  Element element = _MockElement();
+
+  _AlreadyMigratedCodeDecoratorTestBase(NullabilitySuffix nullabilitySuffix)
+      : this._(nullabilitySuffix, NullabilityGraphForTesting(),
+            TestTypeProvider(nullabilitySuffix: nullabilitySuffix));
+
+  _AlreadyMigratedCodeDecoratorTestBase._(
+      this.suffix, this.graph, this.typeProvider)
       : decorator = AlreadyMigratedCodeDecorator(graph, typeProvider);
 
   NullabilityNode get always => graph.always;
 
   NullabilityNode get never => graph.never;
 
+  void checkAlwaysNullable(NullabilityNode node) {
+    var edge = assertEdge(always, node, hard: false);
+    var origin = graph.getEdgeOrigin(edge);
+    expect(origin.kind, EdgeOriginKind.alwaysNullableType);
+    expect(origin.element, same(element));
+  }
+
   void checkDynamic(DecoratedType decoratedType) {
     expect(decoratedType.type, same(typeProvider.dynamicType));
-    expect(decoratedType.node, same(always));
+    checkAlwaysNullable(decoratedType.node);
+  }
+
+  void checkExplicitlyNonNullable(NullabilityNode node) {
+    var edge = assertEdge(node, never, hard: true);
+    var origin = graph.getEdgeOrigin(edge);
+    expect(origin.kind, EdgeOriginKind.alreadyMigratedType);
+    expect(origin.element, same(element));
+  }
+
+  void checkExplicitlyNullable(NullabilityNode node) {
+    var edge = assertEdge(always, node, hard: false);
+    var origin = graph.getEdgeOrigin(edge);
+    expect(origin.kind, EdgeOriginKind.alreadyMigratedType);
+    expect(origin.element, same(element));
   }
 
   void checkFutureOr(
       DecoratedType decoratedType,
-      NullabilityNode expectedNullability,
+      void Function(NullabilityNode) checkNullability,
       void Function(DecoratedType) checkArgument) {
     expect(decoratedType.type.element, typeProvider.futureOrElement);
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
     checkArgument(decoratedType.typeArguments[0]);
   }
 
-  void checkInt(
-      DecoratedType decoratedType, NullabilityNode expectedNullability) {
+  void checkInt(DecoratedType decoratedType,
+      void Function(NullabilityNode) checkNullability) {
     expect(decoratedType.type.element, typeProvider.intType.element);
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
   }
 
   void checkIterable(
       DecoratedType decoratedType,
-      NullabilityNode expectedNullability,
+      void Function(NullabilityNode) checkNullability,
       void Function(DecoratedType) checkArgument) {
     expect(
         decoratedType.type.element, typeProvider.iterableDynamicType.element);
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
     checkArgument(decoratedType.typeArguments[0]);
   }
 
-  void checkNum(
-      DecoratedType decoratedType, NullabilityNode expectedNullability) {
+  void checkNum(DecoratedType decoratedType,
+      void Function(NullabilityNode) checkNullability) {
     expect(decoratedType.type.element, typeProvider.numType.element);
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
   }
 
-  void checkObject(
-      DecoratedType decoratedType, NullabilityNode expectedNullability) {
+  void checkObject(DecoratedType decoratedType,
+      void Function(NullabilityNode) checkNullability) {
     expect(decoratedType.type.element, typeProvider.objectType.element);
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
   }
 
   void checkTypeParameter(
       DecoratedType decoratedType,
-      NullabilityNode expectedNullability,
+      void Function(NullabilityNode) checkNullability,
       TypeParameterElement expectedElement) {
     var type = decoratedType.type as TypeParameterTypeImpl;
     expect(type.element, same(expectedElement));
-    expect(decoratedType.node, expectedNullability);
+    checkNullability(decoratedType.node);
   }
 
   void checkVoid(DecoratedType decoratedType) {
     expect(decoratedType.type, same(typeProvider.voidType));
-    expect(decoratedType.node, same(always));
+    checkAlwaysNullable(decoratedType.node);
   }
 
   DecoratedType decorate(DartType type) {
-    var decoratedType = decorator.decorate(type);
+    var decoratedType = decorator.decorate(type, element);
     expect(decoratedType.type, same(type));
     return decoratedType;
   }
@@ -112,100 +140,149 @@
   test_decorate_functionType_generic_bounded() {
     var typeFormal = TypeParameterElementImpl.synthetic('T')
       ..bound = typeProvider.numType;
-    var decoratedType = decorate(FunctionTypeImpl.synthetic(
-        TypeParameterTypeImpl(typeFormal), [typeFormal], [],
-        nullabilitySuffix: NullabilitySuffix.star));
+    var decoratedType = decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(typeFormal),
+        nullabilitySuffix: suffix,
+      ),
+    );
     expect(decoratedType.typeFormalBounds, hasLength(1));
-    checkNum(decoratedType.typeFormalBounds[0], never);
-    checkTypeParameter(decoratedType.returnType, never, typeFormal);
+    checkNum(decoratedType.typeFormalBounds[0], checkExplicitlyNonNullable);
+    checkTypeParameter(
+        decoratedType.returnType, checkExplicitlyNonNullable, typeFormal);
   }
 
   test_decorate_functionType_generic_no_explicit_bound() {
     var typeFormal = TypeParameterElementImpl.synthetic('T');
-    var decoratedType = decorate(FunctionTypeImpl.synthetic(
-        TypeParameterTypeImpl(typeFormal), [typeFormal], [],
-        nullabilitySuffix: NullabilitySuffix.star));
+    var decoratedType = decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(typeFormal),
+        nullabilitySuffix: suffix,
+      ),
+    );
     expect(decoratedType.typeFormalBounds, hasLength(1));
-    checkObject(decoratedType.typeFormalBounds[0], always);
-    checkTypeParameter(decoratedType.returnType, never, typeFormal);
+    checkObject(decoratedType.typeFormalBounds[0], checkExplicitlyNullable);
+    checkTypeParameter(
+        decoratedType.returnType, checkExplicitlyNonNullable, typeFormal);
   }
 
   test_decorate_functionType_named_parameter() {
-    checkDynamic(decorate(FunctionTypeImpl.synthetic(
-            typeProvider.voidType,
-            [],
-            [
-              ParameterElementImpl.synthetic(
-                  'x', typeProvider.dynamicType, ParameterKind.NAMED)
-            ],
-            nullabilitySuffix: NullabilitySuffix.star))
-        .namedParameters['x']);
+    checkDynamic(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: [
+            ParameterElementImpl.synthetic(
+              'x',
+              typeProvider.dynamicType,
+              ParameterKind.NAMED,
+            )
+          ],
+          returnType: typeProvider.voidType,
+          nullabilitySuffix: suffix,
+        ),
+      ).namedParameters['x'],
+    );
   }
 
   test_decorate_functionType_ordinary_parameter() {
-    checkDynamic(decorate(FunctionTypeImpl.synthetic(
-            typeProvider.voidType,
-            [],
-            [
-              ParameterElementImpl.synthetic(
-                  'x', typeProvider.dynamicType, ParameterKind.REQUIRED)
-            ],
-            nullabilitySuffix: NullabilitySuffix.star))
-        .positionalParameters[0]);
+    checkDynamic(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: [
+            ParameterElementImpl.synthetic(
+              'x',
+              typeProvider.dynamicType,
+              ParameterKind.REQUIRED,
+            )
+          ],
+          returnType: typeProvider.voidType,
+          nullabilitySuffix: suffix,
+        ),
+      ).positionalParameters[0],
+    );
   }
 
   test_decorate_functionType_positional_parameter() {
-    checkDynamic(decorate(FunctionTypeImpl.synthetic(
-            typeProvider.voidType,
-            [],
-            [
-              ParameterElementImpl.synthetic(
-                  'x', typeProvider.dynamicType, ParameterKind.POSITIONAL)
-            ],
-            nullabilitySuffix: NullabilitySuffix.star))
-        .positionalParameters[0]);
+    checkDynamic(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: [
+            ParameterElementImpl.synthetic(
+              'x',
+              typeProvider.dynamicType,
+              ParameterKind.POSITIONAL,
+            )
+          ],
+          returnType: typeProvider.voidType,
+          nullabilitySuffix: suffix,
+        ),
+      ).positionalParameters[0],
+    );
   }
 
   test_decorate_functionType_question() {
-    expect(
-        decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [],
-                nullabilitySuffix: NullabilitySuffix.question))
-            .node,
-        same(always));
+    checkExplicitlyNullable(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: const [],
+          returnType: typeProvider.voidType,
+          nullabilitySuffix: NullabilitySuffix.question,
+        ),
+      ).node,
+    );
   }
 
   test_decorate_functionType_returnType() {
-    checkDynamic(decorate(FunctionTypeImpl.synthetic(
-            typeProvider.dynamicType, [], [],
-            nullabilitySuffix: NullabilitySuffix.star))
-        .returnType);
+    checkDynamic(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: const [],
+          returnType: typeProvider.dynamicType,
+          nullabilitySuffix: suffix,
+        ),
+      ).returnType,
+    );
   }
 
   test_decorate_functionType_star() {
-    expect(
-        decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [],
-                nullabilitySuffix: NullabilitySuffix.star))
-            .node,
-        same(never));
+    checkExplicitlyNonNullable(
+      decorate(
+        FunctionTypeImpl(
+          typeFormals: const [],
+          parameters: const [],
+          returnType: typeProvider.voidType,
+          nullabilitySuffix: suffix,
+        ),
+      ).node,
+    );
   }
 
   test_decorate_interfaceType_simple_question() {
     checkInt(
         decorate(InterfaceTypeImpl(typeProvider.intType.element,
             nullabilitySuffix: NullabilitySuffix.question)),
-        always);
+        checkExplicitlyNullable);
   }
 
   test_decorate_interfaceType_simple_star() {
     checkInt(
         decorate(InterfaceTypeImpl(typeProvider.intType.element,
-            nullabilitySuffix: NullabilitySuffix.star)),
-        never);
+            nullabilitySuffix: suffix)),
+        checkExplicitlyNonNullable);
   }
 
   test_decorate_iterable_dynamic() {
     var decorated = decorate(typeProvider.iterableDynamicType);
-    checkIterable(decorated, never, checkDynamic);
+    checkIterable(decorated, checkExplicitlyNonNullable, checkDynamic);
   }
 
   test_decorate_typeParameterType_question() {
@@ -213,16 +290,15 @@
     checkTypeParameter(
         decorate(TypeParameterTypeImpl(element,
             nullabilitySuffix: NullabilitySuffix.question)),
-        always,
+        checkExplicitlyNullable,
         element);
   }
 
   test_decorate_typeParameterType_star() {
     var element = TypeParameterElementImpl.synthetic('T');
     checkTypeParameter(
-        decorate(TypeParameterTypeImpl(element,
-            nullabilitySuffix: NullabilitySuffix.star)),
-        never,
+        decorate(TypeParameterTypeImpl(element, nullabilitySuffix: suffix)),
+        checkExplicitlyNonNullable,
         element);
   }
 
@@ -231,64 +307,94 @@
   }
 
   test_getImmediateSupertypes_future() {
-    var element = typeProvider.futureElement;
-    var decoratedSupertypes =
-        decorator.getImmediateSupertypes(element).toList();
-    var typeParam = element.typeParameters[0];
+    var class_ = element = typeProvider.futureElement;
+    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
+    var typeParam = class_.typeParameters[0];
     expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], never);
+    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable);
     // Since Future<T> is a subtype of FutureOr<T>, we consider FutureOr<T> to
     // be an immediate supertype, even though the class declaration for Future
     // doesn't mention FutureOr.
-    checkFutureOr(decoratedSupertypes[1], never,
-        (t) => checkTypeParameter(t, never, typeParam));
+    checkFutureOr(decoratedSupertypes[1], checkExplicitlyNonNullable,
+        (t) => checkTypeParameter(t, checkExplicitlyNonNullable, typeParam));
   }
 
   test_getImmediateSupertypes_generic() {
     var t = ElementFactory.typeParameterElement('T');
-    var class_ = ElementFactory.classElement3(
+    var class_ = element = ElementFactory.classElement3(
       name: 'C',
       typeParameters: [t],
       supertype: typeProvider.iterableType2(
-        t.instantiate(nullabilitySuffix: NullabilitySuffix.star),
+        t.instantiate(nullabilitySuffix: suffix),
       ),
     );
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
-    checkIterable(decoratedSupertypes[0], never,
-        (type) => checkTypeParameter(type, never, t));
+    checkIterable(decoratedSupertypes[0], checkExplicitlyNonNullable,
+        (type) => checkTypeParameter(type, checkExplicitlyNonNullable, t));
   }
 
   test_getImmediateSupertypes_interface() {
-    var class_ = ElementFactory.classElement('C', typeProvider.objectType);
+    var class_ =
+        element = ElementFactory.classElement('C', typeProvider.objectType);
     class_.interfaces = [typeProvider.numType];
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], never);
-    checkNum(decoratedSupertypes[1], never);
+    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable);
+    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable);
   }
 
   test_getImmediateSupertypes_mixin() {
-    var class_ = ElementFactory.classElement('C', typeProvider.objectType);
+    var class_ =
+        element = ElementFactory.classElement('C', typeProvider.objectType);
     class_.mixins = [typeProvider.numType];
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], never);
-    checkNum(decoratedSupertypes[1], never);
+    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable);
+    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable);
   }
 
   test_getImmediateSupertypes_superclassConstraint() {
-    var class_ = ElementFactory.mixinElement(
+    var class_ = element = ElementFactory.mixinElement(
         name: 'C', constraints: [typeProvider.numType]);
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
-    checkNum(decoratedSupertypes[0], never);
+    checkNum(decoratedSupertypes[0], checkExplicitlyNonNullable);
   }
 
   test_getImmediateSupertypes_supertype() {
-    var class_ = ElementFactory.classElement('C', typeProvider.objectType);
+    var class_ =
+        element = ElementFactory.classElement('C', typeProvider.objectType);
     var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
     expect(decoratedSupertypes, hasLength(1));
-    checkObject(decoratedSupertypes[0], never);
+    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable);
   }
 }
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code does not contain star types.  In
+/// the final product, by definition all already-migrated code will be free of
+/// star types.  However, since we do not yet migrate using a fully NNBD-aware
+/// SDK, we need to handle both star and non-star variants on a short term
+/// basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestNormal
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestNormal() : super(NullabilitySuffix.none);
+}
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code contains star types.  In the final
+/// product, this will never happen.  However, since we do not yet migrate using
+/// a fully NNBD-aware SDK, we need to handle both star and non-star variants on
+/// a short term basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestProvisional
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestProvisional()
+      : super(NullabilitySuffix.star);
+}
+
+class _MockElement implements Element {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index b441ee4..91a9d171 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -38,7 +38,7 @@
   Future<void> _checkMultipleFileChanges(
       Map<String, String> input, Map<String, String> expectedOutput) async {
     for (var path in input.keys) {
-      newFile(path, content: input[path]);
+      driver.getFileSync(newFile(path, content: input[path]).path);
     }
     var listener = new TestMigrationListener();
     var migration =
@@ -1847,6 +1847,32 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_libraryWithParts() async {
+    var root = '/home/test/lib';
+    var path1 = convertPath('$root/lib.dart');
+    var file1 = '''
+part 'src/foo/part.dart';
+''';
+    var expected1 = '''
+part 'src/foo/part.dart';
+''';
+    var path2 = convertPath('$root/src/foo/part.dart');
+    var file2 = '''
+part of '../../lib.dart';
+class C {
+  static void m(C c) {}
+}
+''';
+    var expected2 = '''
+part of '../../lib.dart';
+class C {
+  static void m(C c) {}
+}
+''';
+    await _checkMultipleFileChanges(
+        {path2: file2, path1: file1}, {path1: expected1, path2: expected2});
+  }
+
   test_local_function() async {
     var content = '''
 int f(int i) {
@@ -2374,7 +2400,6 @@
     await _checkSingleFileChanges(content, expected);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38339')
   test_operator_eq_with_inferred_parameter_type() async {
     var content = '''
 class C {
diff --git a/pkg/nnbd_migration/test/decorated_type_test.dart b/pkg/nnbd_migration/test/decorated_type_test.dart
index 22a2dc0..fc317ec 100644
--- a/pkg/nnbd_migration/test/decorated_type_test.dart
+++ b/pkg/nnbd_migration/test/decorated_type_test.dart
@@ -301,13 +301,13 @@
 
   test_toFinalType_bottom_non_nullable() {
     var type =
-        DecoratedType(BottomTypeImpl.instance, never).toFinalType(typeProvider);
+        DecoratedType(NeverTypeImpl.instance, never).toFinalType(typeProvider);
     assertDartType(type, 'Never');
   }
 
   test_toFinalType_bottom_nullable() {
-    var type = DecoratedType(BottomTypeImpl.instance, always)
-        .toFinalType(typeProvider);
+    var type =
+        DecoratedType(NeverTypeImpl.instance, always).toFinalType(typeProvider);
     assertDartType(type, 'Null');
   }
 
@@ -326,7 +326,7 @@
         .toFinalType(typeProvider) as FunctionType;
     assertDartType(
         type,
-        'dynamic Function<T extends List<U>,U extends Object,'
+        'dynamic Function<T extends List<U>, U extends Object, '
         'V extends List<U>>()');
     expect(type.typeFormals[0], isNot(same(t)));
     expect(type.typeFormals[1], isNot(same(u)));
@@ -522,7 +522,7 @@
 
   test_toString_bottom() {
     var node = newNode();
-    var decoratedType = DecoratedType(BottomTypeImpl.instance, node);
+    var decoratedType = DecoratedType(NeverTypeImpl.instance, node);
     expect(decoratedType.toString(), 'Never?($node)');
   }
 
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 9e3cc4e..9bf66c5 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -342,22 +341,29 @@
     assertEdge(node, right, hard: false);
   }
 
-  void assertLUB(
-      NullabilityNode node, NullabilityNode left, NullabilityNode right) {
+  void assertLUB(NullabilityNode node, Object left, Object right) {
     var conditionalNode = node as NullabilityNodeForLUB;
-    expect(conditionalNode.left, same(left));
-    expect(conditionalNode.right, same(right));
+    var leftMatcher = NodeMatcher(left);
+    var rightMatcher = NodeMatcher(right);
+    expect(leftMatcher.matches(conditionalNode.left), true);
+    expect(rightMatcher.matches(conditionalNode.right), true);
   }
 
   /// Checks that there are no nullability nodes upstream from [node] that could
   /// cause it to become nullable.
   void assertNoUpstreamNullability(NullabilityNode node) {
-    // never can never become nullable, even if it has nodes
-    // upstream from it.
-    if (node == never) return;
+    // Store `neverClosure` in a local variable so that we avoid the
+    // computational expense of recomputing it each time through the loop below.
+    var neverClosure = this.neverClosure;
 
+    // Any node with a hard edge to never (or never itself) won't become
+    // nullable, even if it has nodes upstream from it.
+    if (neverClosure.contains(node)) return;
+
+    // Otherwise, make sure that every node directly upstream from this node
+    // has a hard edge to never.
     for (var edge in getEdges(anyNode, node)) {
-      expect(edge.sourceNode, never);
+      expect(neverClosure, contains(edge.sourceNode));
     }
   }
 
@@ -513,7 +519,10 @@
         decoratedTypeAnnotation('int> f').node);
     // If `x` is `Future<int?>`, then the only way to migrate is to make the
     // return type `FutureOr<int?>`.
-    assertEdge(substitutionNode(decoratedTypeAnnotation('int> x').node, never),
+
+    assertEdge(
+        substitutionNode(
+            decoratedTypeAnnotation('int> x').node, inSet(neverClosure)),
         decoratedTypeAnnotation('int> f').node,
         hard: false);
     assertNoEdge(decoratedTypeAnnotation('int> x').node,
@@ -559,7 +568,8 @@
 }
 ''');
     // TODO(paulberry): edge should be hard.
-    assertEdge(always, decoratedTypeAnnotation('List').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('List').node,
+        hard: false);
   }
 
   test_assign_type_parameter_to_bound() async {
@@ -589,7 +599,8 @@
     var iterableInt = decoratedTypeAnnotation('Iterable<int>');
     var listInt = decoratedTypeAnnotation('List<int>');
     assertEdge(listInt.node, iterableInt.node, hard: true);
-    assertEdge(substitutionNode(listInt.typeArguments[0].node, never),
+    assertEdge(
+        substitutionNode(listInt.typeArguments[0].node, inSet(neverClosure)),
         iterableInt.typeArguments[0].node,
         hard: false);
   }
@@ -1152,8 +1163,10 @@
 int f(int i, int j) => i + j;
 ''');
 
-    assertNullCheck(checkExpression('j;'),
-        assertEdge(decoratedTypeAnnotation('int j').node, never, hard: true));
+    assertNullCheck(
+        checkExpression('j;'),
+        assertEdge(decoratedTypeAnnotation('int j').node, inSet(neverClosure),
+            hard: true));
   }
 
   test_binaryExpression_plus_right_check_custom() async {
@@ -1554,7 +1567,7 @@
 
     var nullable_i = decoratedTypeAnnotation('int i').node;
     var nullable_conditional = decoratedExpressionType('(b ?').node;
-    assertLUB(nullable_conditional, always, nullable_i);
+    assertLUB(nullable_conditional, inSet(alwaysPlus), nullable_i);
   }
 
   test_conditionalExpression_right_non_null() async {
@@ -1581,7 +1594,7 @@
 
     var nullable_i = decoratedTypeAnnotation('int i').node;
     var nullable_conditional = decoratedExpressionType('(b ?').node;
-    assertLUB(nullable_conditional, nullable_i, always);
+    assertLUB(nullable_conditional, nullable_i, inSet(alwaysPlus));
   }
 
   test_constructor_default_parameter_value_bool() async {
@@ -1816,7 +1829,9 @@
 }
 ''');
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
-    assertEdge(substitutionNode(decoratedTypeAnnotation('int> l').node, never),
+    assertEdge(
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
         decoratedTypeAnnotation('int i').node,
         hard: false);
   }
@@ -1834,7 +1849,9 @@
     var iNode = iMatcher.matchingNode;
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
     assertEdge(
-        substitutionNode(decoratedTypeAnnotation('int> l').node, never), iNode,
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
+        iNode,
         hard: false);
   }
 
@@ -1846,7 +1863,9 @@
 }
 ''');
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
-    assertEdge(substitutionNode(decoratedTypeAnnotation('int> l').node, never),
+    assertEdge(
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
         decoratedTypeAnnotation('int x').node,
         hard: false);
   }
@@ -1858,7 +1877,9 @@
 }
 ''');
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
-    assertEdge(substitutionNode(decoratedTypeAnnotation('int> l').node, never),
+    assertEdge(
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
         decoratedTypeAnnotation('int i').node,
         hard: false);
   }
@@ -1878,7 +1899,9 @@
     var iNode = iMatcher.matchingNode;
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
     assertEdge(
-        substitutionNode(decoratedTypeAnnotation('int> l').node, never), iNode,
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
+        iNode,
         hard: false);
   }
 
@@ -1890,7 +1913,9 @@
 }
 ''');
     assertEdge(decoratedTypeAnnotation('List<int>').node, never, hard: true);
-    assertEdge(substitutionNode(decoratedTypeAnnotation('int> l').node, never),
+    assertEdge(
+        substitutionNode(
+            decoratedTypeAnnotation('int> l').node, inSet(neverClosure)),
         decoratedTypeAnnotation('int x').node,
         hard: false);
   }
@@ -2039,7 +2064,8 @@
 void f({int i = null}) {}
 ''');
 
-    assertEdge(always, decoratedTypeAnnotation('int').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+        hard: false);
   }
 
   test_functionDeclaration_parameter_named_no_default() async {
@@ -2073,7 +2099,8 @@
 void f([int i = null]) {}
 ''');
 
-    assertEdge(always, decoratedTypeAnnotation('int').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+        hard: false);
   }
 
   test_functionDeclaration_parameter_positionalOptional_no_default() async {
@@ -2174,8 +2201,10 @@
 }
 ''');
 
-    assertNullCheck(checkExpression('null'),
-        assertEdge(always, decoratedTypeAnnotation('int').node, hard: false));
+    assertNullCheck(
+        checkExpression('null'),
+        assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+            hard: false));
   }
 
   test_functionInvocation_return() async {
@@ -2908,7 +2937,7 @@
     final returnTypeEdge = returnTypeEdges.single;
 
     final listArgType = returnTypeEdge.sourceNode;
-    assertEdge(always, listArgType, hard: false);
+    assertEdge(inSet(alwaysPlus), listArgType, hard: false);
   }
 
   test_listLiteral_typeArgument_noNullableElements() async {
@@ -2931,7 +2960,8 @@
 }
 ''');
     assertNoUpstreamNullability(decoratedTypeAnnotation('List').node);
-    assertEdge(always, decoratedTypeAnnotation('String>[').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('String>[').node,
+        hard: false);
   }
 
   test_localVariable_type_inferred() async {
@@ -3126,13 +3156,12 @@
     var nullable_i = decoratedTypeAnnotation('int i').node;
     var nullable_list_t =
         decoratedTypeAnnotation('List<int>').typeArguments[0].node;
-    var addMethod = findNode.methodInvocation('x.add').methodName.staticElement
-        as MethodMember;
+    var addMethod = findNode.methodInvocation('x.add').methodName.staticElement;
     var nullable_t = variables
-        .decoratedElementType(addMethod.baseElement)
+        .decoratedElementType(addMethod.declaration)
         .positionalParameters[0]
         .node;
-    expect(nullable_t, same(never));
+    assertEdge(nullable_t, never, hard: true);
     var check_i = checkExpression('i/*check*/');
     var nullable_list_t_or_nullable_t = check_i
         .checks.edges.single.destinationNode as NullabilityNodeForSubstitution;
@@ -3209,7 +3238,7 @@
 ''');
     var nullable_j = decoratedTypeAnnotation('int j');
     assertNullCheck(checkExpression('j/*check*/'),
-        assertEdge(nullable_j.node, never, hard: true));
+        assertEdge(nullable_j.node, inSet(neverClosure), hard: true));
   }
 
   test_methodInvocation_resolves_to_getter() async {
@@ -3591,8 +3620,10 @@
 }
 ''');
 
-    assertNullCheck(checkExpression('(null)'),
-        assertEdge(always, decoratedTypeAnnotation('int').node, hard: false));
+    assertNullCheck(
+        checkExpression('(null)'),
+        assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+            hard: false));
   }
 
   test_part_metadata() async {
@@ -4041,7 +4072,8 @@
     // i1.toDouble() cannot be a hard edge or i2 will fail assignment
     assertEdge(decoratedTypeAnnotation('int i').node, never, hard: false);
     // i2 gets a soft edge to always due to null assignment
-    assertEdge(always, decoratedTypeAnnotation('int i').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int i').node,
+        hard: false);
   }
 
   test_postDominators_questionQuestionOperator() async {
@@ -4451,7 +4483,7 @@
     assertNullCheck(use, assertEdge(declaration, never, hard: true));
 
     var returnType = decoratedTypeAnnotation('int f').node;
-    assertEdge(never, returnType, hard: false);
+    assertEdge(inSet(neverClosure), returnType, hard: false);
   }
 
   test_prefixExpression_plusPlus() async {
@@ -4466,7 +4498,7 @@
     assertNullCheck(use, assertEdge(declaration, never, hard: true));
 
     var returnType = decoratedTypeAnnotation('int f').node;
-    assertEdge(never, returnType, hard: false);
+    assertEdge(inSet(neverClosure), returnType, hard: false);
   }
 
   test_prefixExpression_plusPlus_dynamic() async {
@@ -4745,7 +4777,8 @@
 }
 ''');
 
-    assertEdge(always, decoratedTypeAnnotation('int').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+        hard: false);
   }
 
   test_return_null() async {
@@ -4755,8 +4788,10 @@
 }
 ''');
 
-    assertNullCheck(checkExpression('null'),
-        assertEdge(always, decoratedTypeAnnotation('int').node, hard: false));
+    assertNullCheck(
+        checkExpression('null'),
+        assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+            hard: false));
   }
 
   test_return_null_generic() async {
@@ -4768,9 +4803,9 @@
 }
 ''');
     var tNode = decoratedTypeAnnotation('T f').node;
-    assertEdge(always, tNode, hard: false);
-    assertNullCheck(
-        checkExpression('null'), assertEdge(always, tNode, hard: false));
+    assertEdge(inSet(alwaysPlus), tNode, hard: false);
+    assertNullCheck(checkExpression('null'),
+        assertEdge(inSet(alwaysPlus), tNode, hard: false));
   }
 
   test_setOrMapLiteral_map_noTypeArgument_noNullableKeysAndValues() async {
@@ -4801,7 +4836,8 @@
     var mapNode = decoratedTypeAnnotation('Map').node;
 
     assertNoUpstreamNullability(mapNode);
-    assertEdge(always, assertEdge(anyNode, keyNode, hard: false).sourceNode,
+    assertEdge(
+        inSet(alwaysPlus), assertEdge(anyNode, keyNode, hard: false).sourceNode,
         hard: false);
     assertNoUpstreamNullability(
         assertEdge(anyNode, valueNode, hard: false).sourceNode);
@@ -4818,9 +4854,11 @@
     var mapNode = decoratedTypeAnnotation('Map').node;
 
     assertNoUpstreamNullability(mapNode);
-    assertEdge(always, assertEdge(anyNode, keyNode, hard: false).sourceNode,
+    assertEdge(
+        inSet(alwaysPlus), assertEdge(anyNode, keyNode, hard: false).sourceNode,
         hard: false);
-    assertEdge(always, assertEdge(anyNode, valueNode, hard: false).sourceNode,
+    assertEdge(inSet(alwaysPlus),
+        assertEdge(anyNode, valueNode, hard: false).sourceNode,
         hard: false);
   }
 
@@ -4837,7 +4875,8 @@
     assertNoUpstreamNullability(mapNode);
     assertNoUpstreamNullability(
         assertEdge(anyNode, keyNode, hard: false).sourceNode);
-    assertEdge(always, assertEdge(anyNode, valueNode, hard: false).sourceNode,
+    assertEdge(inSet(alwaysPlus),
+        assertEdge(anyNode, valueNode, hard: false).sourceNode,
         hard: false);
   }
 
@@ -4867,7 +4906,7 @@
 }
 ''');
     assertNoUpstreamNullability(decoratedTypeAnnotation('Map').node);
-    assertEdge(always, decoratedTypeAnnotation('String, int>{').node,
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('String, int>{').node,
         hard: false);
     assertNoUpstreamNullability(decoratedTypeAnnotation('int>{').node);
   }
@@ -4879,9 +4918,10 @@
 }
 ''');
     assertNoUpstreamNullability(decoratedTypeAnnotation('Map').node);
-    assertEdge(always, decoratedTypeAnnotation('String, int>{').node,
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('String, int>{').node,
         hard: false);
-    assertEdge(always, decoratedTypeAnnotation('int>{').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int>{').node,
+        hard: false);
   }
 
   test_setOrMapLiteral_map_typeArguments_nullableValue() async {
@@ -4892,7 +4932,8 @@
 ''');
     assertNoUpstreamNullability(decoratedTypeAnnotation('Map').node);
     assertNoUpstreamNullability(decoratedTypeAnnotation('String, int>{').node);
-    assertEdge(always, decoratedTypeAnnotation('int>{').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int>{').node,
+        hard: false);
   }
 
   test_setOrMapLiteral_set_noTypeArgument_noNullableElements() async {
@@ -4919,7 +4960,8 @@
     var setNode = decoratedTypeAnnotation('Set').node;
 
     assertNoUpstreamNullability(setNode);
-    assertEdge(always, assertEdge(anyNode, valueNode, hard: false).sourceNode,
+    assertEdge(inSet(alwaysPlus),
+        assertEdge(anyNode, valueNode, hard: false).sourceNode,
         hard: false);
   }
 
@@ -4943,7 +4985,8 @@
 }
 ''');
     assertNoUpstreamNullability(decoratedTypeAnnotation('Set').node);
-    assertEdge(always, decoratedTypeAnnotation('String>{').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('String>{').node,
+        hard: false);
   }
 
   test_simpleIdentifier_function() async {
@@ -5017,7 +5060,8 @@
     await analyze('''
 int f() => null;
 ''');
-    assertEdge(always, decoratedTypeAnnotation('int').node, hard: false);
+    assertEdge(inSet(alwaysPlus), decoratedTypeAnnotation('int').node,
+        hard: false);
   }
 
   test_spread_element_list() async {
@@ -5213,7 +5257,7 @@
 main() { x = null; }
 ''');
     var setXType = decoratedTypeAnnotation('int value');
-    assertEdge(always, setXType.node, hard: false);
+    assertEdge(inSet(alwaysPlus), setXType.node, hard: false);
   }
 
   test_topLevelVar_metadata() async {
@@ -5247,7 +5291,7 @@
 double get myPi => pi;
 ''');
     var myPiType = decoratedTypeAnnotation('double get');
-    assertEdge(never, myPiType.node, hard: false);
+    assertEdge(inSet(neverClosure), myPiType.node, hard: false);
   }
 
   test_topLevelVariable_type_inferred() async {
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index 638a853..38bdd97 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -41,6 +41,14 @@
   }
 
   @override
+  void externalDecoratedTypeParameterBound(
+      TypeParameterElement typeParameter, DecoratedTypeInfo decoratedType) {
+    expect(test.externalDecoratedTypeParameterBound,
+        isNot(contains(typeParameter)));
+    test.externalDecoratedTypeParameterBound[typeParameter] = decoratedType;
+  }
+
+  @override
   void fix(SingleNullabilityFix fix, Iterable<FixReasonInfo> reasons) {
     test.fixes[fix] = reasons.toList();
   }
@@ -96,6 +104,9 @@
 
   final Map<Element, DecoratedTypeInfo> externalDecoratedType = {};
 
+  final Map<TypeParameterElement, DecoratedTypeInfo>
+      externalDecoratedTypeParameterBound = {};
+
   final List<EdgeInfo> edges = [];
 
   Map<SingleNullabilityFix, List<FixReasonInfo>> fixes = {};
@@ -155,6 +166,40 @@
         'void Function(Object)');
   }
 
+  test_externalDecoratedTypeParameterBound() async {
+    await analyze('''
+import 'dart:math';
+f(Point<int> x) {}
+''');
+    var pointElement = findNode.simple('Point').staticElement as ClassElement;
+    var pointElementTypeParameter = pointElement.typeParameters[0];
+    expect(
+        externalDecoratedTypeParameterBound[pointElementTypeParameter]
+            .type
+            .toString(),
+        'num');
+  }
+
+  test_externalType_nullability_dynamic_edge() async {
+    await analyze('''
+f(List<int> x) {}
+''');
+    var listElement = findNode.simple('List').staticElement as ClassElement;
+    var listElementTypeParameter = listElement.typeParameters[0];
+    var typeParameterBoundNode =
+        externalDecoratedTypeParameterBound[listElementTypeParameter].node;
+    var edge = edges
+        .where((e) =>
+            e.sourceNode == always &&
+            e.destinationNode == typeParameterBoundNode)
+        .single;
+    var origin = edgeOrigin[edge];
+    expect(origin.kind, EdgeOriginKind.alwaysNullableType);
+    expect(origin.element, same(listElementTypeParameter));
+    expect(origin.source, null);
+    expect(origin.node, null);
+  }
+
   test_fix_reason_edge() async {
     await analyze('''
 void f(int x) {
@@ -362,6 +407,21 @@
     expect(origin.node, findNode.simple('x;'));
   }
 
+  test_graphEdge_origin_dynamic_assignment() async {
+    await analyze('''
+int f(dynamic x) => x;
+''');
+    var xNode = explicitTypeNullability[findNode.typeAnnotation('dynamic x')];
+    var returnNode = explicitTypeNullability[findNode.typeAnnotation('int f')];
+    var matchingEdges = edges
+        .where((e) => e.sourceNode == xNode && e.destinationNode == returnNode)
+        .toList();
+    var origin = edgeOrigin[matchingEdges.single];
+    expect(origin.kind, EdgeOriginKind.dynamicAssignment);
+    expect(origin.source, source);
+    expect(origin.node, findNode.simple('x;'));
+  }
+
   test_graphEdge_soft() async {
     await analyze('''
 int f(int x, bool b) {
@@ -413,7 +473,10 @@
     expect(always.isNullable, true);
     var xNode = explicitTypeNullability[findNode.typeAnnotation('int')];
     var edge = edges.where((e) => e.destinationNode == xNode).single;
-    expect(edge.sourceNode, always);
+    var edgeSource = edge.sourceNode;
+    var upstreamEdge =
+        edges.where((e) => e.destinationNode == edgeSource).single;
+    expect(upstreamEdge.sourceNode, always);
   }
 
   test_immutableNode_never() async {
@@ -729,7 +792,7 @@
         explicitTypeNullability[findNode.typeAnnotation('int')];
     expect(edges.where((e) {
       var destination = e.destinationNode;
-      return e.sourceNode == always &&
+      return _isPointedToByAlways(e.sourceNode) &&
           destination is SubstitutionNodeInfo &&
           destination.innerNode == implicitInvocationTypeArgumentNode;
     }), hasLength(1));
@@ -756,7 +819,7 @@
         explicitTypeNullability[findNode.typeAnnotation('int')];
     expect(edges.where((e) {
       var destination = e.destinationNode;
-      return e.sourceNode == always &&
+      return _isPointedToByAlways(e.sourceNode) &&
           destination is SubstitutionNodeInfo &&
           destination.innerNode == implicitInvocationTypeArgumentNode;
     }), hasLength(1));
@@ -781,7 +844,7 @@
         explicitTypeNullability[findNode.typeAnnotation('int')];
     expect(edges.where((e) {
       var destination = e.destinationNode;
-      return e.sourceNode == always &&
+      return _isPointedToByAlways(e.sourceNode) &&
           destination is SubstitutionNodeInfo &&
           destination.innerNode == implicitInvocationTypeArgumentNode;
     }), hasLength(1));
@@ -802,7 +865,7 @@
         explicitTypeNullability[findNode.typeAnnotation('int')];
     expect(
         edges.where((e) =>
-            e.sourceNode == always &&
+            _isPointedToByAlways(e.sourceNode) &&
             e.destinationNode == implicitListLiteralElementNode),
         hasLength(1));
     expect(
@@ -836,7 +899,7 @@
         hasLength(1));
     expect(
         edges.where((e) =>
-            e.sourceNode == always &&
+            _isPointedToByAlways(e.sourceNode) &&
             e.destinationNode == implicitMapLiteralValueNode),
         hasLength(1));
     expect(
@@ -856,7 +919,7 @@
         explicitTypeNullability[findNode.typeAnnotation('int')];
     expect(
         edges.where((e) =>
-            e.sourceNode == always &&
+            _isPointedToByAlways(e.sourceNode) &&
             e.destinationNode == implicitSetLiteralElementNode),
         hasLength(1));
     expect(
@@ -889,7 +952,7 @@
     var step = propagationSteps.where((s) => s.node == xNode).single;
     expect(step.newState, NullabilityState.ordinaryNullable);
     expect(step.reason, StateChangeReason.downstream);
-    expect(step.edge.sourceNode, always);
+    expect(_isPointedToByAlways(step.edge.sourceNode), true);
     expect(step.edge.destinationNode, xNode);
   }
 
@@ -924,4 +987,9 @@
     expect(sNode.outerNode,
         explicitTypeNullability[findNode.typeAnnotation('T t')]);
   }
+
+  bool _isPointedToByAlways(NullabilityNodeInfo node) {
+    return edges
+        .any((e) => e.sourceNode == always && e.destinationNode == node);
+  }
 }
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index fc1b855..c62a340 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -24,16 +24,7 @@
 import 'abstract_single_unit.dart';
 
 /// A [NodeMatcher] that matches any node, and records what node it matched to.
-class AnyNodeMatcher implements NodeMatcher {
-  final List<NullabilityNode> _matchingNodes = [];
-
-  NullabilityNode get matchingNode => _matchingNodes.single;
-
-  @override
-  void matched(NullabilityNode node) {
-    _matchingNodes.add(node);
-  }
-
+class AnyNodeMatcher extends _RecordingNodeMatcher {
   @override
   bool matches(NullabilityNode node) {
     return true;
@@ -75,8 +66,12 @@
     parameters.addAll(named.entries.map((e) => ParameterElementImpl.synthetic(
         e.key, e.value.type, ParameterKind.NAMED)));
     return DecoratedType(
-        FunctionTypeImpl.synthetic(returnType.type, typeFormals, parameters,
-            nullabilitySuffix: NullabilitySuffix.star),
+        FunctionTypeImpl(
+          typeFormals: typeFormals,
+          parameters: parameters,
+          returnType: returnType.type,
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
         node ?? newNode(),
         typeFormalBounds: typeFormals
             .map((formal) => _decoratedTypeParameterBounds[formal])
@@ -153,11 +148,38 @@
 
 /// Mixin allowing unit tests to check for the presence of graph edges.
 mixin EdgeTester {
+  /// Gets the set of all nodes pointed to by always, plus always itself.
+  Set<NullabilityNode> get alwaysPlus {
+    var result = <NullabilityNode>{graph.always};
+    for (var edge in getEdges(graph.always, anyNode)) {
+      if (edge.guards.isEmpty) {
+        result.add(edge.destinationNode);
+      }
+    }
+    return result;
+  }
+
   /// Returns a [NodeMatcher] that matches any node whatsoever.
   AnyNodeMatcher get anyNode => AnyNodeMatcher();
 
   NullabilityGraphForTesting get graph;
 
+  /// Gets the transitive closure of all nodes with hard edges pointing to
+  /// never, plus never itself.
+  Set<NullabilityNode> get neverClosure {
+    var result = <NullabilityNode>{};
+    var pending = <NullabilityNode>[graph.never];
+    while (pending.isNotEmpty) {
+      var node = pending.removeLast();
+      if (result.add(node)) {
+        for (var edge in getEdges(anyNode, node)) {
+          pending.add(edge.sourceNode);
+        }
+      }
+    }
+    return result;
+  }
+
   /// Asserts that an edge exists with a node matching [source] and a node
   /// matching [destination], and with the given [hard]ness and [guards].
   ///
@@ -229,6 +251,9 @@
     return result;
   }
 
+  /// Returns a [NodeMatcher] that matches any node in the given set.
+  NodeSetMatcher inSet(Set<NullabilityNode> nodes) => NodeSetMatcher(nodes);
+
   /// Creates a [NodeMatcher] matching a substitution node whose inner and outer
   /// nodes match [inner] and [outer].
   ///
@@ -384,6 +409,16 @@
   bool matches(NullabilityNode node);
 }
 
+/// A [NodeMatcher] that matches any node contained in the given set.
+class NodeSetMatcher extends _RecordingNodeMatcher {
+  final Set<NullabilityNode> _targetSet;
+
+  NodeSetMatcher(this._targetSet);
+
+  @override
+  bool matches(NullabilityNode node) => _targetSet.contains(node);
+}
+
 /// A [NodeMatcher] that matches exactly one node.
 class _ExactNodeMatcher implements NodeMatcher {
   final NullabilityNode _expectation;
@@ -397,6 +432,18 @@
   bool matches(NullabilityNode node) => node == _expectation;
 }
 
+/// Base class for [NodeMatcher]s that remember which nodes were matched.
+abstract class _RecordingNodeMatcher implements NodeMatcher {
+  final List<NullabilityNode> _matchingNodes = [];
+
+  NullabilityNode get matchingNode => _matchingNodes.single;
+
+  @override
+  void matched(NullabilityNode node) {
+    _matchingNodes.add(node);
+  }
+}
+
 /// A [NodeMatcher] that matches a substitution node with the given inner and
 /// outer nodes.
 class _SubstitutionNodeMatcher implements NodeMatcher {
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index 16bef49..963d3cf 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -871,7 +871,7 @@
     expect(decoratedFunctionType('f').positionalParameters[0],
         same(decoratedType));
     expect(decoratedType.node, TypeMatcher<NullabilityNodeMutable>());
-    expect(decoratedType.type.toString(), 'T Function<T,U>(U)');
+    expect(decoratedType.type.toString(), 'T Function<T, U>(U)');
     expect(decoratedType.typeFormals, hasLength(2));
     var t = decoratedType.typeFormals[0];
     var u = decoratedType.typeFormals[1];
diff --git a/pkg/nnbd_migration/tool/trial_migration.dart b/pkg/nnbd_migration/tool/trial_migration.dart
index e2f9af1..b26acb9 100644
--- a/pkg/nnbd_migration/tool/trial_migration.dart
+++ b/pkg/nnbd_migration/tool/trial_migration.dart
@@ -16,9 +16,15 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 
-main() async {
+main(List<String> args) async {
+  if (args.length > 1) {
+    throw 'invalid args. Specify *one* argument to get exceptions of interest.';
+  }
+
+  warnOnNoAssertions();
+  String categoryOfInterest = args.isEmpty ? null : args.single;
   var rootUri = Platform.script.resolve('../../..');
-  var listener = _Listener();
+  var listener = _Listener(categoryOfInterest);
   for (var testPath in [
     'third_party/pkg/charcode',
     'third_party/pkg/collection',
@@ -72,18 +78,38 @@
   for (var entry in sortedExceptions) {
     print('  ${entry.key} (x${entry.value.length})');
   }
+
+  if (categoryOfInterest == null) {
+    print('\n(Note: to show stack traces & nodes for a particular failure,'
+        ' rerun with a search string as an argument.)');
+  }
 }
 
-/// Set this to a non-null value to cause any exception to be printed in full
-/// if its category contains the string.
-const String categoryOfInterest = null;
+void warnOnNoAssertions() {
+  try {
+    assert(false);
+  } catch (e) {
+    return;
+  }
 
-/// Set this to `true` to cause just the exception nodes to be printed when
-/// `categoryOfInterest` is non-null.  Set this to `false` to cause the full
-/// stack trace to be printed.
-const bool printExceptionNodeOnly = false;
+  print('''
+!!!
+!!! Warning! You didn't --enable-asserts!
+!!!
+''');
+}
 
 class _Listener implements NullabilityMigrationListener {
+  /// Set this to `true` to cause just the exception nodes to be printed when
+  /// `_Listener.categoryOfInterest` is non-null.  Set this to `false` to cause
+  /// the full stack trace to be printed.
+  /// TODO(mfairhurst): make this a cli flag?
+  static const bool printExceptionNodeOnly = false;
+
+  /// Set this to a non-null value to cause any exception to be printed in full
+  /// if its category contains the string.
+  final String categoryOfInterest;
+
   final groupedExceptions = <String, List<String>>{};
 
   int numExceptions = 0;
@@ -98,6 +124,8 @@
 
   int numDeadCodeSegmentsFound = 0;
 
+  _Listener(this.categoryOfInterest);
+
   @override
   void addEdit(SingleNullabilityFix fix, SourceEdit edit) {
     if (edit.replacement == '?' && edit.length == 0) {
diff --git a/pkg/telemetry/lib/crash_reporting.dart b/pkg/telemetry/lib/crash_reporting.dart
index ef43e3a..415950c 100644
--- a/pkg/telemetry/lib/crash_reporting.dart
+++ b/pkg/telemetry/lib/crash_reporting.dart
@@ -7,22 +7,23 @@
 
 import 'package:http/http.dart' as http;
 import 'package:stack_trace/stack_trace.dart';
-import 'package:usage/usage.dart';
 
-// Reporting disabled until we're set up on the backend.
-const bool CRASH_REPORTING_DISABLED = true;
+import 'src/utils.dart';
+
+/// Tells crash backend that this is a Dart error (as opposed to, say, Java).
+const String _dartTypeId = 'DartError';
 
 /// Crash backend host.
 const String _crashServerHost = 'clients2.google.com';
 
 /// Path to the crash servlet.
-const String _crashEndpointPath = '/cr/report'; // or, staging_report
+const String _crashEndpointPath = '/cr/report'; // or, 'staging_report'
 
 /// The field corresponding to the multipart/form-data file attachment where
 /// crash backend expects to find the Dart stack trace.
 const String _stackTraceFileField = 'DartError';
 
-/// The name of the file attached as [stackTraceFileField].
+/// The name of the file attached as [_stackTraceFileField].
 ///
 /// The precise value is not important. It is ignored by the crash back end, but
 /// it must be supplied in the request.
@@ -35,42 +36,60 @@
   static final Uri _baseUri = new Uri(
       scheme: 'https', host: _crashServerHost, path: _crashEndpointPath);
 
+  static const int _maxReportsToSend = 1000;
+
   final String crashProductId;
-  final Analytics analytics;
+  final EnablementCallback shouldSend;
   final http.Client _httpClient;
 
-  /// Create a new [CrashReportSender], using the data from the given
-  /// [Analytics] instance.
-  CrashReportSender(this.crashProductId, this.analytics,
-      {http.Client httpClient})
-      : _httpClient = httpClient ?? new http.Client();
+  final ThrottlingBucket _throttle = ThrottlingBucket(10, Duration(minutes: 1));
+  int _reportsSend = 0;
+
+  /// Create a new [CrashReportSender].
+  CrashReportSender(
+    this.crashProductId,
+    this.shouldSend, {
+    http.Client httpClient,
+  }) : _httpClient = httpClient ?? new http.Client();
 
   /// Sends one crash report.
   ///
   /// The report is populated from data in [error] and [stackTrace].
   Future sendReport(dynamic error, {StackTrace stackTrace}) async {
-    if (!analytics.enabled || CRASH_REPORTING_DISABLED) {
+    if (!shouldSend()) {
+      return;
+    }
+
+    // Check if we've sent too many reports recently.
+    if (!_throttle.removeDrop()) {
+      return;
+    }
+
+    // Don't send too many total reports to crash reporting.
+    if (_reportsSend >= _maxReportsToSend) {
       return;
     }
 
     try {
+      final String dartVersion = Platform.version.split(' ').first;
+
       final Uri uri = _baseUri.replace(
         queryParameters: <String, String>{
-          'product': analytics.trackingId,
-          'version': analytics.applicationVersion,
+          'product': crashProductId,
+          'version': dartVersion,
         },
       );
 
       final http.MultipartRequest req = new http.MultipartRequest('POST', uri);
-      req.fields['uuid'] = analytics.clientId;
       req.fields['product'] = crashProductId;
-      req.fields['version'] = analytics.applicationVersion;
+      req.fields['version'] = dartVersion;
       req.fields['osName'] = Platform.operatingSystem;
       req.fields['osVersion'] = Platform.operatingSystemVersion;
-      req.fields['type'] = 'DartError';
+      req.fields['type'] = _dartTypeId;
       req.fields['error_runtime_type'] = '${error.runtimeType}';
+      req.fields['error_message'] = '$error';
 
-      final Chain chain = new Chain.parse(stackTrace.toString());
+      final Chain chain = new Chain.forTrace(stackTrace);
       req.files.add(new http.MultipartFile.fromString(
           _stackTraceFileField, chain.terse.toString(),
           filename: _stackTraceFilename));
@@ -94,3 +113,7 @@
     _httpClient.close();
   }
 }
+
+/// A typedef to allow crash reporting to query as to whether it should send a
+/// crash report.
+typedef bool EnablementCallback();
diff --git a/pkg/telemetry/lib/src/utils.dart b/pkg/telemetry/lib/src/utils.dart
new file mode 100644
index 0000000..04ddace
--- /dev/null
+++ b/pkg/telemetry/lib/src/utils.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' as math;
+
+/// A throttling algorithm. This models the throttling after a bucket with
+/// water dripping into it at the rate of 1 drop per replenish duration. If the
+/// bucket has water when an operation is requested, 1 drop of water is removed
+/// and the operation is performed. If not the operation is skipped. This
+/// algorithm lets operations be performed in bursts without throttling, but
+/// holds the overall average rate of operations to 1 per replenish duration.
+class ThrottlingBucket {
+  final int bucketSize;
+  final Duration replenishDuration;
+
+  int _drops;
+  int _lastReplenish;
+
+  ThrottlingBucket(this.bucketSize, this.replenishDuration) {
+    _drops = bucketSize;
+    _lastReplenish = new DateTime.now().millisecondsSinceEpoch;
+  }
+
+  bool removeDrop() {
+    _checkReplenish();
+
+    if (_drops <= 0) {
+      return false;
+    } else {
+      _drops--;
+      return true;
+    }
+  }
+
+  void _checkReplenish() {
+    int now = new DateTime.now().millisecondsSinceEpoch;
+
+    int replenishMillis = replenishDuration.inMilliseconds;
+
+    if (_lastReplenish + replenishMillis >= now) {
+      int inc = (now - _lastReplenish) ~/ replenishMillis;
+      _drops = math.min(_drops + inc, bucketSize);
+      _lastReplenish += (replenishMillis * inc);
+    }
+  }
+}
diff --git a/pkg/telemetry/test/crash_reporting_test.dart b/pkg/telemetry/test/crash_reporting_test.dart
index 466e31e..f4867e4 100644
--- a/pkg/telemetry/test/crash_reporting_test.dart
+++ b/pkg/telemetry/test/crash_reporting_test.dart
@@ -24,18 +24,20 @@
     });
 
     test('CrashReportSender', () async {
+      EnablementCallback shouldSend = () {
+        return true;
+      };
+
       AnalyticsMock analytics = new AnalyticsMock()..enabled = true;
       CrashReportSender sender = new CrashReportSender(
-          analytics.trackingId, analytics,
+          analytics.trackingId, shouldSend,
           httpClient: mockClient);
 
       await sender.sendReport('test-error', stackTrace: StackTrace.current);
 
       String body = utf8.decode(request.bodyBytes);
       expect(body, contains('String')); // error.runtimeType
-      expect(body, contains(analytics.trackingId));
-      expect(body, contains('1.0.0'));
-      expect(body, contains(analytics.clientId));
-    }, skip: CRASH_REPORTING_DISABLED);
+      expect(body, contains('test-error'));
+    });
   });
 }
diff --git a/pkg/telemetry/test/utils_test.dart b/pkg/telemetry/test/utils_test.dart
new file mode 100644
index 0000000..2a9fcec
--- /dev/null
+++ b/pkg/telemetry/test/utils_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:telemetry/src/utils.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('ThrottlingBucket', () {
+    test('can send', () {
+      ThrottlingBucket bucket = new ThrottlingBucket(10, Duration(minutes: 1));
+      expect(bucket.removeDrop(), true);
+    });
+
+    test("doesn't send too many", () {
+      ThrottlingBucket bucket = new ThrottlingBucket(10, Duration(minutes: 1));
+      for (int i = 0; i < 10; i++) {
+        expect(bucket.removeDrop(), true);
+      }
+      expect(bucket.removeDrop(), false);
+    });
+  });
+}
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index 9064cb5..ce68eba 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -679,10 +679,87 @@
     var progress = Progress.find(data["progress"] as String);
     var nnbdMode = NnbdMode.find(data["nnbd"] as String);
 
+    void addConfiguration(Configuration innerConfiguration,
+        [String namedConfiguration]) {
+      var configuration = TestConfiguration(
+          configuration: innerConfiguration,
+          progress: progress,
+          selectors: selectors,
+          testList: data["test_list_contents"] as List<String>,
+          repeat: data["repeat"] as int,
+          batch: !(data["noBatch"] as bool),
+          batchDart2JS: data["dart2js_batch"] as bool,
+          copyCoreDumps: data["copy_coredumps"] as bool,
+          isVerbose: data["verbose"] as bool,
+          listTests: data["list"] as bool,
+          listStatusFiles: data["list_status_files"] as bool,
+          cleanExit: data["clean_exit"] as bool,
+          silentFailures: data["silent_failures"] as bool,
+          printTiming: data["time"] as bool,
+          printReport: data["report"] as bool,
+          reportInJson: data["report_in_json"] as bool,
+          resetBrowser: data["reset_browser_configuration"] as bool,
+          skipCompilation: data["skip_compilation"] as bool,
+          writeDebugLog: data["write_debug_log"] as bool,
+          writeResults: data["write_results"] as bool,
+          writeLogs: data["write_logs"] as bool,
+          drtPath: data["drt"] as String,
+          chromePath: data["chrome"] as String,
+          safariPath: data["safari"] as String,
+          firefoxPath: data["firefox"] as String,
+          dartPath: data["dart"] as String,
+          dartPrecompiledPath: data["dart_precompiled"] as String,
+          genSnapshotPath: data["gen-snapshot"] as String,
+          keepGeneratedFiles: data["keep_generated_files"] as bool,
+          taskCount: data["tasks"] as int,
+          shardCount: data["shards"] as int,
+          shard: data["shard"] as int,
+          stepName: data["step_name"] as String,
+          testServerPort: data["test_server_port"] as int,
+          testServerCrossOriginPort:
+              data['test_server_cross_origin_port'] as int,
+          testDriverErrorPort: data["test_driver_error_port"] as int,
+          localIP: data["local_ip"] as String,
+          sharedOptions: sharedOptions,
+          packages: data["packages"] as String,
+          packageRoot: data["package_root"] as String,
+          suiteDirectory: data["suite_dir"] as String,
+          outputDirectory: data["output_directory"] as String,
+          reproducingArguments:
+              _reproducingCommand(data, namedConfiguration != null),
+          fastTestsOnly: data["fast_tests"] as bool,
+          printPassingStdout: data["print_passing_stdout"] as bool);
+
+      if (configuration.validate()) {
+        result.add(configuration);
+      }
+    }
+
+    String namedConfigurationOption = data["named_configuration"] as String;
+    if (namedConfigurationOption != null) {
+      List<String> namedConfigurations = namedConfigurationOption.split(',');
+      var testMatrixFile = "tools/bots/test_matrix.json";
+      var testMatrix = TestMatrix.fromPath(testMatrixFile);
+      for (String namedConfiguration in namedConfigurations) {
+        var configuration = testMatrix.configurations.singleWhere(
+            (c) => c.name == namedConfiguration,
+            orElse: () => null);
+        if (configuration == null) {
+          var names = testMatrix.configurations
+              .map((configuration) => configuration.name)
+              .toList();
+          names.sort();
+          _fail('The named configuration "$namedConfiguration" does not exist.'
+              ' The following configurations are available:\n'
+              '  * ${names.join('\n  * ')}');
+        }
+        addConfiguration(configuration);
+      }
+      return result;
+    }
+
     // Expand runtimes.
     for (var runtime in runtimes) {
-      // Start installing the runtime if needed.
-
       // Expand architectures.
       var architectures = data["arch"] as String;
       if (architectures == "all") {
@@ -700,82 +777,28 @@
           for (var modeName in modes.split(",")) {
             var mode = Mode.find(modeName);
             var system = System.find(data["system"] as String);
-            var namedConfiguration =
-                _namedConfiguration(data["named_configuration"] as String);
-            var innerConfiguration = namedConfiguration ??
-                Configuration("custom configuration", architecture, compiler,
-                    mode, runtime, system,
-                    nnbdMode: nnbdMode,
-                    timeout: data["timeout"] as int,
-                    enableAsserts: data["enable_asserts"] as bool,
-                    useAnalyzerCfe: data["use_cfe"] as bool,
-                    useAnalyzerFastaParser:
-                        data["analyzer_use_fasta_parser"] as bool,
-                    useBlobs: data["use_blobs"] as bool,
-                    useElf: data["use_elf"] as bool,
-                    useSdk: data["use_sdk"] as bool,
-                    useHotReload: data["hot_reload"] as bool,
-                    useHotReloadRollback: data["hot_reload_rollback"] as bool,
-                    isHostChecked: data["host_checked"] as bool,
-                    isCsp: data["csp"] as bool,
-                    isMinified: data["minified"] as bool,
-                    vmOptions: vmOptions,
-                    dart2jsOptions: dart2jsOptions,
-                    experiments: experiments,
-                    babel: data['babel'] as String,
-                    builderTag: data["builder_tag"] as String);
-            var configuration = TestConfiguration(
-                configuration: innerConfiguration,
-                progress: progress,
-                selectors: selectors,
-                testList: data["test_list_contents"] as List<String>,
-                repeat: data["repeat"] as int,
-                batch: !(data["noBatch"] as bool),
-                batchDart2JS: data["dart2js_batch"] as bool,
-                copyCoreDumps: data["copy_coredumps"] as bool,
-                isVerbose: data["verbose"] as bool,
-                listTests: data["list"] as bool,
-                listStatusFiles: data["list_status_files"] as bool,
-                cleanExit: data["clean_exit"] as bool,
-                silentFailures: data["silent_failures"] as bool,
-                printTiming: data["time"] as bool,
-                printReport: data["report"] as bool,
-                reportInJson: data["report_in_json"] as bool,
-                resetBrowser: data["reset_browser_configuration"] as bool,
-                skipCompilation: data["skip_compilation"] as bool,
-                writeDebugLog: data["write_debug_log"] as bool,
-                writeResults: data["write_results"] as bool,
-                writeLogs: data["write_logs"] as bool,
-                drtPath: data["drt"] as String,
-                chromePath: data["chrome"] as String,
-                safariPath: data["safari"] as String,
-                firefoxPath: data["firefox"] as String,
-                dartPath: data["dart"] as String,
-                dartPrecompiledPath: data["dart_precompiled"] as String,
-                genSnapshotPath: data["gen-snapshot"] as String,
-                keepGeneratedFiles: data["keep_generated_files"] as bool,
-                taskCount: data["tasks"] as int,
-                shardCount: data["shards"] as int,
-                shard: data["shard"] as int,
-                stepName: data["step_name"] as String,
-                testServerPort: data["test_server_port"] as int,
-                testServerCrossOriginPort:
-                    data['test_server_cross_origin_port'] as int,
-                testDriverErrorPort: data["test_driver_error_port"] as int,
-                localIP: data["local_ip"] as String,
-                sharedOptions: sharedOptions,
-                packages: data["packages"] as String,
-                packageRoot: data["package_root"] as String,
-                suiteDirectory: data["suite_dir"] as String,
-                outputDirectory: data["output_directory"] as String,
-                reproducingArguments:
-                    _reproducingCommand(data, namedConfiguration != null),
-                fastTestsOnly: data["fast_tests"] as bool,
-                printPassingStdout: data["print_passing_stdout"] as bool);
-
-            if (configuration.validate()) {
-              result.add(configuration);
-            }
+            var configuration = Configuration("custom configuration",
+                architecture, compiler, mode, runtime, system,
+                nnbdMode: nnbdMode,
+                timeout: data["timeout"] as int,
+                enableAsserts: data["enable_asserts"] as bool,
+                useAnalyzerCfe: data["use_cfe"] as bool,
+                useAnalyzerFastaParser:
+                    data["analyzer_use_fasta_parser"] as bool,
+                useBlobs: data["use_blobs"] as bool,
+                useElf: data["use_elf"] as bool,
+                useSdk: data["use_sdk"] as bool,
+                useHotReload: data["hot_reload"] as bool,
+                useHotReloadRollback: data["hot_reload_rollback"] as bool,
+                isHostChecked: data["host_checked"] as bool,
+                isCsp: data["csp"] as bool,
+                isMinified: data["minified"] as bool,
+                vmOptions: vmOptions,
+                dart2jsOptions: dart2jsOptions,
+                experiments: experiments,
+                babel: data['babel'] as String,
+                builderTag: data["builder_tag"] as String);
+            addConfiguration(configuration);
           }
         }
       }
@@ -934,25 +957,6 @@
   OptionParseException(this.message);
 }
 
-Configuration _namedConfiguration(String template) {
-  if (template == null) return null;
-
-  var testMatrixFile = "tools/bots/test_matrix.json";
-  var testMatrix = TestMatrix.fromPath(testMatrixFile);
-  var configuration = testMatrix.configurations
-      .singleWhere((c) => c.name == template, orElse: () => null);
-  if (configuration == null) {
-    var names = testMatrix.configurations
-        .map((configuration) => configuration.name)
-        .toList();
-    names.sort();
-    _fail('The named configuration "$template" does not exist. The following '
-        'configurations are available:\n  * ${names.join('\n  * ')}');
-  }
-
-  return configuration;
-}
-
 /// Throws an [OptionParseException] with [message].
 void _fail(String message) {
   throw OptionParseException(message);
diff --git a/pkg/test_runner/lib/src/test_configurations.dart b/pkg/test_runner/lib/src/test_configurations.dart
index 0d35524..be93c90 100644
--- a/pkg/test_runner/lib/src/test_configurations.dart
+++ b/pkg/test_runner/lib/src/test_configurations.dart
@@ -45,7 +45,6 @@
 
 Future testConfigurations(List<TestConfiguration> configurations) async {
   var startTime = DateTime.now();
-  var startStopwatch = Stopwatch()..start();
 
   // Extract global options from first configuration.
   var firstConf = configurations[0];
@@ -209,7 +208,7 @@
   }
 
   if (firstConf.writeResults) {
-    eventListener.add(ResultWriter(firstConf, startTime, startStopwatch));
+    eventListener.add(ResultWriter(firstConf.outputDirectory));
   }
 
   if (firstConf.copyCoreDumps) {
diff --git a/pkg/test_runner/lib/src/test_progress.dart b/pkg/test_runner/lib/src/test_progress.dart
index 0389d59..6461397 100644
--- a/pkg/test_runner/lib/src/test_progress.dart
+++ b/pkg/test_runner/lib/src/test_progress.dart
@@ -708,15 +708,11 @@
 /// Writes a results.json file with a line for each test.
 /// Each line is a json map with the test name and result and expected result.
 class ResultWriter extends EventListener {
-  final TestConfiguration _configuration;
   final List<Map> _results = [];
   final List<Map> _logs = [];
   final String _outputDirectory;
-  final Stopwatch _startStopwatch;
-  final DateTime _startTime;
 
-  ResultWriter(this._configuration, this._startTime, this._startStopwatch)
-      : _outputDirectory = _configuration.outputDirectory;
+  ResultWriter(this._outputDirectory);
 
   void allTestsKnown() {
     // Write an empty result log file, that will be overwritten if any tests
@@ -729,10 +725,6 @@
       lines.map((l) => l + '\n').join();
 
   void done(TestCase test) {
-    if (_configuration != test.configuration) {
-      throw Exception("Two configurations in the same run. "
-          "Cannot output results for multiple configurations.");
-    }
     final name = test.displayName;
     final index = name.indexOf('/');
     final suite = name.substring(0, index);
@@ -742,7 +734,7 @@
 
     final record = {
       "name": name,
-      "configuration": _configuration.configuration.name,
+      "configuration": test.configuration.configuration.name,
       "suite": suite,
       "test_name": testName,
       "time_ms": time.inMilliseconds,
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 00753c0..00de5c9 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -682,7 +682,9 @@
 
     if (compiler.errors.isNotEmpty) {
       if (component != null) {
-        result = new CompilationResult.errors(compiler.errors,
+        result = new CompilationResult.errors(
+            compiler.errors,
+            // ignore: DEPRECATED_MEMBER_USE
             serializeComponent(component, filter: (lib) => !lib.isExternal));
       } else {
         result = new CompilationResult.errors(compiler.errors, null);
@@ -693,6 +695,7 @@
       // [kernelForProgram] is marked `external`, so we can use that bit to
       // decide what to exclude.
       result = new CompilationResult.ok(
+          // ignore: DEPRECATED_MEMBER_USE
           serializeComponent(component, filter: (lib) => !lib.isExternal));
     }
   } catch (error, stack) {
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index 24d2fa0..ac3e756 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -29,7 +29,10 @@
 
 import 'package:args/args.dart';
 import 'package:kernel/kernel.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
+import 'package:vm/kernel_front_end.dart'
+    show runGlobalTransformations, ErrorDetector;
 import 'package:kernel/target/targets.dart' show TargetFlags, getTarget;
 import 'package:meta/meta.dart';
 import 'package:vm/target/install.dart' show installAdditionalTargets;
@@ -45,14 +48,19 @@
     ..addOption('target',
         allowed: ['dart_runner', 'flutter', 'flutter-runner', 'vm'],
         defaultsTo: 'vm',
-        help: 'A platform.dill file to append to the input. If not given, no '
-            'platform.dill will be appended.')
+        help: 'Target platform.')
+    ..addFlag('aot',
+        help: 'If set, produces kernel file for AOT compilation (enables '
+            'global transformations). Otherwise, writes regular dill.',
+        defaultsTo: false)
+    ..addFlag('gen-bytecode',
+        help:
+            'If true, the kernel file will be output in bytecode format. Defaults to true if --aot, false otherwise')
     ..addFlag('write-txt',
         help: 'Also write the result in kernel-text format as <out.dill>.txt',
         defaultsTo: false)
     ..addFlag('remove-core-libs',
-        help:
-            'If set, the resulting dill file will not include `dart:` libraries',
+        help: 'If set, the output dill file will not include `dart:` libraries',
         defaultsTo: false)
     ..addMultiOption('define',
         abbr: 'D',
@@ -70,6 +78,7 @@
   } on FormatException catch (e) {
     print(e.message);
   }
+
   if (argResults == null || argResults['help'] || argResults.rest.length != 2) {
     String script = 'protobuf_aware_treeshaker.dart';
     print(
@@ -80,6 +89,11 @@
     exit(-1);
   }
 
+  if (argResults['aot'] && argResults['remove-core-libs']) {
+    print('The `--aot` option is incompatible with `--remove-core-libs`');
+    exit(-1);
+  }
+
   return argResults;
 }
 
@@ -103,22 +117,50 @@
 
   installAdditionalTargets();
 
-  treeshaker.TransformationInfo info = treeshaker.transformComponent(
-      component, environment, getTarget(argResults['target'], TargetFlags()),
-      collectInfo: argResults['verbose']);
+  final target = getTarget(argResults['target'], TargetFlags());
 
-  if (argResults['verbose']) {
-    for (String fieldName in info.removedMessageFields) {
-      print('Removed $fieldName');
-    }
-    for (Class removedClass in info.removedMessageClasses) {
-      print('Removed $removedClass');
+  // The [component] is treeshaken and has TFA annotations. Write output.
+  if (argResults['aot']) {
+    const bool useGlobalTypeFlowAnalysis = true;
+    const bool enableAsserts = false;
+    const bool useProtobufAwareTreeShaker = true;
+    final nopErrorDetector = ErrorDetector();
+    runGlobalTransformations(
+      target,
+      component,
+      useGlobalTypeFlowAnalysis,
+      enableAsserts,
+      useProtobufAwareTreeShaker,
+      nopErrorDetector,
+    );
+  } else {
+    treeshaker.TransformationInfo info = treeshaker.transformComponent(
+        component, environment, target,
+        collectInfo: argResults['verbose']);
+
+    if (argResults['verbose']) {
+      for (String fieldName in info.removedMessageFields) {
+        print('Removed $fieldName');
+      }
+      for (Class removedClass in info.removedMessageClasses) {
+        print('Removed $removedClass');
+      }
     }
   }
 
-  await writeComponent(component, output,
-      removeCoreLibs: argResults['remove-core-libs'],
-      removeSource: argResults['remove-source']);
+  if (argResults['aot']) {
+    // Write kernel file for AOT compilation.
+    final sink = File(output).openWrite();
+    final printer = BinaryPrinter(sink);
+    printer.writeComponentFile(component);
+    await sink.close();
+  } else {
+    // Clean out the AOT-only TFA annotations and write regular dill.
+    component.metadata.clear();
+    await writeComponent(component, output,
+        removeCoreLibs: argResults['remove-core-libs'],
+        removeSource: argResults['remove-source']);
+  }
   if (argResults['write-txt']) {
     writeComponentToText(component, path: output + '.txt');
   }
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index 912eede..10dd830 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -740,4 +740,10 @@
     emitSourcePosition();
     _emitInstructionD(Opcode.kNullCheck, rd);
   }
+
+  @pragma('vm:prefer-inline')
+  void emitInitLateField(int rd) {
+    emitSourcePosition();
+    _emitInstructionD(Opcode.kInitLateField, rd);
+  }
 }
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index ff4bc6d..a860cd6 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -10,7 +10,7 @@
 /// Before bumping current bytecode version format, make sure that
 /// all users have switched to a VM which is able to consume new
 /// version of bytecode.
-const int currentBytecodeFormatVersion = 25;
+const int currentBytecodeFormatVersion = 26;
 
 enum Opcode {
   kUnusedOpcode000,
@@ -181,9 +181,11 @@
   kStoreIndexedTOS,
   kUnused20,
 
+  // Late fields and variables.
+  kInitLateField,
+  kInitLateField_Wide,
+
   // Static fields.
-  kUnused40,
-  kUnused41,
   kStoreStaticTOS,
   kStoreStaticTOS_Wide,
 
@@ -412,6 +414,8 @@
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kStoreIndexedTOS: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kInitLateField: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kLoadStatic: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kStoreStaticTOS: const Format(
diff --git a/pkg/vm/lib/bytecode/declarations.dart b/pkg/vm/lib/bytecode/declarations.dart
index 6acb9ff..704bef6 100644
--- a/pkg/vm/lib/bytecode/declarations.dart
+++ b/pkg/vm/lib/bytecode/declarations.dart
@@ -329,7 +329,7 @@
 }
 
 class FieldDeclaration {
-  static const hasInitializerFlag = 1 << 0;
+  static const hasNontrivialInitializerFlag = 1 << 0;
   static const hasGetterFlag = 1 << 1;
   static const hasSetterFlag = 1 << 2;
   static const isReflectableFlag = 1 << 3;
@@ -346,6 +346,7 @@
   static const hasAttributesFlag = 1 << 14;
   static const isLateFlag = 1 << 15;
   static const isExtensionMemberFlag = 1 << 16;
+  static const hasInitializerFlag = 1 << 17;
 
   final int flags;
   final ObjectHandle name;
@@ -389,7 +390,7 @@
     if ((flags & hasInitializerCodeFlag) != 0) {
       writer.writeLinkOffset(initializerCode);
     }
-    if ((flags & hasInitializerFlag) == 0) {
+    if ((flags & hasNontrivialInitializerFlag) == 0) {
       writer.writePackedObject(value);
     }
     if ((flags & hasGetterFlag) != 0) {
@@ -421,8 +422,9 @@
     final initializerCode = ((flags & hasInitializerCodeFlag) != 0)
         ? reader.readLinkOffset<Code>()
         : null;
-    final value =
-        ((flags & hasInitializerFlag) == 0) ? reader.readPackedObject() : null;
+    final value = ((flags & hasNontrivialInitializerFlag) == 0)
+        ? reader.readPackedObject()
+        : null;
     final getterName =
         ((flags & hasGetterFlag) != 0) ? reader.readPackedObject() : null;
     final setterName =
@@ -484,11 +486,14 @@
     if ((flags & hasSourcePositionsFlag) != 0) {
       sb.write(', pos = $position, end-pos = $endPosition');
     }
+    if ((flags & hasInitializerFlag) != 0) {
+      sb.write(', has-initializer');
+    }
     sb.writeln();
     if ((flags & hasInitializerCodeFlag) != 0) {
       sb.write('    initializer\n$initializerCode\n');
     }
-    if ((flags & hasInitializerFlag) == 0) {
+    if ((flags & hasNontrivialInitializerFlag) == 0) {
       sb.write('    value = $value\n');
     }
     if ((flags & hasAnnotationsFlag) != 0) {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 6b1b024..6e97d4a 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -207,6 +207,7 @@
 
   @override
   visitLibrary(Library node) {
+    // ignore: DEPRECATED_MEMBER_USE
     if (node.isExternal) {
       return;
     }
@@ -574,21 +575,24 @@
         value = _getConstant(field.initializer);
       }
     } else {
-      flags |= FieldDeclaration.hasInitializerFlag;
+      flags |= FieldDeclaration.hasNontrivialInitializerFlag;
     }
     if (initializer != null) {
       flags |= FieldDeclaration.hasInitializerCodeFlag;
     }
+    if (field.initializer != null) {
+      flags |= FieldDeclaration.hasInitializerFlag;
+    }
     final name = objectTable.getNameHandle(
         field.name.library, objectTable.mangleMemberName(field, false, false));
     ObjectHandle getterName;
     ObjectHandle setterName;
-    if (!field.isStatic || (initializer != null)) {
+    if (_needsGetter(field)) {
       flags |= FieldDeclaration.hasGetterFlag;
       getterName = objectTable.getNameHandle(
           field.name.library, objectTable.mangleMemberName(field, true, false));
     }
-    if (!field.isStatic && !field.isFinal) {
+    if (_needsSetter(field)) {
       flags |= FieldDeclaration.hasSetterFlag;
       setterName = objectTable.getNameHandle(
           field.name.library, objectTable.mangleMemberName(field, false, true));
@@ -949,9 +953,35 @@
   }
 
   bool hasInitializerCode(Field field) =>
-      (field.isStatic || options.emitInstanceFieldInitializers) &&
+      (field.isStatic ||
+          field.isLate ||
+          options.emitInstanceFieldInitializers) &&
       !_hasTrivialInitializer(field);
 
+  bool _needsGetter(Field field) {
+    // All instance fields need a getter.
+    if (!field.isStatic) return true;
+
+    // Static fields also need a getter if they have a non-trivial initializer,
+    // because it needs to be initialized lazily.
+    if (!_hasTrivialInitializer(field)) return true;
+
+    // Static late fields with no initializer also need a getter, to check if
+    // it's been initialized.
+    return field.isLate && field.initializer == null;
+  }
+
+  bool _needsSetter(Field field) {
+    // Static fields never need a setter.
+    if (field.isStatic) return false;
+
+    // Late instance fields always need a setter.
+    if (field.isLate) return true;
+
+    // Otherwise, the field only needs a setter if it isn't final.
+    return !field.isFinal;
+  }
+
   void _genNativeCall(String nativeName) {
     final function = enclosingMember.function;
     assert(function != null);
@@ -1120,14 +1150,20 @@
     if (!isRedirecting) {
       initializedFields = new Set<Field>();
       for (var field in node.enclosingClass.fields) {
-        if (!field.isStatic && field.initializer != null) {
-          if (initializedInInitializersList.contains(field)) {
-            // Do not store a value into the field as it is going to be
-            // overwritten by initializers list.
-            _generateNode(field.initializer);
-            asm.emitDrop1();
-          } else {
-            _genFieldInitializer(field, field.initializer);
+        if (!field.isStatic) {
+          if (field.isLate) {
+            if (!initializedInInitializersList.contains(field)) {
+              _genLateFieldInitializer(field);
+            }
+          } else if (field.initializer != null) {
+            if (initializedInInitializersList.contains(field)) {
+              // Do not store a value into the field as it is going to be
+              // overwritten by initializers list.
+              _generateNode(field.initializer);
+              asm.emitDrop1();
+            } else {
+              _genFieldInitializer(field, field.initializer);
+            }
           }
         }
       }
@@ -1138,7 +1174,9 @@
     if (!isRedirecting) {
       nullableFields = <ObjectHandle>[];
       for (var field in node.enclosingClass.fields) {
-        if (!field.isStatic && !initializedFields.contains(field)) {
+        if (!field.isStatic &&
+            !field.isLate &&
+            !initializedFields.contains(field)) {
           nullableFields.add(objectTable.getHandle(field));
         }
       }
@@ -1162,6 +1200,22 @@
     initializedFields.add(field);
   }
 
+  void _genLateFieldInitializer(Field field) {
+    assert(!field.isStatic);
+
+    if (field.initializer != null && _hasTrivialInitializer(field)) {
+      _genFieldInitializer(field, field.initializer);
+      return;
+    }
+
+    _genPushReceiver();
+
+    final int cpIndex = cp.addInstanceField(field);
+    asm.emitInitLateField(cpIndex);
+
+    initializedFields.add(field);
+  }
+
   void _genArguments(Expression receiver, Arguments arguments,
       {int storeReceiverToLocal}) {
     if (arguments.types.isNotEmpty) {
@@ -1893,6 +1947,14 @@
       _handleDefaultTypeArguments(function, done);
 
       asm.bind(done);
+    } else if (isClosure &&
+        !(parentFunction != null &&
+            parentFunction.dartAsyncMarker != AsyncMarker.Sync)) {
+      // Closures can be called dynamically with arbitrary arguments,
+      // so they should check number of type arguments, even if
+      // closure is not generic.
+      // Synthetic async_op closures don't need this check.
+      asm.emitCheckFunctionTypeArgs(0, locals.scratchVarIndexInFrame);
     }
 
     // Open initial scope before the first CheckStack, as VM might
@@ -1906,7 +1968,8 @@
         asm.localVariableTable
             .recordContextVariable(asm.offset, locals.contextVarIndexInFrame);
       }
-      if (locals.hasReceiver) {
+      if (locals.hasReceiver &&
+          (!isClosure || locals.isCaptured(locals.receiverVar))) {
         _declareLocalVariable(locals.receiverVar, function.fileOffset);
       }
       for (var v in function.positionalParameters) {
@@ -2116,7 +2179,7 @@
       assert(host.typeParameters.length == targetTypeParameters.length);
       for (int i = 0; i < targetTypeParameters.length; ++i) {
         map[targetTypeParameters[i]] =
-            new TypeParameterType(host.typeParameters[i]);
+            new TypeParameterType(host.typeParameters[i], Nullability.legacy);
       }
     }
     return Substitution.fromMap(map);
@@ -2304,7 +2367,7 @@
     final DartType bound = (forwardingTypeParameterBounds != null)
         ? forwardingTypeParameterBounds[typeParam]
         : typeParam.bound;
-    final DartType type = new TypeParameterType(typeParam);
+    final DartType type = new TypeParameterType(typeParam, Nullability.legacy);
     _genPushInstantiatorAndFunctionTypeArguments([type, bound]);
     asm.emitPushConstant(cp.addType(type));
     asm.emitPushConstant(cp.addType(bound));
@@ -3529,7 +3592,7 @@
     if (target is Field) {
       if (target.isConst) {
         _genPushConstExpr(target.initializer);
-      } else if (_hasTrivialInitializer(target)) {
+      } else if (!_needsGetter(target)) {
         asm.emitLoadStatic(cp.addStaticField(target));
       } else {
         _genDirectCall(target, objectTable.getArgDescHandle(0), 0,
diff --git a/pkg/vm/lib/bytecode/generics.dart b/pkg/vm/lib/bytecode/generics.dart
index 5e60ef1..4fe55e8 100644
--- a/pkg/vm/lib/bytecode/generics.dart
+++ b/pkg/vm/lib/bytecode/generics.dart
@@ -28,7 +28,7 @@
   }
   final types = new List<DartType>(typeParameters.length);
   for (int i = 0; i < typeParameters.length; ++i) {
-    types[i] = new TypeParameterType(typeParameters[i]);
+    types[i] = new TypeParameterType(typeParameters[i], Nullability.legacy);
   }
   return types;
 }
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 6261edb..88812ec 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -638,6 +638,14 @@
         _useVariable(_currentFrame.factoryTypeArgsVar);
       }
     }
+
+    // Erase promoted bound in type parameter types as it makes no
+    // difference at run time, but types which are different only in
+    // promoted bounds are not equal when compared using DartType.operator==,
+    // which prevents reusing of type arguments.
+    // See dartbug.com/39240 for context.
+    node.promotedBound = null;
+
     node.visitChildren(this);
   }
 
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
index 063361f..1d8e290 100644
--- a/pkg/vm/lib/bytecode/object_table.dart
+++ b/pkg/vm/lib/bytecode/object_table.dart
@@ -2323,8 +2323,8 @@
               (Reference fieldRef, Constant value) => new MapEntry(
                   objectTable.getHandle(fieldRef.asField),
                   objectTable.getHandle(value))),
-          objectTable.getHandle(
-              new InterfaceType(node.classNode, node.typeArguments))));
+          objectTable.getHandle(new InterfaceType(
+              node.classNode, Nullability.legacy, node.typeArguments))));
 
   @override
   ObjectHandle visitTearOffConstant(TearOffConstant node) =>
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 448405e..e35422e 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -106,7 +106,7 @@
       help:
           'Split resulting kernel file into multiple files (one per package).',
       defaultsTo: false);
-  args.addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: null);
+  args.addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false);
   args.addMultiOption('bytecode-options',
       help: 'Specify options for bytecode generation:',
       valueHelp: 'opt1,opt2,...',
@@ -157,7 +157,7 @@
   final bool tfa = options['tfa'];
   final bool linkPlatform = options['link-platform'];
   final bool embedSources = options['embed-sources'];
-  final bool genBytecode = options['gen-bytecode'] ?? aot;
+  final bool genBytecode = options['gen-bytecode'];
   final bool dropAST = options['drop-ast'];
   final bool enableAsserts = options['enable-asserts'];
   final bool useProtobufTreeShaker = options['protobuf-tree-shaker'];
@@ -169,6 +169,18 @@
     return badUsageExitCode;
   }
 
+  if (aot) {
+    if (!linkPlatform) {
+      print('Error: --no-link-platform option cannot be used with --aot');
+      return badUsageExitCode;
+    }
+    if (splitOutputByPackages) {
+      print(
+          'Error: --split-output-by-packages option cannot be used with --aot');
+      return badUsageExitCode;
+    }
+  }
+
   final BytecodeOptions bytecodeOptions = new BytecodeOptions(
     enableAsserts: enableAsserts,
     emitSourceFiles: embedSources,
@@ -308,12 +320,10 @@
 
   // Run global transformations only if component is correct.
   if (aot && component != null) {
-    await _runGlobalTransformations(
-        source,
-        options,
+    await runGlobalTransformations(
+        options.target,
         component,
         useGlobalTypeFlowAnalysis,
-        environmentDefines,
         enableAsserts,
         useProtobufTreeShaker,
         errorDetector);
@@ -363,12 +373,10 @@
   options.environmentDefines = environmentDefines;
 }
 
-Future _runGlobalTransformations(
-    Uri source,
-    CompilerOptions compilerOptions,
+Future runGlobalTransformations(
+    Target target,
     Component component,
     bool useGlobalTypeFlowAnalysis,
-    Map<String, String> environmentDefines,
     bool enableAsserts,
     bool useProtobufTreeShaker,
     ErrorDetector errorDetector) async {
@@ -389,8 +397,7 @@
   unreachable_code_elimination.transformComponent(component, enableAsserts);
 
   if (useGlobalTypeFlowAnalysis) {
-    globalTypeFlow.transformComponent(
-        compilerOptions.target, coreTypes, component);
+    globalTypeFlow.transformComponent(target, coreTypes, component);
   } else {
     devirtualization.transformComponent(coreTypes, component);
     no_dynamic_invocations_annotator.transformComponent(component);
@@ -404,8 +411,7 @@
     protobuf_tree_shaker.removeUnusedProtoReferences(
         component, coreTypes, null);
 
-    globalTypeFlow.transformComponent(
-        compilerOptions.target, coreTypes, component);
+    globalTypeFlow.transformComponent(target, coreTypes, component);
   }
 
   // TODO(35069): avoid recomputing CSA by reading it from the platform files.
@@ -669,6 +675,7 @@
 
 String packageFor(Library lib) {
   // Core libraries are not written into any package kernel binaries.
+  // ignore: DEPRECATED_MEMBER_USE
   if (lib.isExternal) return null;
 
   // Packages are written into their own kernel binaries.
diff --git a/pkg/vm/lib/transformations/devirtualization.dart b/pkg/vm/lib/transformations/devirtualization.dart
index 2b10f69..ff8e4ca 100644
--- a/pkg/vm/lib/transformations/devirtualization.dart
+++ b/pkg/vm/lib/transformations/devirtualization.dart
@@ -91,6 +91,7 @@
   @override
   visitLibrary(Library node) {
     if (_trace) {
+      // ignore: DEPRECATED_MEMBER_USE
       String external = node.isExternal ? " (external)" : "";
       print("[devirt] Processing library ${node.name}${external}");
     }
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index e807469..4837963 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -299,10 +299,10 @@
     }
     if (kNativeTypeIntStart.index <= nativeType_.index &&
         nativeType_.index <= kNativeTypeIntEnd.index) {
-      return InterfaceType(intClass);
+      return InterfaceType(intClass, Nullability.legacy);
     }
     if (nativeType_ == NativeType.kFloat || nativeType_ == NativeType.kDouble) {
-      return InterfaceType(doubleClass);
+      return InterfaceType(doubleClass, Nullability.legacy);
     }
     if (nativeType_ == NativeType.kVoid) {
       return VoidType();
@@ -326,7 +326,7 @@
         .map((t) => convertNativeTypeToDartType(t, /*allowStructs=*/ false))
         .toList();
     if (argumentTypes.contains(null)) return null;
-    return FunctionType(argumentTypes, returnType);
+    return FunctionType(argumentTypes, returnType, Nullability.legacy);
   }
 
   NativeType getType(Class c) {
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 78d3d6a..249a45a 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -131,8 +131,10 @@
   bool _isPointerType(Field field) {
     return env.isSubtypeOf(
         field.type,
-        InterfaceType(pointerClass,
-            [InterfaceType(nativeTypesClasses[NativeType.kNativeType.index])]),
+        InterfaceType(pointerClass, Nullability.legacy, [
+          InterfaceType(nativeTypesClasses[NativeType.kNativeType.index],
+              Nullability.legacy)
+        ]),
         SubtypeCheckMode.ignoringNullabilities);
   }
 
@@ -163,8 +165,9 @@
             f.fileUri);
       } else {
         final DartType dartType = f.type;
-        final DartType nativeType =
-            InterfaceType(nativeTypesClasses[nativeTypeAnnos.first.index]);
+        final DartType nativeType = InterfaceType(
+            nativeTypesClasses[nativeTypeAnnos.first.index],
+            Nullability.legacy);
         // TODO(36730): Support structs inside structs.
         final DartType shouldBeDartType =
             convertNativeTypeToDartType(nativeType, /*allowStructs=*/ false);
@@ -266,12 +269,12 @@
   Expression _runtimeBranchOnLayout(Map<Abi, int> values) {
     return MethodInvocation(
         ConstantExpression(
-            ListConstant(InterfaceType(intClass), [
+            ListConstant(InterfaceType(intClass, Nullability.legacy), [
               IntConstant(values[Abi.wordSize64]),
               IntConstant(values[Abi.wordSize32Align32]),
               IntConstant(values[Abi.wordSize32Align64])
             ]),
-            InterfaceType(intClass)),
+            InterfaceType(intClass, Nullability.legacy)),
         Name("[]"),
         Arguments([StaticInvocation(abiMethod, Arguments([]))]),
         listElementAt);
@@ -285,8 +288,9 @@
       Field field, NativeType type, Map<Abi, int> offsets) {
     final DartType nativeType = type == NativeType.kPointer
         ? field.type
-        : InterfaceType(nativeTypesClasses[type.index]);
-    final DartType pointerType = InterfaceType(pointerClass, [nativeType]);
+        : InterfaceType(nativeTypesClasses[type.index], Nullability.legacy);
+    final DartType pointerType =
+        InterfaceType(pointerClass, Nullability.legacy, [nativeType]);
     final Name pointerName = Name('#_ptr_${field.name.name}');
 
     // Sample output:
@@ -371,7 +375,7 @@
         isStatic: true,
         isFinal: true,
         initializer: _runtimeBranchOnLayout(sizes),
-        type: InterfaceType(intClass));
+        type: InterfaceType(intClass, Nullability.legacy));
     _makeEntryPoint(sizeOf);
     struct.addMember(sizeOf);
   }
@@ -424,7 +428,7 @@
           pragmaName.reference: StringConstant("vm:entry-point"),
           pragmaOptions.reference: NullConstant()
         }),
-        InterfaceType(pragmaClass, [])));
+        InterfaceType(pragmaClass, Nullability.legacy, [])));
   }
 
   NativeType _getFieldType(Class c) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 4bf6586..e8562ab 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -79,7 +79,7 @@
 
   @override
   visitClass(Class node) {
-    env.thisType = InterfaceType(node);
+    env.thisType = InterfaceType(node, Nullability.legacy);
     try {
       _ensureNotExtendsOrImplementsSealedClass(node);
       return super.visitClass(node);
@@ -125,8 +125,8 @@
     final Member target = node.target;
     try {
       if (target == fromFunctionMethod) {
-        final DartType nativeType =
-            InterfaceType(nativeFunctionClass, [node.arguments.types[0]]);
+        final DartType nativeType = InterfaceType(
+            nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
         final Expression func = node.arguments.positional[0];
         final DartType dartType = func.getStaticType(env);
 
@@ -235,7 +235,7 @@
     final Arguments args = Arguments([
       node.arguments.positional.single
     ], types: [
-      InterfaceType(nativeFunctionClass, [nativeSignature])
+      InterfaceType(nativeFunctionClass, Nullability.legacy, [nativeSignature])
     ]);
 
     final Expression lookupResult = MethodInvocation(
@@ -260,11 +260,12 @@
   // Creating this closure requires a runtime call, so we save the result in a
   // synthetic top-level field to avoid recomputing it.
   Expression _replaceFromFunction(StaticInvocation node) {
-    final nativeFunctionType =
-        InterfaceType(nativeFunctionClass, node.arguments.types);
+    final nativeFunctionType = InterfaceType(
+        nativeFunctionClass, Nullability.legacy, node.arguments.types);
     final Field field = Field(
         Name("_#ffiCallback${callbackCount++}", currentLibrary),
-        type: InterfaceType(pointerClass, [nativeFunctionType]),
+        type: InterfaceType(
+            pointerClass, Nullability.legacy, [nativeFunctionType]),
         initializer: StaticInvocation(
             pointerFromFunctionProcedure,
             Arguments([
@@ -289,8 +290,8 @@
       // in 'dynamic_library_patch.dart'. Dynamic invocations of 'asFunction'
       // and 'lookupFunction' are not legal and throw a runtime exception.
       if (target == lookupFunctionMethod) {
-        final DartType nativeType =
-            InterfaceType(nativeFunctionClass, [node.arguments.types[0]]);
+        final DartType nativeType = InterfaceType(
+            nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
         final DartType dartType = node.arguments.types[1];
 
         _ensureNativeTypeValid(nativeType, node);
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 73c7e0b..610a20d 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -59,6 +59,7 @@
 
   @override
   TreeNode visitLibrary(Library node) {
+    // ignore: DEPRECATED_MEMBER_USE
     if (!node.isExternal) {
       transformList(node.classes, this, node);
     }
@@ -67,6 +68,7 @@
 
   @override
   TreeNode visitClass(Class c) {
+    // ignore: DEPRECATED_MEMBER_USE
     if (c.enclosingLibrary.isExternal) {
       return c;
     }
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 5c35c72..a272248 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -224,7 +224,9 @@
               NullLiteral(), // valueOf
               NullLiteral(), // enumValues
             ],
-            types: <DartType>[InterfaceType(coreTypes.nullClass)],
+            types: <DartType>[
+              InterfaceType(coreTypes.nullClass, Nullability.nullable)
+            ],
           ),
         );
       }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 285b3ac..259d06e 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -952,8 +952,8 @@
     final cached = useCache ? cachedFlattenedTypeArgs[klass] : null;
     if (cached != null) return cached;
 
-    final flattenedTypeArguments = List<DartType>.from(
-        klass.typeParameters.map((t) => new TypeParameterType(t)));
+    final flattenedTypeArguments = List<DartType>.from(klass.typeParameters
+        .map((t) => new TypeParameterType(t, Nullability.legacy)));
 
     for (final Supertype intf in hierarchy.genericSupertypesOf(klass)) {
       int offset = findOverlap(flattenedTypeArguments, intf.typeArguments);
@@ -1528,7 +1528,8 @@
     if (field.isStatic) {
       fieldValue.setValue(value, this, /*receiver_type=*/ null);
     } else {
-      final receiver = new Type.cone(new InterfaceType(field.parent));
+      final receiver =
+          new Type.cone(new InterfaceType(field.parent, Nullability.legacy));
       fieldValue.setValue(value, this, receiver);
     }
   }
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 01529f7..efcf37f 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -403,7 +403,7 @@
       if (computed is AnyType) return const AnyType();
       types[i] = computed;
     }
-    return new RuntimeType(new InterfaceType(klass), types);
+    return new RuntimeType(new InterfaceType(klass, Nullability.legacy), types);
   }
 }
 
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index b3e7028..23902dc 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -1556,7 +1556,8 @@
     }
 
     if (createRuntimeType) {
-      return new RuntimeType(new InterfaceType(type.classNode),
+      return new RuntimeType(
+          new InterfaceType(type.classNode, Nullability.legacy),
           new List<RuntimeType>.from(flattenedTypeExprs));
     } else {
       final instantiate =
@@ -1606,14 +1607,13 @@
 }
 
 class CreateAllSummariesVisitor extends RecursiveVisitor<Null> {
-  final TypeEnvironment _environment;
   final SummaryCollector _summaryCollector;
 
-  CreateAllSummariesVisitor(Target target, this._environment,
+  CreateAllSummariesVisitor(Target target, TypeEnvironment environment,
       ClassHierarchy hierarchy, GenericInterfacesInfo genericInterfacesInfo)
       : _summaryCollector = new SummaryCollector(
             target,
-            _environment,
+            environment,
             hierarchy,
             new EmptyEntryPointsListener(),
             new NativeCodeOracle(null, null),
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index 4b5a7a1..4f5bf7b 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -59,9 +59,9 @@
     // TODO(alexmarkov): cache the created raw type or use a CoreTypes object
     return new InterfaceType(
         type.classNode,
+        Nullability.legacy,
         new List<DartType>.filled(
-            type.classNode.typeParameters.length, const DynamicType()),
-        Nullability.legacy);
+            type.classNode.typeParameters.length, const DynamicType()));
   } else if (type is FunctionType) {
     // TODO(alexmarkov): support function types
     return const DynamicType();
@@ -871,7 +871,7 @@
           .take(klass.typeParameters.length)
           .map((pt) => pt.representedType)
           .toList();
-      return new InterfaceType(klass, typeArguments);
+      return new InterfaceType(klass, Nullability.legacy, typeArguments);
     } else {
       return _type;
     }
diff --git a/pkg/vm/test/bytecode/object_table_test.dart b/pkg/vm/test/bytecode/object_table_test.dart
index 75ad973..98923e8 100644
--- a/pkg/vm/test/bytecode/object_table_test.dart
+++ b/pkg/vm/test/bytecode/object_table_test.dart
@@ -81,8 +81,10 @@
   });
 
   test('simple-types', () {
-    final h1a = objectTable.getHandle(new InterfaceType(coreTypes.intClass));
-    final h1b = objectTable.getHandle(new InterfaceType(coreTypes.intClass));
+    final h1a = objectTable
+        .getHandle(new InterfaceType(coreTypes.intClass, Nullability.legacy));
+    final h1b = objectTable
+        .getHandle(new InterfaceType(coreTypes.intClass, Nullability.legacy));
     final h2a = objectTable.getHandle(const DynamicType());
     final h2b = objectTable.getHandle(new DynamicType());
     Expect.identical(h1a, h1b);
@@ -92,20 +94,28 @@
     Expect.equals(true, h2a.isCacheable);
     Expect.equals(false, h1a.shouldBeIncludedIntoIndexTable); // 2 uses
     objectTable.getHandle(new InterfaceType(
-        coreTypes.listClass, [new InterfaceType(coreTypes.intClass)]));
+        coreTypes.listClass,
+        Nullability.legacy,
+        [new InterfaceType(coreTypes.intClass, Nullability.legacy)]));
     Expect.equals(true, h1a.shouldBeIncludedIntoIndexTable); // 3 uses
   });
 
   test('recursive-types', () {
     final base = addClass(lib1, "Base", [new TypeParameter("T")]);
     final derived1 = addClass(lib1, "Derived");
-    derived1.supertype = new Supertype(base, [new InterfaceType(derived1)]);
+    derived1.supertype =
+        new Supertype(base, [new InterfaceType(derived1, Nullability.legacy)]);
     final derived2 = addClass(lib2, "Derived");
-    derived2.supertype = new Supertype(base, [new InterfaceType(derived2)]);
-    final h1a = objectTable.getHandle(new InterfaceType(derived1));
-    final h1b = objectTable.getHandle(new InterfaceType(derived1));
-    final h2a = objectTable.getHandle(new InterfaceType(derived2));
-    final h2b = objectTable.getHandle(new InterfaceType(derived2));
+    derived2.supertype =
+        new Supertype(base, [new InterfaceType(derived2, Nullability.legacy)]);
+    final h1a =
+        objectTable.getHandle(new InterfaceType(derived1, Nullability.legacy));
+    final h1b =
+        objectTable.getHandle(new InterfaceType(derived1, Nullability.legacy));
+    final h2a =
+        objectTable.getHandle(new InterfaceType(derived2, Nullability.legacy));
+    final h2b =
+        objectTable.getHandle(new InterfaceType(derived2, Nullability.legacy));
     Expect.identical(h1a, h1b);
     Expect.identical(h2a, h2b);
     Expect.notEquals(h1a, h2a);
diff --git a/pkg/vm/test/bytecode/recursive_types_validator_test.dart b/pkg/vm/test/bytecode/recursive_types_validator_test.dart
index 44c4522..6e27e46 100644
--- a/pkg/vm/test/bytecode/recursive_types_validator_test.dart
+++ b/pkg/vm/test/bytecode/recursive_types_validator_test.dart
@@ -29,8 +29,8 @@
     Component component = createMockSdkComponent();
     CoreTypes coreTypes = new CoreTypes(component);
     objectSuper = coreTypes.objectClass.asThisSupertype;
-    intType = new InterfaceType(coreTypes.intClass);
-    doubleType = new InterfaceType(coreTypes.doubleClass);
+    intType = new InterfaceType(coreTypes.intClass, Nullability.legacy);
+    doubleType = new InterfaceType(coreTypes.doubleClass, Nullability.legacy);
 
     // Add the test library.
     lib = new Library(Uri.parse('org-dartlang:///test.dart'), name: 'lib');
@@ -49,9 +49,10 @@
     // class Derived<T> extends Base<Derived<T>>
     TypeParameter t = new TypeParameter('T');
     Class derived = addClass('Derived', [t]);
-    DartType derivedOfT =
-        new InterfaceType(derived, [new TypeParameterType(t)]);
-    DartType derivedOfInt = new InterfaceType(derived, [intType]);
+    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
+        [new TypeParameterType(t, Nullability.legacy)]);
+    DartType derivedOfInt =
+        new InterfaceType(derived, Nullability.legacy, [intType]);
     derived.supertype = new Supertype(base, [derivedOfT]);
 
     validator.validateType(derivedOfT);
@@ -65,10 +66,12 @@
     // class Derived<T> extends Base<Derived<Derived<int>>>
     TypeParameter t = new TypeParameter('T');
     Class derived = addClass('Derived', [t]);
-    DartType derivedOfT =
-        new InterfaceType(derived, [new TypeParameterType(t)]);
-    DartType derivedOfInt = new InterfaceType(derived, [intType]);
-    DartType derivedOfDerivedOfInt = new InterfaceType(derived, [derivedOfInt]);
+    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
+        [new TypeParameterType(t, Nullability.legacy)]);
+    DartType derivedOfInt =
+        new InterfaceType(derived, Nullability.legacy, [intType]);
+    DartType derivedOfDerivedOfInt =
+        new InterfaceType(derived, Nullability.legacy, [derivedOfInt]);
     derived.supertype = new Supertype(base, [derivedOfDerivedOfInt]);
 
     validator.validateType(derivedOfT);
@@ -83,10 +86,12 @@
     // class Derived<T> extends Base<Derived<Derived<T>>>
     TypeParameter t = new TypeParameter('T');
     Class derived = addClass('Derived', [t]);
-    DartType derivedOfT =
-        new InterfaceType(derived, [new TypeParameterType(t)]);
-    DartType derivedOfInt = new InterfaceType(derived, [intType]);
-    DartType derivedOfDerivedOfT = new InterfaceType(derived, [derivedOfT]);
+    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
+        [new TypeParameterType(t, Nullability.legacy)]);
+    DartType derivedOfInt =
+        new InterfaceType(derived, Nullability.legacy, [intType]);
+    DartType derivedOfDerivedOfT =
+        new InterfaceType(derived, Nullability.legacy, [derivedOfT]);
     derived.supertype = new Supertype(base, [derivedOfDerivedOfT]);
 
     Expect.throws(() {
@@ -109,21 +114,23 @@
     TypeParameter v = new TypeParameter('V');
     Class derived2 = addClass('Derived2', [v]);
 
-    DartType derived2OfU =
-        new InterfaceType(derived2, [new TypeParameterType(u)]);
+    DartType derived2OfU = new InterfaceType(derived2, Nullability.legacy,
+        [new TypeParameterType(u, Nullability.legacy)]);
     derived1.supertype = new Supertype(base, [derived2OfU]);
 
-    DartType derived1OfV =
-        new InterfaceType(derived1, [new TypeParameterType(v)]);
+    DartType derived1OfV = new InterfaceType(derived1, Nullability.legacy,
+        [new TypeParameterType(v, Nullability.legacy)]);
     derived2.supertype = new Supertype(base, [derived1OfV]);
 
-    DartType derived1OfU =
-        new InterfaceType(derived1, [new TypeParameterType(u)]);
-    DartType derived1OfInt = new InterfaceType(derived1, [intType]);
+    DartType derived1OfU = new InterfaceType(derived1, Nullability.legacy,
+        [new TypeParameterType(u, Nullability.legacy)]);
+    DartType derived1OfInt =
+        new InterfaceType(derived1, Nullability.legacy, [intType]);
 
-    DartType derived2OfV =
-        new InterfaceType(derived2, [new TypeParameterType(v)]);
-    DartType derived2OfInt = new InterfaceType(derived2, [intType]);
+    DartType derived2OfV = new InterfaceType(derived2, Nullability.legacy,
+        [new TypeParameterType(v, Nullability.legacy)]);
+    DartType derived2OfInt =
+        new InterfaceType(derived2, Nullability.legacy, [intType]);
 
     validator.validateType(derived1OfU);
     Expect.isTrue(validator.isRecursive(derived1OfU));
@@ -149,11 +156,13 @@
     TypeParameter q2 = new TypeParameter('Q2');
     Class e = addClass('E', [q1, q2]);
 
-    DartType eOfQ1Int =
-        new InterfaceType(e, [new TypeParameterType(q1), intType]);
-    e.supertype = new Supertype(f, [eOfQ1Int, new TypeParameterType(q2)]);
+    DartType eOfQ1Int = new InterfaceType(e, Nullability.legacy,
+        [new TypeParameterType(q1, Nullability.legacy), intType]);
+    e.supertype = new Supertype(
+        f, [eOfQ1Int, new TypeParameterType(q2, Nullability.legacy)]);
 
-    DartType eOfIntDouble = new InterfaceType(e, [intType, doubleType]);
+    DartType eOfIntDouble =
+        new InterfaceType(e, Nullability.legacy, [intType, doubleType]);
 
     validator.validateType(eOfIntDouble);
     validator.validateType(e.thisType);
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 3d2dc5d..1689617 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -49,10 +49,11 @@
   test('factory-constructors', () {
     Class c1 = new Class(name: 'C1');
     Class c2 = new Class(name: 'C2', typeParameters: [new TypeParameter('E')]);
-    InterfaceType t1 = new InterfaceType(c1);
-    InterfaceType t2Raw = new InterfaceType(c2);
-    InterfaceType t2Generic = new InterfaceType(c2, [t1]);
-    FunctionType f1 = new FunctionType([t1], const VoidType());
+    InterfaceType t1 = new InterfaceType(c1, Nullability.legacy);
+    InterfaceType t2Raw = new InterfaceType(c2, Nullability.legacy);
+    InterfaceType t2Generic = new InterfaceType(c2, Nullability.legacy, [t1]);
+    FunctionType f1 =
+        new FunctionType([t1], const VoidType(), Nullability.legacy);
 
     expect(new Type.empty(), equals(const EmptyType()));
 
@@ -85,10 +86,14 @@
   test('union-intersection', () {
     // T1 <: T3, T2 <: T3
 
-    InterfaceType t1 = new InterfaceType(new Class(name: 'T1'));
-    InterfaceType t2 = new InterfaceType(new Class(name: 'T2'));
-    InterfaceType t3 = new InterfaceType(new Class(name: 'T3'));
-    InterfaceType t4 = new InterfaceType(new Class(name: 'T4'));
+    InterfaceType t1 =
+        new InterfaceType(new Class(name: 'T1'), Nullability.legacy);
+    InterfaceType t2 =
+        new InterfaceType(new Class(name: 'T2'), Nullability.legacy);
+    InterfaceType t3 =
+        new InterfaceType(new Class(name: 'T3'), Nullability.legacy);
+    InterfaceType t4 =
+        new InterfaceType(new Class(name: 'T4'), Nullability.legacy);
 
     final empty = new EmptyType();
     final any = new AnyType();
@@ -275,12 +280,13 @@
     final c2 = new Class(name: 'C2');
     final c3 = new Class(name: 'C3');
 
-    final t1a = new InterfaceType(c1);
-    final t1b = new InterfaceType(c1);
-    final t2 = new InterfaceType(c2);
-    final f1a = new FunctionType([t1a], const VoidType());
-    final f1b = new FunctionType([t1b], const VoidType());
-    final f2 = new FunctionType([t1a, t1a], const VoidType());
+    final t1a = new InterfaceType(c1, Nullability.legacy);
+    final t1b = new InterfaceType(c1, Nullability.legacy);
+    final t2 = new InterfaceType(c2, Nullability.legacy);
+    final f1a = new FunctionType([t1a], const VoidType(), Nullability.legacy);
+    final f1b = new FunctionType([t1b], const VoidType(), Nullability.legacy);
+    final f2 =
+        new FunctionType([t1a, t1a], const VoidType(), Nullability.legacy);
 
     final cid1 = const IntClassId(1);
     final cid2 = const IntClassId(2);
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index b186fa7..224709f 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -9,7 +9,7 @@
 
 Class '', script = '#lib'
 
-Field 'asyncInFieldInitializer', type = FunctionType (dart:async::Future < dart:core::int >) -> dart:async::Future < dart:core::Null >, getter = 'get:asyncInFieldInitializer', reflectable, static
+Field 'asyncInFieldInitializer', type = FunctionType (dart:async::Future < dart:core::int >) -> dart:async::Future < dart:core::Null >, getter = 'get:asyncInFieldInitializer', reflectable, static, has-initializer
     initializer
 Bytecode {
   Entry                3
@@ -73,6 +73,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   AllocateContext      0, 9
   PopLocal             r0
@@ -1560,6 +1561,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   AllocateContext      1, 9
   StoreLocal           r1
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index 0bd9929..b06373c 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -9,13 +9,13 @@
 
 Class '', script = '#lib'
 
-Field '_stdinFD', type = dart:core::int, reflectable, static
+Field '_stdinFD', type = dart:core::int, reflectable, static, has-initializer
     value = const 0
 
-Field '_stdoutFD', type = dart:core::int, reflectable, static
+Field '_stdoutFD', type = dart:core::int, reflectable, static, has-initializer
     value = const 1
 
-Field '_stderrFD', type = dart:core::int, reflectable, static
+Field '_stderrFD', type = dart:core::int, reflectable, static, has-initializer
     value = const 2
 
 Field '_rawScript', type = dart:core::String, reflectable, static
@@ -238,7 +238,7 @@
 Class '_ScheduleImmediate', script = '#lib'
     extends dart:core::Object
 
-Field '_closure', type = FunctionType (FunctionType () -> void) -> void, reflectable, static
+Field '_closure', type = FunctionType (FunctionType () -> void) -> void, reflectable, static, has-initializer
     value = null
 
 Function '', constructor, reflectable
@@ -263,7 +263,7 @@
     extends dart:core::Object
     implements [#lib::_Namespace]
 
-Field '_cachedNamespace', type = #lib::_NamespaceImpl, reflectable, static
+Field '_cachedNamespace', type = #lib::_NamespaceImpl, reflectable, static, has-initializer
     value = null
 
 Function '_', constructor, reflectable, debuggable
@@ -488,37 +488,37 @@
 Class 'VMLibraryHooks', script = '#lib'
     extends dart:core::Object
 
-Field 'timerFactory', type = dynamic, reflectable, static
+Field 'timerFactory', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'eventHandlerSendData', type = dynamic, reflectable, static
+Field 'eventHandlerSendData', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'timerMillisecondClock', type = dynamic, reflectable, static
+Field 'timerMillisecondClock', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'resourceReadAsBytes', type = dynamic, reflectable, static
+Field 'resourceReadAsBytes', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'packageRootString', type = dynamic, reflectable, static
+Field 'packageRootString', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'packageConfigString', type = dynamic, reflectable, static
+Field 'packageConfigString', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'packageRootUriFuture', type = dynamic, reflectable, static
+Field 'packageRootUriFuture', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'packageConfigUriFuture', type = dynamic, reflectable, static
+Field 'packageConfigUriFuture', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field 'resolvePackageUriFuture', type = dynamic, reflectable, static
+Field 'resolvePackageUriFuture', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field '_computeScriptUri', type = dynamic, reflectable, static
+Field '_computeScriptUri', type = dynamic, reflectable, static, has-initializer
     value = null
 
-Field '_cachedScript', type = dynamic, reflectable, static
+Field '_cachedScript', type = dynamic, reflectable, static, has-initializer
     value = null
 
 Function '', constructor, reflectable
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 1297978..383b1c0 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -69,6 +69,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   JumpIfUnchecked      L1
   Push                 FP[-5]
@@ -768,6 +769,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r1
+  CheckFunctionTypeArgs 0, r2
   CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#6
@@ -847,7 +849,7 @@
 Class 'B', script = '#lib'
     extends dart:core::Object
 
-Field 'foo', type = dart:core::int, getter = 'get:foo', setter = 'set:foo', reflectable
+Field 'foo', type = dart:core::int, getter = 'get:foo', setter = 'set:foo', reflectable, has-initializer
     value = null
 
 Function '', constructor, reflectable
@@ -987,6 +989,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   AllocateContext      1, 2
   StoreLocal           r1
@@ -1057,6 +1060,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextParent
@@ -1085,6 +1089,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextVar       0, 0
@@ -1242,6 +1247,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#5
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextVar       1, 0
@@ -1258,6 +1264,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#5
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   JumpIfUnchecked      L1
   Push                 FP[-5]
@@ -1360,6 +1367,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#7
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   Push                 r0
@@ -1457,6 +1465,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#5
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextVar       0, 0
@@ -1515,6 +1524,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   AllocateClosure      CP#3
   StoreLocal           r3
@@ -1548,6 +1558,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   PushNull
   ReturnTOS
@@ -1556,7 +1567,7 @@
 Class 'E', script = '#lib', abstract
     extends dart:core::Object
 
-Field 'foo1', type = FunctionType (dart:core::int, dart:core::int) -> dart:core::int, getter = 'get:foo1', setter = 'set:foo1', reflectable
+Field 'foo1', type = FunctionType (dart:core::int, dart:core::int) -> dart:core::int, getter = 'get:foo1', setter = 'set:foo1', reflectable, has-initializer
     value = null
 
 Function '', constructor, reflectable
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index 0f6d5a0..ce083da 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -29,16 +29,16 @@
 Field 'foo1', type = dart:core::int, getter = 'get:foo1', setter = 'set:foo1', reflectable
     value = null
 
-Field 'foo2', type = dart:core::int, getter = 'get:foo2', setter = 'set:foo2', reflectable
+Field 'foo2', type = dart:core::int, getter = 'get:foo2', setter = 'set:foo2', reflectable, has-initializer
     value = null
 
-Field 'foo3', type = dart:core::int, getter = 'get:foo3', setter = 'set:foo3', reflectable
+Field 'foo3', type = dart:core::int, getter = 'get:foo3', setter = 'set:foo3', reflectable, has-initializer
     value = const 42
 
 Field 'foo4', type = dart:core::int, getter = 'get:foo4', setter = 'set:foo4', reflectable
     value = null
 
-Field 'foo5', type = dart:core::int, getter = 'get:foo5', setter = 'set:foo5', reflectable
+Field 'foo5', type = dart:core::int, getter = 'get:foo5', setter = 'set:foo5', reflectable, has-initializer
     value = const 43
 
 Function '', constructor, reflectable, debuggable
@@ -162,13 +162,13 @@
 Class 'B', script = '#lib'
     extends #lib::A
 
-Field 'foo6', type = dart:core::int, getter = 'get:foo6', setter = 'set:foo6', reflectable
+Field 'foo6', type = dart:core::int, getter = 'get:foo6', setter = 'set:foo6', reflectable, has-initializer
     value = const 46
 
-Field 'foo7', type = dart:core::int, reflectable, static
+Field 'foo7', type = dart:core::int, reflectable, static, has-initializer
     value = const 47
 
-Field 'foo8', type = dart:core::int, reflectable, static, const, final
+Field 'foo8', type = dart:core::int, reflectable, static, const, final, has-initializer
     value = const 48
 
 Function '', constructor, reflectable, debuggable
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index cb085fd..b3d07d01 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -217,10 +217,10 @@
     type-params <dart:core::Object T1, dart:core::Object T2> (args: 2)
     extends dart:core::Object
 
-Field 't1', type = #lib::Base::TypeParam/0, getter = 'get:t1', setter = 'set:t1', reflectable
+Field 't1', type = #lib::Base::TypeParam/0, getter = 'get:t1', setter = 'set:t1', reflectable, has-initializer
     value = null
 
-Field 't2', type = #lib::Base::TypeParam/1, getter = 'get:t2', setter = 'set:t2', reflectable
+Field 't2', type = #lib::Base::TypeParam/1, getter = 'get:t2', setter = 'set:t2', reflectable, has-initializer
     value = null
 
 Function '', constructor, reflectable, debuggable
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index b698f7ce..e90a55c 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -9,7 +9,7 @@
 
 Class '', script = '#lib'
 
-Field 'c1', type = #lib::A, getter = 'get:c1', reflectable, static, const, final
+Field 'c1', type = #lib::A, getter = 'get:c1', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -22,13 +22,13 @@
 }
 
 
-Field 'c2', type = dart:core::String, reflectable, static, const, final
+Field 'c2', type = dart:core::String, reflectable, static, const, final, has-initializer
     value = 'hello!'
 
-Field 'c3', type = dart:core::int, reflectable, static, const, final
+Field 'c3', type = dart:core::int, reflectable, static, const, final, has-initializer
     value = const 6
 
-Field 'c4', type = #lib::C, getter = 'get:c4', reflectable, static, const, final
+Field 'c4', type = #lib::C, getter = 'get:c4', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -41,7 +41,7 @@
 }
 
 
-Field 'c5', type = #lib::D, getter = 'get:c5', reflectable, static, const, final
+Field 'c5', type = #lib::D, getter = 'get:c5', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -54,7 +54,7 @@
 }
 
 
-Field 'fieldWithDoubleLiteralInitializer', type = dart:core::double, reflectable, static
+Field 'fieldWithDoubleLiteralInitializer', type = dart:core::double, reflectable, static, has-initializer
     value = const 1.0
 
 Function 'test_constants1', static, reflectable, debuggable
@@ -420,7 +420,7 @@
 Field '_name', type = dart:core::String, getter = 'get:_name', reflectable, final
     value = null
 
-Field 'values', type = dart:core::List < #lib::A >, getter = 'get:values', reflectable, static, const, final
+Field 'values', type = dart:core::List < #lib::A >, getter = 'get:values', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -433,7 +433,7 @@
 }
 
 
-Field 'elem1', type = #lib::A, getter = 'get:elem1', reflectable, static, const, final
+Field 'elem1', type = #lib::A, getter = 'get:elem1', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -446,7 +446,7 @@
 }
 
 
-Field 'elem2', type = #lib::A, getter = 'get:elem2', reflectable, static, const, final
+Field 'elem2', type = #lib::A, getter = 'get:elem2', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -459,7 +459,7 @@
 }
 
 
-Field 'elem3', type = #lib::A, getter = 'get:elem3', reflectable, static, const, final
+Field 'elem3', type = #lib::A, getter = 'get:elem3', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
@@ -472,7 +472,7 @@
 }
 
 
-Field 'elem4', type = #lib::A, getter = 'get:elem4', reflectable, static, const, final
+Field 'elem4', type = #lib::A, getter = 'get:elem4', reflectable, static, const, final, has-initializer
     initializer
 Bytecode {
   Entry                0
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index a64977c..4bc3448 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -341,6 +341,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   PopLocal             r2
@@ -377,6 +378,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   PopLocal             r2
@@ -723,6 +725,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#7
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextVar       0, 0
@@ -831,6 +834,7 @@
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  CheckFunctionTypeArgs 0, r1
   CheckStack           0
   Push                 r0
   LoadContextVar       0, 0
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 0bdecc9..bfd3d22 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -17,7 +17,7 @@
 OPTIONS=()
 GEN_KERNEL_OPTIONS=()
 PACKAGES=
-BUILD_ELF=0
+BUILD_ASM=0
 
 ARGV=()
 for arg in "$@"; do
@@ -36,8 +36,8 @@
     -D* )
     GEN_KERNEL_OPTIONS+=("$arg")
     ;;
-    --build-elf)
-    BUILD_ELF=1
+    --build-assembly)
+    BUILD_ASM=1
     ;;
     --*)
     OPTIONS+=("$arg")
@@ -56,12 +56,12 @@
 SOURCE_FILE="${ARGV[0]}"
 SNAPSHOT_FILE="${ARGV[1]}"
 
-if [ $BUILD_ELF -eq 1 ]; then
+if [ $BUILD_ASM -eq 1 ]; then
   GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-assembly"
   GEN_SNAPSHOT_FILENAME="--assembly=${SNAPSHOT_FILE}.S"
 else
-  GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-blobs"
-  GEN_SNAPSHOT_FILENAME="--blobs_container_filename=${SNAPSHOT_FILE}"
+  GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-elf"
+  GEN_SNAPSHOT_FILENAME="--elf=${SNAPSHOT_FILE}"
 fi
 
 function follow_links() {
@@ -109,6 +109,6 @@
      "$SNAPSHOT_FILE.dill"
 
 # Step 3: Assemble the assembly file into an ELF object.
-if [ $BUILD_ELF -eq 1 ]; then
+if [ $BUILD_ASM -eq 1 ]; then
     gcc -shared -o "$SNAPSHOT_FILE" "${SNAPSHOT_FILE}.S"
 fi
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 1369c7b..4933877 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -917,26 +917,6 @@
   }
 }
 
-dart_executable("dartaotruntime") {
-  extra_configs = [ "..:dart_precompiled_runtime_config" ]
-  extra_deps = [
-    "..:libdart_precompiled_runtime",
-    "../platform:libdart_platform_precompiled_runtime",
-  ]
-  extra_sources = [
-    "builtin.cc",
-    "gzip.cc",
-    "gzip.h",
-    "loader.cc",
-    "loader.h",
-    "main.cc",
-    "observatory_assets_empty.cc",
-    "snapshot_empty.cc",
-  ]
-
-  extra_deps += [ ":elf_loader" ]
-}
-
 executable("process_test") {
   sources = [
     "process_test.cc",
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h
index 245e83c..a305f65 100644
--- a/runtime/bin/eventhandler.h
+++ b/runtime/bin/eventhandler.h
@@ -560,7 +560,7 @@
       pentry->token_count += count;
     }
     ASSERT(pentry->token_count <= kTokenCount);
-    bool is_ready = pentry->token_count > 0 && pentry->IsReady();
+    bool is_ready = pentry->IsReady();
     if (!was_ready && is_ready) {
       active_readers_.Add(pentry);
     }
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 91e6cd8..958e5c3 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -236,14 +236,14 @@
                                GetHashmapHashFromFd(fd));
             di->Close();
             delete di;
-            socket->SetClosedFd();
           }
+          socket->CloseFd();
         } else {
           ASSERT(new_mask == 0);
           socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
           di->Close();
           delete di;
-          socket->SetClosedFd();
+          socket->CloseFd();
         }
 
         DartUtils::PostInt32(port, 1 << kDestroyedEvent);
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index bae6f32..8c963c4 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -447,14 +447,15 @@
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         di->Close();
         delete di;
-        socket->SetClosedFd();
+        socket->CloseFd();
       }
+      socket->SetClosedFd();
     } else {
       ASSERT(new_mask == 0);
       socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
       di->Close();
       delete di;
-      socket->SetClosedFd();
+      socket->CloseFd();
     }
     if (port != 0) {
       const bool success = DartUtils::PostInt32(port, 1 << kDestroyedEvent);
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 8ae3151..48ef4ef 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -246,14 +246,14 @@
                                GetHashmapHashFromFd(fd));
             di->Close();
             delete di;
-            socket->SetClosedFd();
           }
+          socket->CloseFd();
         } else {
           ASSERT(new_mask == 0);
           socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
           di->Close();
           delete di;
-          socket->SetClosedFd();
+          socket->CloseFd();
         }
         DartUtils::PostInt32(port, 1 << kDestroyedEvent);
       } else if (IS_COMMAND(msg[i].data, kReturnTokenCommand)) {
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 1a2b20e..904ae0a 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -252,14 +252,14 @@
                                GetHashmapHashFromFd(fd));
             di->Close();
             delete di;
-            socket->SetClosedFd();
           }
+          socket->CloseFd();
         } else {
           ASSERT(new_mask == 0);
           socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
           di->Close();
           delete di;
-          socket->SetClosedFd();
+          socket->CloseFd();
         }
 
         DartUtils::PostInt32(port, 1 << kDestroyedEvent);
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 177ff33..4187405 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -1071,9 +1071,9 @@
         if (registry->CloseSafe(socket)) {
           ASSERT(listen_socket->Mask() == 0);
           listen_socket->Close();
-          socket->SetClosedFd();
+          socket->CloseFd();
         }
-
+        socket->SetClosedFd();
         DartUtils::PostInt32(msg->dart_port, 1 << kDestroyedEvent);
       } else {
         UNREACHABLE();
@@ -1151,7 +1151,7 @@
       } else if (IS_COMMAND(msg->data, kCloseCommand)) {
         handle->SetPortAndMask(msg->dart_port, 0);
         handle->Close();
-        socket->SetClosedFd();
+        socket->CloseFd();
       } else {
         UNREACHABLE();
       }
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 32c6d9c..a9a2241 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -23,7 +23,6 @@
   V(snapshot_depfile, snapshot_deps_filename)                                  \
   V(depfile, depfile)                                                          \
   V(depfile_output_filename, depfile_output_filename)                          \
-  V(shared_blobs, shared_blobs_filename)                                       \
   V(save_compilation_trace, save_compilation_trace_filename)                   \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
   V(save_type_feedback, save_type_feedback_filename)                           \
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index b36364a..727b18f 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -196,10 +196,10 @@
                                process_stderr->fd(), exit_event->fd(), &result);
   // Process::Wait() closes the file handles, so blow away the fds in the
   // Sockets so that they don't get picked up by the finalizer on _NativeSocket.
-  process_stdin->SetClosedFd();
-  process_stdout->SetClosedFd();
-  process_stderr->SetClosedFd();
-  exit_event->SetClosedFd();
+  process_stdin->CloseFd();
+  process_stdout->CloseFd();
+  process_stderr->CloseFd();
+  exit_event->CloseFd();
   if (success) {
     Dart_Handle out = result.stdout_data();
     ThrowIfError(out);
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 019b33c..9db41a0 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -126,17 +126,16 @@
         }
 
         // This socket creation is the exact same as the one which originally
-        // created the socket. We therefore increment the refcount and reuse
-        // the file descriptor.
+        // created the socket. Feed same fd and store it into native field
+        // of dart socket_object. Sockets here will share same fd but contain a
+        // different port() through EventHandler_SendData.
+        Socket* socketfd = new Socket(os_socket->fd);
         os_socket->ref_count++;
-
-        // The same Socket is used by a second Dart _NativeSocket object.
-        // It Retains a reference.
-        os_socket->socketfd->Retain();
         // We set as a side-effect the file descriptor on the dart
         // socket_object.
-        Socket::ReuseSocketIdNativeField(socket_object, os_socket->socketfd,
+        Socket::ReuseSocketIdNativeField(socket_object, socketfd,
                                          Socket::kFinalizerListening);
+        InsertByFd(socketfd, os_socket);
         return Dart_True();
       }
     }
@@ -194,36 +193,33 @@
 }
 
 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket,
-                                           bool update_hash_maps) {
+                                           Socket* socket) {
   ASSERT(!mutex_.TryLock());
   ASSERT(os_socket != NULL);
   ASSERT(os_socket->ref_count > 0);
   os_socket->ref_count--;
+  RemoveByFd(socket);
   if (os_socket->ref_count > 0) {
     return false;
   }
-  if (update_hash_maps) {
-    // We free the OS socket by removing it from two datastructures.
-    RemoveByFd(os_socket->socketfd);
 
-    OSSocket* prev = NULL;
-    OSSocket* current = LookupByPort(os_socket->port);
-    while (current != os_socket) {
-      ASSERT(current != NULL);
-      prev = current;
-      current = current->next;
-    }
+  OSSocket* prev = NULL;
+  OSSocket* current = LookupByPort(os_socket->port);
+  while (current != os_socket) {
+    ASSERT(current != NULL);
+    prev = current;
+    current = current->next;
+  }
 
-    if ((prev == NULL) && (current->next == NULL)) {
-      // Remove last element from the list.
-      RemoveByPort(os_socket->port);
-    } else if (prev == NULL) {
-      // Remove first element of the list.
-      InsertByPort(os_socket->port, current->next);
-    } else {
-      // Remove element from the list which is not the first one.
-      prev->next = os_socket->next;
-    }
+  if ((prev == NULL) && (current->next == NULL)) {
+    // Remove last element from the list.
+    RemoveByPort(os_socket->port);
+  } else if (prev == NULL) {
+    // Remove first element of the list.
+    InsertByPort(os_socket->port, current->next);
+  } else {
+    // Remove element from the list which is not the first one.
+    prev->next = os_socket->next;
   }
 
   ASSERT(os_socket->ref_count == 0);
@@ -233,10 +229,11 @@
 
 void ListeningSocketRegistry::CloseAllSafe() {
   MutexLocker ml(&mutex_);
-
   for (SimpleHashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL;
        cursor = sockets_by_fd_.Next(cursor)) {
-    CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false);
+    OSSocket* os_socket = reinterpret_cast<OSSocket*>(cursor->value);
+    ASSERT(os_socket != NULL);
+    delete os_socket;
   }
 }
 
@@ -244,7 +241,7 @@
   ASSERT(!mutex_.TryLock());
   OSSocket* os_socket = LookupByFd(socketfd);
   if (os_socket != NULL) {
-    return CloseOneSafe(os_socket, true);
+    return CloseOneSafe(os_socket, socketfd);
   } else {
     // A finalizer may direct the event handler to close a listening socket
     // that it has never seen before. In this case, we return true to direct
@@ -1060,7 +1057,7 @@
                                  void* data) {
   Socket* socket = reinterpret_cast<Socket*>(data);
   if (socket->fd() >= 0) {
-    socket->SetClosedFd();
+    socket->CloseFd();
   }
   socket->Release();
 }
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index a23ff65..c3ea9fe 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -49,6 +49,12 @@
   explicit Socket(intptr_t fd);
 
   intptr_t fd() const { return fd_; }
+
+  // Close fd and may need to decrement the count of handle by calling
+  // release().
+  void CloseFd();
+  // Set fd_ to closed. On fuchsia and win, shared socket should not
+  // release handle but only SetClosedFd().
   void SetClosedFd();
 
   Dart_Port isolate_port() const { return isolate_port_; }
@@ -194,7 +200,7 @@
     bool v6_only;
     bool shared;
     int ref_count;
-    Socket* socketfd;
+    intptr_t fd;
 
     // Singly linked lists of OSSocket instances which listen on the same port
     // but on different addresses.
@@ -210,8 +216,9 @@
           v6_only(v6_only),
           shared(shared),
           ref_count(0),
-          socketfd(socketfd),
-          next(NULL) {}
+          next(NULL) {
+      fd = socketfd->fd();
+    }
   };
 
   static const intptr_t kInitialSocketsCount = 8;
@@ -246,7 +253,7 @@
   void InsertByFd(Socket* fd, OSSocket* socket);
   void RemoveByFd(Socket* fd);
 
-  bool CloseOneSafe(OSSocket* os_socket, bool update_hash_maps);
+  bool CloseOneSafe(OSSocket* os_socket, Socket* socket);
   void CloseAllSafe();
 
   SimpleHashMap sockets_by_port_;
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 5547672..78e1f8e 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -23,6 +23,10 @@
       port_(ILLEGAL_PORT),
       udp_receive_buffer_(NULL) {}
 
+void Socket::CloseFd() {
+  SetClosedFd();
+}
+
 void Socket::SetClosedFd() {
   fd_ = kClosedFd;
 }
diff --git a/runtime/bin/socket_fuchsia.cc b/runtime/bin/socket_fuchsia.cc
index 5454c7e..b4c0b10 100644
--- a/runtime/bin/socket_fuchsia.cc
+++ b/runtime/bin/socket_fuchsia.cc
@@ -51,11 +51,15 @@
       udp_receive_buffer_(NULL) {}
 
 void Socket::SetClosedFd() {
+  fd_ = kClosedFd;
+}
+
+void Socket::CloseFd() {
   ASSERT(fd_ != kClosedFd);
   IOHandle* handle = reinterpret_cast<IOHandle*>(fd_);
   ASSERT(handle != NULL);
   handle->Release();
-  fd_ = kClosedFd;
+  SetClosedFd();
 }
 
 static intptr_t Create(const RawAddr& addr) {
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index f2bb4aa..c993fcb 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -24,6 +24,10 @@
       port_(ILLEGAL_PORT),
       udp_receive_buffer_(NULL) {}
 
+void Socket::CloseFd() {
+  SetClosedFd();
+}
+
 void Socket::SetClosedFd() {
   fd_ = kClosedFd;
 }
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index fc81838..f87482e 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -22,6 +22,10 @@
       port_(ILLEGAL_PORT),
       udp_receive_buffer_(NULL) {}
 
+void Socket::CloseFd() {
+  SetClosedFd();
+}
+
 void Socket::SetClosedFd() {
   fd_ = kClosedFd;
 }
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 79820da..5d476e9 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -30,11 +30,15 @@
   ASSERT(handle != NULL);
 }
 
-void Socket::SetClosedFd() {
+void Socket::CloseFd() {
   ASSERT(fd_ != kClosedFd);
   Handle* handle = reinterpret_cast<Handle*>(fd_);
   ASSERT(handle != NULL);
   handle->Release();
+  SetClosedFd();
+}
+
+void Socket::SetClosedFd() {
   fd_ = kClosedFd;
 }
 
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index 10ae2e3..41044e9 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -238,7 +238,8 @@
           .listen((line) {
         print('>testee>err> $line');
       });
-      process.exitCode.then((exitCode) {
+      process.exitCode.then((exitCode) async {
+        await serviceInfoDir.delete(recursive: true);
         if ((exitCode != 0) && !killedByTester) {
           throw "Testee exited with $exitCode";
         }
@@ -255,7 +256,6 @@
       uri = Uri.parse(infoJson['uri']);
       completer.complete(uri);
       print('** Signaled to run test queries on $uri');
-      await serviceInfoDir.delete(recursive: true);
     });
     return completer.future;
   }
diff --git a/runtime/tests/vm/dart/regress_38743_test.dart b/runtime/tests/vm/dart/regress_38743_test.dart
new file mode 100644
index 0000000..f10dd93
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_38743_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--stacktrace_every=1 --deterministic --optimization-counter-threshold=6 --optimization-filter=baz
+
+// Regression test for https://github.com/dart-lang/sdk/issues/38743.
+// Verifies that VM doesn't crash when collecting debugger stack traces in
+// closures inside instance methods.
+
+class A {
+  foo(unusedArg0) {
+    baz() {
+      for (int i = 0; i < 3; ++i) {
+        print('[$i] $unusedArg0');
+      }
+    }
+
+    baz();
+  }
+}
+
+main() {
+  A().foo(null);
+}
diff --git a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart b/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
index bb8cc83..aaf6db8 100644
--- a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
+++ b/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
@@ -46,14 +46,14 @@
     await Future.wait(<Future>[
       run(genSnapshot, <String>[
         '--use-bare-instructions',
-        '--snapshot-kind=app-aot-blobs',
-        '--blobs_container_filename=$scriptBareSnapshot',
+        '--snapshot-kind=app-aot-elf',
+        '--elf=$scriptBareSnapshot',
         scriptDill,
       ]),
       run(genSnapshot, <String>[
         '--no-use-bare-instructions',
-        '--snapshot-kind=app-aot-blobs',
-        '--blobs_container_filename=$scriptNonBareSnapshot',
+        '--snapshot-kind=app-aot-elf',
+        '--elf=$scriptNonBareSnapshot',
         scriptDill,
       ]),
     ]);
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
index dc259ce..2c6b877 100644
--- a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -12,8 +12,11 @@
   return "/" + segments.join("/");
 }
 
-test(String sdkRoot, {bool useElf: false}) async {
-  if (Platform.isMacOS && useElf) return;
+test(String sdkRoot, {bool useAsm: false}) async {
+  if (Platform.isMacOS || Platform.isWindows) {
+    // Missing necessary utilities.
+    return;
+  }
 
   // Generate the snapshot profile.
   final String thisTestPath =
@@ -28,11 +31,11 @@
     snapshotPath,
   ];
 
-  if (useElf) {
-    precompiler2Args.insert(0, "--build-elf");
+  if (useAsm) {
+    precompiler2Args.insert(0, "--build-assembly");
   }
 
-  final ProcessResult result = await Process.run(
+  ProcessResult result = await Process.run(
     "pkg/vm/tool/precompiler2",
     precompiler2Args,
     workingDirectory: sdkRoot,
@@ -41,9 +44,7 @@
 
   // The precompiler2 script tried using GCC for the wrong architecture. We
   // don't have a workaround for this now.
-  if (useElf &&
-      result.exitCode != 0 &&
-      result.stderr.contains("Assembler messages")) {
+  if (result.exitCode != 0 && result.stderr.contains("Assembler messages")) {
     return;
   }
 
@@ -52,19 +53,18 @@
   print(result.stdout);
 
   Expect.equals(result.exitCode, 0);
-  if (!useElf) {
-    Expect.equals(
-        "WARNING: app-aot-blobs snapshots have been deprecated and support for "
-        "generating them will be removed soon. Please use the app-aot-elf or "
-        "app-aot-assembly snapshot kinds in conjunction with the portable ELF "
-        "loader from //runtime/bin:elf_loader if necessary. See "
-        "http://dartbug.com/38764 for more details.\x0A",
-        result.stderr);
-  } else {
-    Expect.equals("", result.stderr);
-  }
+  Expect.equals("", result.stderr);
   Expect.equals("", result.stdout);
 
+  result = await Process.run("strip", [snapshotPath]);
+
+  // Same issue: strip can't process a cross-compiled ELF.
+  if (result.exitCode != 0 &&
+      (result.stderr.contains("Unable to recognise") ||
+          result.stderr.contains("non-object and non-archive"))) {
+    return;
+  }
+
   final V8SnapshotProfile profile = V8SnapshotProfile.fromJson(JsonDecoder()
       .convert(File("${temp.path}/profile.heapsnapshot").readAsStringSync()));
 
@@ -93,12 +93,17 @@
   // Verify that the actual size of the snapshot is close to the sum of the
   // shallow sizes of all objects in the profile. They will not be exactly equal
   // because of global headers and padding.
-  if (useElf) {
-    await Process.run("strip", [snapshotPath]);
-  }
   final int actual = await File(snapshotPath).length();
   final int expected = profile.accountedBytes;
-  Expect.isTrue((actual - expected).abs() / actual < 0.02);
+  print("Expected size: $expected, actual size: $actual.");
+  if ((actual - expected).abs() / actual > 0.03) {
+    if (useAsm) {
+      print("Failure on Assembly snapshot type.");
+    } else {
+      print("Failure on ELF snapshot type.");
+    }
+    Expect.fail("Difference cannot be greater than 3% of actual.");
+  }
 }
 
 Match matchComplete(RegExp regexp, String line) {
@@ -188,7 +193,7 @@
       .replaceRange(sdkBaseSegments.length - 3, sdkBaseSegments.length, []);
   String sdkRoot = path(sdkBaseSegments);
 
-  test(sdkRoot, useElf: false);
-  test(sdkRoot, useElf: true);
+  await test(sdkRoot, useAsm: true);
+  await test(sdkRoot, useAsm: false);
   testMacros(sdkRoot);
 }
diff --git a/runtime/tools/bin_to_assembly.py b/runtime/tools/bin_to_assembly.py
index fc539e3..9ec13e7 100755
--- a/runtime/tools/bin_to_assembly.py
+++ b/runtime/tools/bin_to_assembly.py
@@ -83,11 +83,11 @@
         with open(options.input, "rb") as input_file:
             if options.target_os in ["win"]:
                 for byte in input_file.read():
-                    output_file.write("byte %d\n" % ord(byte))
+                    output_file.write("byte %d\n" % (byte if isinstance(byte, int) else ord(byte)))
                     size += 1
             else:
                 for byte in input_file.read():
-                    output_file.write(".byte %d\n" % ord(byte))
+                    output_file.write(".byte %d\n" % (byte if isinstance(byte, int) else ord(byte)))
                     size += 1
 
         if options.target_os not in ["mac", "ios", "win"]:
diff --git a/runtime/tools/create_archive.py b/runtime/tools/create_archive.py
index c0b7c89..7bc93d5 100755
--- a/runtime/tools/create_archive.py
+++ b/runtime/tools/create_archive.py
@@ -98,7 +98,7 @@
         line = '   '
         lineCounter = 0
         for byte in tar_archive:
-            line += r" %d," % ord(byte)
+            line += r" %d," % (byte if isinstance(byte, int) else ord(byte))
             lineCounter += 1
             if lineCounter == 10:
                 out.write(line + '\n')
@@ -180,7 +180,7 @@
         else:
             return MakeCCFile(options)
 
-    except Exception, inst:
+    except Exception as inst:
         sys.stderr.write('create_archive.py exception\n')
         sys.stderr.write(str(inst))
         sys.stderr.write('\n')
diff --git a/runtime/tools/create_string_literal.py b/runtime/tools/create_string_literal.py
index b7db388..68a969b 100755
--- a/runtime/tools/create_string_literal.py
+++ b/runtime/tools/create_string_literal.py
@@ -85,7 +85,7 @@
             return -1
 
         return 0
-    except Exception, inst:
+    except Exception as inst:
         sys.stderr.write('create_string_literal.py exception\n')
         sys.stderr.write(str(inst))
         sys.stderr.write('\n')
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index e351fe2..d47151e 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -14,7 +14,7 @@
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
-const String version = '1.64';
+const String version = '1.65';
 
 // Restriction on statements and expressions.
 const int stmtDepth = 1;
@@ -26,6 +26,7 @@
 const int numGlobalMethods = 4;
 const int numMethodParams = 4;
 const int numClasses = 4;
+const int numExtensionMethodsPerClass = 3;
 
 // Naming conventions.
 const varName = 'var';
@@ -34,6 +35,158 @@
 const fieldName = 'fld';
 const methodName = 'foo';
 
+/// Enum for the different types of methods generated by the fuzzer.
+enum MethodType { globalMethod, ffiMethod, instanceMethod, extensionMethod }
+
+/// Base class for all methods in the program generated by DartFuzz.
+abstract class Method {
+  Method(this.name, this.parameters, this.fuzzer);
+
+  DartType get returnType => parameters[0];
+
+  void emitFunctionBody() {
+    if (fuzzer.rollDice(10)) {
+      // Emit a method using "=>" syntax.
+      fuzzer.emit(' => ');
+      fuzzer.emitExpr(0, returnType, includeSemicolon: true);
+    } else {
+      fuzzer.emitBraceWrapped(() {
+        assert(fuzzer.localVars.isEmpty);
+        if (fuzzer.emitStatements(0)) {
+          fuzzer.emitReturn();
+        }
+        assert(fuzzer.localVars.isEmpty);
+      });
+    }
+  }
+
+  void emitFunctionDefinition() {
+    final type = returnType.name;
+    fuzzer.emitLn('$type ${name}', newline: false);
+    fuzzer.emitParenWrapped(() => fuzzer.emitParDecls(parameters));
+    emitFunctionBody();
+    fuzzer.emitNewline();
+    fuzzer.emitNewline();
+  }
+
+  void emitCall(int depth,
+      {RhsFilter rhsFilter,
+      bool includeSemicolon = false,
+      bool extensionApplication = false}) {
+    String outputName = name;
+    fuzzer.emitLn(outputName, newline: false);
+    fuzzer.emitExprList(depth + 1, parameters, rhsFilter: rhsFilter);
+    if (includeSemicolon) {
+      fuzzer.emit(';');
+    }
+  }
+
+  // Main emitter for a method.
+  void emit() {
+    emitFunctionDefinition();
+  }
+
+  final String name;
+  final List<DartType> parameters;
+  final DartFuzz fuzzer;
+}
+
+/// Class for global methods generated by DartFuzz.
+class GlobalMethod extends Method {
+  GlobalMethod(String name, List<DartType> parameters, DartFuzz fuzzer)
+      : super(name, parameters, fuzzer);
+}
+
+/// Class for ffi methods generated by DartFuzz.
+class FfiMethod extends Method {
+  FfiMethod(
+      String namePrefix, int index, List<DartType> parameters, DartFuzz fuzzer)
+      : ffiCastName = "${namePrefix}FfiCast${index}",
+        super("${namePrefix}Ffi${index}", parameters, fuzzer) {}
+
+  @override
+  void emitFunctionBody() {
+    fuzzer.emitBraceWrapped(() {
+      assert(fuzzer.localVars.isEmpty);
+      if (fuzzer.emitStatements(0)) {
+        fuzzer.emitReturn();
+      }
+      assert(fuzzer.localVars.isEmpty);
+    });
+  }
+
+  @override
+  void emit() {
+    fuzzer.emitFfiTypedef(this);
+    emitFunctionDefinition();
+    fuzzer.emitFfiCast("${ffiCastName}", "${name}", "${name}Type", parameters);
+    fuzzer.emitNewline();
+    fuzzer.emitNewline();
+  }
+
+  final String ffiCastName;
+}
+
+/// Class for instance methods generated by DartFuzz.
+class InstanceMethod extends Method {
+  InstanceMethod(
+      String name, List<DartType> parameters, DartFuzz fuzzer, this.className)
+      : super(name, parameters, fuzzer) {}
+
+  @override
+  void emitCall(int depth,
+      {RhsFilter rhsFilter,
+      bool includeSemicolon = false,
+      bool extensionApplication = false}) {
+    String outputName = name;
+    if (fuzzer.currentClass == null) {
+      // If we're calling an instance method from outside the class, then we
+      // should construct an object of that class first.
+      outputName = "${className}().${name}";
+    }
+    fuzzer.emitLn(outputName, newline: false);
+    fuzzer.emitExprList(depth + 1, parameters, rhsFilter: rhsFilter);
+    if (includeSemicolon) {
+      fuzzer.emit(';');
+    }
+  }
+
+  final String className;
+}
+
+// Class for extension methods generated by DartFuzz.
+class ExtensionMethod extends Method {
+  ExtensionMethod(String name, List<DartType> parameters, DartFuzz fuzzer,
+      this.className, this.extensionName)
+      : super(name, parameters, fuzzer) {}
+
+  @override
+  void emitCall(int depth,
+      {RhsFilter rhsFilter,
+      bool includeSemicolon = false,
+      bool extensionApplication = false}) {
+    String outputName = name;
+    if (fuzzer.currentClass == null) {
+      // If we're calling an extension method from outside the class, we can
+      // call it using an object of the class or using explicit extension
+      // application.
+      if (extensionApplication) {
+        outputName = "${extensionName}(${className}()).${name}";
+      } else {
+        outputName = "${className}().${name}";
+      }
+    }
+    fuzzer.emitLn(outputName, newline: false);
+    fuzzer.emitExprList(depth + 1, parameters, rhsFilter: rhsFilter);
+    if (includeSemicolon) {
+      fuzzer.emit(';');
+    }
+  }
+
+  final String className;
+  final String extensionName;
+}
+
 // Class that tracks the state of the filter applied to the
 // right-hand-side of an assignment in order to avoid generating
 // left-hand-side variables.
@@ -133,28 +286,25 @@
     iterVars = <String>[];
     globalVars = fillTypes1(limit: numGlobalVars);
     globalVars.addAll(dartType.allTypes);
-    globalMethods =
-        fillTypes2(limit2: numGlobalMethods, limit1: numMethodParams);
+    globalMethods = getMethods(
+        numGlobalMethods, numMethodParams, MethodType.globalMethod,
+        namePrefix: methodName);
     classFields = fillTypes2(limit2: numClasses, limit1: numLocalVars);
     final int numClassMethods = 1 + numClasses - classFields.length;
-    classMethods = fillTypes3(classFields.length,
-        limit2: numClassMethods, limit1: numMethodParams);
+    classMethods =
+        getClassMethods(classFields.length, numClassMethods, numMethodParams);
     virtualClassMethods = <Map<int, List<int>>>[];
     classParents = <int>[];
     // Setup optional ffi methods and types.
-    final ffiStatus = <bool>[for (final _ in globalMethods) false];
     if (ffi) {
-      List<List<DartType>> globalMethodsFfi = fillTypes2(
-          limit2: numGlobalMethods, limit1: numMethodParams, isFfi: true);
-      for (var m in globalMethodsFfi) {
-        globalMethods.add(m);
-        ffiStatus.add(true);
-      }
+      globalMethods.addAll(getMethods(
+          numGlobalMethods, numMethodParams, MethodType.ffiMethod,
+          namePrefix: methodName));
     }
     // Generate.
     emitHeader();
     emitVariableDeclarations(varName, globalVars);
-    emitMethods(methodName, globalMethods, ffiStatus);
+    emitMethods(globalMethods);
     emitClasses();
     emitMain();
     // Sanity.
@@ -165,6 +315,40 @@
     assert(localVars.isEmpty);
   }
 
+  List<Method> getMethods(int maxMethods, int maxParams, MethodType type,
+      {String className = "", String extensionName = "", String namePrefix}) {
+    final List<Method> list = <Method>[];
+    for (int i = 0, n = chooseOneUpTo(maxMethods); i < n; i++) {
+      final List<DartType> params =
+          fillTypes1(limit: maxParams, isFfi: type == MethodType.ffiMethod);
+      switch (type) {
+        case MethodType.globalMethod:
+          list.add(GlobalMethod("${namePrefix}${i}", params, this));
+          break;
+        case MethodType.ffiMethod:
+          list.add(FfiMethod(namePrefix, i, params, this));
+          break;
+        case MethodType.instanceMethod:
+          list.add(
+              InstanceMethod("${namePrefix}${i}", params, this, className));
+          break;
+        case MethodType.extensionMethod:
+          list.add(ExtensionMethod(
+              "${namePrefix}${i}", params, this, className, extensionName));
+          break;
+      }
+    }
+    return list;
+  }
+
+  List<List<Method>> getClassMethods(
+          int numClasses, int maxMethods, int maxParams) =>
+      [
+        for (int i = 0; i < numClasses; i++)
+          getMethods(maxMethods, maxParams, MethodType.instanceMethod,
+              className: "X${i}", namePrefix: "${methodName}${i}_")
+      ];
+
   //
   // General Helpers.
   //
@@ -466,43 +650,11 @@
     emitNewline();
   }
 
-  void emitMethod(
-      String name, int index, List<DartType> method, bool isFfiMethod) {
-    final type = method[0].name;
-    final methodName = '$name${isFfiMethod ? "Ffi" : ''}$index';
-    if (isFfiMethod) {
-      emitFfiTypedef("${name}Ffi${index}Type", method);
-    }
-    emitLn('$type $methodName', newline: false);
-    emitParenWrapped(() => emitParDecls(method));
-    if (!isFfiMethod && rollDice(10)) {
-      // Emit a method using "=>" syntax.
-      emit(' => ');
-      emitExpr(0, method[0], includeSemicolon: true);
-    } else {
-      emitBraceWrapped(() {
-        assert(localVars.isEmpty);
-        if (emitStatements(0)) {
-          emitReturn();
-        }
-        assert(localVars.isEmpty);
-      });
-    }
-    if (isFfiMethod) {
-      emitFfiCast("${name}${index}", "${name}Ffi${index}",
-          "${name}Ffi${index}Type", method);
-    }
-    emitNewline();
-    emitNewline();
-  }
-
-  void emitMethods(String name, List<List<DartType>> methods,
-      [List<bool> ffiStatus]) {
+  void emitMethods(List<Method> methods) {
     for (int i = 0; i < methods.length; i++) {
-      List<DartType> method = methods[i];
+      Method method = methods[i];
       currentMethod = i;
-      final bool isFfiMethod = ffiStatus != null && ffiStatus[i];
-      emitMethod(name, i, method, isFfiMethod);
+      methods[i].emit();
       currentMethod = null;
     }
   }
@@ -519,8 +671,7 @@
         if (rollDice(8)) {
           currentClass = parentClass;
           currentMethod = j;
-          emitMethod('$methodName${parentClass}_', j,
-              classMethods[parentClass][j], false);
+          classMethods[parentClass][j].emit();
           vcm[parentClass].add(currentMethod);
           currentMethod = null;
           currentClass = null;
@@ -562,7 +713,7 @@
         emitVariableDeclarations('$fieldName${i}_', classFields[i]);
         currentClass = i;
         emitVirtualMethods();
-        emitMethods('$methodName${i}_', classMethods[i]);
+        emitMethods(classMethods[currentClass]);
         emitFunctionDefinition('run', () {
           if (i > 0) {
             // FIXME(bkonyi): fix potential issue where we try to apply a class
@@ -574,12 +725,32 @@
           assert(localVars.isEmpty);
         }, retType: 'void');
       });
+      emitNewline();
+      emitNewline();
+      emitExtensionMethods();
       currentClass = null;
-      emitNewline();
-      emitNewline();
     }
   }
 
+  void emitExtensionMethods() {
+    classMethods[currentClass].addAll(getMethods(numExtensionMethodsPerClass,
+        numMethodParams, MethodType.extensionMethod,
+        className: "X${currentClass}",
+        extensionName: "XE${currentClass}",
+        namePrefix: "${methodName}${currentClass}_Extension"));
+    emit("extension XE$currentClass on X$currentClass ");
+    emitBraceWrapped(() {
+      for (int i = 0; i < classMethods[currentClass].length; i++) {
+        currentMethod = i;
+        if (classMethods[currentClass][i] is ExtensionMethod)
+          classMethods[currentClass][i].emit();
+        currentMethod = null;
+      }
+    });
+    emitNewline();
+    emitNewline();
+  }
+
   void emitLoadFfiLib() {
     if (ffi) {
       emitLn(
@@ -602,7 +773,7 @@
         for (int i = 0; i < globalMethods.length; i++) {
           final outputName = '$methodName$i';
           emitTryCatchFinally(() {
-            emitCall(1, outputName, globalMethods[i], includeSemicolon: true);
+            globalMethods[i].emitCall(1, includeSemicolon: true);
           }, () {
             emitPrint('$outputName() throws');
           });
@@ -612,13 +783,11 @@
         // Call each class method once.
         for (int i = 0; i < classMethods.length; i++) {
           for (int j = 0; j < classMethods[i].length; j++) {
-            final outputName = 'X${i}().$methodName${i}_${j}';
             emitNewline();
             emitTryCatchFinally(() {
-              emitCall(1, outputName, classMethods[i][j],
-                  includeSemicolon: true);
+              classMethods[i][j].emitCall(1, includeSemicolon: true);
             }, () {
-              emitPrint('$outputName() throws');
+              emitPrint('X$i().${classMethods[i][j].name}() throws');
             });
           }
           // Call each virtual class method once.
@@ -631,8 +800,8 @@
                 final outputName = 'X${i}().$methodName${parentClass}_${j}';
                 emitNewline();
                 emitTryCatchFinally(
-                    () => emitCall(1, outputName, classMethods[parentClass][j],
-                        includeSemicolon: true),
+                    () => classMethods[parentClass][j]
+                        .emitCall(1, includeSemicolon: true),
                     () => emitPrint('$outputName() throws'));
               }
             }
@@ -1628,23 +1797,14 @@
     });
   }
 
-  // Emit call to a specific method.
-  void emitCall(int depth, String name, List<DartType> proto,
-      {RhsFilter rhsFilter, bool includeSemicolon = false}) {
-    emitLn(name, newline: false);
-    emitExprList(depth + 1, proto, rhsFilter: rhsFilter);
-    if (includeSemicolon) {
-      emit(';');
-    }
-  }
-
   // Helper for a method call.
-  bool pickedCall(
-      int depth, DartType tp, String name, List<List<DartType>> protos, int m,
+  bool pickedCall(int depth, DartType tp, List<Method> methods, int m,
       {RhsFilter rhsFilter}) {
     for (int i = m - 1; i >= 0; i--) {
-      if (tp == protos[i][0]) {
-        emitCall(depth + 1, "$name$i", protos[i], rhsFilter: rhsFilter);
+      if (tp == methods[i].returnType) {
+        bool extensionApplication = methods[i] is ExtensionMethod && coinFlip();
+        methods[i].emitCall(depth + 1,
+            rhsFilter: rhsFilter, extensionApplication: extensionApplication);
         return true;
       }
     }
@@ -1657,7 +1817,7 @@
     if (currentClass == null) {
       // Outside a class but inside a method: call backward in global methods.
       if (currentMethod != null &&
-          pickedCall(depth, tp, methodName, globalMethods, currentMethod,
+          pickedCall(depth, tp, globalMethods, currentMethod,
               rhsFilter: rhsFilter)) {
         return;
       }
@@ -1684,10 +1844,9 @@
         m1 = currentMethod;
       }
       final int m2 = globalMethods.length;
-      if (pickedCall(depth, tp, '$methodName${classIndex}_',
-              classMethods[classIndex], m1, rhsFilter: rhsFilter) ||
-          pickedCall(depth, tp, methodName, globalMethods, m2,
-              rhsFilter: rhsFilter)) {
+      if (pickedCall(depth, tp, classMethods[classIndex], m1,
+              rhsFilter: rhsFilter) ||
+          pickedCall(depth, tp, globalMethods, m2, rhsFilter: rhsFilter)) {
         return;
       }
     }
@@ -1838,22 +1997,13 @@
     return list;
   }
 
-  List<List<List<DartType>>> fillTypes3(int n,
-      {int limit2 = 4, int limit1 = 4}) {
-    final list = <List<List<DartType>>>[];
-    for (int i = 0; i < n; i++) {
-      list.add(fillTypes2(limit2: limit2, limit1: limit1));
-    }
-    return list;
-  }
-
   List<DartType> getCurrentProto() {
     if (currentClass != null) {
       if (currentMethod != null) {
-        return classMethods[currentClass][currentMethod];
+        return classMethods[currentClass][currentMethod].parameters;
       }
     } else if (currentMethod != null) {
-      return globalMethods[currentMethod];
+      return globalMethods[currentMethod].parameters;
     }
     return null;
   }
@@ -1876,8 +2026,9 @@
     }
   }
 
-  void emitFfiTypedef(String typeName, List<DartType> pars) {
-    emit("typedef ${typeName} = ");
+  void emitFfiTypedef(Method method) {
+    List<DartType> pars = method.parameters;
+    emit("typedef ${method.name}Type = ");
     emitFfiType(pars[0]);
     emit(' Function');
     emitParenWrapped(
@@ -1957,14 +2108,14 @@
   // which can lead to infinite loops.
   List<String> iterVars;
 
-  // Prototypes of all global methods (first element is return type).
-  List<List<DartType>> globalMethods;
+  // List of all global methods.
+  List<Method> globalMethods;
 
   // Types of fields over all classes.
   List<List<DartType>> classFields;
 
-  // Prototypes of all methods over all classes (first element is return type).
-  List<List<List<DartType>>> classMethods;
+  // List of methods over all classes.
+  List<List<Method>> classMethods;
 
   // List of virtual functions per class. Map is from parent class index to List
   // of overloaded functions from that parent.
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index 39593aa..f8f2ba1 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -121,7 +121,7 @@
         constructor.isFactory &&
         constructor.name.isNotEmpty) {
       addToTable(
-          typeString(classElement.type),
+          typeString(classElement.thisType),
           '${classElement.name}.${constructor.name}',
           protoString(null, constructor.parameters));
     }
@@ -135,7 +135,7 @@
             protoString(null, method.parameters));
       } else {
         addToTable(typeString(method.returnType), method.name,
-            protoString(classElement.type, method.parameters));
+            protoString(classElement.thisType, method.parameters));
       }
     }
   }
@@ -147,7 +147,7 @@
             '${classElement.name}.${variable.name}', 'Vv');
       } else {
         addToTable(typeString(variable.type), variable.name,
-            '${typeString(classElement.type)}v');
+            '${typeString(classElement.thisType)}v');
       }
     }
   }
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
index d6cbd3d..f2a08eb 100644
--- a/runtime/tools/dartfuzz/gen_type_table.dart
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
 
 import 'gen_util.dart';
 
@@ -1123,7 +1124,10 @@
       } else {
         return true;
       }
-      ParameterizedType ptx = pType.instantiate([iType]);
+      ParameterizedType ptx = pType.element.instantiate(
+        typeArguments: [iType],
+        nullabilitySuffix: NullabilitySuffix.star,
+      );
       newITypes.add(ptx);
       if (iType.typeArguments.length >= 1) {
         complexTypes.add(getConstName(ptx.displayName));
@@ -1141,7 +1145,10 @@
         } else {
           return true;
         }
-        ParameterizedType ptx = pType.instantiate([iType1, iType2]);
+        ParameterizedType ptx = pType.element.instantiate(
+          typeArguments: [iType1, iType2],
+          nullabilitySuffix: NullabilitySuffix.star,
+        );
         newITypes.add(ptx);
         if (iType1.typeArguments.length >= 1 ||
             iType2.typeArguments.length >= 1) {
@@ -1262,7 +1269,7 @@
       // Compute heuristic to decide whether to include the type.
       int no = countOperators(classElement);
       if (no > operatorCountThreshold) {
-        allTypes.add(classElement.type);
+        allTypes.add(classElement.thisType);
       }
     }
   }
diff --git a/runtime/tools/gen_library_src_paths.py b/runtime/tools/gen_library_src_paths.py
index 56d770a..97f4ae1 100755
--- a/runtime/tools/gen_library_src_paths.py
+++ b/runtime/tools/gen_library_src_paths.py
@@ -126,7 +126,7 @@
             return -1
 
         return 0
-    except Exception, inst:
+    except Exception as inst:
         sys.stderr.write('gen_library_src_paths.py exception\n')
         sys.stderr.write(str(inst))
         sys.stderr.write('\n')
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 2c75b06..6796fb5 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -2924,8 +2924,11 @@
       AutoTraceObject(type);
       WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
-      s->Write<int8_t>(type->ptr()->type_state_);
-      s->Write<int8_t>(type->ptr()->nullability_);
+      const uint8_t combined =
+          (type->ptr()->type_state_ << 4) | type->ptr()->nullability_;
+      ASSERT(type->ptr()->type_state_ == (combined >> 4));
+      ASSERT(type->ptr()->nullability_ == (combined & 0xf));
+      s->Write<uint8_t>(combined);
     }
     count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
@@ -2933,8 +2936,11 @@
       AutoTraceObject(type);
       WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
-      s->Write<int8_t>(type->ptr()->type_state_);
-      s->Write<int8_t>(type->ptr()->nullability_);
+      const uint8_t combined =
+          (type->ptr()->type_state_ << 4) | type->ptr()->nullability_;
+      ASSERT(type->ptr()->type_state_ == (combined >> 4));
+      ASSERT(type->ptr()->nullability_ == (combined & 0xf));
+      s->Write<uint8_t>(combined);
     }
   }
 
@@ -2975,8 +2981,9 @@
                                      is_canonical);
       ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
-      type->ptr()->type_state_ = d->Read<int8_t>();
-      type->ptr()->nullability_ = d->Read<int8_t>();
+      const uint8_t combined = d->Read<uint8_t>();
+      type->ptr()->type_state_ = combined >> 4;
+      type->ptr()->nullability_ = combined & 0xf;
     }
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -2986,8 +2993,9 @@
                                      is_canonical);
       ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
-      type->ptr()->type_state_ = d->Read<int8_t>();
-      type->ptr()->nullability_ = d->Read<int8_t>();
+      const uint8_t combined = d->Read<uint8_t>();
+      type->ptr()->type_state_ = combined >> 4;
+      type->ptr()->nullability_ = combined & 0xf;
     }
   }
 
@@ -3141,8 +3149,11 @@
       s->Write<int32_t>(type->ptr()->parameterized_class_id_);
       s->WriteTokenPosition(type->ptr()->token_pos_);
       s->Write<int16_t>(type->ptr()->index_);
-      s->Write<uint8_t>(type->ptr()->flags_);
-      s->Write<int8_t>(type->ptr()->nullability_);
+      const uint8_t combined =
+          (type->ptr()->flags_ << 4) | type->ptr()->nullability_;
+      ASSERT(type->ptr()->flags_ == (combined >> 4));
+      ASSERT(type->ptr()->nullability_ == (combined & 0xf));
+      s->Write<uint8_t>(combined);
     }
   }
 
@@ -3176,8 +3187,9 @@
       type->ptr()->parameterized_class_id_ = d->Read<int32_t>();
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->index_ = d->Read<int16_t>();
-      type->ptr()->flags_ = d->Read<uint8_t>();
-      type->ptr()->nullability_ = d->Read<int8_t>();
+      const uint8_t combined = d->Read<uint8_t>();
+      type->ptr()->flags_ = combined >> 4;
+      type->ptr()->nullability_ = combined & 0xf;
     }
   }
 
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index c04569b..8a61638 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -336,7 +336,7 @@
   }
 
   if (!field_.IsNull() && field_.is_static() && !field_.is_const() &&
-      field_.has_initializer()) {
+      field_.has_nontrivial_initializer()) {
     processed = true;
     function_ = field_.EnsureInitializerFunction();
     error_ = CompileFunction(function_);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 09bb182..ef81ad9f 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -919,7 +919,7 @@
       AddConstObject(Instance::Cast(value));
     }
 
-    if (field.has_initializer()) {
+    if (field.has_nontrivial_initializer()) {
       // Should not be in the middle of initialization while precompiling.
       ASSERT(value.raw() != Object::transition_sentinel().raw());
 
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 69e2ec7..2f0d0d0 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -245,6 +245,8 @@
 
     case KernelBytecode::kPushConstant:
     case KernelBytecode::kPushConstant_Wide:
+    case KernelBytecode::kInitLateField:
+    case KernelBytecode::kInitLateField_Wide:
     case KernelBytecode::kStoreStaticTOS:
     case KernelBytecode::kStoreStaticTOS_Wide:
     case KernelBytecode::kLoadStatic:
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 60a737d..e1bce80 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1209,6 +1209,7 @@
         // Only intrinsify getter if the field cannot contain a mutable double.
         // Reading from a mutable double box requires allocating a fresh double.
         if (field.is_instance() && !field.needs_load_guard() &&
+            !field.is_late() &&
             (FLAG_precompiled_mode || !IsPotentialUnboxedField(field))) {
           SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
           GenerateGetterIntrinsic(compiler::target::Field::OffsetOf(field));
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 2f00b22..35c221b 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1091,10 +1091,11 @@
   // Check that all non-Smi objects are heap allocated and in old space.
   ASSERT(value.IsSmi() || value.IsOld());
 #if defined(DEBUG)
-  // Generally, instances in the flow graph should be canonical. Smis and
-  // null values are canonical by construction and so we skip them here.
+  // Generally, instances in the flow graph should be canonical. Smis, null
+  // values, and sentinel values are canonical by construction and so we skip
+  // them here.
   if (!value.IsNull() && !value.IsSmi() && value.IsInstance() &&
-      !value.IsCanonical()) {
+      !value.IsCanonical() && (value.raw() != Object::sentinel().raw())) {
     // The only allowed type for which IsCanonical() never answers true is
     // TypeParameter. (They are treated as canonical due to how they are
     // created, but there is no way to canonicalize a new TypeParameter
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 7188785..3324814 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -107,8 +107,8 @@
   "frontend/bytecode_reader.h",
   "frontend/bytecode_scope_builder.cc",
   "frontend/bytecode_scope_builder.h",
-  "frontend/constant_evaluator.cc",
-  "frontend/constant_evaluator.h",
+  "frontend/constant_reader.cc",
+  "frontend/constant_reader.h",
   "frontend/flow_graph_builder.cc",
   "frontend/flow_graph_builder.h",
   "frontend/kernel_binary_flowgraph.cc",
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index dd1ae70..2e8c237 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -696,7 +696,6 @@
 
   const intptr_t expected_num_type_args = DecodeOperandA().value();
   LocalVariable* type_args_var = LocalVariableAt(DecodeOperandE().value());
-  ASSERT(function().IsGeneric());
 
   if (throw_no_such_method_ == nullptr) {
     throw_no_such_method_ = B->BuildThrowNoSuchMethod();
@@ -1313,13 +1312,30 @@
   code_ += B->StoreStaticField(position_, field);
 }
 
+void BytecodeFlowGraphBuilder::BuildInitLateField() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+
+  LoadStackSlots(1);
+  Operand cp_index = DecodeOperandD();
+
+  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
+  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
+         field.Offset());
+
+  code_ += B->Constant(Object::sentinel());
+  code_ += B->StoreInstanceField(
+      field, StoreInstanceFieldInstr::Kind::kInitializing, kNoStoreBarrier);
+}
+
 void BytecodeFlowGraphBuilder::BuildLoadStatic() {
   const Constant operand = ConstantAt(DecodeOperandD());
   const auto& field = Field::Cast(operand.value());
   // All constant expressions (including access to const fields) are evaluated
   // in bytecode. However, values of injected cid fields are only available in
   // the VM. In such case, evaluate const fields with known value here.
-  if (field.is_const() && !field.has_initializer()) {
+  if (field.is_const() && !field.has_nontrivial_initializer()) {
     const auto& value = Object::ZoneHandle(Z, field.StaticValue());
     ASSERT((value.raw() != Object::sentinel().raw()) &&
            (value.raw() != Object::transition_sentinel().raw()));
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index c32f8d2..cbc4c49 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -1956,7 +1956,7 @@
                                                  bool discard_fields) {
   // Field flags, must be in sync with FieldDeclaration constants in
   // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasInitializerFlag = 1 << 0;
+  const int kHasNontrivialInitializerFlag = 1 << 0;
   const int kHasGetterFlag = 1 << 1;
   const int kHasSetterFlag = 1 << 2;
   const int kIsReflectableFlag = 1 << 3;
@@ -1973,6 +1973,7 @@
   const int kHasAttributesFlag = 1 << 14;
   const int kIsLateFlag = 1 << 15;
   const int kIsExtensionMemberFlag = 1 << 16;
+  const int kHasInitializerFlag = 1 << 17;
 
   const int num_fields = reader_.ReadListLength();
   if ((num_fields == 0) && !cls.is_enum_class()) {
@@ -1993,9 +1994,12 @@
     const bool is_static = (flags & kIsStaticFlag) != 0;
     const bool is_final = (flags & kIsFinalFlag) != 0;
     const bool is_const = (flags & kIsConstFlag) != 0;
-    const bool has_initializer = (flags & kHasInitializerFlag) != 0;
+    const bool is_late = (flags & kIsLateFlag) != 0;
+    const bool has_nontrivial_initializer =
+        (flags & kHasNontrivialInitializerFlag) != 0;
     const bool has_pragma = (flags & kHasPragmaFlag) != 0;
     const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
+    const bool has_initializer = (flags & kHasInitializerFlag) != 0;
 
     name ^= ReadObject();
     type ^= ReadObject();
@@ -2023,14 +2027,19 @@
     field.set_is_covariant((flags & kIsCovariantFlag) != 0);
     field.set_is_generic_covariant_impl((flags & kIsGenericCovariantImplFlag) !=
                                         0);
-    field.set_has_initializer(has_initializer);
+    field.set_has_nontrivial_initializer(has_nontrivial_initializer);
     field.set_is_late((flags & kIsLateFlag) != 0);
     field.set_is_extension_member(is_extension_member);
+    field.set_has_initializer(has_initializer);
 
-    if (!has_initializer) {
+    if (!has_nontrivial_initializer) {
       value ^= ReadObject();
       if (is_static) {
-        field.SetStaticValue(value, true);
+        if (field.is_late() && !has_initializer) {
+          field.SetStaticValue(Object::sentinel(), true);
+        } else {
+          field.SetStaticValue(value, true);
+        }
       } else {
         field.set_saved_initial_value(value);
         // Null-initialized instance fields are tracked separately for each
@@ -2072,7 +2081,7 @@
       function.set_accessor_field(field);
       function.set_is_declared_in_bytecode(true);
       function.set_is_extension_member(is_extension_member);
-      if (is_const && has_initializer) {
+      if (is_const && has_nontrivial_initializer) {
         function.set_bytecode_offset(field.bytecode_offset());
       }
       H.SetupFieldAccessorFunction(cls, function, type);
@@ -2080,10 +2089,10 @@
     }
 
     if ((flags & kHasSetterFlag) != 0) {
-      ASSERT((!is_static) && (!is_final) && (!is_const));
+      ASSERT(is_late || ((!is_static) && (!is_final)));
+      ASSERT(!is_const);
       name ^= ReadObject();
-      function = Function::New(name, RawFunction::kImplicitSetter,
-                               false,  // is_static
+      function = Function::New(name, RawFunction::kImplicitSetter, is_static,
                                false,  // is_const
                                false,  // is_abstract
                                false,  // is_external
@@ -3670,7 +3679,7 @@
 
   const auto& field = Field::Handle(zone, function.accessor_field());
   return field.is_declared_in_bytecode() && field.is_const() &&
-         field.has_initializer();
+         field.has_nontrivial_initializer();
 }
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
deleted file mode 100644
index 643e0b4..0000000
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ /dev/null
@@ -1,1371 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/compiler/frontend/constant_evaluator.h"
-
-#include "vm/compiler/aot/precompiler.h"
-#include "vm/compiler/frontend/kernel_to_il.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/dart_entry.h"
-#include "vm/longjump.h"
-#include "vm/object_store.h"
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-namespace dart {
-namespace kernel {
-
-#define Z (zone_)
-#define H (translation_helper_)
-#define T (type_translator_)
-#define I Isolate::Current()
-
-ConstantEvaluator::ConstantEvaluator(KernelReaderHelper* helper,
-                                     TypeTranslator* type_translator,
-                                     ActiveClass* active_class,
-                                     FlowGraphBuilder* flow_graph_builder)
-    : helper_(helper),
-      isolate_(Isolate::Current()),
-      zone_(helper->zone_),
-      translation_helper_(helper->translation_helper_),
-      type_translator_(*type_translator),
-      active_class_(active_class),
-      flow_graph_builder_(flow_graph_builder),
-      script_(helper->script()),
-      result_(Instance::Handle(zone_)) {}
-
-bool ConstantEvaluator::IsCached(intptr_t offset) {
-  return GetCachedConstant(offset, &result_);
-}
-
-RawInstance* ConstantEvaluator::EvaluateExpression(intptr_t offset,
-                                                   bool reset_position) {
-  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
-  if (!GetCachedConstant(offset, &result_)) {
-    BailoutIfBackgroundCompilation();
-
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = helper_->ReaderOffset();
-    helper_->SetOffset(offset);
-    uint8_t payload = 0;
-    Tag tag = helper_->ReadTag(&payload);  // read tag.
-    switch (tag) {
-      case kVariableGet:
-        EvaluateVariableGet(/* is_specialized = */ false);
-        break;
-      case kSpecializedVariableGet:
-        EvaluateVariableGet(/* is_specialized = */ true);
-        break;
-      case kPropertyGet:
-        EvaluatePropertyGet();
-        break;
-      case kDirectPropertyGet:
-        EvaluateDirectPropertyGet();
-        break;
-      case kStaticGet:
-        EvaluateStaticGet();
-        break;
-      case kMethodInvocation:
-        EvaluateMethodInvocation();
-        break;
-      case kDirectMethodInvocation:
-        EvaluateDirectMethodInvocation();
-        break;
-      case kSuperMethodInvocation:
-        EvaluateSuperMethodInvocation();
-        break;
-      case kStaticInvocation:
-      case kConstStaticInvocation:
-        EvaluateStaticInvocation();
-        break;
-      case kConstConstructorInvocation:
-        EvaluateConstructorInvocationInternal();
-        break;
-      case kNot:
-        EvaluateNot();
-        break;
-      case kLogicalExpression:
-        EvaluateLogicalExpression();
-        break;
-      case kConditionalExpression:
-        EvaluateConditionalExpression();
-        break;
-      case kStringConcatenation:
-        EvaluateStringConcatenation();
-        break;
-      case kListConcatenation:
-      case kSetConcatenation:
-      case kMapConcatenation:
-      case kInstanceCreation:
-      case kFileUriExpression:
-        // These only occur inside unevaluated constants, so if we decide to
-        // remove support for late evaluation of environment constants from
-        // dill files in the VM, an implementation here will not be necessary.
-        H.ReportError(
-            script_, TokenPosition::kNoSource,
-            "Unexpected unevaluated constant, All constant expressions"
-            " are expected to be evaluated at this point %s (%d)",
-            Reader::TagName(tag), tag);
-        break;
-      case kSymbolLiteral:
-        EvaluateSymbolLiteral();
-        break;
-      case kTypeLiteral:
-        EvaluateTypeLiteral();
-        break;
-      case kAsExpression:
-        EvaluateAsExpression();
-        break;
-      case kConstListLiteral:
-        EvaluateListLiteralInternal();
-        break;
-      case kConstSetLiteral:
-        // Set literals are currently desugared in the frontend and will not
-        // reach the VM. See http://dartbug.com/35124 for discussion.
-        H.ReportError(script_, TokenPosition::kNoSource,
-                      "Unexpected set literal constant, this constant"
-                      " is expected to be evaluated at this point %s (%d)",
-                      Reader::TagName(tag), tag);
-        break;
-      case kConstMapLiteral:
-        EvaluateMapLiteralInternal();
-        break;
-      case kLet:
-        EvaluateLet();
-        break;
-      case kBlockExpression: {
-        UNIMPLEMENTED();
-        break;
-      }
-      case kInstantiation:
-        EvaluatePartialTearoffInstantiation();
-        break;
-      case kBigIntLiteral:
-        EvaluateBigIntLiteral();
-        break;
-      case kStringLiteral:
-        EvaluateStringLiteral();
-        break;
-      case kSpecializedIntLiteral:
-        EvaluateIntLiteral(payload);
-        break;
-      case kNegativeIntLiteral:
-        EvaluateIntLiteral(true);
-        break;
-      case kPositiveIntLiteral:
-        EvaluateIntLiteral(false);
-        break;
-      case kDoubleLiteral:
-        EvaluateDoubleLiteral();
-        break;
-      case kTrueLiteral:
-        EvaluateBoolLiteral(true);
-        break;
-      case kFalseLiteral:
-        EvaluateBoolLiteral(false);
-        break;
-      case kNullLiteral:
-        EvaluateNullLiteral();
-        break;
-      case kConstantExpression:
-        helper_->ReadPosition();
-        helper_->SkipDartType();
-        result_ = EvaluateConstantExpression(helper_->ReadUInt());
-        break;
-      case kDeprecated_ConstantExpression:
-        result_ = EvaluateConstantExpression(helper_->ReadUInt());
-        break;
-      case kInvalidExpression: {
-        helper_->ReadPosition();  // Skip position.
-        const String& message = H.DartString(helper_->ReadStringReference());
-        // Invalid expression message has pointer to the source code, no need to
-        // report it twice.
-        H.ReportError(helper_->script(), TokenPosition::kNoSource, "%s",
-                      message.ToCString());
-        break;
-      }
-      default:
-        H.ReportError(
-            script_, TokenPosition::kNoSource,
-            "Not a constant expression: unexpected kernel tag %s (%d)",
-            Reader::TagName(tag), tag);
-    }
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) helper_->SetOffset(original_offset);
-  } else {
-    if (!reset_position) {
-      helper_->SetOffset(offset);
-      helper_->SkipExpression();
-    }
-  }
-  return result_.raw();
-}
-
-Instance& ConstantEvaluator::EvaluateListLiteral(intptr_t offset,
-                                                 bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    BailoutIfBackgroundCompilation();
-
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = helper_->ReaderOffset();
-    helper_->SetOffset(offset);
-    helper_->ReadTag();  // skip tag.
-    EvaluateListLiteralInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) helper_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-Instance& ConstantEvaluator::EvaluateMapLiteral(intptr_t offset,
-                                                bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    BailoutIfBackgroundCompilation();
-
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = helper_->ReaderOffset();
-    helper_->SetOffset(offset);
-    helper_->ReadTag();  // skip tag.
-    EvaluateMapLiteralInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) helper_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-Instance& ConstantEvaluator::EvaluateConstructorInvocation(
-    intptr_t offset,
-    bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    BailoutIfBackgroundCompilation();
-
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = helper_->ReaderOffset();
-    helper_->SetOffset(offset);
-    helper_->ReadTag();  // skip tag.
-    EvaluateConstructorInvocationInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) helper_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-Instance& ConstantEvaluator::EvaluateStaticInvocation(intptr_t offset,
-                                                      bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    BailoutIfBackgroundCompilation();
-
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = helper_->ReaderOffset();
-    helper_->SetOffset(offset);
-    helper_->ReadTag();  // skip tag.
-    EvaluateStaticInvocation();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) helper_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-RawObject* ConstantEvaluator::EvaluateExpressionSafe(intptr_t offset) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    return EvaluateExpression(offset);
-  } else {
-    return H.thread()->StealStickyError();
-  }
-}
-
-RawObject* ConstantEvaluator::EvaluateAnnotations() {
-  intptr_t list_length = helper_->ReadListLength();  // read list length.
-  const Array& metadata_values =
-      Array::Handle(Z, Array::New(list_length, H.allocation_space()));
-  Instance& value = Instance::Handle(Z);
-  for (intptr_t i = 0; i < list_length; ++i) {
-    // this will (potentially) read the expression, but reset the position.
-    value = EvaluateExpression(helper_->ReaderOffset());
-    helper_->SkipExpression();  // read (actual) initializer.
-    metadata_values.SetAt(i, value);
-  }
-  return metadata_values.raw();
-}
-
-RawInstance* ConstantEvaluator::EvaluateConstantExpression(
-    intptr_t constant_offset) {
-  ASSERT(!H.constants().IsNull());
-  ASSERT(!H.constants_table().IsNull());  // raw bytes
-
-  // For kernel-level cache (in contrast with script-level caching),
-  // we need to access the raw constants array inside the shared
-  // KernelProgramInfo directly, so that all scripts will see the
-  // results after new insertions. These accesses at kernel-level
-  // must be locked since mutator and background compiler can
-  // access the array at the same time.
-  {
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
-    KernelConstantsMap constant_map(H.info().constants());
-    result_ ^= constant_map.GetOrNull(constant_offset);
-    ASSERT(constant_map.Release().raw() == H.info().constants());
-  }
-
-  // On miss, evaluate, and insert value.
-  if (result_.IsNull()) {
-    result_ = EvaluateConstant(constant_offset);
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
-    KernelConstantsMap constant_map(H.info().constants());
-    auto insert = constant_map.InsertNewOrGetValue(constant_offset, result_);
-    ASSERT(insert == result_.raw());
-    H.info().set_constants(constant_map.Release());  // update!
-  }
-  return result_.raw();
-}
-
-bool ConstantEvaluator::IsInstanceConstant(intptr_t constant_offset,
-                                           const Class& clazz) {
-  // Get reader directly into raw bytes of constant table.
-  KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
-  reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
-  reader.SetOffset(reader.ReaderOffset() + constant_offset);
-  // Peek for an instance of the given clazz.
-  if (reader.ReadByte() == kInstanceConstant) {
-    const NameIndex index = reader.ReadCanonicalNameReference();
-    return H.LookupClassByKernelClass(index) == clazz.raw();
-  }
-  return false;
-}
-
-RawInstance* ConstantEvaluator::EvaluateConstant(intptr_t constant_offset) {
-  // Get reader directly into raw bytes of constant table.
-  KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
-  reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
-  reader.SetOffset(reader.ReaderOffset() + constant_offset);
-  // Construct constant from raw bytes.
-  Instance& instance = Instance::Handle(Z);
-  const intptr_t constant_tag = reader.ReadByte();
-  switch (constant_tag) {
-    case kNullConstant:
-      instance = Instance::null();
-      break;
-    case kBoolConstant:
-      instance = reader.ReadByte() == 1 ? Object::bool_true().raw()
-                                        : Object::bool_false().raw();
-      break;
-    case kIntConstant: {
-      uint8_t payload = 0;
-      Tag integer_tag = reader.ReadTag(&payload);  // read tag.
-      switch (integer_tag) {
-        case kBigIntLiteral: {
-          const String& value = H.DartString(reader.ReadStringReference());
-          instance = Integer::New(value, Heap::kOld);
-          break;
-        }
-        case kSpecializedIntLiteral: {
-          const int64_t value =
-              static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
-          instance = Integer::New(value, Heap::kOld);
-          break;
-        }
-        case kNegativeIntLiteral: {
-          const int64_t value = -static_cast<int64_t>(reader.ReadUInt());
-          instance = Integer::New(value, Heap::kOld);
-          break;
-        }
-        case kPositiveIntLiteral: {
-          const int64_t value = reader.ReadUInt();
-          instance = Integer::New(value, Heap::kOld);
-          break;
-        }
-        default:
-          H.ReportError(
-              script_, TokenPosition::kNoSource,
-              "Cannot lazily read integer: unexpected kernel tag %s (%d)",
-              Reader::TagName(integer_tag), integer_tag);
-      }
-      break;
-    }
-    case kDoubleConstant:
-      instance = Double::New(reader.ReadDouble(), Heap::kOld);
-      break;
-    case kStringConstant:
-      instance = H.DartSymbolPlain(reader.ReadStringReference()).raw();
-      break;
-    case kSymbolConstant: {
-      Library& library = Library::Handle(Z);
-      library = Library::InternalLibrary();
-      const auto& symbol_class =
-          Class::Handle(Z, library.LookupClass(Symbols::Symbol()));
-      const auto& symbol_name_field = Field::Handle(
-          Z, symbol_class.LookupInstanceFieldAllowPrivate(Symbols::_name()));
-      ASSERT(!symbol_name_field.IsNull());
-      const NameIndex index = reader.ReadCanonicalNameReference();
-      if (index == -1) {
-        library = Library::null();
-      } else {
-        library = H.LookupLibraryByKernelLibrary(index);
-      }
-      const String& symbol =
-          H.DartIdentifier(library, reader.ReadStringReference());
-      instance = Instance::New(symbol_class, Heap::kOld);
-      instance.SetField(symbol_name_field, symbol);
-      break;
-    }
-    case kListConstant: {
-      const auto& corelib = Library::Handle(Z, Library::CoreLibrary());
-      const auto& list_class =
-          Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
-      // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true);
-      auto& type_arguments =
-          TypeArguments::Handle(Z, TypeArguments::New(1, Heap::kOld));
-      AbstractType& type = type_translator.BuildType();
-      type_arguments.SetTypeAt(0, type);
-      // Instantiate class.
-      type = Type::New(list_class, type_arguments, TokenPosition::kNoSource);
-      type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
-                                          ClassFinalizer::kCanonicalize);
-      type_arguments = type.arguments();
-      // Fill array with constant elements.
-      const intptr_t length = reader.ReadUInt();
-      const Array& array =
-          Array::Handle(Z, ImmutableArray::New(length, Heap::kOld));
-      array.SetTypeArguments(type_arguments);
-      Instance& constant = Instance::Handle(Z);
-      for (intptr_t j = 0; j < length; ++j) {
-        // Recurse into lazily evaluating all "sub" constants
-        // needed to evaluate the current constant.
-        const intptr_t entry_offset = reader.ReadUInt();
-        ASSERT(entry_offset < constant_offset);  // DAG!
-        constant = EvaluateConstantExpression(entry_offset);
-        array.SetAt(j, constant);
-      }
-      instance = array.raw();
-      break;
-    }
-    case kInstanceConstant: {
-      const NameIndex index = reader.ReadCanonicalNameReference();
-      const auto& klass = Class::Handle(Z, H.LookupClassByKernelClass(index));
-      if (!klass.is_declaration_loaded() && !klass.is_declared_in_bytecode()) {
-        FATAL1(
-            "Trying to evaluate an instance constant whose references class "
-            "%s is not loaded yet.",
-            klass.ToCString());
-      }
-      const auto& obj = Object::Handle(Z, klass.EnsureIsFinalized(H.thread()));
-      ASSERT(obj.IsNull());
-      instance = Instance::New(klass, Heap::kOld);
-      // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true);
-      const intptr_t number_of_type_arguments = reader.ReadUInt();
-      if (klass.NumTypeArguments() > 0) {
-        auto& type_arguments = TypeArguments::Handle(
-            Z, TypeArguments::New(number_of_type_arguments, Heap::kOld));
-        for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
-          type_arguments.SetTypeAt(j, type_translator.BuildType());
-        }
-        // Instantiate class.
-        auto& type = AbstractType::Handle(
-            Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
-        type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
-                                            ClassFinalizer::kCanonicalize);
-        type_arguments = type.arguments();
-        instance.SetTypeArguments(type_arguments);
-      } else {
-        ASSERT(number_of_type_arguments == 0);
-      }
-      // Set the fields.
-      const intptr_t number_of_fields = reader.ReadUInt();
-      Field& field = Field::Handle(Z);
-      Instance& constant = Instance::Handle(Z);
-      for (intptr_t j = 0; j < number_of_fields; ++j) {
-        field = H.LookupFieldByKernelField(reader.ReadCanonicalNameReference());
-        // Recurse into lazily evaluating all "sub" constants
-        // needed to evaluate the current constant.
-        const intptr_t entry_offset = reader.ReadUInt();
-        ASSERT(entry_offset < constant_offset);  // DAG!
-        constant = EvaluateConstantExpression(entry_offset);
-        instance.SetField(field, constant);
-      }
-      break;
-    }
-    case kPartialInstantiationConstant: {
-      // Recurse into lazily evaluating the "sub" constant
-      // needed to evaluate the current constant.
-      const intptr_t entry_offset = reader.ReadUInt();
-      ASSERT(entry_offset < constant_offset);  // DAG!
-      const auto& constant =
-          Instance::Handle(Z, EvaluateConstantExpression(entry_offset));
-      ASSERT(!constant.IsNull());
-
-      // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true);
-      const intptr_t number_of_type_arguments = reader.ReadUInt();
-      ASSERT(number_of_type_arguments > 0);
-      auto& type_arguments = TypeArguments::Handle(
-          Z, TypeArguments::New(number_of_type_arguments, Heap::kOld));
-      for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
-        type_arguments.SetTypeAt(j, type_translator.BuildType());
-      }
-      type_arguments = type_arguments.Canonicalize();
-      // Make a copy of the old closure, and set delayed type arguments.
-      Closure& closure = Closure::Handle(Z, Closure::RawCast(constant.raw()));
-      Function& function = Function::Handle(Z, closure.function());
-      const auto& type_arguments2 =
-          TypeArguments::Handle(Z, closure.instantiator_type_arguments());
-      // The function type arguments are used for type parameters from enclosing
-      // closures. Though inner closures cannot be constants. We should
-      // therefore see `null here.
-      ASSERT(closure.function_type_arguments() == TypeArguments::null());
-      Context& context = Context::Handle(Z, closure.context());
-      instance = Closure::New(type_arguments2, Object::null_type_arguments(),
-                              type_arguments, function, context, Heap::kOld);
-      break;
-    }
-    case kTearOffConstant: {
-      const NameIndex index = reader.ReadCanonicalNameReference();
-      Function& function =
-          Function::Handle(Z, H.LookupStaticMethodByKernelProcedure(index));
-      function = function.ImplicitClosureFunction();
-      instance = function.ImplicitStaticClosure();
-      break;
-    }
-    case kTypeLiteralConstant: {
-      // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true);
-      instance = type_translator.BuildType().raw();
-      break;
-    }
-    default:
-      // Set literals (kSetConstant) are currently desugared in the frontend
-      // and will not reach the VM. See http://dartbug.com/35124 for some
-      // discussion. Map constants (kMapConstant ) are already lowered to
-      // InstanceConstant or ListConstant. We should never see unevaluated
-      // constants (kUnevaluatedConstant) in the constant table, they should
-      // have been fully evaluated before we get them.
-      H.ReportError(script_, TokenPosition::kNoSource,
-                    "Cannot lazily read constant: unexpected kernel tag (%" Pd
-                    ")",
-                    constant_tag);
-  }
-  return H.Canonicalize(instance);
-}
-
-void ConstantEvaluator::BailoutIfBackgroundCompilation() {
-  if (Compiler::IsBackgroundCompilation()) {
-    Compiler::AbortBackgroundCompilation(
-        DeoptId::kNone, "Cannot evaluate annotations in background compiler.");
-  }
-}
-
-bool ConstantEvaluator::IsBuildingFlowGraph() const {
-  return flow_graph_builder_ != nullptr;
-}
-
-bool ConstantEvaluator::IsAllowedToEvaluate() const {
-  return FLAG_precompiled_mode || !IsBuildingFlowGraph() ||
-         !flow_graph_builder_->optimizing_;
-}
-
-void ConstantEvaluator::EvaluateVariableGet(bool is_specialized) {
-  ASSERT(IsBuildingFlowGraph());
-  // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
-  // been executed already. It therefore must have a constant object associated
-  // with it.
-  const TokenPosition position = helper_->ReadPosition();  // read position.
-  const intptr_t variable_kernel_position =
-      helper_->ReadUInt();  // read kernel position.
-  if (!is_specialized) {
-    helper_->ReadUInt();              // read relative variable index.
-    helper_->SkipOptionalDartType();  // read promoted type.
-  }
-  LocalVariable* variable =
-      flow_graph_builder_->LookupVariable(variable_kernel_position);
-  if (!variable->IsConst()) {
-    H.ReportError(script_, position, "Not a constant expression.");
-  }
-  result_ = variable->ConstValue()->raw();
-}
-
-void ConstantEvaluator::EvaluateGetStringLength(intptr_t expression_offset,
-                                                TokenPosition position) {
-  EvaluateExpression(expression_offset);
-  if (result_.IsString()) {
-    const auto& str = String::Handle(Z, String::RawCast(result_.raw()));
-    result_ = Integer::New(str.Length(), H.allocation_space());
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void ConstantEvaluator::EvaluatePropertyGet() {
-  const TokenPosition position = helper_->ReadPosition();  // read position.
-  intptr_t expression_offset = helper_->ReaderOffset();
-  helper_->SkipExpression();                            // read receiver.
-  StringIndex name = helper_->ReadNameAsStringIndex();  // read name.
-  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
-
-  if (H.StringEquals(name, "length")) {
-    EvaluateGetStringLength(expression_offset, position);
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void ConstantEvaluator::EvaluateDirectPropertyGet() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-  intptr_t expression_offset = helper_->ReaderOffset();
-  helper_->SkipExpression();  // read receiver.
-  NameIndex kernel_name =
-      helper_->ReadCanonicalNameReference();  // read target_reference.
-
-  // TODO(vegorov): add check based on the complete canonical name.
-  if (H.IsGetter(kernel_name) &&
-      H.StringEquals(H.CanonicalNameString(kernel_name), "length")) {
-    EvaluateGetStringLength(expression_offset, position);
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void ConstantEvaluator::EvaluateStaticGet() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-  NameIndex target =
-      helper_->ReadCanonicalNameReference();  // read target_reference.
-
-  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
-
-  if (H.IsField(target)) {
-    const auto& field = Field::Handle(Z, H.LookupFieldByKernelField(target));
-    if (!field.is_const()) {
-      H.ReportError(script_, position, "Not a constant field.");
-    }
-    if (field.StaticValue() == Object::transition_sentinel().raw()) {
-      if (IsBuildingFlowGraph()) {
-        flow_graph_builder_->InlineBailout(
-            "kernel::ConstantEvaluator::EvaluateStaticGet::Cyclic");
-      }
-      H.ReportError(script_, position, "Not a constant expression.");
-    } else if (field.StaticValue() == Object::sentinel().raw()) {
-      field.SetStaticValue(Object::transition_sentinel());
-      const auto& value = Object::Handle(Z, field.EvaluateInitializer());
-      if (value.IsError()) {
-        field.SetStaticValue(Object::null_instance());
-        H.ReportError(Error::Cast(value), script_, position,
-                      "Not a constant expression.");
-      }
-      Thread* thread = H.thread();
-      const Error& error =
-          Error::Handle(thread->zone(), thread->StealStickyError());
-      if (!error.IsNull()) {
-        field.SetStaticValue(Object::null_instance());
-        H.ReportError(error, script_, position, "Not a constant expression.");
-      }
-      ASSERT(value.IsNull() || value.IsInstance());
-      field.SetStaticValue(value.IsNull() ? Instance::null_instance()
-                                          : Instance::Cast(value));
-
-      result_ = field.StaticValue();
-      result_ = H.Canonicalize(result_);
-      field.SetStaticValue(result_, true);
-    } else {
-      result_ = field.StaticValue();
-    }
-  } else if (H.IsProcedure(target)) {
-    const auto& function =
-        Function::Handle(Z, H.LookupStaticMethodByKernelProcedure(target));
-
-    if (H.IsMethod(target)) {
-      const auto& closure_function =
-          Function::Handle(Z, function.ImplicitClosureFunction());
-      result_ = closure_function.ImplicitStaticClosure();
-      result_ = H.Canonicalize(result_);
-    } else if (H.IsGetter(target)) {
-      H.ReportError(script_, position, "Not a constant expression.");
-    } else {
-      H.ReportError(script_, position, "Not a constant expression.");
-    }
-  }
-}
-
-void ConstantEvaluator::EvaluateMethodInvocation() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-  // This method call wasn't cached, so receiver et al. isn't cached either.
-  const auto& receiver = Instance::Handle(
-      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
-  Class& klass =
-      Class::Handle(Z, isolate_->class_table()->At(receiver.GetClassId()));
-  ASSERT(!klass.IsNull());
-
-  // Search the superclass chain for the selector.
-  const String& method_name = helper_->ReadNameAsMethodName();  // read name.
-  Function& function =
-      Function::Handle(Z, H.LookupDynamicFunction(klass, method_name));
-
-  // The frontend should guarantee that [MethodInvocation]s inside constant
-  // expressions are always valid.
-  ASSERT(!function.IsNull());
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-
-  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
-}
-
-void ConstantEvaluator::EvaluateDirectMethodInvocation() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-
-  const auto& receiver = Instance::Handle(
-      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
-
-  NameIndex kernel_name =
-      helper_->ReadCanonicalNameReference();  // read target_reference.
-
-  const auto& function = Function::Handle(
-      Z, H.LookupMethodByMember(kernel_name, H.DartProcedureName(kernel_name)));
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateSuperMethodInvocation() {
-  ASSERT(IsBuildingFlowGraph());
-  TokenPosition position = helper_->ReadPosition();  // read position.
-
-  const LocalVariable* receiver_variable =
-      flow_graph_builder_->parsed_function_->receiver_var();
-  ASSERT(receiver_variable->IsConst());
-  const Instance& receiver =
-      Instance::Handle(Z, receiver_variable->ConstValue()->raw());
-  ASSERT(!receiver.IsNull());
-
-  Class& klass = Class::Handle(Z, active_class_->klass->SuperClass());
-  ASSERT(!klass.IsNull());
-
-  const String& method_name = helper_->ReadNameAsMethodName();  // read name.
-  const auto& function =
-      Function::Handle(Z, H.LookupDynamicFunction(klass, method_name));
-
-  // The frontend should guarantee that [MethodInvocation]s inside constant
-  // expressions are always valid.
-  ASSERT(!function.IsNull());
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-
-  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
-}
-
-void ConstantEvaluator::EvaluateStaticInvocation() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-  NameIndex procedure_reference =
-      helper_->ReadCanonicalNameReference();  // read procedure reference.
-
-  const auto& function = Function::Handle(
-      Z, H.LookupStaticMethodByKernelProcedure(procedure_reference));
-  Class& klass = Class::Handle(Z, function.Owner());
-
-  intptr_t argument_count =
-      helper_->ReadUInt();  // read arguments part #1: arguments count.
-
-  // Build the type arguments vector (if necessary).
-  const TypeArguments* type_arguments =
-      TranslateTypeArguments(function, &klass);  // read argument types.
-
-  // read positional and named parameters.
-  const Object& result =
-      RunFunction(position, function, argument_count, NULL, type_arguments);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateConstructorInvocationInternal() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-
-  NameIndex target = helper_->ReadCanonicalNameReference();  // read target.
-  const auto& constructor =
-      Function::Handle(Z, H.LookupConstructorByKernelConstructor(target));
-  Class& klass = Class::Handle(Z, constructor.Owner());
-
-  intptr_t argument_count =
-      helper_->ReadUInt();  // read arguments part #1: arguments count.
-
-  // Build the type arguments vector (if necessary).
-  const TypeArguments* type_arguments =
-      TranslateTypeArguments(constructor, &klass);  // read argument types.
-
-  if (klass.NumTypeArguments() > 0 && !klass.IsGeneric()) {
-    auto& type = Type::Handle(Z, T.ReceiverType(klass).raw());
-    // TODO(27590): Can we move this code into [ReceiverType]?
-    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type,
-                                         ClassFinalizer::kFinalize);
-    auto& canonicalized_type_arguments =
-        TypeArguments::Handle(Z, type.arguments());
-    canonicalized_type_arguments = canonicalized_type_arguments.Canonicalize();
-    type_arguments = &canonicalized_type_arguments;
-  }
-
-  // Prepare either the instance or the type argument vector for the constructor
-  // call.
-  Instance* receiver = NULL;
-  const TypeArguments* type_arguments_argument = NULL;
-  if (!constructor.IsFactory()) {
-    receiver = &Instance::Handle(Z, Instance::New(klass, Heap::kOld));
-    if (type_arguments != NULL) {
-      receiver->SetTypeArguments(*type_arguments);
-    }
-  } else {
-    type_arguments_argument = type_arguments;
-  }
-
-  // read positional and named parameters.
-  const Object& result = RunFunction(position, constructor, argument_count,
-                                     receiver, type_arguments_argument);
-
-  if (constructor.IsFactory()) {
-    // Factories return the new object.
-    result_ ^= result.raw();
-  } else {
-    ASSERT(!receiver->IsNull());
-    result_ = (*receiver).raw();
-  }
-  if (I->obfuscate() &&
-      (result_.clazz() == I->object_store()->symbol_class())) {
-    Obfuscator::ObfuscateSymbolInstance(H.thread(), result_);
-  }
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateNot() {
-  result_ = Bool::Get(!EvaluateBooleanExpressionHere()).raw();
-}
-
-void ConstantEvaluator::EvaluateLogicalExpression() {
-  bool left = EvaluateBooleanExpressionHere();  // read left.
-  LogicalOperator op = static_cast<LogicalOperator>(helper_->ReadByte());
-  if (op == kAnd) {
-    if (left) {
-      EvaluateBooleanExpressionHere();  // read right.
-    } else {
-      helper_->SkipExpression();  // read right.
-    }
-  } else {
-    ASSERT(op == kOr);
-    if (!left) {
-      EvaluateBooleanExpressionHere();  // read right.
-    } else {
-      helper_->SkipExpression();  // read right.
-    }
-  }
-}
-
-void ConstantEvaluator::EvaluateAsExpression() {
-  TokenPosition position = helper_->ReadPosition();
-  const uint8_t flags = helper_->ReadFlags();
-  const bool is_type_error = (flags & (1 << 0)) != 0;
-
-  // Check that this AsExpression was inserted by the front-end.
-  if (!is_type_error) {
-    H.ReportError(
-        script_, position,
-        "explicit as operator is not permitted in constant expression");
-  }
-
-  EvaluateExpression(helper_->ReaderOffset(), false);
-
-  const AbstractType& type = T.BuildType();
-  if (!type.IsInstantiated()) {
-    const auto& type_str = String::Handle(type.UserVisibleName());
-    H.ReportError(
-        script_, position,
-        "Not a constant expression: right hand side of an implicit "
-        "as-expression is expected to be an instantiated type, got %s",
-        type_str.ToCString());
-  }
-
-  const auto& instantiator_type_arguments = TypeArguments::Handle();
-  const auto& function_type_arguments = TypeArguments::Handle();
-  if (!result_.IsInstanceOf(type, instantiator_type_arguments,
-                            function_type_arguments)) {
-    const AbstractType& rtype =
-        AbstractType::Handle(result_.GetType(Heap::kNew));
-    const auto& result_str = String::Handle(rtype.UserVisibleName());
-    const auto& type_str = String::Handle(type.UserVisibleName());
-    H.ReportError(
-        script_, position,
-        "Not a constant expression: Type '%s' is not a subtype of type '%s'",
-        result_str.ToCString(), type_str.ToCString());
-  }
-}
-
-void ConstantEvaluator::EvaluateConditionalExpression() {
-  bool condition = EvaluateBooleanExpressionHere();
-  if (condition) {
-    EvaluateExpression(helper_->ReaderOffset(), false);  // read then.
-    helper_->SkipExpression();                           // read otherwise.
-  } else {
-    helper_->SkipExpression();                           // read then.
-    EvaluateExpression(helper_->ReaderOffset(), false);  // read otherwise.
-  }
-  helper_->SkipOptionalDartType();  // read unused static type.
-}
-
-void ConstantEvaluator::EvaluateStringConcatenation() {
-  TokenPosition position = helper_->ReadPosition();  // read position.
-  intptr_t length = helper_->ReadListLength();       // read list length.
-
-  bool all_string = true;
-  const Array& strings =
-      Array::Handle(Z, Array::New(length, H.allocation_space()));
-  for (intptr_t i = 0; i < length; ++i) {
-    EvaluateExpression(helper_->ReaderOffset(),
-                       false);  // read ith expression.
-    strings.SetAt(i, result_);
-    all_string = all_string && result_.IsString();
-  }
-  if (all_string) {
-    result_ = String::ConcatAll(strings, Heap::kOld);
-    result_ = H.Canonicalize(result_);
-  } else {
-    // Get string interpolation function.
-    const Class& cls =
-        Class::Handle(Z, Library::LookupCoreClass(Symbols::StringBase()));
-    ASSERT(!cls.IsNull());
-    const auto& func = Function::Handle(
-        Z, cls.LookupStaticFunction(
-               Library::PrivateCoreLibName(Symbols::Interpolate())));
-    ASSERT(!func.IsNull());
-
-    // Build argument array to pass to the interpolation function.
-    const auto& interpolate_arg = Array::Handle(Z, Array::New(1, Heap::kOld));
-    interpolate_arg.SetAt(0, strings);
-
-    // Run and canonicalize.
-    const Object& result =
-        RunFunction(position, func, interpolate_arg, Array::null_array());
-    result_ = H.Canonicalize(String::Cast(result));
-  }
-}
-
-void ConstantEvaluator::EvaluateSymbolLiteral() {
-  const Class& owner = *active_class_->klass;
-  const Library& lib = Library::Handle(Z, owner.library());
-  String& symbol_value = H.DartIdentifier(lib, helper_->ReadStringReference());
-  const Class& symbol_class =
-      Class::Handle(Z, I->object_store()->symbol_class());
-  ASSERT(!symbol_class.IsNull());
-  const auto& symbol_constructor = Function::Handle(
-      Z, symbol_class.LookupConstructor(Symbols::SymbolCtor()));
-  ASSERT(!symbol_constructor.IsNull());
-  result_ ^= EvaluateConstConstructorCall(
-      symbol_class, TypeArguments::Handle(Z), symbol_constructor, symbol_value);
-}
-
-void ConstantEvaluator::EvaluateTypeLiteral() {
-  const AbstractType& type = T.BuildType();
-  result_ = type.raw();
-}
-
-void ConstantEvaluator::EvaluateListLiteralInternal() {
-  helper_->ReadPosition();  // read position.
-  const TypeArguments& type_arguments = T.BuildTypeArguments(1);  // read type.
-  intptr_t length = helper_->ReadListLength();  // read list length.
-  const auto& const_list = Array::Handle(Z, Array::New(length, Heap::kOld));
-  const_list.SetTypeArguments(type_arguments);
-  Instance& expression = Instance::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    expression = EvaluateExpression(helper_->ReaderOffset(),
-                                    false);  // read ith expression.
-    const_list.SetAt(i, expression);
-  }
-  const_list.MakeImmutable();
-  result_ = H.Canonicalize(const_list);
-}
-
-void ConstantEvaluator::EvaluateMapLiteralInternal() {
-  helper_->ReadPosition();  // read position.
-  const TypeArguments& type_arguments =
-      T.BuildTypeArguments(2);  // read key type and value type.
-
-  intptr_t length = helper_->ReadListLength();  // read length of entries.
-
-  // This MapLiteral wasn't cached, so content isn't cached either.
-  Array& const_kv_array = Array::Handle(Z, Array::New(2 * length, Heap::kOld));
-  Instance& temp = Instance::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    temp = EvaluateExpression(helper_->ReaderOffset(), false);  // read key.
-    const_kv_array.SetAt(2 * i + 0, temp);
-    temp = EvaluateExpression(helper_->ReaderOffset(), false);  // read value.
-    const_kv_array.SetAt(2 * i + 1, temp);
-  }
-
-  const_kv_array.MakeImmutable();
-  const_kv_array ^= H.Canonicalize(const_kv_array);
-
-  const Class& map_class =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::ImmutableMap()));
-  ASSERT(!map_class.IsNull());
-  ASSERT(map_class.NumTypeArguments() == 2);
-
-  const Field& field =
-      Field::Handle(Z, map_class.LookupInstanceFieldAllowPrivate(
-                           H.DartSymbolObfuscate("_kvPairs")));
-  ASSERT(!field.IsNull());
-
-  // NOTE: This needs to be kept in sync with `runtime/lib/immutable_map.dart`!
-  result_ = Instance::New(map_class, Heap::kOld);
-  ASSERT(!result_.IsNull());
-  result_.SetTypeArguments(type_arguments);
-  result_.SetField(field, const_kv_array);
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateLet() {
-  ASSERT(IsBuildingFlowGraph());
-  intptr_t kernel_position =
-      helper_->ReaderOffset() + helper_->data_program_offset_;
-
-  LocalVariable* local = flow_graph_builder_->LookupVariable(kernel_position);
-
-  // read variable declaration.
-  VariableDeclarationHelper helper(helper_);
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
-  Tag tag = helper_->ReadTag();  // read (first part of) initializer.
-  if (tag == kNothing) {
-    local->SetConstValue(Instance::ZoneHandle(Z, Instance::null()));
-  } else {
-    local->SetConstValue(Instance::ZoneHandle(
-        Z, EvaluateExpression(helper_->ReaderOffset(),
-                              false)));  // read rest of initializer.
-  }
-
-  EvaluateExpression(helper_->ReaderOffset(), false);  // read body
-}
-
-void ConstantEvaluator::EvaluatePartialTearoffInstantiation() {
-  // This method call wasn't cached, so receiver et al. isn't cached either.
-  const auto& receiver = Instance::Handle(
-      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
-  if (!receiver.IsClosure()) {
-    H.ReportError(script_, TokenPosition::kNoSource, "Expected closure.");
-  }
-  const Closure& old_closure = Closure::Cast(receiver);
-
-  // read type arguments.
-  intptr_t num_type_args = helper_->ReadListLength();
-  const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
-  if (!type_args->IsNull() && !type_args->IsInstantiated()) {
-    H.ReportError(
-        script_, TokenPosition::kNoSource,
-        "Type arguments in partial instantiations must be instantiated and are "
-        "therefore not allowed to depend on type parameters.");
-  }
-
-  // Create new closure with the type arguments inserted, and other things
-  // copied over.
-  Closure& new_closure = Closure::Handle(
-      Z,
-      Closure::New(
-          TypeArguments::Handle(Z, old_closure.instantiator_type_arguments()),
-          TypeArguments::Handle(old_closure.function_type_arguments()),
-          *type_args, Function::Handle(Z, old_closure.function()),
-          Context::Handle(Z, old_closure.context()), Heap::kOld));
-  result_ = H.Canonicalize(new_closure);
-}
-
-void ConstantEvaluator::EvaluateBigIntLiteral() {
-  const String& value =
-      H.DartString(helper_->ReadStringReference());  // read string reference.
-  result_ = Integer::New(value, Heap::kOld);
-  if (result_.IsNull()) {
-    H.ReportError(script_, TokenPosition::kNoSource,
-                  "Integer literal %s is out of range", value.ToCString());
-  }
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateStringLiteral() {
-  result_ = H.DartSymbolPlain(helper_->ReadStringReference())
-                .raw();  // read string reference.
-}
-
-void ConstantEvaluator::EvaluateIntLiteral(uint8_t payload) {
-  int64_t value = static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
-  result_ = Integer::New(value, Heap::kOld);
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateIntLiteral(bool is_negative) {
-  int64_t value = is_negative ? -static_cast<int64_t>(helper_->ReadUInt())
-                              : helper_->ReadUInt();  // read value.
-  result_ = Integer::New(value, Heap::kOld);
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateDoubleLiteral() {
-  result_ = Double::New(helper_->ReadDouble(), Heap::kOld);  // read value.
-  result_ = H.Canonicalize(result_);
-}
-
-void ConstantEvaluator::EvaluateBoolLiteral(bool value) {
-  result_ = Bool::Get(value).raw();
-}
-
-void ConstantEvaluator::EvaluateNullLiteral() {
-  result_ = Instance::null();
-}
-
-// This depends on being about to read the list of positionals on arguments.
-const Object& ConstantEvaluator::RunFunction(TokenPosition position,
-                                             const Function& function,
-                                             intptr_t argument_count,
-                                             const Instance* receiver,
-                                             const TypeArguments* type_args) {
-  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
-  // we should never end up evaluating constants using the VM's constant
-  // evaluator.
-  if (FLAG_precompiled_mode) {
-    UNREACHABLE();
-  }
-
-  // We do not support generic methods yet.
-  ASSERT((receiver == NULL) || (type_args == NULL));
-  intptr_t extra_arguments =
-      (receiver != NULL ? 1 : 0) + (type_args != NULL ? 1 : 0);
-
-  // Build up arguments.
-  const auto& arguments = Array::Handle(
-      Z, Array::New(extra_arguments + argument_count, H.allocation_space()));
-  intptr_t pos = 0;
-  if (receiver != NULL) {
-    arguments.SetAt(pos++, *receiver);
-  }
-  if (type_args != NULL) {
-    arguments.SetAt(pos++, *type_args);
-  }
-
-  // List of positional.
-  intptr_t list_length = helper_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    EvaluateExpression(helper_->ReaderOffset(),
-                       false);  // read ith expression.
-    arguments.SetAt(pos++, result_);
-  }
-
-  // List of named.
-  list_length = helper_->ReadListLength();  // read list length.
-  const Array& names =
-      Array::Handle(Z, Array::New(list_length, H.allocation_space()));
-  for (intptr_t i = 0; i < list_length; ++i) {
-    String& name = H.DartSymbolObfuscate(
-        helper_->ReadStringReference());  // read ith name index.
-    names.SetAt(i, name);
-    EvaluateExpression(helper_->ReaderOffset(),
-                       false);  // read ith expression.
-    arguments.SetAt(pos++, result_);
-  }
-
-  return RunFunction(position, function, arguments, names);
-}
-
-const Object& ConstantEvaluator::RunFunction(const TokenPosition position,
-                                             const Function& function,
-                                             const Array& arguments,
-                                             const Array& names) {
-  // We do not support generic methods yet.
-  const int kTypeArgsLen = 0;
-  const auto& args_descriptor = Array::Handle(
-      Z, ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length(), names));
-  const auto& result = Object::Handle(
-      Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
-  if (result.IsError()) {
-    H.ReportError(Error::Cast(result), script_, position,
-                  "error evaluating constant constructor");
-  }
-  return result;
-}
-
-const Object& ConstantEvaluator::RunMethodCall(const TokenPosition position,
-                                               const Function& function,
-                                               const Instance* receiver) {
-  intptr_t argument_count = helper_->ReadUInt();  // read arguments count.
-
-  // TODO(28109) Support generic methods in the VM or reify them away.
-  ASSERT(helper_->PeekListLength() == 0);
-  helper_->SkipListOfDartTypes();  // read list of types.
-
-  // Run the method.
-  return RunFunction(position, function, argument_count, receiver, NULL);
-}
-
-RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
-    const Class& type_class,
-    const TypeArguments& type_arguments,
-    const Function& constructor,
-    const Object& argument) {
-  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
-  // we should never end up evaluating constants using the VM's constant
-  // evaluator.
-  if (FLAG_precompiled_mode) {
-    UNREACHABLE();
-  }
-
-  // Factories have one extra argument: the type arguments.
-  // Constructors have 1 extra arguments: receiver.
-  const int kTypeArgsLen = 0;
-  const int kNumArgs = 1;
-  const int kNumExtraArgs = 1;
-  const int argument_count = kNumArgs + kNumExtraArgs;
-  const Array& arg_values =
-      Array::Handle(Z, Array::New(argument_count, Heap::kOld));
-  Instance& instance = Instance::Handle(Z);
-  if (!constructor.IsFactory()) {
-    instance = Instance::New(type_class, Heap::kOld);
-    if (!type_arguments.IsNull()) {
-      ASSERT(type_arguments.IsInstantiated());
-      instance.SetTypeArguments(
-          TypeArguments::Handle(Z, type_arguments.Canonicalize()));
-    }
-    arg_values.SetAt(0, instance);
-  } else {
-    // Prepend type_arguments to list of arguments to factory.
-    ASSERT(type_arguments.IsZoneHandle());
-    arg_values.SetAt(0, type_arguments);
-  }
-  arg_values.SetAt((0 + kNumExtraArgs), argument);
-  const Array& args_descriptor =
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, argument_count,
-                                                Object::empty_array()));
-  const auto& result = Object::Handle(
-      Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
-  ASSERT(!result.IsError());
-  if (constructor.IsFactory()) {
-    // The factory method returns the allocated object.
-    instance ^= result.raw();
-  }
-  if (I->obfuscate() &&
-      (instance.clazz() == I->object_store()->symbol_class())) {
-    Obfuscator::ObfuscateSymbolInstance(H.thread(), instance);
-  }
-  return H.Canonicalize(instance);
-}
-
-const TypeArguments* ConstantEvaluator::TranslateTypeArguments(
-    const Function& target,
-    Class* target_klass) {
-  intptr_t type_count = helper_->ReadListLength();  // read type count.
-
-  const TypeArguments* type_arguments = NULL;
-  if (type_count > 0) {
-    type_arguments = &T.BuildInstantiatedTypeArguments(
-        *target_klass, type_count);  // read types.
-
-    if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) {
-      H.ReportError(script_, TokenPosition::kNoSource,
-                    "Type must be constant in const constructor.");
-    }
-  } else if (target.IsFactory() && type_arguments == NULL) {
-    // All factories take a type arguments vector as first argument (independent
-    // of whether the class is generic or not).
-    type_arguments = &TypeArguments::ZoneHandle(Z, TypeArguments::null());
-  }
-  return type_arguments;
-}
-
-bool ConstantEvaluator::EvaluateBooleanExpressionHere() {
-  EvaluateExpression(helper_->ReaderOffset(), false);
-  AssertBool();
-  return result_.raw() == Bool::True().raw();
-}
-
-bool ConstantEvaluator::GetCachedConstant(intptr_t kernel_offset,
-                                          Instance* value) {
-  if (!IsBuildingFlowGraph()) return false;
-
-  const Function& function = flow_graph_builder_->parsed_function_->function();
-  if ((function.kind() == RawFunction::kImplicitStaticGetter ||
-       function.kind() == RawFunction::kFieldInitializer) &&
-      !I->CanOptimizeImmediately()) {
-    // Don't cache constants in initializer expressions. They get
-    // evaluated only once.
-    return false;
-  }
-
-  bool is_present = false;
-  ASSERT(!script_.InVMIsolateHeap());
-  if (script_.compile_time_constants() == Array::null()) {
-    return false;
-  }
-  {
-    // Any access to constants arrays must be locked since mutator and
-    // background compiler can access the array at the same time.
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
-
-    KernelConstantsMap constants(script_.compile_time_constants());
-    *value ^= constants.GetOrNull(kernel_offset + helper_->data_program_offset_,
-                                  &is_present);
-    constants.Release();
-  }
-  return is_present;
-}
-
-void ConstantEvaluator::CacheConstantValue(intptr_t kernel_offset,
-                                           const Instance& value) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (!IsBuildingFlowGraph()) return;
-
-  const Function& function = flow_graph_builder_->parsed_function_->function();
-  if ((function.kind() == RawFunction::kImplicitStaticGetter ||
-       function.kind() == RawFunction::kFieldInitializer) &&
-      !I->CanOptimizeImmediately()) {
-    // Don't cache constants in initializer expressions. They get
-    // evaluated only once.
-    return;
-  }
-  const intptr_t kInitialConstMapSize = 16;
-  ASSERT(!script_.InVMIsolateHeap());
-  if (script_.compile_time_constants() == Array::null()) {
-    const auto& array = Array::Handle(
-        HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
-    script_.set_compile_time_constants(array);
-  }
-  {
-    // Any access to constants arrays must be locked since mutator and
-    // background compiler can access the array at the same time.
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
-
-    KernelConstantsMap constants(script_.compile_time_constants());
-    constants.InsertNewOrGetValue(kernel_offset + helper_->data_program_offset_,
-                                  value);
-    script_.set_compile_time_constants(constants.Release());
-  }
-}
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.h b/runtime/vm/compiler/frontend/constant_evaluator.h
deleted file mode 100644
index 3e96dd9..0000000
--- a/runtime/vm/compiler/frontend/constant_evaluator.h
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/frontend/kernel_translation_helper.h"
-#include "vm/hash_table.h"
-#include "vm/object.h"
-
-namespace dart {
-namespace kernel {
-
-class FlowGraphBuilder;
-
-// There are several cases when we are compiling constant expressions:
-//
-//   * constant field initializers:
-//      const FieldName = <expr>;
-//
-//   * constant expressions:
-//      const [<expr>, ...]
-//      const {<expr> : <expr>, ...}
-//      const Constructor(<expr>, ...)
-//
-//   * constant default parameters:
-//      f(a, [b = <expr>])
-//      f(a, {b: <expr>})
-//
-//   * constant values to compare in a [SwitchCase]
-//      case <expr>:
-//
-// In all cases `<expr>` must be recursively evaluated and canonicalized at
-// compile-time.
-class ConstantEvaluator {
- public:
-  ConstantEvaluator(KernelReaderHelper* helper,
-                    TypeTranslator* type_translator,
-                    ActiveClass* active_class,
-                    FlowGraphBuilder* flow_graph_builder = nullptr);
-
-  virtual ~ConstantEvaluator() {}
-
-  bool IsCached(intptr_t offset);
-
-  RawInstance* EvaluateExpression(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateListLiteral(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateMapLiteral(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateConstructorInvocation(intptr_t offset,
-                                          bool reset_position = true);
-  Instance& EvaluateStaticInvocation(intptr_t offset,
-                                     bool reset_position = true);
-  RawObject* EvaluateExpressionSafe(intptr_t offset);
-  RawObject* EvaluateAnnotations();
-
-  // Peeks to see if constant at the given offset will evaluate to
-  // instance of the given clazz.
-  bool IsInstanceConstant(intptr_t constant_offset, const Class& clazz);
-
-  // Evaluates a constant at the given offset (possibly by recursing
-  // into sub-constants).
-  RawInstance* EvaluateConstantExpression(intptr_t constant_offset);
-
- private:
-  RawInstance* EvaluateConstant(intptr_t constant_offset);
-
-  void BailoutIfBackgroundCompilation();
-
-  bool IsBuildingFlowGraph() const;
-  bool IsAllowedToEvaluate() const;
-  void EvaluateAsExpression();
-  void EvaluateVariableGet(bool is_specialized);
-  void EvaluatePropertyGet();
-  void EvaluateDirectPropertyGet();
-  void EvaluateStaticGet();
-  void EvaluateMethodInvocation();
-  void EvaluateDirectMethodInvocation();
-  void EvaluateSuperMethodInvocation();
-  void EvaluateStaticInvocation();
-  void EvaluateConstructorInvocationInternal();
-  void EvaluateNot();
-  void EvaluateLogicalExpression();
-  void EvaluateConditionalExpression();
-  void EvaluateStringConcatenation();
-  void EvaluateSymbolLiteral();
-  void EvaluateTypeLiteral();
-  void EvaluateListLiteralInternal();
-  void EvaluateMapLiteralInternal();
-  void EvaluateLet();
-  void EvaluatePartialTearoffInstantiation();
-  void EvaluateBigIntLiteral();
-  void EvaluateStringLiteral();
-  void EvaluateIntLiteral(uint8_t payload);
-  void EvaluateIntLiteral(bool is_negative);
-  void EvaluateDoubleLiteral();
-  void EvaluateBoolLiteral(bool value);
-  void EvaluateNullLiteral();
-
-  void EvaluateGetStringLength(intptr_t expression_offset,
-                               TokenPosition position);
-
-  const Object& RunFunction(const TokenPosition position,
-                            const Function& function,
-                            intptr_t argument_count,
-                            const Instance* receiver,
-                            const TypeArguments* type_args);
-
-  const Object& RunFunction(const TokenPosition position,
-                            const Function& function,
-                            const Array& arguments,
-                            const Array& names);
-
-  const Object& RunMethodCall(const TokenPosition position,
-                              const Function& function,
-                              const Instance* receiver);
-
-  RawObject* EvaluateConstConstructorCall(const Class& type_class,
-                                          const TypeArguments& type_arguments,
-                                          const Function& constructor,
-                                          const Object& argument);
-
-  const TypeArguments* TranslateTypeArguments(const Function& target,
-                                              Class* target_klass);
-
-  void AssertBool() {
-    if (!result_.IsBool()) {
-      translation_helper_.ReportError("Expected boolean expression.");
-    }
-  }
-
-  bool EvaluateBooleanExpressionHere();
-
-  bool GetCachedConstant(intptr_t kernel_offset, Instance* value);
-  void CacheConstantValue(intptr_t kernel_offset, const Instance& value);
-
-  KernelReaderHelper* helper_;
-  Isolate* isolate_;
-  Zone* zone_;
-  TranslationHelper& translation_helper_;
-  TypeTranslator& type_translator_;
-  ActiveClass* active_class_;
-  FlowGraphBuilder* flow_graph_builder_;
-  const Script& script_;
-  Instance& result_;
-
-  DISALLOW_COPY_AND_ASSIGN(ConstantEvaluator);
-};
-
-class KernelConstMapKeyEqualsTraits : public AllStatic {
- public:
-  static const char* Name() { return "KernelConstMapKeyEqualsTraits"; }
-  static bool ReportStats() { return false; }
-
-  static bool IsMatch(const Object& a, const Object& b) {
-    const Smi& key1 = Smi::Cast(a);
-    const Smi& key2 = Smi::Cast(b);
-    return (key1.Value() == key2.Value());
-  }
-  static bool IsMatch(const intptr_t key1, const Object& b) {
-    return KeyAsSmi(key1) == Smi::Cast(b).raw();
-  }
-  static uword Hash(const Object& obj) {
-    const Smi& key = Smi::Cast(obj);
-    return HashValue(key.Value());
-  }
-  static uword Hash(const intptr_t key) {
-    return HashValue(Smi::Value(KeyAsSmi(key)));
-  }
-  static RawObject* NewKey(const intptr_t key) { return KeyAsSmi(key); }
-
- private:
-  static uword HashValue(intptr_t pos) { return pos % (Smi::kMaxValue - 13); }
-
-  static RawSmi* KeyAsSmi(const intptr_t key) {
-    ASSERT(key >= 0);
-    return Smi::New(key);
-  }
-};
-typedef UnorderedHashMap<KernelConstMapKeyEqualsTraits> KernelConstantsMap;
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
new file mode 100644
index 0000000..9646b59
--- /dev/null
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -0,0 +1,322 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/frontend/constant_reader.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+namespace dart {
+namespace kernel {
+
+#define Z (zone_)
+#define H (translation_helper_)
+
+ConstantReader::ConstantReader(KernelReaderHelper* helper,
+                               ActiveClass* active_class)
+    : helper_(helper),
+      zone_(helper->zone_),
+      translation_helper_(helper->translation_helper_),
+      active_class_(active_class),
+      script_(helper->script()),
+      result_(Instance::Handle(zone_)) {}
+
+RawInstance* ConstantReader::ReadConstantExpression() {
+  Tag tag = helper_->ReadTag();  // read tag.
+  switch (tag) {
+    case kConstantExpression:
+      helper_->ReadPosition();
+      helper_->SkipDartType();
+      result_ = ReadConstant(helper_->ReadUInt());
+      break;
+    case kInvalidExpression: {
+      helper_->ReadPosition();  // Skip position.
+      const String& message = H.DartString(helper_->ReadStringReference());
+      // Invalid expression message has pointer to the source code, no need to
+      // report it twice.
+      H.ReportError(helper_->script(), TokenPosition::kNoSource, "%s",
+                    message.ToCString());
+      break;
+    }
+    default:
+      H.ReportError(script_, TokenPosition::kNoSource,
+                    "Not a constant expression: unexpected kernel tag %s (%d)",
+                    Reader::TagName(tag), tag);
+  }
+  return result_.raw();
+}
+
+RawObject* ConstantReader::ReadAnnotations() {
+  intptr_t list_length = helper_->ReadListLength();  // read list length.
+  const Array& metadata_values =
+      Array::Handle(Z, Array::New(list_length, H.allocation_space()));
+  Instance& value = Instance::Handle(Z);
+  for (intptr_t i = 0; i < list_length; ++i) {
+    // This will read the expression.
+    value = ReadConstantExpression();
+    metadata_values.SetAt(i, value);
+  }
+  return metadata_values.raw();
+}
+
+RawInstance* ConstantReader::ReadConstant(intptr_t constant_offset) {
+  ASSERT(!H.constants().IsNull());
+  ASSERT(!H.constants_table().IsNull());  // raw bytes
+
+  // For kernel-level cache (in contrast with script-level caching),
+  // we need to access the raw constants array inside the shared
+  // KernelProgramInfo directly, so that all scripts will see the
+  // results after new insertions. These accesses at kernel-level
+  // must be locked since mutator and background compiler can
+  // access the array at the same time.
+  {
+    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+    KernelConstantsMap constant_map(H.info().constants());
+    result_ ^= constant_map.GetOrNull(constant_offset);
+    ASSERT(constant_map.Release().raw() == H.info().constants());
+  }
+
+  // On miss, evaluate, and insert value.
+  if (result_.IsNull()) {
+    result_ = ReadConstantInternal(constant_offset);
+    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+    KernelConstantsMap constant_map(H.info().constants());
+    auto insert = constant_map.InsertNewOrGetValue(constant_offset, result_);
+    ASSERT(insert == result_.raw());
+    H.info().set_constants(constant_map.Release());  // update!
+  }
+  return result_.raw();
+}
+
+bool ConstantReader::IsInstanceConstant(intptr_t constant_offset,
+                                        const Class& clazz) {
+  // Get reader directly into raw bytes of constant table.
+  KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
+  reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
+  reader.SetOffset(reader.ReaderOffset() + constant_offset);
+  // Peek for an instance of the given clazz.
+  if (reader.ReadByte() == kInstanceConstant) {
+    const NameIndex index = reader.ReadCanonicalNameReference();
+    return H.LookupClassByKernelClass(index) == clazz.raw();
+  }
+  return false;
+}
+
+RawInstance* ConstantReader::ReadConstantInternal(intptr_t constant_offset) {
+  // Get reader directly into raw bytes of constant table.
+  KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
+  reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
+  reader.SetOffset(reader.ReaderOffset() + constant_offset);
+  // Construct constant from raw bytes.
+  Instance& instance = Instance::Handle(Z);
+  const intptr_t constant_tag = reader.ReadByte();
+  switch (constant_tag) {
+    case kNullConstant:
+      instance = Instance::null();
+      break;
+    case kBoolConstant:
+      instance = reader.ReadByte() == 1 ? Object::bool_true().raw()
+                                        : Object::bool_false().raw();
+      break;
+    case kIntConstant: {
+      uint8_t payload = 0;
+      Tag integer_tag = reader.ReadTag(&payload);  // read tag.
+      switch (integer_tag) {
+        case kBigIntLiteral: {
+          const String& value = H.DartString(reader.ReadStringReference());
+          instance = Integer::New(value, Heap::kOld);
+          break;
+        }
+        case kSpecializedIntLiteral: {
+          const int64_t value =
+              static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
+          instance = Integer::New(value, Heap::kOld);
+          break;
+        }
+        case kNegativeIntLiteral: {
+          const int64_t value = -static_cast<int64_t>(reader.ReadUInt());
+          instance = Integer::New(value, Heap::kOld);
+          break;
+        }
+        case kPositiveIntLiteral: {
+          const int64_t value = reader.ReadUInt();
+          instance = Integer::New(value, Heap::kOld);
+          break;
+        }
+        default:
+          H.ReportError(
+              script_, TokenPosition::kNoSource,
+              "Cannot lazily read integer: unexpected kernel tag %s (%d)",
+              Reader::TagName(integer_tag), integer_tag);
+      }
+      break;
+    }
+    case kDoubleConstant:
+      instance = Double::New(reader.ReadDouble(), Heap::kOld);
+      break;
+    case kStringConstant:
+      instance = H.DartSymbolPlain(reader.ReadStringReference()).raw();
+      break;
+    case kSymbolConstant: {
+      Library& library = Library::Handle(Z);
+      library = Library::InternalLibrary();
+      const auto& symbol_class =
+          Class::Handle(Z, library.LookupClass(Symbols::Symbol()));
+      const auto& symbol_name_field = Field::Handle(
+          Z, symbol_class.LookupInstanceFieldAllowPrivate(Symbols::_name()));
+      ASSERT(!symbol_name_field.IsNull());
+      const NameIndex index = reader.ReadCanonicalNameReference();
+      if (index == -1) {
+        library = Library::null();
+      } else {
+        library = H.LookupLibraryByKernelLibrary(index);
+      }
+      const String& symbol =
+          H.DartIdentifier(library, reader.ReadStringReference());
+      instance = Instance::New(symbol_class, Heap::kOld);
+      instance.SetField(symbol_name_field, symbol);
+      break;
+    }
+    case kListConstant: {
+      const auto& corelib = Library::Handle(Z, Library::CoreLibrary());
+      const auto& list_class =
+          Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
+      // Build type from the raw bytes (needs temporary translator).
+      TypeTranslator type_translator(&reader, active_class_, true);
+      auto& type_arguments =
+          TypeArguments::Handle(Z, TypeArguments::New(1, Heap::kOld));
+      AbstractType& type = type_translator.BuildType();
+      type_arguments.SetTypeAt(0, type);
+      // Instantiate class.
+      type = Type::New(list_class, type_arguments, TokenPosition::kNoSource);
+      type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
+                                          ClassFinalizer::kCanonicalize);
+      type_arguments = type.arguments();
+      // Fill array with constant elements.
+      const intptr_t length = reader.ReadUInt();
+      const Array& array =
+          Array::Handle(Z, ImmutableArray::New(length, Heap::kOld));
+      array.SetTypeArguments(type_arguments);
+      Instance& constant = Instance::Handle(Z);
+      for (intptr_t j = 0; j < length; ++j) {
+        // Recurse into lazily evaluating all "sub" constants
+        // needed to evaluate the current constant.
+        const intptr_t entry_offset = reader.ReadUInt();
+        ASSERT(entry_offset < constant_offset);  // DAG!
+        constant = ReadConstant(entry_offset);
+        array.SetAt(j, constant);
+      }
+      instance = array.raw();
+      break;
+    }
+    case kInstanceConstant: {
+      const NameIndex index = reader.ReadCanonicalNameReference();
+      const auto& klass = Class::Handle(Z, H.LookupClassByKernelClass(index));
+      if (!klass.is_declaration_loaded() && !klass.is_declared_in_bytecode()) {
+        FATAL1(
+            "Trying to evaluate an instance constant whose references class "
+            "%s is not loaded yet.",
+            klass.ToCString());
+      }
+      const auto& obj = Object::Handle(Z, klass.EnsureIsFinalized(H.thread()));
+      ASSERT(obj.IsNull());
+      instance = Instance::New(klass, Heap::kOld);
+      // Build type from the raw bytes (needs temporary translator).
+      TypeTranslator type_translator(&reader, active_class_, true);
+      const intptr_t number_of_type_arguments = reader.ReadUInt();
+      if (klass.NumTypeArguments() > 0) {
+        auto& type_arguments = TypeArguments::Handle(
+            Z, TypeArguments::New(number_of_type_arguments, Heap::kOld));
+        for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
+          type_arguments.SetTypeAt(j, type_translator.BuildType());
+        }
+        // Instantiate class.
+        auto& type = AbstractType::Handle(
+            Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
+        type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
+                                            ClassFinalizer::kCanonicalize);
+        type_arguments = type.arguments();
+        instance.SetTypeArguments(type_arguments);
+      } else {
+        ASSERT(number_of_type_arguments == 0);
+      }
+      // Set the fields.
+      const intptr_t number_of_fields = reader.ReadUInt();
+      Field& field = Field::Handle(Z);
+      Instance& constant = Instance::Handle(Z);
+      for (intptr_t j = 0; j < number_of_fields; ++j) {
+        field = H.LookupFieldByKernelField(reader.ReadCanonicalNameReference());
+        // Recurse into lazily evaluating all "sub" constants
+        // needed to evaluate the current constant.
+        const intptr_t entry_offset = reader.ReadUInt();
+        ASSERT(entry_offset < constant_offset);  // DAG!
+        constant = ReadConstant(entry_offset);
+        instance.SetField(field, constant);
+      }
+      break;
+    }
+    case kPartialInstantiationConstant: {
+      // Recurse into lazily evaluating the "sub" constant
+      // needed to evaluate the current constant.
+      const intptr_t entry_offset = reader.ReadUInt();
+      ASSERT(entry_offset < constant_offset);  // DAG!
+      const auto& constant = Instance::Handle(Z, ReadConstant(entry_offset));
+      ASSERT(!constant.IsNull());
+
+      // Build type from the raw bytes (needs temporary translator).
+      TypeTranslator type_translator(&reader, active_class_, true);
+      const intptr_t number_of_type_arguments = reader.ReadUInt();
+      ASSERT(number_of_type_arguments > 0);
+      auto& type_arguments = TypeArguments::Handle(
+          Z, TypeArguments::New(number_of_type_arguments, Heap::kOld));
+      for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
+        type_arguments.SetTypeAt(j, type_translator.BuildType());
+      }
+      type_arguments = type_arguments.Canonicalize();
+      // Make a copy of the old closure, and set delayed type arguments.
+      Closure& closure = Closure::Handle(Z, Closure::RawCast(constant.raw()));
+      Function& function = Function::Handle(Z, closure.function());
+      const auto& type_arguments2 =
+          TypeArguments::Handle(Z, closure.instantiator_type_arguments());
+      // The function type arguments are used for type parameters from enclosing
+      // closures. Though inner closures cannot be constants. We should
+      // therefore see `null here.
+      ASSERT(closure.function_type_arguments() == TypeArguments::null());
+      Context& context = Context::Handle(Z, closure.context());
+      instance = Closure::New(type_arguments2, Object::null_type_arguments(),
+                              type_arguments, function, context, Heap::kOld);
+      break;
+    }
+    case kTearOffConstant: {
+      const NameIndex index = reader.ReadCanonicalNameReference();
+      Function& function =
+          Function::Handle(Z, H.LookupStaticMethodByKernelProcedure(index));
+      function = function.ImplicitClosureFunction();
+      instance = function.ImplicitStaticClosure();
+      break;
+    }
+    case kTypeLiteralConstant: {
+      // Build type from the raw bytes (needs temporary translator).
+      TypeTranslator type_translator(&reader, active_class_, true);
+      instance = type_translator.BuildType().raw();
+      break;
+    }
+    default:
+      // Set literals (kSetConstant) are currently desugared in the frontend
+      // and will not reach the VM. See http://dartbug.com/35124 for some
+      // discussion. Map constants (kMapConstant ) are already lowered to
+      // InstanceConstant or ListConstant. We should never see unevaluated
+      // constants (kUnevaluatedConstant) in the constant table, they should
+      // have been fully evaluated before we get them.
+      H.ReportError(script_, TokenPosition::kNoSource,
+                    "Cannot lazily read constant: unexpected kernel tag (%" Pd
+                    ")",
+                    constant_tag);
+  }
+  return H.Canonicalize(instance);
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/constant_reader.h b/runtime/vm/compiler/frontend/constant_reader.h
new file mode 100644
index 0000000..c5a7574
--- /dev/null
+++ b/runtime/vm/compiler/frontend/constant_reader.h
@@ -0,0 +1,84 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_READER_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_READER_H_
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/hash_table.h"
+#include "vm/object.h"
+
+namespace dart {
+namespace kernel {
+
+// Reads and caches constants from the kernel constant pool.
+class ConstantReader {
+ public:
+  ConstantReader(KernelReaderHelper* helper, ActiveClass* active_class);
+
+  virtual ~ConstantReader() {}
+
+  RawInstance* ReadConstantExpression();
+  RawObject* ReadAnnotations();
+
+  // Peeks to see if constant at the given offset will evaluate to
+  // instance of the given clazz.
+  bool IsInstanceConstant(intptr_t constant_offset, const Class& clazz);
+
+  // Reads a constant at the given offset (possibly by recursing
+  // into sub-constants).
+  RawInstance* ReadConstant(intptr_t constant_offset);
+
+ private:
+  RawInstance* ReadConstantInternal(intptr_t constant_offset);
+
+  KernelReaderHelper* helper_;
+  Zone* zone_;
+  TranslationHelper& translation_helper_;
+  ActiveClass* active_class_;
+  const Script& script_;
+  Instance& result_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConstantReader);
+};
+
+class KernelConstMapKeyEqualsTraits : public AllStatic {
+ public:
+  static const char* Name() { return "KernelConstMapKeyEqualsTraits"; }
+  static bool ReportStats() { return false; }
+
+  static bool IsMatch(const Object& a, const Object& b) {
+    const Smi& key1 = Smi::Cast(a);
+    const Smi& key2 = Smi::Cast(b);
+    return (key1.Value() == key2.Value());
+  }
+  static bool IsMatch(const intptr_t key1, const Object& b) {
+    return KeyAsSmi(key1) == Smi::Cast(b).raw();
+  }
+  static uword Hash(const Object& obj) {
+    const Smi& key = Smi::Cast(obj);
+    return HashValue(key.Value());
+  }
+  static uword Hash(const intptr_t key) {
+    return HashValue(Smi::Value(KeyAsSmi(key)));
+  }
+  static RawObject* NewKey(const intptr_t key) { return KeyAsSmi(key); }
+
+ private:
+  static uword HashValue(intptr_t pos) { return pos % (Smi::kMaxValue - 13); }
+
+  static RawSmi* KeyAsSmi(const intptr_t key) {
+    ASSERT(key >= 0);
+    return Smi::New(key);
+  }
+};
+typedef UnorderedHashMap<KernelConstMapKeyEqualsTraits> KernelConstantsMap;
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_READER_H_
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b093215..ca71934 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -52,10 +52,9 @@
   Fragment body(normal_entry);
   body += B->CheckStackOverflowInPrologue(field_helper.position_);
   if (field_helper.IsConst()) {
-    // this will (potentially) read the initializer, but reset the position.
-    body += Constant(Instance::ZoneHandle(
-        Z, constant_evaluator_.EvaluateExpression(ReaderOffset())));
-    SkipExpression();  // read the initializer.
+    // This will read the initializer.
+    body += Constant(
+        Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression()));
   } else {
     body += BuildExpression();  // read initializer.
   }
@@ -78,8 +77,8 @@
 
   ASSERT(initializer_tag == kSomething);
 
-  Instance& value = Instance::Handle(
-      Z, constant_evaluator_.EvaluateExpression(ReaderOffset()));
+  Instance& value =
+      Instance::Handle(Z, constant_reader_.ReadConstantExpression());
   field.SetStaticValue(value);
 }
 
@@ -114,11 +113,9 @@
         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
         Tag tag = ReadTag();  // read (first part of) initializer.
         if (tag == kSomething) {
-          // this will (potentially) read the initializer,
-          // but reset the position.
+          // This will read the initializer.
           default_value = &Instance::ZoneHandle(
-              Z, constant_evaluator_.EvaluateExpression(ReaderOffset()));
-          SkipExpression();  // read (actual) initializer.
+              Z, constant_reader_.ReadConstantExpression());
         } else {
           default_value = &Instance::ZoneHandle(Z, Instance::null());
         }
@@ -142,11 +139,9 @@
         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
         Tag tag = ReadTag();  // read (first part of) initializer.
         if (tag == kSomething) {
-          // this will (potentially) read the initializer,
-          // but reset the position.
+          // This will read the initializer.
           default_value = &Instance::ZoneHandle(
-              Z, constant_evaluator_.EvaluateExpression(ReaderOffset()));
-          SkipExpression();  // read (actual) initializer.
+              Z, constant_reader_.ReadConstantExpression());
         } else {
           default_value = &Instance::ZoneHandle(Z, Instance::null());
         }
@@ -1207,13 +1202,9 @@
     case kDirectMethodInvocation:
       return BuildDirectMethodInvocation(position);
     case kStaticInvocation:
-      return BuildStaticInvocation(false, position);
-    case kConstStaticInvocation:
-      return BuildStaticInvocation(true, position);
+      return BuildStaticInvocation(position);
     case kConstructorInvocation:
-      return BuildConstructorInvocation(false, position);
-    case kConstConstructorInvocation:
-      return BuildConstructorInvocation(true, position);
+      return BuildConstructorInvocation(position);
     case kNot:
       return BuildNot(position);
     case kNullCheck:
@@ -1224,21 +1215,10 @@
       return BuildConditionalExpression(position);
     case kStringConcatenation:
       return BuildStringConcatenation(position);
-    case kListConcatenation:
-    case kSetConcatenation:
-    case kMapConcatenation:
-    case kInstanceCreation:
-    case kFileUriExpression:
-      // Collection concatenation, instance creation operations and
-      // in-expression URI changes are removed by the constant evaluator.
-      UNREACHABLE();
-      break;
     case kIsExpression:
       return BuildIsExpression(position);
     case kAsExpression:
       return BuildAsExpression(position);
-    case kSymbolLiteral:
-      return BuildSymbolLiteral(position);
     case kTypeLiteral:
       return BuildTypeLiteral(position);
     case kThisExpression:
@@ -1248,19 +1228,14 @@
     case kThrow:
       return BuildThrow(position);
     case kListLiteral:
-      return BuildListLiteral(false, position);
-    case kConstListLiteral:
-      return BuildListLiteral(true, position);
+      return BuildListLiteral(position);
     case kSetLiteral:
-    case kConstSetLiteral:
       // Set literals are currently desugared in the frontend and will not
       // reach the VM. See http://dartbug.com/35124 for discussion.
       UNREACHABLE();
       break;
     case kMapLiteral:
-      return BuildMapLiteral(false, position);
-    case kConstMapLiteral:
-      return BuildMapLiteral(true, position);
+      return BuildMapLiteral(position);
     case kFunctionExpression:
       return BuildFunctionExpression();
     case kLet:
@@ -1287,14 +1262,28 @@
       return BuildNullLiteral(position);
     case kConstantExpression:
       return BuildConstantExpression(position, tag);
-    case kDeprecated_ConstantExpression:
-      return BuildConstantExpression(position, tag);
     case kInstantiation:
       return BuildPartialTearoffInstantiation(position);
     case kLoadLibrary:
     case kCheckLibraryIsLoaded:
       ReadUInt();  // skip library index
       return BuildFutureNullValue(position);
+    case kConstStaticInvocation:
+    case kConstConstructorInvocation:
+    case kConstListLiteral:
+    case kConstSetLiteral:
+    case kConstMapLiteral:
+    case kSymbolLiteral:
+      // Const invocations and const literals are removed by the
+      // constant evaluator.
+    case kListConcatenation:
+    case kSetConcatenation:
+    case kMapConcatenation:
+    case kInstanceCreation:
+    case kFileUriExpression:
+      // Collection concatenation, instance creation operations and
+      // in-expression URI changes are internal to the front end and
+      // removed by the constant evaluator.
     default:
       ReportUnexpectedTag("expression", tag);
       UNREACHABLE();
@@ -1376,10 +1365,7 @@
 }
 
 Nullability KernelReaderHelper::ReadNullability() {
-  if (translation_helper_.info().kernel_binary_version() >= 28) {
-    return reader_.ReadNullability();
-  }
-  return kLegacy;
+  return reader_.ReadNullability();
 }
 
 Variance KernelReaderHelper::ReadVariance() {
@@ -2609,14 +2595,21 @@
     const Field& field =
         Field::ZoneHandle(Z, H.LookupFieldByKernelField(target));
     if (field.is_const()) {
-      return Constant(Instance::ZoneHandle(
-          Z, constant_evaluator_.EvaluateExpression(offset)));
+      // Since the CFE inlines all references to const variables and fields,
+      // it never emits a StaticGet of a const field.
+      // This situation only arises because of the static const fields in
+      // the ClassID class, which are generated internally in the VM
+      // during loading. See also Class::InjectCIDFields.
+      ASSERT(Class::Handle(field.Owner()).library() ==
+                 Library::InternalLibrary() &&
+             Class::Handle(field.Owner()).Name() == Symbols::ClassID().raw());
+      return Constant(Instance::ZoneHandle(Z, field.StaticValue()));
     } else {
       const Class& owner = Class::Handle(Z, field.Owner());
       const String& getter_name = H.DartGetterName(target);
       const Function& getter =
           Function::ZoneHandle(Z, owner.LookupStaticFunction(getter_name));
-      if (getter.IsNull() || !field.has_initializer()) {
+      if (getter.IsNull() || !field.has_nontrivial_initializer()) {
         Fragment instructions = Constant(field);
         return instructions + LoadStaticField();
       } else {
@@ -2632,8 +2625,11 @@
       return StaticCall(position, function, 0, Array::null_array(),
                         ICData::kStatic, &result_type);
     } else if (H.IsMethod(target)) {
-      return Constant(Instance::ZoneHandle(
-          Z, constant_evaluator_.EvaluateExpression(offset)));
+      const auto& closure_function =
+          Function::Handle(Z, function.ImplicitClosureFunction());
+      const auto& static_closure =
+          Instance::Handle(Z, closure_function.ImplicitStaticClosure());
+      return Constant(Instance::ZoneHandle(Z, H.Canonicalize(static_closure)));
     } else {
       UNIMPLEMENTED();
     }
@@ -3096,17 +3092,7 @@
   }
 }
 
-Fragment StreamingFlowGraphBuilder::BuildStaticInvocation(bool is_const,
-                                                          TokenPosition* p) {
-  if (is_const) {
-    const intptr_t offset = ReaderOffset() - 1;           // Include the tag.
-    (p != NULL) ? * p = ReadPosition() : ReadPosition();  // read position.
-
-    SetOffset(offset);
-    SkipExpression();  // read past this StaticInvocation.
-    return Constant(constant_evaluator_.EvaluateStaticInvocation(offset));
-  }
-
+Fragment StreamingFlowGraphBuilder::BuildStaticInvocation(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;  // Include the tag.
   TokenPosition position = ReadPosition();     // read position.
   if (p != NULL) *p = position;
@@ -3236,17 +3222,7 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildConstructorInvocation(
-    bool is_const,
     TokenPosition* p) {
-  if (is_const) {
-    intptr_t offset = ReaderOffset() - 1;                 // Include the tag.
-    (p != NULL) ? * p = ReadPosition() : ReadPosition();  // read position.
-
-    SetOffset(offset);
-    SkipExpression();  // read past this ConstructorInvocation.
-    return Constant(constant_evaluator_.EvaluateConstructorInvocation(offset));
-  }
-
   TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
@@ -3579,16 +3555,6 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildSymbolLiteral(
-    TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  intptr_t offset = ReaderOffset() - 1;  // EvaluateExpression needs the tag.
-  SkipStringReference();                 // read index into string table.
-  return Constant(
-      Instance::ZoneHandle(Z, constant_evaluator_.EvaluateExpression(offset)));
-}
-
 Fragment StreamingFlowGraphBuilder::BuildTypeLiteral(TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
 
@@ -3651,17 +3617,7 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildListLiteral(bool is_const,
-                                                     TokenPosition* p) {
-  if (is_const) {
-    intptr_t offset = ReaderOffset() - 1;                 // Include the tag.
-    (p != NULL) ? * p = ReadPosition() : ReadPosition();  // read position.
-
-    SetOffset(offset);
-    SkipExpression();  // read past the ListLiteral.
-    return Constant(constant_evaluator_.EvaluateListLiteral(offset));
-  }
-
+Fragment StreamingFlowGraphBuilder::BuildListLiteral(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
@@ -3704,17 +3660,7 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildMapLiteral(bool is_const,
-                                                    TokenPosition* p) {
-  if (is_const) {
-    intptr_t offset = ReaderOffset() - 1;  // Include the tag.
-    (p != NULL) ? * p = ReadPosition() : ReadPosition();
-
-    SetOffset(offset);
-    SkipExpression();  // Read past the MapLiteral.
-    return Constant(constant_evaluator_.EvaluateMapLiteral(offset));
-  }
-
+Fragment StreamingFlowGraphBuilder::BuildMapLiteral(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
@@ -3883,8 +3829,8 @@
   }
   if (position != nullptr) *position = p;
   const intptr_t constant_offset = ReadUInt();
-  Fragment result = Constant(Object::ZoneHandle(
-      Z, constant_evaluator_.EvaluateConstantExpression(constant_offset)));
+  Fragment result = Constant(
+      Object::ZoneHandle(Z, constant_reader_.ReadConstant(constant_offset)));
   return result;
 }
 
@@ -4456,16 +4402,6 @@
     if (i == default_case) {
       ASSERT(i == (case_count - 1));
 
-      // Evaluate the conditions for the default [SwitchCase] just for the
-      // purpose of potentially triggering a compile-time error.
-
-      for (intptr_t j = 0; j < expression_count; ++j) {
-        ReadPosition();  // read jth position.
-        // this reads the expression, but doesn't skip past it.
-        constant_evaluator_.EvaluateExpression(ReaderOffset());
-        SkipExpression();  // read jth expression.
-      }
-
       if (block.HadJumper(i)) {
         // There are several branches to the body, so we will make a goto to
         // the join block (and prepend a join instruction to the real body).
@@ -4489,9 +4425,8 @@
         TargetEntryInstr* otherwise;
 
         TokenPosition position = ReadPosition();  // read jth position.
-        current_instructions += Constant(Instance::ZoneHandle(
-            Z, constant_evaluator_.EvaluateExpression(ReaderOffset())));
-        SkipExpression();  // read jth expression.
+        current_instructions += Constant(
+            Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression()));
         current_instructions += PushArgument();
         current_instructions += LoadLocal(scopes()->switch_variable);
         current_instructions += PushArgument();
@@ -4941,12 +4876,11 @@
     instructions += NullConstant();
   } else {
     if (helper.IsConst()) {
-      const Instance& constant_value = Instance::ZoneHandle(
-          Z, constant_evaluator_.EvaluateExpression(
-                 ReaderOffset()));  // read initializer form current position.
+      // Read const initializer form current position.
+      const Instance& constant_value =
+          Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression());
       variable->SetConstValue(constant_value);
       instructions += Constant(constant_value);
-      SkipExpression();  // skip initializer.
     } else {
       // Initializer
       instructions += BuildExpression();  // read (actual) initializer.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 830ec2a..ba3c765 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -8,7 +8,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 #include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/frontend/constant_evaluator.h"
+#include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/frontend/scope_builder.h"
@@ -37,10 +37,7 @@
         flow_graph_builder_(flow_graph_builder),
         active_class_(&flow_graph_builder->active_class_),
         type_translator_(this, active_class_, /* finalize= */ true),
-        constant_evaluator_(this,
-                            &type_translator_,
-                            active_class_,
-                            flow_graph_builder),
+        constant_reader_(this, active_class_),
         bytecode_metadata_helper_(this, active_class_),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
@@ -299,8 +296,8 @@
   Fragment BuildMethodInvocation(TokenPosition* position);
   Fragment BuildDirectMethodInvocation(TokenPosition* position);
   Fragment BuildSuperMethodInvocation(TokenPosition* position);
-  Fragment BuildStaticInvocation(bool is_const, TokenPosition* position);
-  Fragment BuildConstructorInvocation(bool is_const, TokenPosition* position);
+  Fragment BuildStaticInvocation(TokenPosition* position);
+  Fragment BuildConstructorInvocation(TokenPosition* position);
   Fragment BuildNot(TokenPosition* position);
   Fragment BuildNullCheck(TokenPosition* position);
   Fragment BuildLogicalExpression(TokenPosition* position);
@@ -310,13 +307,12 @@
   Fragment BuildStringConcatenation(TokenPosition* position);
   Fragment BuildIsExpression(TokenPosition* position);
   Fragment BuildAsExpression(TokenPosition* position);
-  Fragment BuildSymbolLiteral(TokenPosition* position);
   Fragment BuildTypeLiteral(TokenPosition* position);
   Fragment BuildThisExpression(TokenPosition* position);
   Fragment BuildRethrow(TokenPosition* position);
   Fragment BuildThrow(TokenPosition* position);
-  Fragment BuildListLiteral(bool is_const, TokenPosition* position);
-  Fragment BuildMapLiteral(bool is_const, TokenPosition* position);
+  Fragment BuildListLiteral(TokenPosition* position);
+  Fragment BuildMapLiteral(TokenPosition* position);
   Fragment BuildFunctionExpression();
   Fragment BuildLet(TokenPosition* position);
   Fragment BuildBlockExpression();
@@ -365,7 +361,7 @@
   FlowGraphBuilder* flow_graph_builder_;
   ActiveClass* const active_class_;
   TypeTranslator type_translator_;
-  ConstantEvaluator constant_evaluator_;
+  ConstantReader constant_reader_;
   BytecodeMetadataHelper bytecode_metadata_helper_;
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 871f1f8..bf79b16 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -303,9 +303,7 @@
       // read string reference (i.e. named_parameters[i].name).
       CalculateStringReferenceFingerprint();
       CalculateDartTypeFingerprint();  // read named_parameters[i].type.
-      if (translation_helper_.info().kernel_binary_version() >= 29) {
-        BuildHash(ReadFlags());  // read flags.
-      }
+      BuildHash(ReadFlags());          // read flags.
     }
   }
 
@@ -433,13 +431,11 @@
       CalculateArgumentsFingerprint();      // read arguments.
       return;
     case kStaticInvocation:
-    case kConstStaticInvocation:
       ReadPosition();                       // read position.
       CalculateCanonicalNameFingerprint();  // read target_reference.
       CalculateArgumentsFingerprint();      // read arguments.
       return;
     case kConstructorInvocation:
-    case kConstConstructorInvocation:
       ReadPosition();                       // read position.
       CalculateCanonicalNameFingerprint();  // read target_reference.
       CalculateArgumentsFingerprint();      // read arguments.
@@ -466,15 +462,6 @@
       ReadPosition();                           // read position.
       CalculateListOfExpressionsFingerprint();  // read list of expressions.
       return;
-    case kListConcatenation:
-    case kSetConcatenation:
-    case kMapConcatenation:
-    case kInstanceCreation:
-    case kFileUriExpression:
-      // Collection concatenation, instance creation operations and
-      // in-expression URI changes are removed by the constant evaluator.
-      UNREACHABLE();
-      break;
     case kIsExpression:
       ReadPosition();                    // read position.
       CalculateExpressionFingerprint();  // read operand.
@@ -486,9 +473,6 @@
       CalculateExpressionFingerprint();  // read operand.
       CalculateDartTypeFingerprint();    // read type.
       return;
-    case kSymbolLiteral:
-      CalculateStringReferenceFingerprint();  // read index into string table.
-      return;
     case kTypeLiteral:
       CalculateDartTypeFingerprint();  // read type.
       return;
@@ -502,19 +486,16 @@
       CalculateExpressionFingerprint();  // read expression.
       return;
     case kListLiteral:
-    case kConstListLiteral:
       ReadPosition();                           // read position.
       CalculateDartTypeFingerprint();           // read type.
       CalculateListOfExpressionsFingerprint();  // read list of expressions.
       return;
     case kSetLiteral:
-    case kConstSetLiteral:
       // Set literals are currently desugared in the frontend and will not
       // reach the VM. See http://dartbug.com/35124 for discussion.
       UNREACHABLE();
       return;
-    case kMapLiteral:
-    case kConstMapLiteral: {
+    case kMapLiteral: {
       ReadPosition();                           // read position.
       CalculateDartTypeFingerprint();           // read type.
       CalculateDartTypeFingerprint();           // read value type.
@@ -573,13 +554,26 @@
       SkipDartType();
       SkipConstantReference();
       return;
-    case kDeprecated_ConstantExpression:
-      SkipConstantReference();
-      return;
     case kLoadLibrary:
     case kCheckLibraryIsLoaded:
       ReadUInt();  // skip library index
       return;
+    case kConstStaticInvocation:
+    case kConstConstructorInvocation:
+    case kConstListLiteral:
+    case kConstSetLiteral:
+    case kConstMapLiteral:
+    case kSymbolLiteral:
+      // Const invocations and const literals are removed by the
+      // constant evaluator.
+    case kListConcatenation:
+    case kSetConcatenation:
+    case kMapConcatenation:
+    case kInstanceCreation:
+    case kFileUriExpression:
+      // Collection concatenation, instance creation operations and
+      // in-expression URI changes are internal to the front end and
+      // removed by the constant evaluator.
     default:
       ReportUnexpectedTag("expression", tag);
       UNREACHABLE();
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 973f4e9..a3877ad 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -411,6 +411,188 @@
   }
 }
 
+Fragment FlowGraphBuilder::LoadLateInstanceField(const Field& field,
+                                                 LocalVariable* instance) {
+  Fragment instructions;
+  TargetEntryInstr *is_uninitialized, *is_initialized;
+  const TokenPosition position = field.token_pos();
+
+  // Check whether the field has been initialized already.
+  instructions += LoadLocal(instance);
+  instructions += LoadField(field);
+  LocalVariable* temp = MakeTemporary();
+  instructions += LoadLocal(temp);
+  instructions += Constant(Object::sentinel());
+  instructions += BranchIfStrictEqual(&is_uninitialized, &is_initialized);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+
+  if (field.has_initializer()) {
+    // has_nontrivial_initializer is required for EnsureInitializerFunction. The
+    // trivial initializer case is treated as a normal field.
+    ASSERT(field.has_nontrivial_initializer());
+
+    // If the field isn't initialized, call the initializer and set the field.
+    Function& init_function =
+        Function::ZoneHandle(Z, field.EnsureInitializerFunction());
+    Fragment initialize(is_uninitialized);
+    initialize += LoadLocal(instance);  // For the store.
+    initialize += LoadLocal(instance);  // For the init call.
+    initialize += PushArgument();
+    initialize += StaticCall(position, init_function,
+                             /* argument_count = */ 1, ICData::kStatic);
+    initialize += StoreLocal(position, temp);
+    initialize += StoreInstanceFieldGuarded(
+        field, StoreInstanceFieldInstr::Kind::kInitializing);
+    initialize += Goto(join);
+  } else {
+    // The field has no initializer, so throw a LateInitializationError.
+    Fragment initialize(is_uninitialized);
+    initialize += ThrowLateInitializationError(
+        position, String::ZoneHandle(Z, field.name()));
+    initialize += Goto(join);
+  }
+
+  {
+    // Already initialized, so there's nothing to do.
+    Fragment already_initialized(is_initialized);
+    already_initialized += Goto(join);
+  }
+
+  // Now that the field has been initialized, load it.
+  instructions = Fragment(instructions.entry, join);
+
+  return instructions;
+}
+
+Fragment FlowGraphBuilder::LoadLateStaticField(const Field& field) {
+  Fragment instructions;
+
+  // Check whether the field has been initialized already.
+  TargetEntryInstr *is_uninitialized, *is_initialized;
+  const TokenPosition position = field.token_pos();
+  instructions += Constant(field);
+  instructions += LoadStaticField();
+  LocalVariable* temp = MakeTemporary();
+  instructions += LoadLocal(temp);
+  instructions += Constant(Object::sentinel());
+  instructions += BranchIfStrictEqual(&is_uninitialized, &is_initialized);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+
+  if (field.has_initializer()) {
+    // has_nontrivial_initializer is required for EnsureInitializerFunction. The
+    // trivial initializer case is treated as a normal field.
+    ASSERT(field.has_nontrivial_initializer());
+
+    // If the field isn't initialized, call the initializer and set the field.
+    Function& init_function =
+        Function::ZoneHandle(Z, field.EnsureInitializerFunction());
+    Fragment initialize(is_uninitialized);
+    initialize += StaticCall(position, init_function,
+                             /* argument_count = */ 0, ICData::kStatic);
+    initialize += StoreLocal(position, temp);
+    initialize += StoreStaticField(position, field);
+    initialize += Goto(join);
+  } else {
+    // The field has no initializer, so throw a LateInitializationError.
+    Fragment initialize(is_uninitialized);
+    initialize += ThrowLateInitializationError(
+        position, String::ZoneHandle(Z, field.name()));
+    initialize += Goto(join);
+  }
+
+  {
+    // Already initialized, so there's nothing to do.
+    Fragment already_initialized(is_initialized);
+    already_initialized += Goto(join);
+  }
+
+  // Now that the field has been initialized, load it.
+  instructions = Fragment(instructions.entry, join);
+
+  return instructions;
+}
+
+Fragment FlowGraphBuilder::StoreLateInstanceField(const Field& field,
+                                                  LocalVariable* instance,
+                                                  LocalVariable* setter_value) {
+  // Implicit setters for non-final late fields are the same as non-late fields.
+  if (!field.is_final()) {
+    return StoreInstanceFieldGuarded(field,
+                                     StoreInstanceFieldInstr::Kind::kOther);
+  }
+
+  // If a late final field has an initializer, the setter always throws. This
+  // case is typically caught as a compile error, but there are ways to avoid
+  // that error, so we also need this runtime error.
+  const TokenPosition position = field.token_pos();
+  if (field.has_initializer()) {
+    Fragment instructions;
+    instructions += Drop();
+    instructions += Drop();
+    instructions += ThrowLateInitializationError(
+        position, String::ZoneHandle(Z, field.name()));
+    return instructions;
+  }
+
+  // Late final fields with no initializer can be written to once.
+  Fragment instructions;
+  TargetEntryInstr *is_uninitialized, *is_initialized;
+
+  // Check whether the field has been initialized already.
+  instructions += Drop();
+  instructions += LoadField(field);
+  instructions += Constant(Object::sentinel());
+  instructions += BranchIfStrictEqual(&is_uninitialized, &is_initialized);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+
+  {
+    // If the field isn't initialized, set it to the new value.
+    Fragment initialize(is_uninitialized);
+    initialize += LoadLocal(instance);
+    initialize += LoadLocal(setter_value);
+    initialize +=
+        StoreInstanceFieldGuarded(field, StoreInstanceFieldInstr::Kind::kOther);
+    initialize += Goto(join);
+  }
+
+  {
+    // If the field is already initialized, throw a LateInitializationError.
+    Fragment already_initialized(is_initialized);
+    already_initialized += ThrowLateInitializationError(
+        position, String::ZoneHandle(Z, field.name()));
+    already_initialized += Goto(join);
+  }
+
+  return Fragment(instructions.entry, join);
+}
+
+Fragment FlowGraphBuilder::ThrowLateInitializationError(TokenPosition position,
+                                                        const String& name) {
+  const Class& klass = Class::ZoneHandle(
+      Z, Library::LookupCoreClass(Symbols::LateInitializationError()));
+  ASSERT(!klass.IsNull());
+
+  const Function& throw_new =
+      Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate(
+                                  H.DartSymbolObfuscate("_throwNew")));
+  ASSERT(!throw_new.IsNull());
+
+  Fragment instructions;
+
+  // Call _LateInitializationError._throwNew.
+  instructions += Constant(name);
+  instructions += PushArgument();  // name
+
+  instructions += StaticCall(position, throw_new,
+                             /* argument_count = */ 1, ICData::kStatic);
+  instructions += Drop();
+
+  return instructions;
+}
+
 Fragment FlowGraphBuilder::InitInstanceField(const Field& field) {
   ASSERT(field.is_instance());
   ASSERT(field.needs_load_guard());
@@ -2466,6 +2648,9 @@
     field = function.accessor_field();
   }
 
+  const Class& owner = Class::ZoneHandle(Z, field.Owner());
+  const bool lib_is_nnbd = Library::ZoneHandle(Z, owner.library()).is_nnbd();
+
   graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
 
@@ -2490,8 +2675,13 @@
                               AssertAssignableInstr::kParameterCheck);
     }
     if (is_method) {
-      body += StoreInstanceFieldGuarded(field,
-                                        StoreInstanceFieldInstr::Kind::kOther);
+      if (field.is_late()) {
+        body += StoreLateInstanceField(
+            field, parsed_function_->ParameterVariable(0), setter_value);
+      } else {
+        body += StoreInstanceFieldGuarded(
+            field, StoreInstanceFieldInstr::Kind::kOther);
+      }
     } else {
       body += StoreStaticField(TokenPosition::kNoSource, field);
     }
@@ -2505,8 +2695,13 @@
       // TODO(rmacnak): Type check.
     }
 #endif
-    body += LoadLocal(parsed_function_->ParameterVariable(0));
-    body += LoadField(field);
+    if (field.is_late() && !field.has_trivial_initializer()) {
+      body +=
+          LoadLateInstanceField(field, parsed_function_->ParameterVariable(0));
+    } else {
+      body += LoadLocal(parsed_function_->ParameterVariable(0));
+      body += LoadField(field);
+    }
   } else if (field.is_const()) {
     // If the parser needs to know the value of an uninitialized constant field
     // it will set the value to the transition sentinel (used to detect circular
@@ -2519,11 +2714,18 @@
   } else {
     // The field always has an initializer because static fields without
     // initializers are initialized eagerly and do not have implicit getters.
-    ASSERT(field.has_initializer());
-    body += Constant(field);
-    body += InitStaticField(field);
-    body += Constant(field);
-    body += LoadStaticField();
+    if (lib_is_nnbd) {
+      // In NNBD mode, static fields act like late fields regardless of whether
+      // they're marked late. The only behavioural difference is in compile
+      // errors that are handled by the front end.
+      body += LoadLateStaticField(field);
+    } else {
+      ASSERT(field.has_nontrivial_initializer());
+      body += Constant(field);
+      body += InitStaticField(field);
+      body += Constant(field);
+      body += LoadStaticField();
+    }
   }
   body += Return(TokenPosition::kNoSource);
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index fc461c0..434106f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -132,6 +132,11 @@
 
   Fragment RethrowException(TokenPosition position, int catch_try_index);
   Fragment LoadLocal(LocalVariable* variable);
+  Fragment LoadLateInstanceField(const Field& field, LocalVariable* instance);
+  Fragment LoadLateStaticField(const Field& field);
+  Fragment StoreLateInstanceField(const Field& field,
+                                  LocalVariable* instance,
+                                  LocalVariable* setter_value);
   Fragment InitInstanceField(const Field& field);
   Fragment InitStaticField(const Field& field);
   Fragment NativeCall(const String* name, const Function* function);
@@ -155,6 +160,8 @@
   Fragment StringInterpolateSingle(TokenPosition position);
   Fragment ThrowTypeError();
   Fragment ThrowNoSuchMethodError();
+  Fragment ThrowLateInitializationError(TokenPosition position,
+                                        const String& name);
   Fragment BuildImplicitClosureCreation(const Function& target);
 
   Fragment EvaluateAssertion();
@@ -384,7 +391,6 @@
 
   friend class BreakableBlock;
   friend class CatchBlock;
-  friend class ConstantEvaluator;
   friend class ProgramState;
   friend class StreamingFlowGraphBuilder;
   friend class SwitchBlock;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index bad19e4..f02eb50 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1009,11 +1009,7 @@
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kFlags:
-      if (helper_->translation_helper_.info().kernel_binary_version() >= 29) {
-        flags_ = helper_->ReadUInt();
-      } else {
-        flags_ = helper_->ReadFlags();
-      }
+      flags_ = helper_->ReadUInt();
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kName:
@@ -1081,11 +1077,7 @@
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kFlags:
-      if (helper_->translation_helper_.info().kernel_binary_version() >= 29) {
-        flags_ = helper_->ReadUInt();
-      } else {
-        flags_ = helper_->ReadFlags();
-      }
+      flags_ = helper_->ReadUInt();
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kName:
@@ -1317,10 +1309,8 @@
       FALL_THROUGH;
     }
     case kLanguageVersion: {
-      if (binary_version_ >= 27) {
-        helper_->ReadUInt();  // Read major language version.
-        helper_->ReadUInt();  // Read minor language version.
-      }
+      helper_->ReadUInt();  // Read major language version.
+      helper_->ReadUInt();  // Read minor language version.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     }
@@ -2043,9 +2033,7 @@
       // read string reference (i.e. named_parameters[i].name).
       SkipStringReference();
       SkipDartType();  // read named_parameters[i].type.
-      if (translation_helper_.info().kernel_binary_version() >= 29) {
-        SkipBytes(1);  // read flags
-      }
+      SkipBytes(1);    // read flags
     }
   }
 
@@ -2224,13 +2212,11 @@
       SkipArguments();               // read arguments.
       return;
     case kStaticInvocation:
-    case kConstStaticInvocation:
       ReadPosition();                // read position.
       SkipCanonicalNameReference();  // read procedure_reference.
       SkipArguments();               // read arguments.
       return;
     case kConstructorInvocation:
-    case kConstConstructorInvocation:
       ReadPosition();                // read position.
       SkipCanonicalNameReference();  // read target_reference.
       SkipArguments();               // read arguments.
@@ -2257,15 +2243,6 @@
       ReadPosition();           // read position.
       SkipListOfExpressions();  // read list of expressions.
       return;
-    case kListConcatenation:
-    case kSetConcatenation:
-    case kMapConcatenation:
-    case kInstanceCreation:
-    case kFileUriExpression:
-      // Collection concatenation, instance creation operations and
-      // in-expression URI changes are removed by the constant evaluator.
-      UNREACHABLE();
-      break;
     case kIsExpression:
       ReadPosition();    // read position.
       SkipExpression();  // read operand.
@@ -2277,9 +2254,6 @@
       SkipExpression();  // read operand.
       SkipDartType();    // read type.
       return;
-    case kSymbolLiteral:
-      SkipStringReference();  // read index into string table.
-      return;
     case kTypeLiteral:
       SkipDartType();  // read type.
       return;
@@ -2293,19 +2267,16 @@
       SkipExpression();  // read expression.
       return;
     case kListLiteral:
-    case kConstListLiteral:
       ReadPosition();           // read position.
       SkipDartType();           // read type.
       SkipListOfExpressions();  // read list of expressions.
       return;
     case kSetLiteral:
-    case kConstSetLiteral:
       // Set literals are currently desugared in the frontend and will not
       // reach the VM. See http://dartbug.com/35124 for discussion.
       UNREACHABLE();
       return;
-    case kMapLiteral:
-    case kConstMapLiteral: {
+    case kMapLiteral: {
       ReadPosition();                           // read position.
       SkipDartType();                           // read key type.
       SkipDartType();                           // read value type.
@@ -2360,13 +2331,26 @@
       SkipDartType();  // read type.
       SkipConstantReference();
       return;
-    case kDeprecated_ConstantExpression:
-      SkipConstantReference();
-      return;
     case kLoadLibrary:
     case kCheckLibraryIsLoaded:
       ReadUInt();  // skip library index
       return;
+    case kConstStaticInvocation:
+    case kConstConstructorInvocation:
+    case kConstListLiteral:
+    case kConstSetLiteral:
+    case kConstMapLiteral:
+    case kSymbolLiteral:
+      // Const invocations and const literals are removed by the
+      // constant evaluator.
+    case kListConcatenation:
+    case kSetConcatenation:
+    case kMapConcatenation:
+    case kInstanceCreation:
+    case kFileUriExpression:
+      // Collection concatenation, instance creation operations and
+      // in-expression URI changes are internal to the front end and
+      // removed by the constant evaluator.
     default:
       ReportUnexpectedTag("expression", tag);
       UNREACHABLE();
@@ -2929,10 +2913,8 @@
       // read string reference (i.e. named_parameters[i].name).
       String& name = H.DartSymbolObfuscate(helper_->ReadStringReference());
       BuildTypeInternal();  // read named_parameters[i].type.
-      if (translation_helper_.info().kernel_binary_version() >= 29) {
-        // TODO(markov): Store 'required' bit.
-        helper_->ReadFlags();  // read flags
-      }
+      // TODO(markov): Store 'required' bit.
+      helper_->ReadFlags();  // read flags
       parameter_types.SetAt(pos, result_);
       parameter_names.SetAt(pos, name);
     }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index de53d78..c17bd59 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1125,7 +1125,7 @@
   friend class BytecodeReaderHelper;
   friend class ClassHelper;
   friend class CallSiteAttributesMetadataHelper;
-  friend class ConstantEvaluator;
+  friend class ConstantReader;
   friend class ConstantHelper;
   friend class ConstructorHelper;
   friend class DirectCallMetadataHelper;
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 319b362..8e1302a 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -184,7 +184,7 @@
           Field& class_field = Field::Handle(Z);
           for (intptr_t i = 0; i < class_fields.Length(); ++i) {
             class_field ^= class_fields.At(i);
-            if (!class_field.is_static()) {
+            if (!class_field.is_static() && !class_field.is_late()) {
               ExternalTypedData& kernel_data =
                   ExternalTypedData::Handle(Z, class_field.KernelData());
               ASSERT(!kernel_data.IsNull());
@@ -469,7 +469,7 @@
     Field& class_field = Field::Handle(Z);
     for (intptr_t i = 0; i < class_fields.Length(); ++i) {
       class_field ^= class_fields.At(i);
-      if (!class_field.is_static()) {
+      if (!class_field.is_static() && !class_field.is_late()) {
         ExternalTypedData& kernel_data =
             ExternalTypedData::Handle(Z, class_field.KernelData());
         ASSERT(!kernel_data.IsNull());
@@ -750,13 +750,11 @@
       helper_.SkipCanonicalNameReference();
       return;
     case kStaticInvocation:
-    case kConstStaticInvocation:
       helper_.ReadPosition();                // read position.
       helper_.SkipCanonicalNameReference();  // read procedure_reference.
       VisitArguments();                      // read arguments.
       return;
     case kConstructorInvocation:
-    case kConstConstructorInvocation:
       helper_.ReadPosition();                // read position.
       helper_.SkipCanonicalNameReference();  // read target_reference.
       VisitArguments();                      // read arguments.
@@ -790,15 +788,6 @@
       }
       return;
     }
-    case kListConcatenation:
-    case kSetConcatenation:
-    case kMapConcatenation:
-    case kInstanceCreation:
-    case kFileUriExpression:
-      // Collection concatenation, instance creation operations and
-      // in-expression URI changes are removed by the constant evaluator.
-      UNREACHABLE();
-      break;
     case kIsExpression:
       helper_.ReadPosition();  // read position.
       VisitExpression();       // read operand.
@@ -810,9 +799,6 @@
       VisitExpression();       // read operand.
       VisitDartType();         // read type.
       return;
-    case kSymbolLiteral:
-      helper_.SkipStringReference();  // read index into string table.
-      return;
     case kTypeLiteral:
       VisitDartType();  // read type.
       return;
@@ -826,8 +812,7 @@
       helper_.ReadPosition();  // read position.
       VisitExpression();       // read expression.
       return;
-    case kListLiteral:
-    case kConstListLiteral: {
+    case kListLiteral: {
       helper_.ReadPosition();                           // read position.
       VisitDartType();                                  // read type.
       intptr_t list_length = helper_.ReadListLength();  // read list length.
@@ -836,15 +821,13 @@
       }
       return;
     }
-    case kSetLiteral:
-    case kConstSetLiteral: {
+    case kSetLiteral: {
       // Set literals are currently desugared in the frontend and will not
       // reach the VM. See http://dartbug.com/35124 for discussion.
       UNREACHABLE();
       return;
     }
-    case kMapLiteral:
-    case kConstMapLiteral: {
+    case kMapLiteral: {
       helper_.ReadPosition();                           // read position.
       VisitDartType();                                  // read key type.
       VisitDartType();                                  // read value type.
@@ -917,10 +900,6 @@
       helper_.SkipDartType();
       helper_.SkipConstantReference();
       return;
-    case kDeprecated_ConstantExpression: {
-      helper_.SkipConstantReference();
-      return;
-    }
     case kInstantiation: {
       VisitExpression();
       const intptr_t list_length =
@@ -934,6 +913,22 @@
     case kCheckLibraryIsLoaded:
       helper_.ReadUInt();  // library index
       break;
+    case kConstStaticInvocation:
+    case kConstConstructorInvocation:
+    case kConstListLiteral:
+    case kConstSetLiteral:
+    case kConstMapLiteral:
+    case kSymbolLiteral:
+      // Const invocations and const literals are removed by the
+      // constant evaluator.
+    case kListConcatenation:
+    case kSetConcatenation:
+    case kMapConcatenation:
+    case kInstanceCreation:
+    case kFileUriExpression:
+      // Collection concatenation, instance creation operations and
+      // in-expression URI changes are internal to the front end and
+      // removed by the constant evaluator.
     default:
       ReportUnexpectedTag("expression", tag);
       UNREACHABLE();
@@ -1369,9 +1364,7 @@
       // read string reference (i.e. named_parameters[i].name).
       helper_.SkipStringReference();
       VisitDartType();  // read named_parameters[i].type.
-      if (helper_.translation_helper_.info().kernel_binary_version() >= 29) {
-        helper_.ReadByte();  // read flags
-      }
+      helper_.ReadByte();  // read flags
     }
   }
 
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index a6f9de5..025d22d 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -625,8 +625,8 @@
   V(StoreFieldTOS_Wide,                    D, WIDE, lit, ___, ___)             \
   V(StoreIndexedTOS,                       0, ORDN, ___, ___, ___)             \
   V(Unused20,                              0, RESV, ___, ___, ___)             \
-  V(Unused40,                              0, RESV, ___, ___, ___)             \
-  V(Unused41,                              0, RESV, ___, ___, ___)             \
+  V(InitLateField,                         D, ORDN, lit, ___, ___)             \
+  V(InitLateField_Wide,                    D, WIDE, lit, ___, ___)             \
   V(StoreStaticTOS,                        D, ORDN, lit, ___, ___)             \
   V(StoreStaticTOS_Wide,                   D, WIDE, lit, ___, ___)             \
   V(Jump,                                  T, ORDN, tgt, ___, ___)             \
@@ -749,7 +749,7 @@
   // Maximum bytecode format version supported by VM.
   // The range of supported versions should include version produced by bytecode
   // generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
-  static const intptr_t kMaxSupportedBytecodeFormatVersion = 25;
+  static const intptr_t kMaxSupportedBytecodeFormatVersion = 26;
 
   enum Opcode {
 #define DECLARE_BYTECODE(name, encoding, kind, op1, op2, op3) k##name,
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 05fb029..a8a2f94 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -69,6 +69,7 @@
 Dart_FileWriteCallback Dart::file_write_callback_ = NULL;
 Dart_FileCloseCallback Dart::file_close_callback_ = NULL;
 Dart_EntropySource Dart::entropy_source_callback_ = NULL;
+bool Dart::non_nullable_flag_ = false;
 
 // Structure for managing read-only global handles allocation used for
 // creating global read-only handles that are pre created and initialized
@@ -222,6 +223,9 @@
     ASSERT(Flags::Initialized());
     const bool is_vm_isolate = true;
 
+    // Cache value of "non-nullable" experimental flag.
+    set_non_nullable_flag(KernelIsolate::GetExperimentalFlag("non-nullable"));
+
     // Setup default flags for the VM isolate.
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 3fd9376..3399ca5 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -123,6 +123,8 @@
   static Dart_EntropySource entropy_source_callback() {
     return entropy_source_callback_;
   }
+  static void set_non_nullable_flag(bool value) { non_nullable_flag_ = value; }
+  static bool non_nullable_flag() { return non_nullable_flag_; }
 
  private:
   static void WaitForIsolateShutdown();
@@ -141,6 +143,7 @@
   static Dart_FileWriteCallback file_write_callback_;
   static Dart_FileCloseCallback file_close_callback_;
   static Dart_EntropySource entropy_source_callback_;
+  static bool non_nullable_flag_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index d66238a..7db09c1 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1605,7 +1605,7 @@
   CHECK_ISOLATE(T->isolate());
   API_TIMELINE_BEGIN_END(T);
   TransitionNativeToVM transition(T);
-  T->isolate()->NotifyIdle(deadline);
+  T->isolate()->idle_time_handler()->NotifyIdle(deadline);
 }
 
 DART_EXPORT void Dart_NotifyLowMemory() {
@@ -6200,12 +6200,18 @@
     dwarf = new (Z) Dwarf(Z, nullptr, elf);
   }
 
+  // Note that the BSS section must come first because it cannot be placed in
+  // between any two non-writable segments, due to a bug in Jelly Bean's ELF
+  // loader. See also Elf::WriteProgramTable().
+  const intptr_t bss_base =
+      elf->AddBSSData("_kDartBSSData", sizeof(compiler::target::uword));
+
   BlobImageWriter vm_image_writer(T, &vm_snapshot_instructions_buffer,
                                   ApiReallocate, /* initial_size= */ 2 * MB,
-                                  elf, dwarf);
-  BlobImageWriter isolate_image_writer(T, &isolate_snapshot_instructions_buffer,
-                                       ApiReallocate,
-                                       /* initial_size= */ 2 * MB, elf, dwarf);
+                                  bss_base, elf, dwarf);
+  BlobImageWriter isolate_image_writer(
+      T, &isolate_snapshot_instructions_buffer, ApiReallocate,
+      /* initial_size= */ 2 * MB, bss_base, elf, dwarf);
   FullSnapshotWriter writer(Snapshot::kFullAOT, &vm_snapshot_data_buffer,
                             &isolate_snapshot_data_buffer, ApiReallocate,
                             &vm_image_writer, &isolate_image_writer);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index e49bd50..392705a 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -3452,7 +3452,7 @@
           // the breakpoint in.
           continue;
         }
-        if (!field.has_initializer()) {
+        if (!field.has_nontrivial_initializer()) {
           continue;
         }
         start = field.token_pos();
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index 5be327b..7f57a5d 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -644,6 +644,13 @@
 
     ASSERT(kNumImplicitSegments == 3);
     const intptr_t start = stream_->position();
+
+    // The Android dynamic linker in Jelly Bean incorrectly assumes that all
+    // non-writable segments are continguous. We put BSS first, so we must make
+    // this segment writable so it does not mark the BSS as read-only.
+    //
+    // The bug is here:
+    //   https://github.com/aosp-mirror/platform_bionic/blob/94963af28e445384e19775a838a29e6a71708179/linker/linker.c#L1991-L2001
 #if defined(TARGET_ARCH_IS_32_BIT)
     WriteWord(elf::PT_LOAD);
     WriteOff(0);   // File offset.
@@ -651,11 +658,11 @@
     WriteAddr(0);  // Physical address, not used.
     WriteWord(program_table_file_offset_ + program_table_file_size_);
     WriteWord(program_table_file_offset_ + program_table_file_size_);
-    WriteWord(elf::PF_R);
+    WriteWord(elf::PF_R | elf::PF_W);
     WriteWord(kPageSize);
 #else
     WriteWord(elf::PT_LOAD);
-    WriteWord(elf::PF_R);
+    WriteWord(elf::PF_R | elf::PF_W);
     WriteOff(0);   // File offset.
     WriteAddr(0);  // Virtual address.
     WriteAddr(0);  // Physical address, not used.
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index a8a1a60..6cb98f0 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -36,14 +36,7 @@
 // in the middle of a GC or interested in stub frames.
 DART_EXPORT
 void _printStackTrace() {
-  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
-                            Thread::Current(),
-                            StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame = frames.NextFrame();
-  while (frame != nullptr) {
-    OS::PrintErr("%s\n", frame->ToCString());
-    frame = frames.NextFrame();
-  }
+  StackFrame::DumpCurrentTrace();
 }
 
 // Like _printDartStackTrace, but works when stopped in generated code.
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index e5ef799..d70d64e 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -37,10 +37,11 @@
 
 // The default old gen heap size in MB, where 0 == unlimited.
 // 32-bit: OS limit is 2 or 3 GB
-// 64-bit: OS limit is 2^16 page table entries * 256 KB HeapPages = 16 GB
+// 64-bit: Linux's limit is
+//   sysctl vm.max_map_count (default 2^16) * 512 KB HeapPages = 32 GB
 // Set the VM limit below the OS limit to increase the likelihood of failing
 // gracefully with a Dart OutOfMemory exception instead of SIGABORT.
-const intptr_t kDefaultMaxOldGenHeapSize = (kWordSize <= 4) ? 1536 : 15360;
+const intptr_t kDefaultMaxOldGenHeapSize = (kWordSize <= 4) ? 1536 : 30720;
 
 #define kPosInfinity bit_cast<double>(DART_UINT64_C(0x7ff0000000000000))
 #define kNegInfinity bit_cast<double>(DART_UINT64_C(0xfff0000000000000))
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index b9b4824..92472c8 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -26,8 +26,7 @@
 class ForwardingPage;
 class GCMarker;
 
-// TODO(iposva): Determine heap sizes and tune the page size accordingly.
-static const intptr_t kPageSize = 256 * KB;
+static const intptr_t kPageSize = 512 * KB;
 static const intptr_t kPageSizeInWords = kPageSize / kWordSize;
 static const intptr_t kPageMask = ~(kPageSize - 1);
 
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index f043096..c1217a2 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -833,12 +833,14 @@
                                  uint8_t** instructions_blob_buffer,
                                  ReAlloc alloc,
                                  intptr_t initial_size,
+                                 intptr_t bss_base,
                                  Elf* elf,
                                  Dwarf* dwarf)
     : ImageWriter(thread->heap()),
       instructions_blob_stream_(instructions_blob_buffer, alloc, initial_size),
       elf_(elf),
-      dwarf_(dwarf) {
+      dwarf_(dwarf),
+      bss_base_(bss_base) {
 #ifndef DART_PRECOMPILER
   RELEASE_ASSERT(elf_ == nullptr);
   RELEASE_ASSERT(dwarf_ == nullptr);
@@ -859,14 +861,6 @@
   if (elf_ != nullptr) {
     segment_base = elf_->NextMemoryOffset();
   }
-
-  // Calculate the start of the BSS section based on the known size of the
-  // text section and page alignment.
-  intptr_t bss_base = 0;
-  if (elf_ != nullptr) {
-    bss_base =
-        Utils::RoundUp(segment_base + instructions_length, Elf::kPageSize);
-  }
 #endif
 
   // This header provides the gap to make the instructions snapshot look like a
@@ -874,7 +868,7 @@
   instructions_blob_stream_.WriteTargetWord(instructions_length);
 #if defined(DART_PRECOMPILER)
   instructions_blob_stream_.WriteTargetWord(
-      elf_ != nullptr ? bss_base - segment_base : 0);
+      elf_ != nullptr ? bss_base_ - segment_base : 0);
 #else
   instructions_blob_stream_.WriteTargetWord(0);  // No relocations.
 #endif
@@ -1008,8 +1002,8 @@
         instructions_blob_stream_.SetPosition(payload_stream_start +
                                               reloc_offset);
 
-        const uword offset =
-            bss_base - (segment_base + payload_stream_start + reloc_offset) +
+        const compiler::target::word offset =
+            bss_base_ - (segment_base + payload_stream_start + reloc_offset) +
             addend;
         instructions_blob_stream_.WriteTargetWord(offset);
       }
@@ -1035,10 +1029,6 @@
         elf_->AddText(instructions_symbol, instructions_blob_stream_.buffer(),
                       instructions_blob_stream_.bytes_written());
     ASSERT(segment_base == segment_base2);
-
-    const intptr_t real_bss_base =
-        elf_->AddBSSData("_kDartVMBSSData", sizeof(compiler::target::uword));
-    ASSERT(bss_base == real_bss_base);
   }
 #endif
 }
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 7835778..6221311 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -355,6 +355,7 @@
                   uint8_t** instructions_blob_buffer,
                   ReAlloc alloc,
                   intptr_t initial_size,
+                  intptr_t bss_base = 0,
                   Elf* elf = nullptr,
                   Dwarf* dwarf = nullptr);
 
@@ -368,8 +369,9 @@
   intptr_t WriteByteSequence(uword start, uword end);
 
   WriteStream instructions_blob_stream_;
-  Elf* elf_;
-  Dwarf* dwarf_;
+  Elf* const elf_;
+  Dwarf* const dwarf_;
+  const intptr_t bss_base_;
 
   DISALLOW_COPY_AND_ASSIGN(BlobImageWriter);
 };
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 3f82a4a..aedda0b 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -1971,8 +1971,8 @@
       RawObject** call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      RawString* target_name = RAW_CAST(String, LOAD_CONSTANT(kidx));
-      argdesc_ = RAW_CAST(Array, LOAD_CONSTANT(kidx + 1));
+      RawString* target_name = String::RawCast(LOAD_CONSTANT(kidx));
+      argdesc_ = Array::RawCast(LOAD_CONSTANT(kidx + 1));
       if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
                         &SP)) {
         HANDLE_EXCEPTION;
@@ -2239,6 +2239,20 @@
   }
 
   {
+    BYTECODE(InitLateField, D);
+    RawField* field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
+    RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
+    intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
+
+    instance->StorePointer(
+        reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
+        Object::RawCast(Object::sentinel().raw()), thread);
+
+    SP -= 1;  // Drop instance.
+    DISPATCH();
+  }
+
+  {
     BYTECODE(StoreStaticTOS, D);
     RawField* field = reinterpret_cast<RawField*>(LOAD_CONSTANT(rD));
     RawInstance* value = static_cast<RawInstance*>(*SP--);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index a39f06d..f1ea56d 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -138,6 +138,71 @@
   }
 }
 
+void IdleTimeHandler::InitializeWithHeap(Heap* heap) {
+  MutexLocker ml(&mutex_);
+  ASSERT(heap_ == nullptr && heap != nullptr);
+  heap_ = heap;
+}
+
+bool IdleTimeHandler::ShouldCheckForIdle() {
+  MutexLocker ml(&mutex_);
+  return idle_start_time_ > 0 && FLAG_idle_timeout_micros != 0 &&
+         disabled_counter_ == 0;
+}
+
+void IdleTimeHandler::UpdateStartIdleTime() {
+  MutexLocker ml(&mutex_);
+  if (disabled_counter_ == 0) {
+    idle_start_time_ = OS::GetCurrentMonotonicMicros();
+  }
+}
+
+bool IdleTimeHandler::ShouldNotifyIdle(int64_t* expiry) {
+  const int64_t now = OS::GetCurrentMonotonicMicros();
+
+  MutexLocker ml(&mutex_);
+  if (idle_start_time_ > 0 && disabled_counter_ == 0) {
+    const int64_t expiry_time = idle_start_time_ + FLAG_idle_timeout_micros;
+    if (expiry_time < now) {
+      idle_start_time_ = 0;
+      return true;
+    }
+  }
+
+  *expiry = now + FLAG_idle_timeout_micros;
+  return false;
+}
+
+void IdleTimeHandler::NotifyIdle(int64_t deadline) {
+  MutexLocker ml(&mutex_, /*no_safepoint_scope=*/false);
+  if (heap_ != nullptr) {
+    heap_->NotifyIdle(deadline);
+  }
+  idle_start_time_ = 0;
+}
+
+void IdleTimeHandler::NotifyIdleUsingDefaultDeadline() {
+  const int64_t now = OS::GetCurrentMonotonicMicros();
+  NotifyIdle(now + FLAG_idle_timeout_micros);
+}
+
+DisableIdleTimerScope::DisableIdleTimerScope(IdleTimeHandler* handler)
+    : handler_(handler) {
+  if (handler_ != nullptr) {
+    MutexLocker ml(&handler_->mutex_);
+    ++handler_->disabled_counter_;
+    handler_->idle_start_time_ = 0;
+  }
+}
+
+DisableIdleTimerScope::~DisableIdleTimerScope() {
+  if (handler_ != nullptr) {
+    MutexLocker ml(&handler_->mutex_);
+    --handler_->disabled_counter_;
+    ASSERT(handler_->disabled_counter_ >= 0);
+  }
+}
+
 IsolateGroup::IsolateGroup(std::unique_ptr<IsolateGroupSource> source,
                            void* embedder_data)
     : embedder_data_(embedder_data),
@@ -1961,10 +2026,6 @@
                          reinterpret_cast<uword>(this));
 }
 
-void Isolate::NotifyIdle(int64_t deadline) {
-  heap()->NotifyIdle(deadline);
-}
-
 void Isolate::AddClosureFunction(const Function& function) const {
   ASSERT(!Compiler::IsBackgroundCompilation());
   GrowableObjectArray& closures =
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 99a58a0..9c83e6b 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -213,6 +213,50 @@
   intptr_t script_kernel_size;
 };
 
+// Tracks idle time and notifies heap when idle time expired.
+class IdleTimeHandler : public ValueObject {
+ public:
+  IdleTimeHandler() {}
+
+  // Initializes the idle time handler with the given [heap], to which
+  // idle notifications will be sent.
+  void InitializeWithHeap(Heap* heap);
+
+  // Returns whether the caller should check for idle timeouts.
+  bool ShouldCheckForIdle();
+
+  // Declares that the idle time should be reset to now.
+  void UpdateStartIdleTime();
+
+  // Returns whether idle time expired and [NotifyIdle] should be called.
+  bool ShouldNotifyIdle(int64_t* expiry);
+
+  // Notifies the heap that now is a good time to do compactions and indicates
+  // we have time for the GC until [deadline].
+  void NotifyIdle(int64_t deadline);
+
+  // Calls [NotifyIdle] with the default deadline.
+  void NotifyIdleUsingDefaultDeadline();
+
+ private:
+  friend class DisableIdleTimerScope;
+
+  Mutex mutex_;
+  Heap* heap_ = nullptr;
+  intptr_t disabled_counter_ = 0;
+  int64_t idle_start_time_ = 0;
+};
+
+// Disables firing of the idle timer while this object is alive.
+class DisableIdleTimerScope : public ValueObject {
+ public:
+  explicit DisableIdleTimerScope(IdleTimeHandler* handler);
+  ~DisableIdleTimerScope();
+
+ private:
+  IdleTimeHandler* handler_;
+};
+
 // Represents an isolate group and is shared among all isolates within a group.
 class IsolateGroup : public IntrusiveDListEntry<IsolateGroup> {
  public:
@@ -440,8 +484,13 @@
 
   void SendInternalLibMessage(LibMsgId msg_id, uint64_t capability);
 
+  IdleTimeHandler* idle_time_handler() { return &idle_time_handler_; }
+
   Heap* heap() const { return heap_; }
-  void set_heap(Heap* value) { heap_ = value; }
+  void set_heap(Heap* value) {
+    idle_time_handler_.InitializeWithHeap(value);
+    heap_ = value;
+  }
 
   ObjectStore* object_store() const { return object_store_; }
   void set_object_store(ObjectStore* value) { object_store_ = value; }
@@ -512,8 +561,6 @@
 #endif
   }
 
-  void NotifyIdle(int64_t deadline);
-
   bool compaction_in_progress() const {
     return CompactionInProgressBit::decode(isolate_flags_);
   }
@@ -1082,6 +1129,7 @@
   MarkingStack* deferred_marking_stack_ = nullptr;
   Heap* heap_ = nullptr;
   IsolateGroup* isolate_group_ = nullptr;
+  IdleTimeHandler idle_time_handler_;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   NativeCallbackTrampolines native_callback_trampolines_;
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 8e2dbec..cb89d2c 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -6,7 +6,7 @@
 
 #include "vm/bit_vector.h"
 #include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/frontend/constant_evaluator.h"
+#include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/longjump.h"
@@ -373,7 +373,8 @@
             if (temp_field.is_declared_in_bytecode()) {
               token_positions.Add(temp_field.token_pos().value());
               token_positions.Add(temp_field.end_token_pos().value());
-              if (temp_field.is_static() && temp_field.has_initializer()) {
+              if (temp_field.is_static() &&
+                  temp_field.has_nontrivial_initializer()) {
                 temp_function = temp_field.EnsureInitializerFunction();
                 CollectBytecodeFunctionTokenPositions(temp_function,
                                                       &token_positions);
@@ -454,7 +455,7 @@
         if (field.is_declared_in_bytecode()) {
           token_positions.Add(field.token_pos().value());
           token_positions.Add(field.end_token_pos().value());
-          if (field.is_static() && field.has_initializer()) {
+          if (field.is_static() && field.has_nontrivial_initializer()) {
             temp_function = field.EnsureInitializerFunction();
             CollectBytecodeFunctionTokenPositions(temp_function,
                                                   &token_positions);
@@ -488,8 +489,7 @@
                            script,
                            data,
                            data_program_offset),
-        type_translator_(this, active_class, /* finalize= */ true),
-        constant_evaluator_(this, &type_translator_, active_class, nullptr) {}
+        constant_reader_(this, active_class) {}
 
   RawObject* EvaluateMetadata(intptr_t kernel_offset,
                               bool is_annotations_offset) {
@@ -518,12 +518,11 @@
       }
     }
 
-    return constant_evaluator_.EvaluateAnnotations();
+    return constant_reader_.ReadAnnotations();
   }
 
  private:
-  TypeTranslator type_translator_;
-  ConstantEvaluator constant_evaluator_;
+  ConstantReader constant_reader_;
 
   DISALLOW_COPY_AND_ASSIGN(MetadataEvaluator);
 };
@@ -568,14 +567,12 @@
                            script,
                            data,
                            data_program_offset),
-        type_translator_(this, active_class, /* finalize= */ true),
-        constant_evaluator_(this, &type_translator_, active_class, nullptr) {}
+        constant_reader_(this, active_class) {}
 
   RawObject* BuildParameterDescriptor(const Function& function);
 
  private:
-  TypeTranslator type_translator_;
-  ConstantEvaluator constant_evaluator_;
+  ConstantReader constant_reader_;
 
   DISALLOW_COPY_AND_ASSIGN(ParameterDescriptorBuilder);
 };
@@ -611,25 +608,25 @@
 
     Tag tag = ReadTag();  // read (first part of) initializer.
     if ((tag == kSomething) && !function.is_abstract()) {
-      // this will (potentially) read the initializer, but reset the position.
+      // This will read the initializer.
       Instance& constant = Instance::ZoneHandle(
-          zone_, constant_evaluator_.EvaluateExpression(ReaderOffset()));
+          zone_, constant_reader_.ReadConstantExpression());
       param_descriptor.SetAt(entry_start + Parser::kParameterDefaultValueOffset,
                              constant);
     } else {
+      if (tag == kSomething) {
+        SkipExpression();  // Skip initializer.
+      }
       param_descriptor.SetAt(entry_start + Parser::kParameterDefaultValueOffset,
                              Object::null_instance());
     }
-    if (tag == kSomething) {
-      SkipExpression();  // read (actual) initializer.
-    }
 
     if (FLAG_enable_mirrors && (helper.annotation_count_ > 0)) {
       AlternativeReadingScope alt(&reader_, param_kernel_offset);
       VariableDeclarationHelper helper(this);
       helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
       Object& metadata =
-          Object::ZoneHandle(zone_, constant_evaluator_.EvaluateAnnotations());
+          Object::ZoneHandle(zone_, constant_reader_.ReadAnnotations());
       param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
                              metadata);
     } else {
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 6bf5371..d739365 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -19,7 +19,7 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 18;
+static const uint32_t kMinSupportedKernelFormatVersion = 29;
 static const uint32_t kMaxSupportedKernelFormatVersion = 36;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
@@ -128,7 +128,6 @@
   V(SimpleInterfaceType, 96)                                                   \
   V(SimpleFunctionType, 97)                                                    \
   V(ConstantExpression, 106)                                                   \
-  V(Deprecated_ConstantExpression, 107)                                        \
   V(SpecializedVariableGet, 128)                                               \
   V(SpecializedVariableSet, 136)                                               \
   V(SpecializedIntLiteral, 144)
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 28d4ffe..3b955ff 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -8,7 +8,7 @@
 
 #include <memory>
 
-#include "vm/compiler/frontend/constant_evaluator.h"
+#include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/dart_api_impl.h"
 #include "vm/flags.h"
@@ -157,9 +157,7 @@
   class_index_offset_ = procedure_index_offset_ - 4 - (class_count_ + 1) * 4;
 
   source_references_offset_ = -1;
-  if (binary_version >= 25) {
-    source_references_offset_ = reader_.ReadUInt32At(class_index_offset_ - 4);
-  }
+  source_references_offset_ = reader_.ReadUInt32At(class_index_offset_ - 4);
 }
 
 ClassIndex::ClassIndex(const uint8_t* buffer,
@@ -502,8 +500,7 @@
   if (length == 0) return;
 
   // Prepare lazy constant reading.
-  ConstantEvaluator constant_evaluator(&helper_, &type_translator_,
-                                       &active_class_);
+  ConstantReader constant_reader(&helper_, &active_class_);
 
   // Obtain `dart:_internal::ExternalName.name`.
   EnsureExternalClassIsLookedUp();
@@ -526,20 +523,17 @@
     const intptr_t annotation_count = helper_.ReadListLength();
     for (intptr_t j = 0; j < annotation_count; ++j) {
       const intptr_t tag = helper_.PeekTag();
-      if (tag == kConstantExpression || tag == kDeprecated_ConstantExpression) {
+      if (tag == kConstantExpression) {
         helper_.ReadByte();  // Skip the tag.
+        helper_.ReadPosition();  // Skip fileOffset.
+        helper_.SkipDartType();  // Skip type.
 
         // We have a candidate. Let's look if it's an instance of the
         // ExternalName class.
-        if (tag == kConstantExpression) {
-          helper_.ReadPosition();  // Skip fileOffset.
-          helper_.SkipDartType();  // Skip type.
-        }
         const intptr_t constant_table_offset = helper_.ReadUInt();
-        if (constant_evaluator.IsInstanceConstant(constant_table_offset,
-                                                  external_name_class_)) {
-          constant = constant_evaluator.EvaluateConstantExpression(
-              constant_table_offset);
+        if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                               external_name_class_)) {
+          constant = constant_reader.ReadConstant(constant_table_offset);
           ASSERT(constant.clazz() == external_name_class_.raw());
           // We found the annotation, let's flag the function as native and
           // set the native name!
@@ -623,8 +617,7 @@
   }
 
   // Prepare lazy constant reading.
-  ConstantEvaluator constant_evaluator(&helper_, &type_translator_,
-                                       &active_class_);
+  ConstantReader constant_reader(&helper_, &active_class_);
 
   // Obtain `dart:_internal::ExternalName.name`.
   EnsureExternalClassIsLookedUp();
@@ -661,21 +654,17 @@
         uri_path = String::null();
 
         const intptr_t tag = helper_.PeekTag();
-        if (tag == kConstantExpression ||
-            tag == kDeprecated_ConstantExpression) {
+        if (tag == kConstantExpression) {
           helper_.ReadByte();  // Skip the tag.
+          helper_.ReadPosition();  // Skip fileOffset.
+          helper_.SkipDartType();  // Skip type.
 
           // We have a candidate. Let's look if it's an instance of the
           // ExternalName class.
-          if (tag == kConstantExpression) {
-            helper_.ReadPosition();  // Skip fileOffset.
-            helper_.SkipDartType();  // Skip type.
-          }
           const intptr_t constant_table_offset = helper_.ReadUInt();
-          if (constant_evaluator.IsInstanceConstant(constant_table_offset,
-                                                    external_name_class_)) {
-            constant = constant_evaluator.EvaluateConstantExpression(
-                constant_table_offset);
+          if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                                 external_name_class_)) {
+            constant = constant_reader.ReadConstant(constant_table_offset);
             ASSERT(constant.clazz() == external_name_class_.raw());
             uri_path ^= constant.GetField(external_name_field_);
           }
@@ -963,11 +952,11 @@
     const bool has_simple_initializer =
         converter.IsSimple(helper_.ReaderOffset() + 1);
     if (!has_simple_initializer || !converter.SimpleValue().IsNull()) {
-      field.set_has_initializer(true);
+      field.set_has_nontrivial_initializer(true);
       return;
     }
   }
-  field.set_has_initializer(false);
+  field.set_has_nontrivial_initializer(false);
 }
 
 RawLibrary* KernelLoader::LoadLibrary(intptr_t index) {
@@ -1101,17 +1090,15 @@
   }
 
   if (register_class) {
-    if (library_index.HasSourceReferences()) {
-      helper_.SetOffset(library_index.SourceReferencesOffset());
-      intptr_t count = helper_.ReadUInt();
-      const GrowableObjectArray& owned_scripts =
-          GrowableObjectArray::Handle(library.owned_scripts());
-      Script& script = Script::Handle(Z);
-      for (intptr_t i = 0; i < count; i++) {
-        intptr_t uri_index = helper_.ReadUInt();
-        script = ScriptAt(uri_index);
-        owned_scripts.Add(script);
-      }
+    helper_.SetOffset(library_index.SourceReferencesOffset());
+    intptr_t count = helper_.ReadUInt();
+    const GrowableObjectArray& owned_scripts =
+        GrowableObjectArray::Handle(library.owned_scripts());
+    Script& script = Script::Handle(Z);
+    for (intptr_t i = 0; i < count; i++) {
+      intptr_t uri_index = helper_.ReadUInt();
+      script = ScriptAt(uri_index);
+      owned_scripts.Add(script);
     }
   }
   if (!library.Loaded()) library.SetLoaded();
@@ -1785,8 +1772,7 @@
       if (DetectPragmaCtor()) {
         *has_pragma_annotation = true;
       }
-    } else if (tag == kConstantExpression ||
-               tag == kDeprecated_ConstantExpression) {
+    } else if (tag == kConstantExpression) {
       const Array& constant_table_array =
           Array::Handle(kernel_program_info_.constants());
       if (constant_table_array.IsNull()) {
@@ -1807,11 +1793,8 @@
         // and avoid the "potential natives" list.
 
         helper_.ReadByte();  // Skip the tag.
-
-        if (tag == kConstantExpression) {
-          helper_.ReadPosition();  // Skip fileOffset.
-          helper_.SkipDartType();  // Skip type.
-        }
+        helper_.ReadPosition();  // Skip fileOffset.
+        helper_.SkipDartType();  // Skip type.
         const intptr_t offset_in_constant_table = helper_.ReadUInt();
 
         AlternativeReadingScopeWithNewData scope(
@@ -1836,8 +1819,7 @@
         const dart::Class& toplevel_class =
             Class::Handle(Z, library.toplevel_class());
         ActiveClassScope active_class_scope(&active_class_, &toplevel_class);
-        ConstantEvaluator constant_evaluator(&helper_, &type_translator_,
-                                             &active_class_);
+        ConstantReader constant_reader(&helper_, &active_class_);
 
         helper_.ReadByte();  // Skip the tag.
 
@@ -1854,14 +1836,13 @@
         const intptr_t constant_table_offset = helper_.ReadUInt();
         // We have a candidate. Let's look if it's an instance of the
         // ExternalName or Pragma class.
-        if (constant_evaluator.IsInstanceConstant(constant_table_offset,
-                                                  external_name_class_)) {
-          constant = constant_evaluator.EvaluateConstantExpression(
-              constant_table_offset);
+        if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                               external_name_class_)) {
+          constant = constant_reader.ReadConstant(constant_table_offset);
           ASSERT(constant.clazz() == external_name_class_.raw());
           *native_name ^= constant.GetField(external_name_field_);
-        } else if (constant_evaluator.IsInstanceConstant(constant_table_offset,
-                                                         pragma_class_)) {
+        } else if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                                      pragma_class_)) {
           *has_pragma_annotation = true;
         }
       }
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index cf01099..a6f3c75 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -107,11 +107,6 @@
     return -1;
   }
 
-  bool HasSourceReferences() {
-    if (binary_version_ < 25) return false;
-    return true;
-  }
-
   intptr_t SourceReferencesOffset() { return source_references_offset_; }
 
  private:
@@ -283,10 +278,8 @@
     // Start reading library.
     // Note that this needs to be keep in sync with LibraryHelper.
     reader.ReadFlags();
-    if (program_->binary_version() >= 27) {
-      reader.ReadUInt();  // Read major language version.
-      reader.ReadUInt();  // Read minor language version.
-    }
+    reader.ReadUInt();  // Read major language version.
+    reader.ReadUInt();  // Read minor language version.
     return reader.ReadCanonicalNameReference();
   }
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index d945b97..4b37bc0 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -70,7 +70,6 @@
       task_running_(false),
       delete_me_(false),
       pool_(NULL),
-      idle_start_time_(0),
       start_callback_(NULL),
       end_callback_(NULL),
       callback_data_(0) {
@@ -202,6 +201,9 @@
   StartIsolateScope start_isolate(isolate());
   ml->Enter();
 
+  auto idle_time_handler =
+      isolate() != nullptr ? isolate()->idle_time_handler() : nullptr;
+
   MessageStatus max_status = kOK;
   Message::Priority min_priority =
       ((allow_normal_messages && !paused()) ? Message::kNormalPriority
@@ -224,7 +226,11 @@
     ml->Exit();
     Message::Priority saved_priority = message->priority();
     Dart_Port saved_dest_port = message->dest_port();
-    MessageStatus status = HandleMessage(std::move(message));
+    MessageStatus status = kOK;
+    {
+      DisableIdleTimerScope disable_idle_timer(idle_time_handler);
+      status = HandleMessage(std::move(message));
+    }
     if (status > max_status) {
       max_status = status;
     }
@@ -248,7 +254,9 @@
     // using Observatory doesn't trigger additional idle tasks.
     if ((FLAG_idle_timeout_micros != 0) &&
         (saved_priority == Message::kNormalPriority)) {
-      idle_start_time_ = OS::GetCurrentMonotonicMicros();
+      if (idle_time_handler != nullptr) {
+        idle_time_handler->UpdateStartIdleTime();
+      }
     }
 
     // Some callers want to process only one normal message and then quit. At
@@ -514,44 +522,40 @@
 }
 
 bool MessageHandler::CheckIfIdleLocked(MonitorLocker* ml) {
-  if ((isolate() == NULL) || (idle_start_time_ == 0) ||
-      (FLAG_idle_timeout_micros == 0)) {
+  if (isolate() == nullptr ||
+      !isolate()->idle_time_handler()->ShouldCheckForIdle()) {
     // No idle task to schedule.
     return false;
   }
-  const int64_t now = OS::GetCurrentMonotonicMicros();
-  const int64_t idle_expirary = idle_start_time_ + FLAG_idle_timeout_micros;
-  if (idle_expirary > now) {
-    // We wait here for the scheduled idle time to expire or
-    // new messages or OOB messages to arrive.
-    paused_for_messages_ = true;
-    ml->WaitMicros(idle_expirary - now);
-    paused_for_messages_ = false;
-    // We want to loop back in order to handle the new messages
-    // or run the idle task.
+  int64_t idle_expirary = 0;
+  if (isolate()->idle_time_handler()->ShouldNotifyIdle(&idle_expirary)) {
+    // We've been without a message long enough to hope we can do some
+    // cleanup before the next message arrives.
+    RunIdleTaskLocked(ml);
+    // We may have received new messages while running idle task, so return
+    // true so that the handle messages loop is run again.
     return true;
   }
-  // The idle task can be scheduled immediately.
-  RunIdleTaskLocked(ml);
-  // We may have received new messages while running idle task, so return
-  // true so that the handle messages loop is run again.
+
+  // We wait here for the scheduled idle time to expire or
+  // new messages or OOB messages to arrive.
+  paused_for_messages_ = true;
+  ml->WaitMicros(idle_expirary - OS::GetCurrentMonotonicMicros());
+  paused_for_messages_ = false;
+  // We want to loop back in order to handle the new messages
+  // or run the idle task.
   return true;
 }
 
 void MessageHandler::RunIdleTaskLocked(MonitorLocker* ml) {
-  // We've been without a message long enough to hope we can do some
-  // cleanup before the next message arrives.
-  const int64_t now = OS::GetCurrentMonotonicMicros();
-  const int64_t deadline = now + FLAG_idle_duration_micros;
   // Idle tasks may take a while: don't block other isolates sending
   // us messages.
   ml->Exit();
   {
     StartIsolateScope start_isolate(isolate());
-    isolate()->NotifyIdle(deadline);
+    isolate()->idle_time_handler()->NotifyIdleUsingDefaultDeadline();
   }
   ml->Enter();
-  idle_start_time_ = 0;
 }
 
 void MessageHandler::ClosePort(Dart_Port port) {
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 46a7c19..133f8bf 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -260,7 +260,6 @@
   bool task_running_;
   bool delete_me_;
   ThreadPool* pool_;
-  int64_t idle_start_time_;
   StartCallback start_callback_;
   EndCallback end_callback_;
   CallbackData callback_data_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6087194..faf1184 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -8233,7 +8233,7 @@
     return true;
   }
 
-  if (KernelIsolate::GetExperimentalFlag("non-nullable")) {
+  if (Dart::non_nullable_flag()) {
     // The non-nullable experiment changes the fingerprints, and we only track
     // one fingerprint set.
     return true;
@@ -8698,6 +8698,7 @@
   result.set_owner(owner);
   result.set_token_pos(token_pos);
   result.set_end_token_pos(end_token_pos);
+  result.set_has_nontrivial_initializer(false);
   result.set_has_initializer(false);
   result.set_is_unboxing_candidate(!is_final);
   result.set_initializer_changed_after_initialization(false);
@@ -8950,7 +8951,7 @@
 }
 
 RawFunction* Field::EnsureInitializerFunction() const {
-  ASSERT(has_initializer());
+  ASSERT(has_nontrivial_initializer());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Function& initializer = Function::Handle(zone, InitializerFunction());
@@ -8979,7 +8980,7 @@
   ASSERT(is_instance());
   ASSERT(instance.GetField(*this) == Object::sentinel().raw());
   Object& value = Object::Handle();
-  if (has_initializer()) {
+  if (has_nontrivial_initializer()) {
     const Function& initializer = Function::Handle(EnsureInitializerFunction());
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(0, instance);
@@ -10684,14 +10685,9 @@
   // We compute the list of loaded scripts lazily. The result is
   // cached in loaded_scripts_.
   if (loaded_scripts() == Array::null()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    // TODO(jensj): Once minimum kernel support is >= 25 this can be cleaned up.
+    // TODO(jensj): This can be cleaned up.
     // It really should just return the content of `owned_scripts`, and there
     // should be no need to do the O(n) call to `AddScriptIfUnique` per script.
-    static_assert(
-        kernel::kMinSupportedKernelFormatVersion < 25,
-        "Once minimum kernel support is >= 25 this can be cleaned up.");
-#endif
 
     // Iterate over the library dictionary and collect all scripts.
     const GrowableObjectArray& scripts =
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index f64b4b0..4f9f92b 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3616,6 +3616,17 @@
 
   RawString* InitializingExpression() const;
 
+  bool has_nontrivial_initializer() const {
+    return HasNontrivialInitializerBit::decode(raw_ptr()->kind_bits_);
+  }
+  // Called by parser after allocating field.
+  void set_has_nontrivial_initializer(bool has_nontrivial_initializer) const {
+    ASSERT(IsOriginal());
+    ASSERT(Thread::Current()->IsMutatorThread());
+    set_kind_bits(HasNontrivialInitializerBit::update(
+        has_nontrivial_initializer, raw_ptr()->kind_bits_));
+  }
+
   bool has_initializer() const {
     return HasInitializerBit::decode(raw_ptr()->kind_bits_);
   }
@@ -3627,6 +3638,10 @@
         HasInitializerBit::update(has_initializer, raw_ptr()->kind_bits_));
   }
 
+  bool has_trivial_initializer() const {
+    return has_initializer() && !has_nontrivial_initializer();
+  }
+
   StaticTypeExactnessState static_type_exactness_state() const {
     return StaticTypeExactnessState::Decode(
         raw_ptr()->static_type_exactness_state_);
@@ -3820,7 +3835,7 @@
     kConstBit = 0,
     kStaticBit,
     kFinalBit,
-    kHasInitializerBit,
+    kHasNontrivialInitializerBit,
     kUnboxingCandidateBit,
     kReflectableBit,
     kDoubleInitializedBit,
@@ -3831,12 +3846,13 @@
     kIsLateBit,
     kIsExtensionMemberBit,
     kNeedsLoadGuardBit,
+    kHasInitializerBit,
   };
   class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {};
   class StaticBit : public BitField<uint16_t, bool, kStaticBit, 1> {};
   class FinalBit : public BitField<uint16_t, bool, kFinalBit, 1> {};
-  class HasInitializerBit
-      : public BitField<uint16_t, bool, kHasInitializerBit, 1> {};
+  class HasNontrivialInitializerBit
+      : public BitField<uint16_t, bool, kHasNontrivialInitializerBit, 1> {};
   class UnboxingCandidateBit
       : public BitField<uint16_t, bool, kUnboxingCandidateBit, 1> {};
   class ReflectableBit : public BitField<uint16_t, bool, kReflectableBit, 1> {};
@@ -3856,6 +3872,8 @@
       : public BitField<uint16_t, bool, kIsExtensionMemberBit, 1> {};
   class NeedsLoadGuardBit
       : public BitField<uint16_t, bool, kNeedsLoadGuardBit, 1> {};
+  class HasInitializerBit
+      : public BitField<uint16_t, bool, kHasInitializerBit, 1> {};
 
   // Update guarded cid and guarded length for this field. Returns true, if
   // deoptimization of dependent code is required.
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 9b4e734..a86665c 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -461,29 +461,7 @@
   sample->Clear();
 }
 
-static void DumpStackFrame(intptr_t frame_index,
-                           uword pc,
-                           uword fp,
-                           bool try_symbolize_dart_frames) {
-  Thread* thread = Thread::Current();
-  if ((thread != NULL) && !thread->IsAtSafepoint() &&
-      try_symbolize_dart_frames) {
-    Isolate* isolate = thread->isolate();
-    if ((isolate != NULL) && isolate->is_runnable()) {
-      // Only attempt to symbolize Dart frames if we can safely iterate the
-      // current isolate's heap.
-      Code& code = Code::Handle(Code::LookupCodeInVmIsolate(pc));
-      if (code.IsNull()) {
-        code = Code::LookupCode(pc);  // In current isolate.
-      }
-      if (!code.IsNull()) {
-        OS::PrintErr("  pc 0x%" Pp " fp 0x%" Pp " %s\n", pc, fp,
-                     code.QualifiedName());
-        return;
-      }
-    }
-  }
-
+static void DumpStackFrame(intptr_t frame_index, uword pc, uword fp) {
   uintptr_t start = 0;
   char* native_symbol_name = NativeSymbolResolver::LookupSymbolName(pc, &start);
   if (native_symbol_name != NULL) {
@@ -511,16 +489,14 @@
   ProfilerStackWalker(Dart_Port port_id,
                       Sample* head_sample,
                       SampleBuffer* sample_buffer,
-                      intptr_t skip_count = 0,
-                      bool try_symbolize_dart_frames = true)
+                      intptr_t skip_count = 0)
       : port_id_(port_id),
         sample_(head_sample),
         sample_buffer_(sample_buffer),
         skip_count_(skip_count),
         frames_skipped_(0),
         frame_index_(0),
-        total_frames_(0),
-        try_symbolize_dart_frames_(try_symbolize_dart_frames) {
+        total_frames_(0) {
     if (sample_ == NULL) {
       ASSERT(sample_buffer_ == NULL);
     } else {
@@ -536,7 +512,7 @@
     }
 
     if (sample_ == NULL) {
-      DumpStackFrame(frame_index_, pc, fp, try_symbolize_dart_frames_);
+      DumpStackFrame(frame_index_, pc, fp);
       frame_index_++;
       total_frames_++;
       return true;
@@ -571,7 +547,6 @@
   intptr_t frames_skipped_;
   intptr_t frame_index_;
   intptr_t total_frames_;
-  const bool try_symbolize_dart_frames_;
 };
 
 // Executing Dart code, walk the stack.
@@ -768,13 +743,8 @@
                             uword pc,
                             uword fp,
                             uword sp,
-                            intptr_t skip_count = 0,
-                            bool try_symbolize_dart_frames = true)
-      : ProfilerStackWalker(port_id,
-                            sample,
-                            sample_buffer,
-                            skip_count,
-                            try_symbolize_dart_frames),
+                            intptr_t skip_count = 0)
+      : ProfilerStackWalker(port_id, sample, sample_buffer, skip_count),
         counters_(counters),
         stack_upper_(stack_upper),
         original_pc_(pc),
@@ -1190,13 +1160,19 @@
     return;
   }
 
-  ProfilerNativeStackWalker native_stack_walker(
-      &counters_, ILLEGAL_PORT, NULL, NULL, stack_lower, stack_upper, pc, fp,
-      sp,
-      /*skip_count=*/0,
-      /*try_symbolize_dart_frames=*/!for_crash);
+  ProfilerNativeStackWalker native_stack_walker(&counters_, ILLEGAL_PORT, NULL,
+                                                NULL, stack_lower, stack_upper,
+                                                pc, fp, sp,
+                                                /*skip_count=*/0);
   native_stack_walker.walk();
   OS::PrintErr("-- End of DumpStackTrace\n");
+
+  if (thread->execution_state() == Thread::kThreadInNative) {
+    TransitionNativeToVM transition(thread);
+    StackFrame::DumpCurrentTrace();
+  } else if (thread->execution_state() == Thread::kThreadInVM) {
+    StackFrame::DumpCurrentTrace();
+  }
 }
 
 void Profiler::SampleAllocation(Thread* thread, intptr_t cid) {
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 2ebcd9e..fd2e3eb 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -88,8 +88,9 @@
 
   // Set all non object fields.
   type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
-  type.set_type_state(reader->Read<int8_t>());
-  type.set_nullability(static_cast<Nullability>(reader->Read<int8_t>()));
+  const uint8_t combined = reader->Read<uint8_t>();
+  type.set_type_state(combined >> 4);
+  type.set_nullability(static_cast<Nullability>(combined & 0xf));
 
   // Read the code object for the type testing stub and set its entrypoint.
   reader->EnqueueTypePostprocessing(type);
@@ -152,8 +153,10 @@
 
   // Write out all the non object pointer fields.
   writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
-  writer->Write<int8_t>(ptr()->type_state_);
-  writer->Write<int8_t>(ptr()->nullability_);
+  const uint8_t combined = (ptr()->type_state_ << 4) | ptr()->nullability_;
+  ASSERT(ptr()->type_state_ == (combined >> 4));
+  ASSERT(ptr()->nullability_ == (combined & 0xf));
+  writer->Write<uint8_t>(combined);
 
   // Write out all the object pointer fields.
   ASSERT(ptr()->type_class_id_ != Object::null());
@@ -224,9 +227,9 @@
   type_parameter.set_token_pos(
       TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
   type_parameter.set_index(reader->Read<int16_t>());
-  type_parameter.set_flags(reader->Read<uint8_t>());
-  type_parameter.set_nullability(
-      static_cast<Nullability>(reader->Read<int8_t>()));
+  const uint8_t combined = reader->Read<uint8_t>();
+  type_parameter.set_flags(combined >> 4);
+  type_parameter.set_nullability(static_cast<Nullability>(combined & 0xf));
 
   // Read the code object for the type testing stub and set its entrypoint.
   reader->EnqueueTypePostprocessing(type_parameter);
@@ -267,8 +270,10 @@
   // Write out all the non object pointer fields.
   writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
   writer->Write<int16_t>(ptr()->index_);
-  writer->Write<uint8_t>(ptr()->flags_);
-  writer->Write<int8_t>(ptr()->nullability_);
+  const uint8_t combined = (ptr()->flags_ << 4) | ptr()->nullability_;
+  ASSERT(ptr()->flags_ == (combined >> 4));
+  ASSERT(ptr()->nullability_ == (combined & 0xf));
+  writer->Write<uint8_t>(combined);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer, kAsReference);
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 260e99f..b2ad52a 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -532,6 +532,17 @@
   return (LookupDartCode() != Code::null());
 }
 
+void StackFrame::DumpCurrentTrace() {
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
+                            Thread::Current(),
+                            StackFrameIterator::kNoCrossThreadIteration);
+  StackFrame* frame = frames.NextFrame();
+  while (frame != nullptr) {
+    OS::PrintErr("%s\n", frame->ToCString());
+    frame = frames.NextFrame();
+  }
+}
+
 void StackFrameIterator::SetupLastExitFrameData() {
   ASSERT(thread_ != NULL);
   uword exit_marker = thread_->top_exit_frame_info();
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 69368fe..72699ae 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -130,6 +130,8 @@
   // Returns token_pos of the pc(), or -1 if none exists.
   TokenPosition GetTokenPos() const;
 
+  static void DumpCurrentTrace();
+
  protected:
   explicit StackFrame(Thread* thread)
       : fp_(0), sp_(0), pc_(0), thread_(thread), is_interpreted_(false) {}
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 10c22d1..e9aa508 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -65,6 +65,7 @@
   V(Current, "current")                                                        \
   V(CurrentContextVar, ":current_context_var")                                 \
   V(CyclicInitializationError, "CyclicInitializationError")                    \
+  V(LateInitializationError, "_LateInitializationError")                       \
   V(DartCollection, "dart:collection")                                         \
   V(DartCore, "dart:core")                                                     \
   V(DartDeveloper, "dart:developer")                                           \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index c79be7b..2afc376 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -507,6 +507,7 @@
 RawError* Thread::HandleInterrupts() {
   uword interrupt_bits = GetAndClearInterrupts();
   if ((interrupt_bits & kVMInterrupt) != 0) {
+    CheckForSafepoint();
     if (isolate()->store_buffer()->Overflowed()) {
       if (FLAG_verbose_gc) {
         OS::PrintErr("Scavenge scheduled by store buffer overflow.\n");
diff --git a/samples/ffi/sqlite/README.md b/samples/ffi/sqlite/README.md
index 85a26dd..4f7c8eb 100644
--- a/samples/ffi/sqlite/README.md
+++ b/samples/ffi/sqlite/README.md
@@ -37,5 +37,5 @@
 ## Tutorial
 
 A tutorial walking through the code is available in [docs/sqlite-tutorial.md](docs/sqlite-tutorial.md).
-For information on how to use this package within a Flutter app, see [docs/android.md].
+For information on how to use this package within a Flutter app, see [docs/android.md](docs/android.md).
 (Note: iOS is not yet supported).
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 3101029..e637088 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -20,9 +20,12 @@
   # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
   dart_platform_sdk = true
 
+  # Whether to include dart2native in the "create_sdk" target.
+  include_dart2native = false
+
   # Path to stripped dart binaries relative to build output directory.
   dart_stripped_binary = "dart"
-  dartaotruntime_stripped_binary = "dartaotruntime"
+  dart_precompiled_runtime_stripped_binary = "dart_precompiled_runtime"
   gen_snapshot_stripped_binary = "gen_snapshot"
 }
 
@@ -35,11 +38,11 @@
 # ......dartaotruntime or dartaotruntime.exe (executable)
 # ......dartdoc
 # ......dartfmt
-# ......dart2native
+# ......dart2native (if `include_dart2native` and not on ia32)
 # ......dart2js
 # ......dartanalyzer
 # ......dartdevc
-# ......utils/gen_snapshot or utils/gen_snapshot.exe (executable)
+# ......utils/gen_snapshot or utils/gen_snapshot.exe (if `include_dart2native` and not on ia32)
 # ......pub
 # ......snapshots/
 # ........analysis_server.dart.snapshot
@@ -48,7 +51,8 @@
 # ........dartdoc.dart.snapshot
 # ........dartfmt.dart.snapshot
 # ........dartdevc.dart.snapshot
-# ........gen_kernel.dart.snapshot
+# ........gen_kernel.dart.snapshot (if `include_dart2native` and not on ia32)
+# ........dart2native.dart.snapshot (if `include_dart2native` and not on ia32)
 # ........kernel_worker.dart.snapshot
 # ........pub.dart.snapshot
 # ......resources/
@@ -117,10 +121,6 @@
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
   [
-    "dart2native",
-    "../utils/dart2native:generate_dart2native_snapshot",
-  ],
-  [
     "dartdoc",
     "../utils/dartdoc",
   ],
@@ -133,6 +133,12 @@
     "../utils/pub",
   ],
 ]
+if (include_dart2native && dart_target_arch != "ia32") {
+  _platform_sdk_snapshots += [ [
+        "dart2native",
+        "../utils/dart2native:generate_dart2native_snapshot",
+      ] ]
+}
 if (create_kernel_service_snapshot) {
   _platform_sdk_snapshots += [ [
         "kernel-service",
@@ -156,10 +162,6 @@
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
   [
-    "dart2native",
-    "../utils/dart2native:generate_dart2native_snapshot",
-  ],
-  [
     "dartdevc",
     "../utils/dartdevc",
   ],
@@ -180,6 +182,12 @@
     "../utils/pub",
   ],
 ]
+if (include_dart2native && dart_target_arch != "ia32") {
+  _full_sdk_snapshots += [ [
+        "dart2native",
+        "../utils/dart2native:generate_dart2native_snapshot",
+      ] ]
+}
 if (create_kernel_service_snapshot) {
   _full_sdk_snapshots += [ [
         "kernel-service",
@@ -314,17 +322,49 @@
       dest = "$root_out_dir/dart-sdk/bin/model"
       ignore_patterns = "{}"
     },
-    {
-      target = "copy_libtensorflowlite_c"
-      visibility = [ ":create_common_sdk" ]
-      deps = [
-        ":copy_libraries",
-      ]
-      source = "../third_party/pkg/tflite_native/lib/src/blobs"
-      dest = "$root_out_dir/dart-sdk/bin/snapshots"
-      ignore_patterns = "{}"
-    },
   ]
+  if (is_linux) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.dll,*mac64.so"
+      },
+    ]
+  }
+  if (is_mac) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.dll,*linux64.so"
+      },
+    ]
+  }
+  if (is_win) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.so"
+      },
+    ]
+  }
 }
 
 # This generates targets for everything in copy_tree_specs. The targets have the
@@ -394,25 +434,25 @@
 
 copy("copy_dartaotruntime") {
   deps = [
-    "../runtime/bin:dartaotruntime",
+    "../runtime/bin:dart_precompiled_runtime",
   ]
   dartaotruntime_out =
-      get_label_info("../runtime/bin:dartaotruntime", "root_out_dir")
+      get_label_info("../runtime/bin:dart_precompiled_runtime", "root_out_dir")
   if (is_win) {
     sources = [
-      "$dartaotruntime_out/dartaotruntime.exe",
+      "$dartaotruntime_out/dart_precompiled_runtime.exe",
+    ]
+    outputs = [
+      "$root_out_dir/dart-sdk/bin/dartaotruntime.exe",
     ]
   } else {
     sources = [
-      "$dartaotruntime_out/$dartaotruntime_stripped_binary",
+      "$dartaotruntime_out/$dart_precompiled_runtime_stripped_binary",
+    ]
+    outputs = [
+      "$root_out_dir/dart-sdk/bin/dartaotruntime",
     ]
   }
-  if (is_win) {
-    sources += [ "$dartaotruntime_out/dartaotruntime.lib" ]
-  }
-  outputs = [
-    "$root_out_dir/dart-sdk/bin/{{source_file_part}}",
-  ]
 }
 
 copy("copy_gen_snapshot") {
@@ -437,6 +477,7 @@
 
 copy("copy_dart2native") {
   deps = [
+    ":copy_dartaotruntime",
     ":copy_gen_kernel_snapshot",
     ":copy_gen_snapshot",
   ]
@@ -987,7 +1028,6 @@
     ":copy_analysis_summaries",
     ":copy_api_readme",
     ":copy_dart",
-    ":copy_dart2native",
     ":copy_dartdoc_files",
     ":copy_headers",
     ":copy_libraries_dart",
@@ -999,6 +1039,13 @@
     ":write_revision_file",
     ":write_version_file",
   ]
+
+  # We do not support AOT on ia32 and should therefore not add the
+  # dart2native script (since there is no AOT compiler/runtime available)
+  if (include_dart2native && dart_target_arch != "ia32") {
+    public_deps += [ ":copy_dart2native" ]
+  }
+
   if (is_win) {
     public_deps += [ ":copy_7zip" ]
   }
diff --git a/sdk/lib/_http/http_headers.dart b/sdk/lib/_http/http_headers.dart
index 0a5e478..d452315 100644
--- a/sdk/lib/_http/http_headers.dart
+++ b/sdk/lib/_http/http_headers.dart
@@ -104,6 +104,7 @@
   }
 
   void noFolding(String name) {
+    name = _validateField(name);
     if (_noFoldingHeaders == null) _noFoldingHeaders = new List<String>();
     _noFoldingHeaders.add(name);
   }
diff --git a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
index 4b9fdb0..d0377bb 100644
--- a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
@@ -11,6 +11,8 @@
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:collection' show HashMap;
+import 'dart:async' show Completer;
+import 'dart:_js_helper' show convertDartClosureToJS;
 
 /// WARNING: performance of this method is much worse than other uitil
 /// methods in this library. Only use this method as a last resort.
@@ -124,3 +126,23 @@
   //         []..addAll(arguments.map(_convertToJS)));
   //     return _wrapToDart(jsObj);
 }
+
+/// Converts a JavaScript Promise to a Dart [Future].
+///
+/// ```dart
+/// @JS()
+/// external Promise<num> get threePromise; // Resolves to 3
+///
+/// final Future<num> threeFuture = promiseToFuture(threePromise);
+///
+/// final three = await threeFuture; // == 3
+/// ```
+Future<T> promiseToFuture<T>(jsPromise) {
+  final completer = Completer<T>();
+
+  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
+  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
+
+  JS('', '#.then(#, #)', jsPromise, success, error);
+  return completer.future;
+}
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 43e0f08..a52e489 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -20,7 +20,7 @@
         quoteStringForRegExp,
         undefined;
 import 'dart:_runtime' as dart;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JSExportName;
 import 'dart:_native_typed_data' show NativeUint8List;
 import 'dart:collection' show UnmodifiableMapView;
 import 'dart:convert' show Encoding, utf8;
@@ -63,12 +63,39 @@
 
   @patch
   Type get runtimeType => dart.wrapType(dart.getReifiedType(this));
+
+  // Everything is an Object.
+  @JSExportName('is')
+  static bool _is_Object(Object o) => true;
+
+  @JSExportName('as')
+  static Object _as_Object(Object o) => o;
+
+  @JSExportName('_check')
+  static Object _check_Object(Object o) => o;
 }
 
 @patch
 class Null {
   @patch
   int get hashCode => super.hashCode;
+
+  @JSExportName('is')
+  static bool _is_Null(Object o) => o == null;
+
+  @JSExportName('as')
+  static Object _as_Null(Object o) {
+    // Avoid extra function call to core.Null.is() by manually inlining.
+    if (o == null) return o;
+    return dart.cast(o, dart.unwrapType(Null), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_Null(Object o) {
+    // Avoid extra function call to core.Null.is() by manually inlining.
+    if (o == null) return o;
+    return dart.cast(o, dart.unwrapType(Null), true);
+  }
 }
 
 // Patch for Function implementation.
@@ -97,6 +124,24 @@
     });
     return result;
   }
+
+  @JSExportName('is')
+  static bool _is_Function(Object o) =>
+      JS<bool>('!', 'typeof $o == "function"');
+
+  @JSExportName('as')
+  static Object _as_Function(Object o) {
+    // Avoid extra function call to core.Function.is() by manually inlining.
+    if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(Function), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_Function(Object o) {
+    // Avoid extra function call to core.Function.is() by manually inlining.
+    if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(Function), true);
+  }
 }
 
 // TODO(jmesserly): switch to WeakMap
@@ -157,6 +202,31 @@
     throw UnsupportedError(
         'int.fromEnvironment can only be used as a const constructor');
   }
+
+  @JSExportName('is')
+  static bool _is_int(Object o) {
+    return JS<bool>('!', 'typeof $o == "number" && Math.floor($o) == $o');
+  }
+
+  @JSExportName('as')
+  static Object _as_int(Object o) {
+    // Avoid extra function call to core.int.is() by manually inlining.
+    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
+        o == null) {
+      return o;
+    }
+    return dart.cast(o, dart.unwrapType(int), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_int(Object o) {
+    // Avoid extra function call to core.int.is() by manually inlining.
+    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
+        o == null) {
+      return o;
+    }
+    return dart.cast(o, dart.unwrapType(int), true);
+  }
 }
 
 @patch
@@ -171,6 +241,47 @@
   static double tryParse(String source) {
     return Primitives.parseDouble(source, _kNull);
   }
+
+  @JSExportName('is')
+  static bool _is_double(o) {
+    return JS<bool>('!', 'typeof $o == "number"');
+  }
+
+  @JSExportName('as')
+  static Object _as_double(o) {
+    // Avoid extra function call to core.double.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(double), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_double(o) {
+    // Avoid extra function call to core.double.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(double), true);
+  }
+}
+
+@patch
+abstract class num implements Comparable<num> {
+  @JSExportName('is')
+  static bool _is_num(o) {
+    return JS<bool>('!', 'typeof $o == "number"');
+  }
+
+  @JSExportName('as')
+  static Object _as_num(o) {
+    // Avoid extra function call to core.num.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(num), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_num(o) {
+    // Avoid extra function call to core.num.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(num), true);
+  }
 }
 
 @patch
@@ -528,6 +639,25 @@
     }
     return Primitives.stringFromCharCodes(list);
   }
+
+  @JSExportName('is')
+  static bool _is_String(Object o) {
+    return JS<bool>('!', 'typeof $o == "string"');
+  }
+
+  @JSExportName('as')
+  static Object _as_String(Object o) {
+    // Avoid extra function call to core.String.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(String), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_String(Object o) {
+    // Avoid extra function call to core.String.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(String), true);
+  }
 }
 
 @patch
@@ -541,6 +671,24 @@
 
   @patch
   int get hashCode => super.hashCode;
+
+  @JSExportName('is')
+  static bool _is_bool(Object o) =>
+      JS<bool>('!', '$o === true || $o === false');
+
+  @JSExportName('as')
+  static Object _as_bool(Object o) {
+    // Avoid extra function call to core.bool.is() by manually inlining.
+    if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(bool), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_bool(Object o) {
+    // Avoid extra function call to core.bool.is() by manually inlining.
+    if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(bool), true);
+  }
 }
 
 @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index b0300d5..5a8d3b9 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -22,7 +22,13 @@
 import 'dart:_js_names' show unmangleGlobalNameIfPreservedAnyways;
 
 import 'dart:_js_embedded_names'
-    show JsBuiltin, JsGetName, RtiUniverseFieldNames, RTI_UNIVERSE, TYPES;
+    show
+        JsBuiltin,
+        JsGetName,
+        RtiUniverseFieldNames,
+        CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME,
+        RTI_UNIVERSE,
+        TYPES;
 
 import 'dart:_recipe_syntax';
 
@@ -103,6 +109,18 @@
     rti._precomputed1 = precomputed;
   }
 
+  // Data value used by some tests.
+  @pragma('dart2js:noElision')
+  Object _specializedTestResource;
+
+  static Object _getSpecializedTestResource(Rti rti) {
+    return rti._specializedTestResource;
+  }
+
+  static void _setSpecializedTestResource(Rti rti, Object value) {
+    rti._specializedTestResource = value;
+  }
+
   // The Type object corresponding to this Rti.
   Object _cachedRuntimeType;
   static _Type _getCachedRuntimeType(Rti rti) =>
@@ -543,10 +561,14 @@
   return result;
 }
 
+bool _isDartObject(object) => _Utils.instanceOf(object,
+    JS_BUILTIN('depends:none;effects:none;', JsBuiltin.dartObjectConstructor));
+
 bool _isClosure(object) => _Utils.instanceOf(object,
     JS_BUILTIN('depends:none;effects:none;', JsBuiltin.dartClosureConstructor));
 
-/// Returns the structural function [Rti] of [closure].
+/// Returns the structural function [Rti] of [closure], or `null`.
+/// [closure] must be a subclass of [Closure].
 /// Called from generated code.
 Rti closureFunctionType(closure) {
   var signatureName = JS_GET_NAME(JsGetName.SIGNATURE_NAME);
@@ -560,19 +582,6 @@
   return null;
 }
 
-// Subclasses of Closure are synthetic classes. The synthetic classes all
-// extend a 'normal' class (Closure, BoundClosure, StaticClosure), so make
-// them appear to be the superclass.
-// TODO(sra): Can this be done less expensively, e.g. by putting $ti on the
-// prototype of Closure/BoundClosure/StaticClosure classes?
-Rti _closureInterfaceType(closure) {
-  var rti = JS('', r'#[#]', closure, JS_GET_NAME(JsGetName.RTI_NAME));
-  return rti != null
-      ? _castToRti(rti)
-      : _instanceTypeFromConstructor(
-          JS('', '#.__proto__.__proto__.constructor', closure));
-}
-
 /// Returns the Rti type of [object]. Closures have both an interface type
 /// (Closures implement `Function`) and a structural function type. Uses
 /// [testRti] to choose the appropriate type.
@@ -592,23 +601,18 @@
 }
 
 /// Returns the Rti type of [object].
+/// This is the general entry for obtaining the interface type of any value.
 /// Called from generated code.
 Rti instanceType(object) {
-  if (_isClosure(object)) return _closureInterfaceType(object);
-  return _nonClosureInstanceType(object);
-}
+  // TODO(sra): Add interceptor-based specializations of this method. Inject a
+  // _getRti method into (Dart)Object, JSArray, and Interceptor. Then calls to
+  // this method can be generated as `getInterceptor(o)._getRti(o)`, allowing
+  // interceptor optimizations to select the specialization. If the only use of
+  // `getInterceptor` is for calling `_getRti`, then `instanceType` can be
+  // called, similar to a one-shot interceptor call. This would improve type
+  // lookup in ListMixin code as the interceptor is JavaScript 'this'.
 
-Rti _nonClosureInstanceType(object) {
-  // TODO(sra): Add specializations of this method. One possible way is to
-  // arrange that the interceptor has a _getType method that is injected into
-  // DartObject, Interceptor and JSArray. Then this method can be replaced-by
-  // `getInterceptor(o)._getType(o)`, allowing interceptor optimizations to
-  // select the specialization.
-
-  if (_Utils.instanceOf(
-      object,
-      JS_BUILTIN(
-          'depends:none;effects:none;', JsBuiltin.dartObjectConstructor))) {
+  if (_isDartObject(object)) {
     return _instanceType(object);
   }
 
@@ -617,7 +621,7 @@
   }
 
   var interceptor = getInterceptor(object);
-  return _instanceTypeFromConstructor(JS('', '#.constructor', interceptor));
+  return _instanceTypeFromConstructor(interceptor);
 }
 
 /// Returns the Rti type of JavaScript Array [object].
@@ -636,9 +640,7 @@
 /// Called from generated code.
 Rti _instanceType(object) {
   var rti = JS('', r'#[#]', object, JS_GET_NAME(JsGetName.RTI_NAME));
-  return rti != null
-      ? _castToRti(rti)
-      : _instanceTypeFromConstructor(JS('', '#.constructor', object));
+  return rti != null ? _castToRti(rti) : _instanceTypeFromConstructor(object);
 }
 
 String instanceTypeName(object) {
@@ -646,10 +648,32 @@
   return _rtiToString(rti, null);
 }
 
-Rti _instanceTypeFromConstructor(constructor) {
-  // TODO(sra): Cache Rti on constructor.
-  return _Universe.findErasedType(
-      _theUniverse(), JS('String', '#.name', constructor));
+Rti _instanceTypeFromConstructor(instance) {
+  var constructor = JS('', '#.constructor', instance);
+  var probe = JS('', r'#[#]', constructor, CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME);
+  if (probe != null) return _castToRti(probe);
+  return _instanceTypeFromConstructorMiss(instance, constructor);
+}
+
+@pragma('dart2js:noInline')
+Rti _instanceTypeFromConstructorMiss(instance, constructor) {
+  // Subclasses of Closure are synthetic classes. The synthetic classes all
+  // extend a 'normal' class (Closure, BoundClosure, StaticClosure), so make
+  // them appear to be the superclass. Instantiations have a `$ti` field so
+  // don't reach here.
+  //
+  // TODO(39214): This will need fixing if we ever use instances of
+  // StaticClosure for static tear-offs.
+  //
+  // TODO(sra): Can this test be avoided, e.g. by putting $ti on the
+  // prototype of Closure/BoundClosure/StaticClosure classes?
+  var effectiveConstructor = _isClosure(instance)
+      ? JS('', '#.__proto__.__proto__.constructor', instance)
+      : constructor;
+  Rti rti = _Universe.findErasedType(
+      _theUniverse(), JS('String', '#.name', effectiveConstructor));
+  JS('', r'#[#] = #', constructor, CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME, rti);
+  return rti;
 }
 
 /// Returns the structural function type of [object], or `null` if the object is
@@ -672,7 +696,7 @@
 }
 
 Type getRuntimeType(object) {
-  Rti rti = _instanceFunctionType(object) ?? _nonClosureInstanceType(object);
+  Rti rti = _instanceFunctionType(object) ?? instanceType(object);
   return createRuntimeType(rti);
 }
 
@@ -750,6 +774,16 @@
       isFn = RAW_DART_FUNCTION_REF(_isString);
     } else if (JS_GET_NAME(JsGetName.BOOL_RECIPE) == key) {
       isFn = RAW_DART_FUNCTION_REF(_isBool);
+    } else {
+      String name = Rti._getInterfaceName(testRti);
+      var arguments = Rti._getInterfaceTypeArguments(testRti);
+      if (JS(
+          'bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
+        String propertyName =
+            '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
+        Rti._setSpecializedTestResource(testRti, propertyName);
+        isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
+      }
     }
   }
 
@@ -767,6 +801,24 @@
 }
 
 /// Called from generated code.
+bool _isTestViaProperty(object) {
+  // This static method is installed on an Rti object as a JavaScript instance
+  // method. The Rti object is 'this'.
+  Rti testRti = _castToRti(JS('', 'this'));
+  var tag = Rti._getSpecializedTestResource(testRti);
+
+  // This test is redundant with getInterceptor below, but getInterceptor does
+  // the tests in the wrong order for most tags, so it is usually faster to have
+  // this check.
+  if (_isDartObject(object)) {
+    return JS('bool', '!!#[#]', object, tag);
+  }
+
+  var interceptor = getInterceptor(object);
+  return JS('bool', '!!#[#]', interceptor, tag);
+}
+
+/// Called from generated code.
 _generalAsCheckImplementation(object) {
   if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 66cba17..8456b8b 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -47,6 +47,10 @@
 /// the static function's unique (potentially minified) name.
 const STATIC_FUNCTION_NAME_PROPERTY_NAME = r'$static_name';
 
+/// The name of a property on the constructor function of Dart Object
+/// and interceptor types, used for caching Rti types.
+const CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME = r'$ccache';
+
 /// The name of the embedded global for metadata.
 ///
 /// Use [JsBuiltin.getMetadata] instead of directly accessing this embedded
diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart
index 1e61ce6..a8cb80c 100644
--- a/sdk/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/errors_patch.dart
@@ -588,3 +588,17 @@
 
   toString() => "Error: field '$_name' is already initialized.";
 }
+
+class _LateInitializationError extends Error
+    implements LateInitializationError {
+  _LateInitializationError(this._name);
+
+  @pragma("vm:entry-point")
+  static void _throwNew(String name) {
+    throw _LateInitializationError(name);
+  }
+
+  String toString() => "LateInitializationError: $_name";
+
+  final String _name;
+}
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 53f3d35..298083d 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -586,3 +586,8 @@
       ? "Reading static variable during its initialization"
       : "Reading static variable '$variableName' during its initialization";
 }
+
+/**
+ * Error thrown when a late field is set or get when it shouldn't be.
+ */
+class LateInitializationError extends Error {}
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index a47ebdf..f072a7c 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -5,8 +5,7 @@
 /**
  * Foreign Function Interface for interoperability with the C programming language.
  *
- * **NOTE**: Dart:FFI is in technical preview. The overall feature is incomplete,
- * may contain issues, and breaking API changes are still expected.
+ * **NOTE**: Dart:FFI is in beta, and breaking API changes might still happen.
  *
  * For further details, please see: https://dart.dev/server/c-interop
  *
diff --git a/sdk/lib/html/html_common/conversions_dart2js.dart b/sdk/lib/html/html_common/conversions_dart2js.dart
index 625bb31..21ab9ae 100644
--- a/sdk/lib/html/html_common/conversions_dart2js.dart
+++ b/sdk/lib/html/html_common/conversions_dart2js.dart
@@ -98,14 +98,6 @@
 bool isJavaScriptPromise(value) =>
     JS('bool', r'typeof Promise != "undefined" && # instanceof Promise', value);
 
-Future<T> promiseToFuture<T>(promise) {
-  var completer = new Completer<T>();
-  var then = convertDartClosureToJS((r) => completer.complete(r), 1);
-  var error = convertDartClosureToJS((e) => completer.completeError(e), 1);
-  JS('', '#.then(#, #)', promise, then, error);
-  return completer.future;
-}
-
 const String _serializedScriptValue = 'num|String|bool|'
     'JSExtendableArray|=Object|'
     'Blob|File|NativeByteBuffer|NativeTypedData|MessagePort'
diff --git a/sdk/lib/html/html_common/html_common_dart2js.dart b/sdk/lib/html/html_common/html_common_dart2js.dart
index de8d89e..3df2ccf 100644
--- a/sdk/lib/html/html_common/html_common_dart2js.dart
+++ b/sdk/lib/html/html_common/html_common_dart2js.dart
@@ -15,6 +15,9 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray, JSObject;
 
+import 'dart:js_util' show promiseToFuture;
+export 'dart:js_util' show promiseToFuture;
+
 import 'dart:_metadata';
 export 'dart:_metadata';
 
diff --git a/sdk/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/js_util/dart2js/js_util_dart2js.dart
index 6b605fb..2e731fb 100644
--- a/sdk/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk/lib/js_util/dart2js/js_util_dart2js.dart
@@ -13,6 +13,8 @@
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:collection' show HashMap;
+import 'dart:async' show Completer;
+import 'dart:_js_helper' show convertDartClosureToJS;
 
 /// WARNING: performance of this method is much worse than other util
 /// methods in this library. Only use this method as a last resort.
@@ -126,3 +128,23 @@
   //         []..addAll(arguments.map(_convertToJS)));
   //     return _wrapToDart(jsObj);
 }
+
+/// Converts a JavaScript Promise to a Dart [Future].
+///
+/// ```dart
+/// @JS()
+/// external Promise<num> get threePromise; // Resolves to 3
+///
+/// final Future<num> threeFuture = promiseToFuture(threePromise);
+///
+/// final three = await threeFuture; // == 3
+/// ```
+Future<T> promiseToFuture<T>(jsPromise) {
+  final completer = Completer<T>();
+
+  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
+  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
+
+  JS('', '#.then(#, #)', jsPromise, success, error);
+  return completer.future;
+}
diff --git a/sdk_nnbd/BUILD.gn b/sdk_nnbd/BUILD.gn
index e352733..e637088 100644
--- a/sdk_nnbd/BUILD.gn
+++ b/sdk_nnbd/BUILD.gn
@@ -20,9 +20,12 @@
   # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
   dart_platform_sdk = true
 
+  # Whether to include dart2native in the "create_sdk" target.
+  include_dart2native = false
+
   # Path to stripped dart binaries relative to build output directory.
   dart_stripped_binary = "dart"
-  dartaotruntime_stripped_binary = "dartaotruntime"
+  dart_precompiled_runtime_stripped_binary = "dart_precompiled_runtime"
   gen_snapshot_stripped_binary = "gen_snapshot"
 }
 
@@ -35,11 +38,11 @@
 # ......dartaotruntime or dartaotruntime.exe (executable)
 # ......dartdoc
 # ......dartfmt
-# ......dart2native
+# ......dart2native (if `include_dart2native` and not on ia32)
 # ......dart2js
 # ......dartanalyzer
 # ......dartdevc
-# ......utils/gen_snapshot or utils/gen_snapshot.exe (executable)
+# ......utils/gen_snapshot or utils/gen_snapshot.exe (if `include_dart2native` and not on ia32)
 # ......pub
 # ......snapshots/
 # ........analysis_server.dart.snapshot
@@ -48,7 +51,8 @@
 # ........dartdoc.dart.snapshot
 # ........dartfmt.dart.snapshot
 # ........dartdevc.dart.snapshot
-# ........gen_kernel.dart.snapshot
+# ........gen_kernel.dart.snapshot (if `include_dart2native` and not on ia32)
+# ........dart2native.dart.snapshot (if `include_dart2native` and not on ia32)
 # ........kernel_worker.dart.snapshot
 # ........pub.dart.snapshot
 # ......resources/
@@ -68,13 +72,13 @@
 # ....lib/
 # ......libraries.json
 # ......_internal/
-#.........strong.sum
-#.........dart2js_platform.dill
-#.........dart2js_server_platform.dill
-#.........dart2js_platform_strong.dill
-#.........dart2js_server_platform_strong.dill
-#.........vm_platform_strong.dill
-#.........dev_compiler/
+# ........strong.sum
+# ........dart2js_platform.dill
+# ........dart2js_server_platform.dill
+# ........dart2js_platform_strong.dill
+# ........dart2js_server_platform_strong.dill
+# ........vm_platform_strong.dill
+# ........dev_compiler/
 # ......async/
 # ......collection/
 # ......convert/
@@ -117,10 +121,6 @@
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
   [
-    "dart2native",
-    "../utils/dart2native:generate_dart2native_snapshot",
-  ],
-  [
     "dartdoc",
     "../utils/dartdoc",
   ],
@@ -133,6 +133,12 @@
     "../utils/pub",
   ],
 ]
+if (include_dart2native && dart_target_arch != "ia32") {
+  _platform_sdk_snapshots += [ [
+        "dart2native",
+        "../utils/dart2native:generate_dart2native_snapshot",
+      ] ]
+}
 if (create_kernel_service_snapshot) {
   _platform_sdk_snapshots += [ [
         "kernel-service",
@@ -156,10 +162,6 @@
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
   [
-    "dart2native",
-    "../utils/dart2native:generate_dart2native_snapshot",
-  ],
-  [
     "dartdevc",
     "../utils/dartdevc",
   ],
@@ -180,6 +182,12 @@
     "../utils/pub",
   ],
 ]
+if (include_dart2native && dart_target_arch != "ia32") {
+  _full_sdk_snapshots += [ [
+        "dart2native",
+        "../utils/dart2native:generate_dart2native_snapshot",
+      ] ]
+}
 if (create_kernel_service_snapshot) {
   _full_sdk_snapshots += [ [
         "kernel-service",
@@ -314,17 +322,49 @@
       dest = "$root_out_dir/dart-sdk/bin/model"
       ignore_patterns = "{}"
     },
-    {
-      target = "copy_libtensorflowlite_c"
-      visibility = [ ":create_common_sdk" ]
-      deps = [
-        ":copy_libraries",
-      ]
-      source = "../third_party/pkg/tflite_native/lib/src/blobs"
-      dest = "$root_out_dir/dart-sdk/bin/snapshots"
-      ignore_patterns = "{}"
-    },
   ]
+  if (is_linux) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.dll,*mac64.so"
+      },
+    ]
+  }
+  if (is_mac) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.dll,*linux64.so"
+      },
+    ]
+  }
+  if (is_win) {
+    copy_tree_specs += [
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "*.so"
+      },
+    ]
+  }
 }
 
 # This generates targets for everything in copy_tree_specs. The targets have the
@@ -394,25 +434,25 @@
 
 copy("copy_dartaotruntime") {
   deps = [
-    "../runtime/bin:dartaotruntime",
+    "../runtime/bin:dart_precompiled_runtime",
   ]
   dartaotruntime_out =
-      get_label_info("../runtime/bin:dartaotruntime", "root_out_dir")
+      get_label_info("../runtime/bin:dart_precompiled_runtime", "root_out_dir")
   if (is_win) {
     sources = [
-      "$dartaotruntime_out/dartaotruntime.exe",
+      "$dartaotruntime_out/dart_precompiled_runtime.exe",
+    ]
+    outputs = [
+      "$root_out_dir/dart-sdk/bin/dartaotruntime.exe",
     ]
   } else {
     sources = [
-      "$dartaotruntime_out/$dartaotruntime_stripped_binary",
+      "$dartaotruntime_out/$dart_precompiled_runtime_stripped_binary",
+    ]
+    outputs = [
+      "$root_out_dir/dart-sdk/bin/dartaotruntime",
     ]
   }
-  if (is_win) {
-    sources += [ "$dartaotruntime_out/dartaotruntime.lib" ]
-  }
-  outputs = [
-    "$root_out_dir/dart-sdk/bin/{{source_file_part}}",
-  ]
 }
 
 copy("copy_gen_snapshot") {
@@ -437,6 +477,7 @@
 
 copy("copy_dart2native") {
   deps = [
+    ":copy_dartaotruntime",
     ":copy_gen_kernel_snapshot",
     ":copy_gen_snapshot",
   ]
@@ -987,7 +1028,6 @@
     ":copy_analysis_summaries",
     ":copy_api_readme",
     ":copy_dart",
-    ":copy_dart2native",
     ":copy_dartdoc_files",
     ":copy_headers",
     ":copy_libraries_dart",
@@ -999,6 +1039,13 @@
     ":write_revision_file",
     ":write_version_file",
   ]
+
+  # We do not support AOT on ia32 and should therefore not add the
+  # dart2native script (since there is no AOT compiler/runtime available)
+  if (include_dart2native && dart_target_arch != "ia32") {
+    public_deps += [ ":copy_dart2native" ]
+  }
+
   if (is_win) {
     public_deps += [ ":copy_7zip" ]
   }
diff --git a/sdk_nnbd/lib/_http/http_headers.dart b/sdk_nnbd/lib/_http/http_headers.dart
index f383790..f2d9da8 100644
--- a/sdk_nnbd/lib/_http/http_headers.dart
+++ b/sdk_nnbd/lib/_http/http_headers.dart
@@ -106,6 +106,7 @@
   }
 
   void noFolding(String name) {
+    name = _validateField(name);
     if (_noFoldingHeaders == null) _noFoldingHeaders = new List<String>();
     _noFoldingHeaders.add(name);
   }
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
index 66f8c29..1cccbaa 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
@@ -13,6 +13,8 @@
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:collection' show HashMap;
+import 'dart:async' show Completer;
+import 'dart:_js_helper' show convertDartClosureToJS;
 
 /// WARNING: performance of this method is much worse than other uitil
 /// methods in this library. Only use this method as a last resort.
@@ -126,3 +128,23 @@
   //         []..addAll(arguments.map(_convertToJS)));
   //     return _wrapToDart(jsObj);
 }
+
+/// Converts a JavaScript Promise to a Dart [Future].
+///
+/// ```dart
+/// @JS()
+/// external Promise<num> get threePromise; // Resolves to 3
+///
+/// final Future<num> threeFuture = promiseToFuture(threePromise);
+///
+/// final three = await threeFuture; // == 3
+/// ```
+Future<T> promiseToFuture<T>(jsPromise) {
+  final completer = Completer<T>();
+
+  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
+  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
+
+  JS('', '#.then(#, #)', jsPromise, success, error);
+  return completer.future;
+}
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
index 88d2407..894aef4 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 // Patch file for the dart:async library.
 
 import 'dart:_js_helper' show notNull, patch, ReifyFunctionTypes;
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 4829140..48e9236 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -20,7 +20,7 @@
         quoteStringForRegExp,
         undefined;
 import 'dart:_runtime' as dart;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JSExportName;
 import 'dart:_native_typed_data' show NativeUint8List;
 import 'dart:collection' show UnmodifiableMapView;
 import 'dart:convert' show Encoding, utf8;
@@ -63,12 +63,39 @@
 
   @patch
   Type get runtimeType => dart.wrapType(dart.getReifiedType(this));
+
+  // Everything is an Object.
+  @JSExportName('is')
+  static bool _is_Object(Object o) => true;
+
+  @JSExportName('as')
+  static Object _as_Object(Object o) => o;
+
+  @JSExportName('_check')
+  static Object _check_Object(Object o) => o;
 }
 
 @patch
 class Null {
   @patch
   int get hashCode => super.hashCode;
+
+  @JSExportName('is')
+  static bool _is_Null(Object o) => o == null;
+
+  @JSExportName('as')
+  static Object _as_Null(Object o) {
+    // Avoid extra function call to core.Null.is() by manually inlining.
+    if (o == null) return o;
+    return dart.cast(o, dart.unwrapType(Null), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_Null(Object o) {
+    // Avoid extra function call to core.Null.is() by manually inlining.
+    if (o == null) return o;
+    return dart.cast(o, dart.unwrapType(Null), true);
+  }
 }
 
 // Patch for Function implementation.
@@ -97,6 +124,24 @@
     });
     return result;
   }
+
+  @JSExportName('is')
+  static bool _is_Function(Object o) =>
+      JS<bool>('!', 'typeof $o == "function"');
+
+  @JSExportName('as')
+  static Object _as_Function(Object o) {
+    // Avoid extra function call to core.Function.is() by manually inlining.
+    if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(Function), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_Function(Object o) {
+    // Avoid extra function call to core.Function.is() by manually inlining.
+    if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(Function), true);
+  }
 }
 
 // TODO(jmesserly): switch to WeakMap
@@ -157,6 +202,31 @@
     throw UnsupportedError(
         'int.fromEnvironment can only be used as a const constructor');
   }
+
+  @JSExportName('is')
+  static bool _is_int(Object o) {
+    return JS<bool>('!', 'typeof $o == "number" && Math.floor($o) == $o');
+  }
+
+  @JSExportName('as')
+  static Object _as_int(Object o) {
+    // Avoid extra function call to core.int.is() by manually inlining.
+    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
+        o == null) {
+      return o;
+    }
+    return dart.cast(o, dart.unwrapType(int), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_int(Object o) {
+    // Avoid extra function call to core.int.is() by manually inlining.
+    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
+        o == null) {
+      return o;
+    }
+    return dart.cast(o, dart.unwrapType(int), true);
+  }
 }
 
 @patch
@@ -171,6 +241,47 @@
   static double? tryParse(String source) {
     return Primitives.parseDouble(source, _kNull);
   }
+
+  @JSExportName('is')
+  static bool _is_double(o) {
+    return JS<bool>('!', 'typeof $o == "number"');
+  }
+
+  @JSExportName('as')
+  static Object _as_double(o) {
+    // Avoid extra function call to core.double.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(double), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_double(o) {
+    // Avoid extra function call to core.double.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(double), true);
+  }
+}
+
+@patch
+abstract class num implements Comparable<num> {
+  @JSExportName('is')
+  static bool _is_num(o) {
+    return JS<bool>('!', 'typeof $o == "number"');
+  }
+
+  @JSExportName('as')
+  static Object _as_num(o) {
+    // Avoid extra function call to core.num.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(num), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_num(o) {
+    // Avoid extra function call to core.num.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(num), true);
+  }
 }
 
 @patch
@@ -532,6 +643,25 @@
     }
     return Primitives.stringFromCharCodes(list);
   }
+
+  @JSExportName('is')
+  static bool _is_String(Object o) {
+    return JS<bool>('!', 'typeof $o == "string"');
+  }
+
+  @JSExportName('as')
+  static Object _as_String(Object o) {
+    // Avoid extra function call to core.String.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(String), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_String(Object o) {
+    // Avoid extra function call to core.String.is() by manually inlining.
+    if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(String), true);
+  }
 }
 
 @patch
@@ -545,6 +675,24 @@
 
   @patch
   int get hashCode => super.hashCode;
+
+  @JSExportName('is')
+  static bool _is_bool(Object o) =>
+      JS<bool>('!', '$o === true || $o === false');
+
+  @JSExportName('as')
+  static Object _as_bool(Object o) {
+    // Avoid extra function call to core.bool.is() by manually inlining.
+    if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(bool), false);
+  }
+
+  @JSExportName('_check')
+  static Object _check_bool(Object o) {
+    // Avoid extra function call to core.bool.is() by manually inlining.
+    if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
+    return dart.cast(o, dart.unwrapType(bool), true);
+  }
 }
 
 @patch
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/developer_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/developer_patch.dart
index 7f5e4fe..a60609f 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/developer_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/developer_patch.dart
@@ -13,7 +13,7 @@
 
 @patch
 @ForceInline()
-bool debugger({bool when = true, String message}) {
+bool debugger({bool when = true, String? message}) {
   if (when) {
     JS('', 'debugger');
   }
@@ -21,7 +21,7 @@
 }
 
 @patch
-Object inspect(Object object) {
+Object? inspect(Object? object) {
   // Note: this log level does not show up by default in Chrome.
   // This is used for communication with the debugger service.
   JS('', 'console.debug("dart.developer.inspect", #)', object);
@@ -30,13 +30,13 @@
 
 @patch
 void log(String message,
-    {DateTime time,
-    int sequenceNumber,
+    {DateTime? time,
+    int? sequenceNumber,
     int level = 0,
     String name = '',
-    Zone zone,
-    Object error,
-    StackTrace stackTrace}) {
+    Zone? zone,
+    Object? error,
+    StackTrace? stackTrace}) {
   Object items =
       JS('!', '{ message: #, name: #, level: # }', message, name, level);
   if (time != null) JS('', '#.time = #', items, time);
@@ -50,10 +50,10 @@
   JS('', 'console.debug("dart.developer.log", #)', items);
 }
 
-final _extensions = Map<String, ServiceExtensionHandler>();
+final _extensions = <String, ServiceExtensionHandler>{};
 
 @patch
-ServiceExtensionHandler _lookupExtension(String method) {
+ServiceExtensionHandler? _lookupExtension(String method) {
   return _extensions[method];
 }
 
@@ -79,7 +79,7 @@
   return JS('', 'new #.Promise(#)', dart.global_,
       (Function(Object) resolve, Function(Object) reject) async {
     try {
-      var method = _lookupExtension(methodName);
+      var method = _lookupExtension(methodName)!;
       var parameters = (json.decode(encodedJson) as Map).cast<String, String>();
       var result = await method(methodName, parameters);
       resolve(result._toString());
@@ -164,7 +164,7 @@
 }
 
 @patch
-String _getIsolateIDFromSendPort(SendPort sendPort) {
+String? _getIsolateIDFromSendPort(SendPort sendPort) {
   return null;
 }
 
@@ -178,7 +178,7 @@
 }
 
 class _FakeUserTag implements UserTag {
-  static Map _instances = {};
+  static final _instances = <String, _FakeUserTag>{};
 
   _FakeUserTag.real(this.label);
 
@@ -193,10 +193,7 @@
       throw UnsupportedError(
           'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
     }
-    // Create a new instance and add it to the instance map.
-    var instance = _FakeUserTag.real(label);
-    _instances[label] = instance;
-    return instance;
+    return _instances[label] = _FakeUserTag.real(label);
   }
 
   final String label;
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
index e642b5c..5e850bb 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 import 'dart:core' hide Symbol;
 import 'dart:core' as core show Symbol;
 import 'dart:_js_primitives' show printString;
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
index 1bda4e3..9b9e648 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
@@ -24,7 +24,13 @@
 import 'dart:_js_names' show unmangleGlobalNameIfPreservedAnyways;
 
 import 'dart:_js_embedded_names'
-    show JsBuiltin, JsGetName, RtiUniverseFieldNames, RTI_UNIVERSE, TYPES;
+    show
+        JsBuiltin,
+        JsGetName,
+        RtiUniverseFieldNames,
+        CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME,
+        RTI_UNIVERSE,
+        TYPES;
 
 import 'dart:_recipe_syntax';
 
@@ -105,6 +111,18 @@
     rti._precomputed1 = precomputed;
   }
 
+  // Data value used by some tests.
+  @pragma('dart2js:noElision')
+  Object _specializedTestResource;
+
+  static Object _getSpecializedTestResource(Rti rti) {
+    return rti._specializedTestResource;
+  }
+
+  static void _setSpecializedTestResource(Rti rti, Object value) {
+    rti._specializedTestResource = value;
+  }
+
   // The Type object corresponding to this Rti.
   Object _cachedRuntimeType;
   static _Type _getCachedRuntimeType(Rti rti) =>
@@ -545,10 +563,14 @@
   return result;
 }
 
+bool _isDartObject(object) => _Utils.instanceOf(object,
+    JS_BUILTIN('depends:none;effects:none;', JsBuiltin.dartObjectConstructor));
+
 bool _isClosure(object) => _Utils.instanceOf(object,
     JS_BUILTIN('depends:none;effects:none;', JsBuiltin.dartClosureConstructor));
 
-/// Returns the structural function [Rti] of [closure].
+/// Returns the structural function [Rti] of [closure], or `null`.
+/// [closure] must be a subclass of [Closure].
 /// Called from generated code.
 Rti closureFunctionType(closure) {
   var signatureName = JS_GET_NAME(JsGetName.SIGNATURE_NAME);
@@ -562,19 +584,6 @@
   return null;
 }
 
-// Subclasses of Closure are synthetic classes. The synthetic classes all
-// extend a 'normal' class (Closure, BoundClosure, StaticClosure), so make
-// them appear to be the superclass.
-// TODO(sra): Can this be done less expensively, e.g. by putting $ti on the
-// prototype of Closure/BoundClosure/StaticClosure classes?
-Rti _closureInterfaceType(closure) {
-  var rti = JS('', r'#[#]', closure, JS_GET_NAME(JsGetName.RTI_NAME));
-  return rti != null
-      ? _castToRti(rti)
-      : _instanceTypeFromConstructor(
-          JS('', '#.__proto__.__proto__.constructor', closure));
-}
-
 /// Returns the Rti type of [object]. Closures have both an interface type
 /// (Closures implement `Function`) and a structural function type. Uses
 /// [testRti] to choose the appropriate type.
@@ -594,23 +603,18 @@
 }
 
 /// Returns the Rti type of [object].
+/// This is the general entry for obtaining the interface type of any value.
 /// Called from generated code.
 Rti instanceType(object) {
-  if (_isClosure(object)) return _closureInterfaceType(object);
-  return _nonClosureInstanceType(object);
-}
+  // TODO(sra): Add interceptor-based specializations of this method. Inject a
+  // _getRti method into (Dart)Object, JSArray, and Interceptor. Then calls to
+  // this method can be generated as `getInterceptor(o)._getRti(o)`, allowing
+  // interceptor optimizations to select the specialization. If the only use of
+  // `getInterceptor` is for calling `_getRti`, then `instanceType` can be
+  // called, similar to a one-shot interceptor call. This would improve type
+  // lookup in ListMixin code as the interceptor is JavaScript 'this'.
 
-Rti _nonClosureInstanceType(object) {
-  // TODO(sra): Add specializations of this method. One possible way is to
-  // arrange that the interceptor has a _getType method that is injected into
-  // DartObject, Interceptor and JSArray. Then this method can be replaced-by
-  // `getInterceptor(o)._getType(o)`, allowing interceptor optimizations to
-  // select the specialization.
-
-  if (_Utils.instanceOf(
-      object,
-      JS_BUILTIN(
-          'depends:none;effects:none;', JsBuiltin.dartObjectConstructor))) {
+  if (_isDartObject(object)) {
     return _instanceType(object);
   }
 
@@ -619,7 +623,7 @@
   }
 
   var interceptor = getInterceptor(object);
-  return _instanceTypeFromConstructor(JS('', '#.constructor', interceptor));
+  return _instanceTypeFromConstructor(interceptor);
 }
 
 /// Returns the Rti type of JavaScript Array [object].
@@ -638,9 +642,7 @@
 /// Called from generated code.
 Rti _instanceType(object) {
   var rti = JS('', r'#[#]', object, JS_GET_NAME(JsGetName.RTI_NAME));
-  return rti != null
-      ? _castToRti(rti)
-      : _instanceTypeFromConstructor(JS('', '#.constructor', object));
+  return rti != null ? _castToRti(rti) : _instanceTypeFromConstructor(object);
 }
 
 String instanceTypeName(object) {
@@ -648,10 +650,32 @@
   return _rtiToString(rti, null);
 }
 
-Rti _instanceTypeFromConstructor(constructor) {
-  // TODO(sra): Cache Rti on constructor.
-  return _Universe.findErasedType(
-      _theUniverse(), JS('String', '#.name', constructor));
+Rti _instanceTypeFromConstructor(instance) {
+  var constructor = JS('', '#.constructor', instance);
+  var probe = JS('', r'#[#]', constructor, CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME);
+  if (probe != null) return _castToRti(probe);
+  return _instanceTypeFromConstructorMiss(instance, constructor);
+}
+
+@pragma('dart2js:noInline')
+Rti _instanceTypeFromConstructorMiss(instance, constructor) {
+  // Subclasses of Closure are synthetic classes. The synthetic classes all
+  // extend a 'normal' class (Closure, BoundClosure, StaticClosure), so make
+  // them appear to be the superclass. Instantiations have a `$ti` field so
+  // don't reach here.
+  //
+  // TODO(39214): This will need fixing if we ever use instances of
+  // StaticClosure for static tear-offs.
+  //
+  // TODO(sra): Can this test be avoided, e.g. by putting $ti on the
+  // prototype of Closure/BoundClosure/StaticClosure classes?
+  var effectiveConstructor = _isClosure(instance)
+      ? JS('', '#.__proto__.__proto__.constructor', instance)
+      : constructor;
+  Rti rti = _Universe.findErasedType(
+      _theUniverse(), JS('String', '#.name', effectiveConstructor));
+  JS('', r'#[#] = #', constructor, CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME, rti);
+  return rti;
 }
 
 /// Returns the structural function type of [object], or `null` if the object is
@@ -674,7 +698,7 @@
 }
 
 Type getRuntimeType(object) {
-  Rti rti = _instanceFunctionType(object) ?? _nonClosureInstanceType(object);
+  Rti rti = _instanceFunctionType(object) ?? instanceType(object);
   return createRuntimeType(rti);
 }
 
@@ -752,6 +776,16 @@
       isFn = RAW_DART_FUNCTION_REF(_isString);
     } else if (JS_GET_NAME(JsGetName.BOOL_RECIPE) == key) {
       isFn = RAW_DART_FUNCTION_REF(_isBool);
+    } else {
+      String name = Rti._getInterfaceName(testRti);
+      var arguments = Rti._getInterfaceTypeArguments(testRti);
+      if (JS(
+          'bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
+        String propertyName =
+            '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
+        Rti._setSpecializedTestResource(testRti, propertyName);
+        isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
+      }
     }
   }
 
@@ -769,6 +803,24 @@
 }
 
 /// Called from generated code.
+bool _isTestViaProperty(object) {
+  // This static method is installed on an Rti object as a JavaScript instance
+  // method. The Rti object is 'this'.
+  Rti testRti = _castToRti(JS('', 'this'));
+  var tag = Rti._getSpecializedTestResource(testRti);
+
+  // This test is redundant with getInterceptor below, but getInterceptor does
+  // the tests in the wrong order for most tags, so it is usually faster to have
+  // this check.
+  if (_isDartObject(object)) {
+    return JS('bool', '!!#[#]', object, tag);
+  }
+
+  var interceptor = getInterceptor(object);
+  return JS('bool', '!!#[#]', interceptor, tag);
+}
+
+/// Called from generated code.
 _generalAsCheckImplementation(object) {
   if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 4628ac9..99435c0 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -49,6 +49,10 @@
 /// the static function's unique (potentially minified) name.
 const STATIC_FUNCTION_NAME_PROPERTY_NAME = r'$static_name';
 
+/// The name of a property on the constructor function of Dart Object
+/// and interceptor types, used for caching Rti types.
+const CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME = r'$ccache';
+
 /// The name of the embedded global for metadata.
 ///
 /// Use [JsBuiltin.getMetadata] instead of directly accessing this embedded
diff --git a/sdk_nnbd/lib/_internal/vm/lib/errors_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/errors_patch.dart
index 628419c..5d7ee8c 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/errors_patch.dart
@@ -590,3 +590,17 @@
 
   toString() => "Error: field '$_name' is already initialized.";
 }
+
+class _LateInitializationError extends Error
+    implements LateInitializationError {
+  _LateInitializationError(this._name);
+
+  @pragma("vm:entry-point")
+  static void _throwNew(String name) {
+    throw _LateInitializationError(name);
+  }
+
+  String toString() => "LateInitializationError: $_name";
+
+  final String _name;
+}
diff --git a/sdk_nnbd/lib/async/async.dart b/sdk_nnbd/lib/async/async.dart
index b4bec24..75d1c60 100644
--- a/sdk_nnbd/lib/async/async.dart
+++ b/sdk_nnbd/lib/async/async.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 /**
  * Support for asynchronous programming,
  * with classes such as Future and Stream.
@@ -95,7 +93,7 @@
  */
 library dart.async;
 
-import "dart:collection" show HashMap, IterableBase;
+import "dart:collection" show HashMap;
 import "dart:_internal"
     show
         CastStream,
diff --git a/sdk_nnbd/lib/async/async_error.dart b/sdk_nnbd/lib/async/async_error.dart
index 5edac63..17abfed 100644
--- a/sdk_nnbd/lib/async/async_error.dart
+++ b/sdk_nnbd/lib/async/async_error.dart
@@ -2,20 +2,17 @@
 // 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.
 
-// @dart = 2.5
-
 part of dart.async;
 
 _invokeErrorHandler(
-    Function errorHandler, Object error, StackTrace stackTrace) {
-  if (errorHandler is ZoneBinaryCallback<dynamic, Null, Null>) {
+    Function errorHandler, Object error, StackTrace? stackTrace) {
+  var handler = errorHandler; // Rename to avoid promotion.
+  if (handler is ZoneBinaryCallback<dynamic, Never, Never>) {
     // Dynamic invocation because we don't know the actual type of the
     // first argument or the error object, but we should successfully call
     // the handler if they match up.
-    // TODO(lrn): Should we? Why not the same below for the unary case?
-    return (errorHandler as dynamic)(error, stackTrace);
+    return errorHandler(error, stackTrace);
   } else {
-    ZoneUnaryCallback unaryErrorHandler = errorHandler;
-    return unaryErrorHandler(error);
+    return errorHandler(error);
   }
 }
diff --git a/sdk_nnbd/lib/async/broadcast_stream_controller.dart b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
index c5358f2..ec0bae3 100644
--- a/sdk_nnbd/lib/async/broadcast_stream_controller.dart
+++ b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 class _BroadcastStream<T> extends _ControllerStream<T> {
@@ -22,11 +20,12 @@
   // does not assume that it's use of the state integer is the only use.
   int _eventState = 0; // Initialized to help dart2js type inference.
 
-  _BroadcastSubscription<T> _next;
-  _BroadcastSubscription<T> _previous;
+  _BroadcastSubscription<T>? _next;
+  _BroadcastSubscription<T>? _previous;
 
   _BroadcastSubscription(_StreamControllerLifecycle<T> controller,
-      void onData(T data), Function onError, void onDone(), bool cancelOnError)
+      void onData(T data)?, Function? onError, void onDone()?,
+      bool cancelOnError)
       : super(controller, onData, onError, onDone, cancelOnError) {
     _next = _previous = this;
   }
@@ -66,18 +65,18 @@
   static const int _STATE_CLOSED = 4;
   static const int _STATE_ADDSTREAM = 8;
 
-  ControllerCallback onListen;
-  ControllerCancelCallback onCancel;
+  void Function()? onListen;
+  FutureOr<void> Function()? onCancel;
 
   // State of the controller.
   int _state;
 
   // Double-linked list of active listeners.
-  _BroadcastSubscription<T> _firstSubscription;
-  _BroadcastSubscription<T> _lastSubscription;
+  _BroadcastSubscription<T>? _firstSubscription;
+  _BroadcastSubscription<T>? _lastSubscription;
 
   // Extra state used during an [addStream] call.
-  _AddStreamState<T> _addStreamState;
+  _AddStreamState<T>? _addStreamState;
 
   /**
    * Future returned by [close] and [done].
@@ -92,27 +91,27 @@
    * Any attempt to listen after calling [close] will throw, so there won't
    * be any further listeners.
    */
-  _Future _doneFuture;
+  _Future<void>? _doneFuture;
 
   _BroadcastStreamController(this.onListen, this.onCancel)
       : _state = _STATE_INITIAL;
 
-  ControllerCallback get onPause {
+  void Function() get onPause {
     throw new UnsupportedError(
         "Broadcast stream controllers do not support pause callbacks");
   }
 
-  void set onPause(void onPauseHandler()) {
+  void set onPause(void onPauseHandler()?) {
     throw new UnsupportedError(
         "Broadcast stream controllers do not support pause callbacks");
   }
 
-  ControllerCallback get onResume {
+  void Function() get onResume {
     throw new UnsupportedError(
         "Broadcast stream controllers do not support pause callbacks");
   }
 
-  void set onResume(void onResumeHandler()) {
+  void set onResume(void onResumeHandler()?) {
     throw new UnsupportedError(
         "Broadcast stream controllers do not support pause callbacks");
   }
@@ -153,10 +152,7 @@
 
   bool get _mayAddEvent => (_state < _STATE_CLOSED);
 
-  _Future _ensureDoneFuture() {
-    if (_doneFuture != null) return _doneFuture;
-    return _doneFuture = new _Future();
-  }
+  _Future<void> _ensureDoneFuture() => _doneFuture ??= _Future<void>();
 
   // Linked list helpers
 
@@ -167,7 +163,7 @@
     assert(identical(subscription._next, subscription));
     subscription._eventState = (_state & _STATE_EVENT_ID);
     // Insert in linked list as last subscription.
-    _BroadcastSubscription<T> oldLast = _lastSubscription;
+    _BroadcastSubscription<T>? oldLast = _lastSubscription;
     _lastSubscription = subscription;
     subscription._next = null;
     subscription._previous = oldLast;
@@ -181,8 +177,8 @@
   void _removeListener(_BroadcastSubscription<T> subscription) {
     assert(identical(subscription._controller, this));
     assert(!identical(subscription._next, subscription));
-    _BroadcastSubscription<T> previous = subscription._previous;
-    _BroadcastSubscription<T> next = subscription._next;
+    _BroadcastSubscription<T>? previous = subscription._previous;
+    _BroadcastSubscription<T>? next = subscription._next;
     if (previous == null) {
       // This was the first subscription.
       _firstSubscription = next;
@@ -201,13 +197,12 @@
 
   // _StreamControllerLifecycle interface.
 
-  StreamSubscription<T> _subscribe(void onData(T data), Function onError,
-      void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _subscribe(void onData(T data)?, Function? onError,
+      void onDone()?, bool cancelOnError) {
     if (isClosed) {
-      onDone ??= _nullDoneHandler;
       return new _DoneStreamSubscription<T>(onDone);
     }
-    StreamSubscription<T> subscription = new _BroadcastSubscription<T>(
+    var subscription = new _BroadcastSubscription<T>(
         this, onData, onError, onDone, cancelOnError);
     _addListener(subscription);
     if (identical(_firstSubscription, _lastSubscription)) {
@@ -217,8 +212,8 @@
     return subscription;
   }
 
-  Future _recordCancel(StreamSubscription<T> sub) {
-    _BroadcastSubscription<T> subscription = sub;
+  Future<void>? _recordCancel(StreamSubscription<T> sub) {
+    _BroadcastSubscription<T> subscription = sub as _BroadcastSubscription<T>;
     // If already removed by the stream, don't remove it again.
     if (identical(subscription._next, subscription)) return null;
     if (subscription._isFiring) {
@@ -252,12 +247,11 @@
     _sendData(data);
   }
 
-  void addError(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
+  void addError(Object error, [StackTrace? stackTrace]) {
     if (!_mayAddEvent) throw _addEventError();
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
     if (replacement != null) {
-      error = _nonNullError(replacement.error);
+      error = replacement.error;
       stackTrace = replacement.stackTrace;
     }
     _sendError(error, stackTrace);
@@ -266,7 +260,7 @@
   Future close() {
     if (isClosed) {
       assert(_doneFuture != null);
-      return _doneFuture;
+      return _doneFuture!;
     }
     if (!_mayAddEvent) throw _addEventError();
     _state |= _STATE_CLOSED;
@@ -275,13 +269,15 @@
     return doneFuture;
   }
 
-  Future get done => _ensureDoneFuture();
+  Future<void> get done => _ensureDoneFuture();
 
-  Future addStream(Stream<T> stream, {bool cancelOnError}) {
+  Future addStream(Stream<T> stream, {bool? cancelOnError}) {
     if (!_mayAddEvent) throw _addEventError();
     _state |= _STATE_ADDSTREAM;
-    _addStreamState = new _AddStreamState(this, stream, cancelOnError ?? false);
-    return _addStreamState.addStreamFuture;
+    var addStreamState =
+        new _AddStreamState(this, stream, cancelOnError ?? false);
+    _addStreamState = addStreamState;
+    return addStreamState.addStreamFuture;
   }
 
   // _EventSink interface, called from AddStreamState.
@@ -289,13 +285,13 @@
     _sendData(data);
   }
 
-  void _addError(Object error, StackTrace stackTrace) {
+  void _addError(Object error, StackTrace? stackTrace) {
     _sendError(error, stackTrace);
   }
 
   void _close() {
     assert(_isAddingStream);
-    _AddStreamState addState = _addStreamState;
+    _AddStreamState addState = _addStreamState!;
     _addStreamState = null;
     _state &= ~_STATE_ADDSTREAM;
     addState.complete();
@@ -319,13 +315,13 @@
     // Any listeners added while firing this event will expect the next event,
     // not this one, and won't get notified.
     _state ^= _STATE_EVENT_ID | _STATE_FIRING;
-    _BroadcastSubscription<T> subscription = _firstSubscription;
+    _BroadcastSubscription<T>? subscription = _firstSubscription;
     while (subscription != null) {
       if (subscription._expectsEvent(id)) {
         subscription._eventState |= _BroadcastSubscription._STATE_FIRING;
         action(subscription);
         subscription._toggleEventId();
-        _BroadcastSubscription<T> next = subscription._next;
+        _BroadcastSubscription<T>? next = subscription._next;
         if (subscription._removeAfterFiring) {
           _removeListener(subscription);
         }
@@ -344,9 +340,12 @@
 
   void _callOnCancel() {
     assert(_isEmpty);
-    if (isClosed && _doneFuture._mayComplete) {
+    if (isClosed) {
       // When closed, _doneFuture is not null.
-      _doneFuture._asyncComplete(null);
+      var doneFuture = _doneFuture!;
+      if (doneFuture._mayComplete) {
+        doneFuture._asyncComplete(null);
+      }
     }
     _runGuarded(onCancel);
   }
@@ -354,7 +353,7 @@
 
 class _SyncBroadcastStreamController<T> extends _BroadcastStreamController<T>
     implements SynchronousStreamController<T> {
-  _SyncBroadcastStreamController(void onListen(), void onCancel())
+  _SyncBroadcastStreamController(void onListen()?, void onCancel()?)
       : super(onListen, onCancel);
 
   // EventDispatch interface.
@@ -373,8 +372,7 @@
     if (_isEmpty) return;
     if (_hasOneListener) {
       _state |= _BroadcastStreamController._STATE_FIRING;
-      _BroadcastSubscription<T> subscription = _firstSubscription;
-      subscription._add(data);
+      (_firstSubscription as _BroadcastSubscription<T>)._add(data);
       _state &= ~_BroadcastStreamController._STATE_FIRING;
       if (_isEmpty) {
         _callOnCancel();
@@ -386,7 +384,7 @@
     });
   }
 
-  void _sendError(Object error, StackTrace stackTrace) {
+  void _sendError(Object error, StackTrace? stackTrace) {
     if (_isEmpty) return;
     _forEachListener((_BufferingStreamSubscription<T> subscription) {
       subscription._addError(error, stackTrace);
@@ -399,29 +397,28 @@
         subscription._close();
       });
     } else {
-      assert(_doneFuture != null);
-      assert(_doneFuture._mayComplete);
-      _doneFuture._asyncComplete(null);
+      assert(_doneFuture != null && _doneFuture!._mayComplete);
+      _doneFuture!._asyncComplete(null);
     }
   }
 }
 
 class _AsyncBroadcastStreamController<T> extends _BroadcastStreamController<T> {
-  _AsyncBroadcastStreamController(void onListen(), void onCancel())
+  _AsyncBroadcastStreamController(void onListen()?, void onCancel()?)
       : super(onListen, onCancel);
 
   // EventDispatch interface.
 
   void _sendData(T data) {
-    for (_BroadcastSubscription<T> subscription = _firstSubscription;
+    for (var subscription = _firstSubscription;
         subscription != null;
         subscription = subscription._next) {
       subscription._addPending(new _DelayedData<T>(data));
     }
   }
 
-  void _sendError(Object error, StackTrace stackTrace) {
-    for (_BroadcastSubscription<T> subscription = _firstSubscription;
+  void _sendError(Object error, StackTrace? stackTrace) {
+    for (var subscription = _firstSubscription;
         subscription != null;
         subscription = subscription._next) {
       subscription._addPending(new _DelayedError(error, stackTrace));
@@ -430,15 +427,14 @@
 
   void _sendDone() {
     if (!_isEmpty) {
-      for (_BroadcastSubscription<T> subscription = _firstSubscription;
+      for (var subscription = _firstSubscription;
           subscription != null;
           subscription = subscription._next) {
         subscription._addPending(const _DelayedDone());
       }
     } else {
-      assert(_doneFuture != null);
-      assert(_doneFuture._mayComplete);
-      _doneFuture._asyncComplete(null);
+      assert(_doneFuture != null && _doneFuture!._mayComplete);
+      _doneFuture!._asyncComplete(null);
     }
   }
 }
@@ -456,16 +452,18 @@
  */
 class _AsBroadcastStreamController<T> extends _SyncBroadcastStreamController<T>
     implements _EventDispatch<T> {
-  _StreamImplEvents<T> _pending;
+  _StreamImplEvents<T>? _pending;
 
-  _AsBroadcastStreamController(void onListen(), void onCancel())
+  _AsBroadcastStreamController(void onListen()?, void onCancel()?)
       : super(onListen, onCancel);
 
-  bool get _hasPending => _pending != null && !_pending.isEmpty;
+  bool get _hasPending {
+    var pending = _pending;
+    return pending != null && !pending.isEmpty;
+  }
 
   void _addPendingEvent(_DelayedEvent event) {
-    _pending ??= new _StreamImplEvents<T>();
-    _pending.add(event);
+    (_pending ??= new _StreamImplEvents<T>()).add(event);
   }
 
   void add(T data) {
@@ -474,20 +472,24 @@
       return;
     }
     super.add(data);
-    while (_hasPending) {
-      _pending.handleNext(this);
-    }
+    _flushPending();
   }
 
-  void addError(Object error, [StackTrace stackTrace]) {
+  void addError(Object error, [StackTrace? stackTrace]) {
     if (!isClosed && _isFiring) {
       _addPendingEvent(new _DelayedError(error, stackTrace));
       return;
     }
     if (!_mayAddEvent) throw _addEventError();
     _sendError(error, stackTrace);
-    while (_hasPending) {
-      _pending.handleNext(this);
+    _flushPending();
+  }
+
+  void _flushPending() {
+    var pending = _pending;
+    while (pending != null && !pending.isEmpty) {
+      pending.handleNext(this);
+      pending = _pending;
     }
   }
 
@@ -503,8 +505,9 @@
   }
 
   void _callOnCancel() {
-    if (_hasPending) {
-      _pending.clear();
+    var pending = _pending;
+    if (pending != null) {
+      pending.clear();
       _pending = null;
     }
     super._callOnCancel();
diff --git a/sdk_nnbd/lib/async/deferred_load.dart b/sdk_nnbd/lib/async/deferred_load.dart
index 1e2be92..419db58 100644
--- a/sdk_nnbd/lib/async/deferred_load.dart
+++ b/sdk_nnbd/lib/async/deferred_load.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /**
@@ -15,7 +13,7 @@
 @Deprecated("Dart sdk v. 1.8")
 class DeferredLibrary {
   final String libraryName;
-  final String uri;
+  final String? uri;
 
   const DeferredLibrary(this.libraryName, {this.uri});
 
@@ -32,7 +30,7 @@
  * Thrown when a deferred library fails to load.
  */
 class DeferredLoadException implements Exception {
-  DeferredLoadException(this._s);
+  DeferredLoadException(String message) : _s = message;
   String toString() => "DeferredLoadException: '$_s'";
   final String _s;
 }
diff --git a/sdk_nnbd/lib/async/future.dart b/sdk_nnbd/lib/async/future.dart
index 6e5a777..bbf2eab 100644
--- a/sdk_nnbd/lib/async/future.dart
+++ b/sdk_nnbd/lib/async/future.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /// A type representing values that are either `Future<T>` or `T`.
@@ -149,11 +147,11 @@
 abstract class Future<T> {
   /// A `Future<Null>` completed with `null`.
   static final _Future<Null> _nullFuture =
-      new _Future<Null>.zoneValue(null, Zone.root);
+      new _Future<Null>.zoneValue(null, _rootZone);
 
   /// A `Future<bool>` completed with `false`.
   static final _Future<bool> _falseFuture =
-      new _Future<bool>.zoneValue(false, Zone.root);
+      new _Future<bool>.zoneValue(false, _rootZone);
 
   /**
    * Creates a future containing the result of calling [computation]
@@ -225,14 +223,15 @@
       if (result is Future<T>) {
         return result;
       } else {
+        if (result is! T)
+          throw "unreachable"; // TODO(lrn): Remove when type promotion works.
         return new _Future<T>.value(result);
       }
     } catch (error, stackTrace) {
       var future = new _Future<T>();
-      AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+      AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
       if (replacement != null) {
-        future._asyncCompleteError(
-            _nonNullError(replacement.error), replacement.stackTrace);
+        future._asyncCompleteError(replacement.error, replacement.stackTrace);
       } else {
         future._asyncCompleteError(error, stackTrace);
       }
@@ -252,10 +251,14 @@
    * with the [value] value,
    * equivalently to `new Future<T>.sync(() => value)`.
    *
+   * If [value] is omitted or `null`, it is converted to `FutureOr<T>` by
+   * `value as FutureOr<T>`. If `T` is not nullable, then the [value] is
+   * required, otherwise the construction throws.
+   *
    * Use [Completer] to create a future and complete it later.
    */
-  factory Future.value([FutureOr<T> value]) {
-    return new _Future<T>.immediate(value);
+  factory Future.value([FutureOr<T>? value]) {
+    return new _Future<T>.immediate(value as FutureOr<T>);
   }
 
   /**
@@ -270,12 +273,11 @@
    *
    * Use [Completer] to create a future and complete it later.
    */
-  factory Future.error(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
+  factory Future.error(Object error, [StackTrace? stackTrace]) {
     if (!identical(Zone.current, _rootZone)) {
-      AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+      AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
       if (replacement != null) {
-        error = _nonNullError(replacement.error);
+        error = replacement.error;
         stackTrace = replacement.stackTrace;
       }
     }
@@ -299,6 +301,7 @@
    * If [computation] is omitted,
    * it will be treated as if [computation] was `() => null`,
    * and the future will eventually complete with the `null` value.
+   * In that case, [T] must be nullable.
    *
    * If calling [computation] throws, the created future will complete with the
    * error.
@@ -306,11 +309,15 @@
    * See also [Completer] for a way to create and complete a future at a
    * later time that isn't necessarily after a known fixed duration.
    */
-  factory Future.delayed(Duration duration, [FutureOr<T> computation()]) {
+  factory Future.delayed(Duration duration, [FutureOr<T> computation()?]) {
+    if (computation == null && null is! T) {
+      throw ArgumentError.value(
+          null, "computation", "The type parameter is not nullable");
+    }
     _Future<T> result = new _Future<T>();
     new Timer(duration, () {
       if (computation == null) {
-        result._complete(null);
+        result._complete(null as T);
       } else {
         try {
           result._complete(computation());
@@ -352,25 +359,27 @@
    * uncaught asynchronous error.
    */
   static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
-      {bool eagerError: false, void cleanUp(T successValue)}) {
+      {bool eagerError = false, void cleanUp(T successValue)?}) {
     final _Future<List<T>> result = new _Future<List<T>>();
-    List<T> values; // Collects the values. Set to null on error.
+    List<T?>? values; // Collects the values. Set to null on error.
     int remaining = 0; // How many futures are we waiting for.
-    var error; // The first error from a future.
-    StackTrace stackTrace; // The stackTrace that came with the error.
+    Object? error; // The first error from a future.
+    StackTrace? stackTrace; // The stackTrace that came with the error.
 
     // Handle an error from any of the futures.
     // TODO(jmesserly): use `void` return type once it can be inferred for the
     // `then` call below.
-    handleError(theError, StackTrace theStackTrace) {
+    handleError(theError, StackTrace? theStackTrace) {
       remaining--;
-      if (values != null) {
+      List<T?>? valueList = values;
+      if (valueList != null) {
         if (cleanUp != null) {
-          for (var value in values) {
+          for (var value in valueList) {
             if (value != null) {
               // Ensure errors from cleanUp are uncaught.
+              T cleanUpValue = value;
               new Future.sync(() {
-                cleanUp(value);
+                cleanUp(cleanUpValue);
               });
             }
           }
@@ -383,7 +392,7 @@
           stackTrace = theStackTrace;
         }
       } else if (remaining == 0 && !eagerError) {
-        result._completeError(error, stackTrace);
+        result._completeError(error!, stackTrace);
       }
     }
 
@@ -394,12 +403,15 @@
         int pos = remaining;
         future.then((T value) {
           remaining--;
-          if (values != null) {
-            values[pos] = value;
+          List<T?>? valueList = values;
+          if (valueList != null) {
+            valueList[pos] = value;
             if (remaining == 0) {
-              result._completeWithValue(values);
+              result._completeWithValue(List<T>.from(valueList));
             }
           } else {
+            // An error has occurred earlier.
+            assert(error != null);
             if (cleanUp != null && value != null) {
               // Ensure errors from cleanUp are uncaught.
               new Future.sync(() {
@@ -407,7 +419,7 @@
               });
             }
             if (remaining == 0 && !eagerError) {
-              result._completeError(error, stackTrace);
+              result._completeError(error!, stackTrace);
             }
           }
         }, onError: handleError);
@@ -417,12 +429,14 @@
         remaining++;
       }
       if (remaining == 0) {
-        return new Future.value(const []);
+        return new Future<List<T>>.value(const <Never>[]);
       }
-      values = new List<T>(remaining);
+      values = new List<T?>(remaining);
     } catch (e, st) {
       // The error must have been thrown while iterating over the futures
       // list, or while installing a callback handler on the future.
+      // This is a breach of the `Future` protocol, but we try to handle it
+      // gracefully.
       if (remaining == 0 || eagerError) {
         // Throw a new Future.error.
         // Don't just call `result._completeError` since that would propagate
@@ -458,7 +472,7 @@
     var onValue = (T value) {
       if (!completer.isCompleted) completer.complete(value);
     };
-    var onError = (error, StackTrace stack) {
+    var onError = (Object error, StackTrace? stack) {
       if (!completer.isCompleted) completer.completeError(error, stack);
     };
     for (var future in futures) {
@@ -496,7 +510,7 @@
   }
 
   // Constant `true` function, used as callback by [forEach].
-  static bool _kTrue(_) => true;
+  static bool _kTrue(Object? _) => true;
 
   /**
    * Performs an operation repeatedly until it returns `false`.
@@ -521,8 +535,8 @@
    * until that future has completed.
    */
   static Future doWhile(FutureOr<bool> action()) {
-    _Future doneSignal = new _Future();
-    void Function(bool) nextIteration;
+    _Future<void> doneSignal = new _Future<void>();
+    late void Function(bool) nextIteration;
     // Bind this callback explicitly so that each iteration isn't bound in the
     // context of all the previous iterations' callbacks.
     // This avoids, e.g., deeply nested stack traces from the stack trace
@@ -542,7 +556,7 @@
           result.then(nextIteration, onError: doneSignal._completeError);
           return;
         }
-        keepGoing = result;
+        keepGoing = result as bool;
       }
       doneSignal._complete(null);
     });
@@ -598,7 +612,7 @@
    * has completed with an error then the error is reported as unhandled error.
    * See the description on [Future].
    */
-  Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError});
+  Future<R> then<R>(FutureOr<R> onValue(T value), {Function? onError});
 
   /**
    * Handles errors emitted by this [Future].
@@ -634,10 +648,10 @@
    */
   // The `Function` below stands for one of two types:
   // - (dynamic) -> FutureOr<T>
-  // - (dynamic, StackTrace) -> FutureOr<T>
+  // - (dynamic, StackTrace?) -> FutureOr<T>
   // Given that there is a `test` function that is usually used to do an
   // `isCheck` we should also expect functions that take a specific argument.
-  Future<T> catchError(Function onError, {bool test(Object error)});
+  Future<T> catchError(Function onError, {bool test(Object error)?});
 
   /**
    * Registers a function to be called when this future completes.
@@ -674,7 +688,7 @@
    *       });
    *     }
    */
-  Future<T> whenComplete(FutureOr action());
+  Future<T> whenComplete(FutureOr<void> action());
 
   /**
    * Creates a [Stream] containing the result of this future.
@@ -701,7 +715,7 @@
    * If `onTimeout` is omitted, a timeout will cause the returned future to
    * complete with a [TimeoutException].
    */
-  Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()});
+  Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()?});
 }
 
 /**
@@ -709,9 +723,9 @@
  */
 class TimeoutException implements Exception {
   /** Description of the cause of the timeout. */
-  final String message;
+  final String? message;
   /** The duration that was exceeded. */
-  final Duration duration;
+  final Duration? duration;
 
   TimeoutException(this.message, [this.duration]);
 
@@ -855,6 +869,8 @@
    *
    * The value must be either a value of type [T]
    * or a future of type `Future<T>`.
+   * If the value is omitted or null, and `T` is not nullable, the call
+   * to `complete` throws.
    *
    * If the value is itself a future, the completer will wait for that future
    * to complete, and complete with the same result, whether it is a success
@@ -864,7 +880,7 @@
    *
    * All listeners on the future are informed about the value.
    */
-  void complete([FutureOr<T> value]);
+  void complete([FutureOr<T>? value]);
 
   /**
    * Complete [future] with an error.
@@ -874,8 +890,6 @@
    * Completing a future with an error indicates that an exception was thrown
    * while trying to produce a value.
    *
-   * If [error] is `null`, it is replaced by a [NullThrownError].
-   *
    * If `error` is a `Future`, the future itself is used as the error value.
    * If you want to complete with the result of the future, you can use:
    * ```
@@ -886,7 +900,7 @@
    * theFuture.catchError(thisCompleter.completeError);
    * ```
    */
-  void completeError(Object error, [StackTrace stackTrace]);
+  void completeError(Object error, [StackTrace? stackTrace]);
 
   /**
    * Whether the [future] has been completed.
@@ -905,10 +919,11 @@
 
 // Helper function completing a _Future with error, but checking the zone
 // for error replacement first.
-void _completeWithErrorCallback(_Future result, error, StackTrace stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+void _completeWithErrorCallback(
+    _Future result, Object error, StackTrace? stackTrace) {
+  AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
-    error = _nonNullError(replacement.error);
+    error = replacement.error;
     stackTrace = replacement.stackTrace;
   }
   result._completeError(error, stackTrace);
@@ -916,14 +931,11 @@
 
 // Like [_completeWithErrorCallback] but completes asynchronously.
 void _asyncCompleteWithErrorCallback(
-    _Future result, error, StackTrace stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    _Future result, Object error, StackTrace? stackTrace) {
+  AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
-    error = _nonNullError(replacement.error);
+    error = replacement.error;
     stackTrace = replacement.stackTrace;
   }
   result._asyncCompleteError(error, stackTrace);
 }
-
-/** Helper function that converts `null` to a [NullThrownError]. */
-Object _nonNullError(Object error) => error ?? new NullThrownError();
diff --git a/sdk_nnbd/lib/async/future_impl.dart b/sdk_nnbd/lib/async/future_impl.dart
index c9685ff..a4be169 100644
--- a/sdk_nnbd/lib/async/future_impl.dart
+++ b/sdk_nnbd/lib/async/future_impl.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /** The onValue and onError handlers return either a value or a future */
@@ -16,20 +14,19 @@
 abstract class _Completer<T> implements Completer<T> {
   final _Future<T> future = new _Future<T>();
 
-  void complete([FutureOr<T> value]);
+  void complete([FutureOr<T>? value]);
 
-  void completeError(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
+  void completeError(Object error, [StackTrace? stackTrace]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
     if (replacement != null) {
-      error = _nonNullError(replacement.error);
+      error = replacement.error;
       stackTrace = replacement.stackTrace;
     }
     _completeError(error, stackTrace);
   }
 
-  void _completeError(Object error, StackTrace stackTrace);
+  void _completeError(Object error, StackTrace? stackTrace);
 
   // The future's _isComplete doesn't take into account pending completions.
   // We therefore use _mayComplete.
@@ -37,23 +34,23 @@
 }
 
 class _AsyncCompleter<T> extends _Completer<T> {
-  void complete([FutureOr<T> value]) {
+  void complete([FutureOr<T>? value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
-    future._asyncComplete(value);
+    future._asyncComplete(value as FutureOr<T>);
   }
 
-  void _completeError(Object error, StackTrace stackTrace) {
+  void _completeError(Object error, StackTrace? stackTrace) {
     future._asyncCompleteError(error, stackTrace);
   }
 }
 
 class _SyncCompleter<T> extends _Completer<T> {
-  void complete([FutureOr<T> value]) {
+  void complete([FutureOr<T>? value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
-    future._complete(value);
+    future._complete(value as FutureOr<T>);
   }
 
-  void _completeError(Object error, StackTrace stackTrace) {
+  void _completeError(Object error, StackTrace? stackTrace) {
     future._completeError(error, stackTrace);
   }
 }
@@ -73,18 +70,18 @@
       maskValue | maskError | maskTestError | maskWhencomplete;
   static const int stateIsAwait = 16;
   // Listeners on the same future are linked through this link.
-  _FutureListener _nextListener;
+  _FutureListener? _nextListener;
   // The future to complete when this listener is activated.
   final _Future<T> result;
   // Which fields means what.
   final int state;
   // Used for then/whenDone callback and error test
-  final Function callback;
+  final Function? callback;
   // Used for error callbacks.
-  final Function errorCallback;
+  final Function? errorCallback;
 
   _FutureListener.then(
-      this.result, _FutureOnValue<S, T> onValue, Function errorCallback)
+      this.result, FutureOr<T> Function(S) onValue, Function? errorCallback)
       : callback = onValue,
         errorCallback = errorCallback,
         state = (errorCallback == null) ? stateThen : stateThenOnerror;
@@ -93,8 +90,8 @@
       this.result, _FutureOnValue<S, T> onValue, Function errorCallback)
       : callback = onValue,
         errorCallback = errorCallback,
-        state = ((errorCallback == null) ? stateThen : stateThenOnerror)
-              | stateIsAwait ;
+        state = ((errorCallback == null) ? stateThen : stateThenOnerror) |
+            stateIsAwait;
 
   _FutureListener.catchError(this.result, this.errorCallback, this.callback)
       : state = (callback == null) ? stateCatcherror : stateCatcherrorTest;
@@ -103,7 +100,7 @@
       : errorCallback = null,
         state = stateWhencomplete;
 
-  Zone get _zone => result._zone;
+  _Zone get _zone => result._zone;
 
   bool get handlesValue => (state & maskValue != 0);
   bool get handlesError => (state & maskError != 0);
@@ -111,20 +108,21 @@
   bool get handlesComplete => (state & maskType == stateWhencomplete);
   bool get isAwait => (state & stateIsAwait != 0);
 
-  _FutureOnValue<S, T> get _onValue {
+  FutureOr<T> Function(S) get _onValue {
     assert(handlesValue);
-    return callback;
+    return callback as FutureOr<T> Function(S);
   }
 
-  Function get _onError => errorCallback;
+  Function? get _onError => errorCallback;
+
   _FutureErrorTest get _errorTest {
     assert(hasErrorTest);
-    return callback;
+    return callback as _FutureErrorTest;
   }
 
   _FutureAction get _whenCompleteAction {
     assert(handlesComplete);
-    return callback;
+    return callback as _FutureAction;
   }
 
   /// Whether this listener has an error callback.
@@ -149,12 +147,12 @@
     var errorCallback = this.errorCallback; // To enable promotion.
     // If the errorCallback returns something which is not a FutureOr<T>,
     // this return statement throws, and the caller handles the error.
-    if (errorCallback is dynamic Function(Object, StackTrace)) {
-      return _zone.runBinary<dynamic, Object, StackTrace>(
+    if (errorCallback is dynamic Function(Object, StackTrace?)) {
+      return _zone.runBinary<dynamic, Object, StackTrace?>(
           errorCallback, asyncError.error, asyncError.stackTrace);
     } else {
-      assert(errorCallback is dynamic Function(Object));
-      return _zone.runUnary<dynamic, Object>(errorCallback, asyncError.error);
+      return _zone.runUnary<dynamic, Object>(
+          errorCallback as dynamic Function(Object), asyncError.error);
     }
   }
 
@@ -196,7 +194,7 @@
    * Until the future is completed, the field may hold the zone that
    * listener callbacks used to create this future should be run in.
    */
-  final Zone _zone;
+  final _Zone _zone;
 
   /**
    * Either the result, a list of listeners or another future.
@@ -216,9 +214,9 @@
   var _resultOrListeners;
 
   // This constructor is used by async/await.
-  _Future() : _zone = Zone.current;
+  _Future() : _zone = Zone._current;
 
-  _Future.immediate(FutureOr<T> result) : _zone = Zone.current {
+  _Future.immediate(FutureOr<T> result) : _zone = Zone._current {
     _asyncComplete(result);
   }
 
@@ -227,13 +225,13 @@
     _setValue(value);
   }
 
-  _Future.immediateError(var error, [StackTrace stackTrace])
-      : _zone = Zone.current {
+  _Future.immediateError(var error, [StackTrace? stackTrace])
+      : _zone = Zone._current {
     _asyncCompleteError(error, stackTrace);
   }
 
   /** Creates a future that is already completed with the value. */
-  _Future.value(T value) : this.zoneValue(value, Zone.current);
+  _Future.value(T value) : this.zoneValue(value, Zone._current);
 
   bool get _mayComplete => _state == _stateIncomplete;
   bool get _isPendingComplete => _state == _statePendingComplete;
@@ -242,14 +240,14 @@
   bool get _isComplete => _state >= _stateValue;
   bool get _hasError => _state == _stateError;
 
-  static List<Function> _continuationFunctions(_Future<Object> future) {
-    List<Function> result = null;
+  static List<Function>? _continuationFunctions(_Future<Object> future) {
+    List<Function>? result = null;
     while (true) {
       if (future._mayAddListener) return result;
       assert(!future._isComplete);
       assert(!future._isChained);
       // So _resultOrListeners contains listeners.
-      _FutureListener<Object, Object> listener = future._resultOrListeners;
+      _FutureListener<Object, Object>? listener = future._resultOrListeners;
       if (listener != null &&
           listener._nextListener == null &&
           listener.isAwait) {
@@ -269,7 +267,7 @@
     _resultOrListeners = source;
   }
 
-  Future<R> then<R>(FutureOr<R> f(T value), {Function onError}) {
+  Future<R> then<R>(FutureOr<R> f(T value), {Function? onError}) {
     Zone currentZone = Zone.current;
     if (!identical(currentZone, _rootZone)) {
       f = currentZone.registerUnaryCallback<FutureOr<R>, T>(f);
@@ -291,14 +289,13 @@
   /// The system created liseners are not registered in the zone,
   /// and the listener is marked as being from an `await`.
   /// This marker is used in [_continuationFunctions].
-  Future<E> _thenAwait<E>(
-      FutureOr<E> f(T value), Function onError) {
+  Future<E> _thenAwait<E>(FutureOr<E> f(T value), Function onError) {
     _Future<E> result = new _Future<E>();
     _addListener(new _FutureListener<T, E>.thenAwait(result, f, onError));
     return result;
   }
 
-  Future<T> catchError(Function onError, {bool test(error)}) {
+  Future<T> catchError(Function onError, {bool test(Object error)?}) {
     _Future<T> result = new _Future<T>();
     if (!identical(result._zone, _rootZone)) {
       onError = _registerErrorHandler(onError, result._zone);
@@ -352,7 +349,7 @@
     _resultOrListeners = error;
   }
 
-  void _setError(Object error, StackTrace stackTrace) {
+  void _setError(Object error, StackTrace? stackTrace) {
     _setErrorObject(new AsyncError(error, stackTrace));
   }
 
@@ -391,15 +388,17 @@
     }
   }
 
-  void _prependListeners(_FutureListener listeners) {
+  void _prependListeners(_FutureListener? listeners) {
     if (listeners == null) return;
     if (_mayAddListener) {
       _FutureListener existingListeners = _resultOrListeners;
       _resultOrListeners = listeners;
       if (existingListeners != null) {
         _FutureListener cursor = listeners;
-        while (cursor._nextListener != null) {
-          cursor = cursor._nextListener;
+        _FutureListener? next = cursor._nextListener;
+        while (next != null) {
+          cursor = next;
+          next = cursor._nextListener;
         }
         cursor._nextListener = existingListeners;
       }
@@ -423,20 +422,20 @@
     }
   }
 
-  _FutureListener _removeListeners() {
+  _FutureListener? _removeListeners() {
     // Reverse listeners before returning them, so the resulting list is in
     // subscription order.
     assert(!_isComplete);
-    _FutureListener current = _resultOrListeners;
+    _FutureListener? current = _resultOrListeners;
     _resultOrListeners = null;
     return _reverseListeners(current);
   }
 
-  _FutureListener _reverseListeners(_FutureListener listeners) {
-    _FutureListener prev;
-    _FutureListener current = listeners;
+  _FutureListener? _reverseListeners(_FutureListener? listeners) {
+    _FutureListener? prev = null;
+    _FutureListener? current = listeners;
     while (current != null) {
-      _FutureListener next = current._nextListener;
+      _FutureListener? next = current._nextListener;
       current._nextListener = prev;
       prev = current;
       current = next;
@@ -467,7 +466,7 @@
           // and dependent on the listeners of the target future. If none of
           // the target future's listeners want to have the stack trace we don't
           // need a trace.
-          onError: (error, [StackTrace stackTrace]) {
+          onError: (Object error, [StackTrace? stackTrace]) {
         assert(target._isPendingComplete);
         target._completeError(error, stackTrace);
       });
@@ -490,11 +489,11 @@
       source = source._chainSource;
     }
     if (source._isComplete) {
-      _FutureListener listeners = target._removeListeners();
+      _FutureListener? listeners = target._removeListeners();
       target._cloneResult(source);
       _propagateToListeners(target, listeners);
     } else {
-      _FutureListener listeners = target._resultOrListeners;
+      _FutureListener? listeners = target._resultOrListeners;
       target._setChained(source);
       source._prependListeners(listeners);
     }
@@ -509,8 +508,10 @@
         _chainForeignFuture(value, this);
       }
     } else {
-      _FutureListener listeners = _removeListeners();
-      _setValue(value);
+      if (value is! T)
+        throw "unreachable"; // TODO(lrn): Remove when type promotion works.
+      _FutureListener? listeners = _removeListeners();
+      _setValue(value); // Value promoted to T.
       _propagateToListeners(this, listeners);
     }
   }
@@ -519,15 +520,15 @@
     assert(!_isComplete);
     assert(value is! Future<T>);
 
-    _FutureListener listeners = _removeListeners();
+    _FutureListener? listeners = _removeListeners();
     _setValue(value);
     _propagateToListeners(this, listeners);
   }
 
-  void _completeError(Object error, [StackTrace stackTrace]) {
+  void _completeError(Object error, [StackTrace? stackTrace]) {
     assert(!_isComplete);
 
-    _FutureListener listeners = _removeListeners();
+    _FutureListener? listeners = _removeListeners();
     _setError(error, stackTrace);
     _propagateToListeners(this, listeners);
   }
@@ -549,9 +550,11 @@
       _chainFuture(value);
       return;
     }
+    if (value is! T)
+      throw "unreachable"; // TODO(lrn): Remove when type promotion works.
     _setPendingComplete();
     _zone.scheduleMicrotask(() {
-      _completeWithValue(value);
+      _completeWithValue(value); // Value promoted to T.
     });
   }
 
@@ -572,7 +575,7 @@
     _chainForeignFuture(value, this);
   }
 
-  void _asyncCompleteError(error, StackTrace stackTrace) {
+  void _asyncCompleteError(Object error, StackTrace? stackTrace) {
     assert(!_isComplete);
 
     _setPendingComplete();
@@ -585,7 +588,8 @@
    * Propagates the value/error of [source] to its [listeners], executing the
    * listeners' callbacks.
    */
-  static void _propagateToListeners(_Future source, _FutureListener listeners) {
+  static void _propagateToListeners(
+      _Future source, _FutureListener? listeners) {
     while (true) {
       assert(source._isComplete);
       bool hasError = source._hasError;
@@ -600,13 +604,15 @@
       // Usually futures only have one listener. If they have several, we
       // call handle them separately in recursive calls, continuing
       // here only when there is only one listener left.
-      while (listeners._nextListener != null) {
-        _FutureListener listener = listeners;
-        listeners = listener._nextListener;
+      _FutureListener listener = listeners;
+      _FutureListener? nextListener = listener._nextListener;
+      while (nextListener != null) {
         listener._nextListener = null;
         _propagateToListeners(source, listener);
+        listener = nextListener;
+        nextListener = listener._nextListener;
       }
-      _FutureListener listener = listeners;
+
       final sourceResult = source._resultOrListeners;
       // Do the actual propagation.
       // Set initial state of listenerHasError and listenerValueOrError. These
@@ -622,7 +628,7 @@
       // expensive, branch. Here we'll enter/leave the zone. Many futures
       // don't have callbacks, so this is a significant optimization.
       if (hasError || listener.handlesValue || listener.handlesComplete) {
-        Zone zone = listener._zone;
+        _Zone zone = listener._zone;
         if (hasError && !source._zone.inSameErrorZone(zone)) {
           // Don't cross zone boundaries with errors.
           AsyncError asyncError = source._error;
@@ -631,8 +637,8 @@
           return;
         }
 
-        Zone oldZone;
-        if (!identical(Zone.current, zone)) {
+        _Zone? oldZone;
+        if (!identical(Zone._current, zone)) {
           // Change zone if it's not current.
           oldZone = Zone._enter(zone);
         }
@@ -752,7 +758,7 @@
     }
   }
 
-  Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()}) {
+  Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()?}) {
     if (_isComplete) return new _Future.immediate(this);
     _Future<T> result = new _Future<T>();
     Timer timer;
@@ -763,10 +769,12 @@
       });
     } else {
       Zone zone = Zone.current;
-      onTimeout = zone.registerCallback(onTimeout);
+      FutureOr<T> Function() onTimeoutHandler =
+          zone.registerCallback(onTimeout);
+
       timer = new Timer(timeLimit, () {
         try {
-          result._complete(zone.run(onTimeout));
+          result._complete(zone.run(onTimeoutHandler));
         } catch (e, s) {
           result._completeError(e, s);
         }
@@ -777,7 +785,7 @@
         timer.cancel();
         result._completeWithValue(v);
       }
-    }, onError: (e, StackTrace s) {
+    }, onError: (Object e, StackTrace? s) {
       if (timer.isActive) {
         timer.cancel();
         result._completeError(e, s);
@@ -810,5 +818,5 @@
       errorHandler,
       "onError",
       "Error handler must accept one Object or one Object and a StackTrace"
-      " as arguments, and return a a valid result");
+          " as arguments, and return a a valid result");
 }
diff --git a/sdk_nnbd/lib/async/schedule_microtask.dart b/sdk_nnbd/lib/async/schedule_microtask.dart
index 41b9d31..95fca9e 100644
--- a/sdk_nnbd/lib/async/schedule_microtask.dart
+++ b/sdk_nnbd/lib/async/schedule_microtask.dart
@@ -2,22 +2,20 @@
 // 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.
 
-// @dart = 2.5
-
 part of dart.async;
 
 typedef void _AsyncCallback();
 
 class _AsyncCallbackEntry {
   final _AsyncCallback callback;
-  _AsyncCallbackEntry next;
+  _AsyncCallbackEntry? next;
   _AsyncCallbackEntry(this.callback);
 }
 
 /** Head of single linked list of pending callbacks. */
-_AsyncCallbackEntry _nextCallback;
+_AsyncCallbackEntry? _nextCallback;
 /** Tail of single linked list of pending callbacks. */
-_AsyncCallbackEntry _lastCallback;
+_AsyncCallbackEntry? _lastCallback;
 /**
  * Tail of priority callbacks added by the currently executing callback.
  *
@@ -25,7 +23,7 @@
  * callback queue, so that if one callback schedules more than one
  * priority callback, they are still enqueued in scheduling order.
  */
-_AsyncCallbackEntry _lastPriorityCallback;
+_AsyncCallbackEntry? _lastPriorityCallback;
 /**
  * Whether we are currently inside the callback loop.
  *
@@ -35,11 +33,11 @@
 bool _isInCallbackLoop = false;
 
 void _microtaskLoop() {
-  while (_nextCallback != null) {
+  for (var entry = _nextCallback; entry != null; entry = _nextCallback) {
     _lastPriorityCallback = null;
-    _AsyncCallbackEntry entry = _nextCallback;
-    _nextCallback = entry.next;
-    if (_nextCallback == null) _lastCallback = null;
+    var next = entry.next;
+    _nextCallback = next;
+    if (next == null) _lastCallback = null;
     (entry.callback)();
   }
 }
@@ -67,13 +65,14 @@
  */
 void _scheduleAsyncCallback(_AsyncCallback callback) {
   _AsyncCallbackEntry newEntry = new _AsyncCallbackEntry(callback);
-  if (_nextCallback == null) {
+  _AsyncCallbackEntry? lastCallback = _lastCallback;
+  if (lastCallback == null) {
     _nextCallback = _lastCallback = newEntry;
     if (!_isInCallbackLoop) {
       _AsyncRun._scheduleImmediate(_startMicrotaskLoop);
     }
   } else {
-    _lastCallback.next = newEntry;
+    lastCallback.next = newEntry;
     _lastCallback = newEntry;
   }
 }
@@ -93,14 +92,16 @@
     return;
   }
   _AsyncCallbackEntry entry = new _AsyncCallbackEntry(callback);
-  if (_lastPriorityCallback == null) {
+  _AsyncCallbackEntry? lastPriorityCallback = _lastPriorityCallback;
+  if (lastPriorityCallback == null) {
     entry.next = _nextCallback;
     _nextCallback = _lastPriorityCallback = entry;
   } else {
-    entry.next = _lastPriorityCallback.next;
-    _lastPriorityCallback.next = entry;
+    var next = lastPriorityCallback.next;
+    entry.next = next;
+    lastPriorityCallback.next = entry;
     _lastPriorityCallback = entry;
-    if (entry.next == null) {
+    if (next == null) {
       _lastCallback = entry;
     }
   }
@@ -132,7 +133,7 @@
  * better asynchronous code with fewer surprises.
  */
 void scheduleMicrotask(void callback()) {
-  _Zone currentZone = Zone.current;
+  _Zone currentZone = Zone._current;
   if (identical(_rootZone, currentZone)) {
     // No need to bind the callback. We know that the root's scheduleMicrotask
     // will be invoked in the root zone.
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index 26d4342..afcd3c5 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 // -------------------------------------------------------------------
@@ -152,7 +150,7 @@
    * stack trace as well.
    */
   @Since("2.5")
-  factory Stream.error(Object error, [StackTrace stackTrace]) =>
+  factory Stream.error(Object error, [StackTrace? stackTrace]) =>
       (_AsyncStreamController<T>(null, null, null, null)
             .._addError(error, stackTrace)
             .._closeUnchecked())
@@ -208,7 +206,7 @@
         if (--count == 0) controller._closeUnchecked();
       }
     };
-    var onError = (error, StackTrace stack) {
+    var onError = (Object error, StackTrace? stack) {
       if (!controller.isClosed) {
         controller._addError(error, stack);
         if (--count == 0) controller._closeUnchecked();
@@ -251,65 +249,59 @@
    * this callback is an integer that starts with 0 and is incremented for
    * every event.
    *
+   * The [period] must a non-negative [Duration].
+   *
    * If [computation] is omitted the event values will all be `null`.
    *
-   * [period] must a non-negative [Duration].
+   * The [computation] must not be omitted if the event type [T] does not
+   * allow `null` as a value.
    */
   factory Stream.periodic(Duration period,
-      [T computation(int computationCount)]) {
-    Timer timer;
-    int computationCount = 0;
-    StreamController<T> controller;
+      [T computation(int computationCount)?]) {
+    if (computation == null && null is! T) {
+      throw ArgumentError.value(null, "computation",
+          "Must not be omitted when the event type is non-nullable");
+    }
+    var controller = _SyncStreamController<T>(null, null, null, null);
     // Counts the time that the Stream was running (and not paused).
     Stopwatch watch = new Stopwatch();
-
-    void sendEvent() {
-      watch.reset();
-      T data;
-      if (computation != null) {
-        try {
-          data = computation(computationCount++);
-        } catch (e, s) {
-          controller.addError(e, s);
-          return;
+    controller.onListen = () {
+      int computationCount = 0;
+      void sendEvent(_) {
+        watch.reset();
+        if (computation != null) {
+          T event;
+          try {
+            event = computation(computationCount++);
+          } catch (e, s) {
+            controller.addError(e, s);
+            return;
+          }
+          controller.add(event);
+        } else {
+          controller.add(null as T); // We have checked that null is T.
         }
       }
-      controller.add(data);
-    }
 
-    void startPeriodicTimer() {
-      assert(timer == null);
-      timer = new Timer.periodic(period, (Timer timer) {
-        sendEvent();
-      });
-    }
-
-    controller = new StreamController<T>(
-        sync: true,
-        onListen: () {
-          watch.start();
-          startPeriodicTimer();
-        },
-        onPause: () {
+      Timer timer = Timer.periodic(period, sendEvent);
+      controller
+        ..onCancel = () {
           timer.cancel();
-          timer = null;
+          return Future._nullFuture;
+        }
+        ..onPause = () {
           watch.stop();
-        },
-        onResume: () {
-          assert(timer == null);
+          timer.cancel();
+        }
+        ..onResume = () {
           Duration elapsed = watch.elapsed;
           watch.start();
           timer = new Timer(period - elapsed, () {
-            timer = null;
-            startPeriodicTimer();
-            sendEvent();
+            timer = Timer.periodic(period, sendEvent);
+            sendEvent(null);
           });
-        },
-        onCancel: () {
-          if (timer != null) timer.cancel();
-          timer = null;
-          return Future._nullFuture;
-        });
+        };
+    };
     return controller.stream;
   }
 
@@ -354,7 +346,7 @@
    * The resulting stream is a broadcast stream if [source] is.
    */
   factory Stream.eventTransformed(
-      Stream source, EventSink mapSink(EventSink<T> sink)) {
+      Stream<dynamic> source, EventSink<dynamic> mapSink(EventSink<T> sink)) {
     return new _BoundSinkStream(source, mapSink);
   }
 
@@ -396,8 +388,8 @@
    * subscription when there are no listeners.
    */
   Stream<T> asBroadcastStream(
-      {void onListen(StreamSubscription<T> subscription),
-      void onCancel(StreamSubscription<T> subscription)}) {
+      {void onListen(StreamSubscription<T> subscription)?,
+      void onCancel(StreamSubscription<T> subscription)?}) {
     return new _AsBroadcastStream<T>(this, onListen, onCancel);
   }
 
@@ -415,8 +407,8 @@
    * On errors from this stream, the [onError] handler is called with the
    * error object and possibly a stack trace.
    *
-   * The [onError] callback must be of type `void onError(error)` or
-   * `void onError(error, StackTrace stackTrace)`. If [onError] accepts
+   * The [onError] callback must be of type `void onError(Object error)` or
+   * `void onError(Object error, StackTrace? stackTrace)`. If [onError] accepts
    * two arguments it is called with the error object and the stack trace
    * (which could be `null` if this stream itself received an error without
    * stack trace).
@@ -436,8 +428,8 @@
    * the subscription doesn't receive events and none of the
    * event handler functions are called.
    */
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError});
+  StreamSubscription<T> listen(void onData(T event)?,
+      {Function? onError, void onDone()?, bool? cancelOnError});
 
   /**
    * Creates a new stream from this stream that discards some elements.
@@ -497,15 +489,17 @@
    * The returned stream is a broadcast stream if this stream is.
    */
   Stream<E> asyncMap<E>(FutureOr<E> convert(T event)) {
-    _StreamControllerBase<E> controller;
-    StreamSubscription<T> subscription;
+    _StreamControllerBase<E> controller = isBroadcast
+        ? _SyncBroadcastStreamController<E>(null, null)
+        : _SyncStreamController<E>(null, null, null, null);
 
-    void onListen() {
+    controller.onListen = () {
+      StreamSubscription<T> subscription = this.listen(null,
+          onError: controller._addError, // Avoid Zone error replacement.
+          onDone: controller.close);
       final add = controller.add;
-      assert(controller is _StreamController<E> ||
-          controller is _BroadcastStreamController);
       final addError = controller._addError;
-      subscription = this.listen((T event) {
+      subscription.onData((T event) {
         FutureOr<E> newValue;
         try {
           newValue = convert(event);
@@ -519,30 +513,17 @@
               .then(add, onError: addError)
               .whenComplete(subscription.resume);
         } else {
+          if (newValue is! E) throw "unreachable"; // TODO(lrn): Remove when type promotion works.
           controller.add(newValue);
         }
-      }, onError: addError, onDone: controller.close);
-    }
-
-    if (this.isBroadcast) {
-      controller = new StreamController<E>.broadcast(
-          onListen: onListen,
-          onCancel: () {
-            subscription.cancel();
-          },
-          sync: true);
-    } else {
-      controller = new StreamController<E>(
-          onListen: onListen,
-          onPause: () {
-            subscription.pause();
-          },
-          onResume: () {
-            subscription.resume();
-          },
-          onCancel: () => subscription.cancel(),
-          sync: true);
-    }
+      });
+      controller.onCancel = subscription.cancel;
+      if (!isBroadcast) {
+        controller
+          ..onPause = subscription.pause
+          ..onResume = subscription.resume;
+      }
+    };
     return controller.stream;
   }
 
@@ -565,12 +546,15 @@
    * The returned stream is a broadcast stream if this stream is.
    */
   Stream<E> asyncExpand<E>(Stream<E> convert(T event)) {
-    _StreamControllerBase<E> controller;
-    StreamSubscription<T> subscription;
-    void onListen() {
-      assert(controller is _StreamController ||
-          controller is _BroadcastStreamController);
-      subscription = this.listen((T event) {
+    _StreamControllerBase<E> controller = isBroadcast
+        ? _SyncBroadcastStreamController<E>(null, null)
+        : _SyncStreamController<E>(null, null, null, null);
+
+    controller.onListen = () {
+      StreamSubscription<T> subscription = this.listen(null,
+          onError: controller._addError, // Avoid Zone error replacement.
+          onDone: controller.close);
+      subscription.onData((T event) {
         Stream<E> newStream;
         try {
           newStream = convert(event);
@@ -578,34 +562,16 @@
           controller.addError(e, s);
           return;
         }
-        if (newStream != null) {
-          subscription.pause();
-          controller.addStream(newStream).whenComplete(subscription.resume);
-        }
-      },
-          onError: controller._addError, // Avoid Zone error replacement.
-          onDone: controller.close);
-    }
-
-    if (this.isBroadcast) {
-      controller = new StreamController<E>.broadcast(
-          onListen: onListen,
-          onCancel: () {
-            subscription.cancel();
-          },
-          sync: true);
-    } else {
-      controller = new StreamController<E>(
-          onListen: onListen,
-          onPause: () {
-            subscription.pause();
-          },
-          onResume: () {
-            subscription.resume();
-          },
-          onCancel: () => subscription.cancel(),
-          sync: true);
-    }
+        subscription.pause();
+        controller.addStream(newStream).whenComplete(subscription.resume);
+      });
+      controller.onCancel = subscription.cancel;
+      if (!isBroadcast) {
+        controller
+          ..onPause = subscription.pause
+          ..onResume = subscription.resume;
+      }
+    };
     return controller.stream;
   }
 
@@ -615,8 +581,8 @@
    * If this stream sends an error that matches [test], then it is intercepted
    * by the [onError] function.
    *
-   * The [onError] callback must be of type `void onError(error)` or
-   * `void onError(error, StackTrace stackTrace)`.
+   * The [onError] callback must be of type `void onError(Object error)` or
+   * `void onError(Object error, StackTrace? stackTrace)`.
    * The function type determines whether [onError] is invoked with a stack
    * trace argument.
    * The stack trace argument may be `null` if this stream received an error
@@ -641,7 +607,7 @@
    * If a broadcast stream is listened to more than once, each subscription
    * will individually perform the `test` and handle the error.
    */
-  Stream<T> handleError(Function onError, {bool test(error)}) {
+  Stream<T> handleError(Function onError, {bool test(error)?}) {
     return new _HandleErrorStream<T>(this, onError, test);
   }
 
@@ -741,35 +707,32 @@
   Future<T> reduce(T combine(T previous, T element)) {
     _Future<T> result = new _Future<T>();
     bool seenFirst = false;
-    T value;
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          if (seenFirst) {
-            _runUserCode(() => combine(value, element), (T newValue) {
-              value = newValue;
-            }, _cancelAndErrorClosure(subscription, result));
-          } else {
-            value = element;
-            seenFirst = true;
-          }
-        },
-        onError: result._completeError,
-        onDone: () {
-          if (!seenFirst) {
-            try {
-              // Throw and recatch, instead of just doing
-              //  _completeWithErrorCallback, e, theError, StackTrace.current),
-              // to ensure that the stackTrace is set on the error.
-              throw IterableElementError.noElement();
-            } catch (e, s) {
-              _completeWithErrorCallback(result, e, s);
-            }
-          } else {
-            result._complete(value);
-          }
-        },
-        cancelOnError: true);
+    late T value;
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: result._completeError, onDone: () {
+      if (!seenFirst) {
+        try {
+          // Throw and recatch, instead of just doing
+          //  _completeWithErrorCallback, e, theError, StackTrace.current),
+          // to ensure that the stackTrace is set on the error.
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          _completeWithErrorCallback(result, e, s);
+        }
+      } else {
+        result._complete(value);
+      }
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      if (seenFirst) {
+        _runUserCode(() => combine(value, element), (T newValue) {
+          value = newValue;
+        }, _cancelAndErrorClosure(subscription, result));
+      } else {
+        value = element;
+        seenFirst = true;
+      }
+    });
     return result;
   }
 
@@ -793,18 +756,15 @@
   Future<S> fold<S>(S initialValue, S combine(S previous, T element)) {
     _Future<S> result = new _Future<S>();
     S value = initialValue;
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(() => combine(value, element), (S newValue) {
-            value = newValue;
-          }, _cancelAndErrorClosure(subscription, result));
-        },
-        onError: result._completeError,
-        onDone: () {
-          result._complete(value);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: result._completeError, onDone: () {
+      result._complete(value);
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      _runUserCode(() => combine(value, element), (S newValue) {
+        value = newValue;
+      }, _cancelAndErrorClosure(subscription, result));
+    });
     return result;
   }
 
@@ -825,25 +785,30 @@
   Future<String> join([String separator = ""]) {
     _Future<String> result = new _Future<String>();
     StringBuffer buffer = new StringBuffer();
-    StreamSubscription subscription;
     bool first = true;
-    subscription = this.listen(
-        (T element) {
-          if (!first) {
-            buffer.write(separator);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: result._completeError, onDone: () {
+      result._complete(buffer.toString());
+    }, cancelOnError: true);
+    subscription.onData(separator.isEmpty
+        ? (T element) {
+            try {
+              buffer.write(element);
+            } catch (e, s) {
+              _cancelAndErrorWithReplacement(subscription, result, e, s);
+            }
           }
-          first = false;
-          try {
-            buffer.write(element);
-          } catch (e, s) {
-            _cancelAndErrorWithReplacement(subscription, result, e, s);
-          }
-        },
-        onError: result._completeError,
-        onDone: () {
-          result._complete(buffer.toString());
-        },
-        cancelOnError: true);
+        : (T element) {
+            if (!first) {
+              buffer.write(separator);
+            }
+            first = false;
+            try {
+              buffer.write(element);
+            } catch (e, s) {
+              _cancelAndErrorWithReplacement(subscription, result, e, s);
+            }
+          });
     return result;
   }
 
@@ -861,20 +826,17 @@
    */
   Future<bool> contains(Object needle) {
     _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(() => (element == needle), (bool isMatch) {
-            if (isMatch) {
-              _cancelAndValue(subscription, future, true);
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(false);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      future._complete(false);
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      _runUserCode(() => (element == needle), (bool isMatch) {
+        if (isMatch) {
+          _cancelAndValue(subscription, future, true);
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -890,18 +852,14 @@
    */
   Future forEach(void action(T element)) {
     _Future future = new _Future();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          // TODO(floitsch): the type should be 'void' and inferred.
-          _runUserCode<dynamic>(() => action(element), (_) {},
-              _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(null);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      future._complete(null);
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      _runUserCode<void>(() => action(element), (_) {},
+          _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -921,20 +879,17 @@
    */
   Future<bool> every(bool test(T element)) {
     _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(() => test(element), (bool isMatch) {
-            if (!isMatch) {
-              _cancelAndValue(subscription, future, false);
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(true);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      future._complete(true);
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      _runUserCode(() => test(element), (bool isMatch) {
+        if (!isMatch) {
+          _cancelAndValue(subscription, future, false);
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -954,20 +909,17 @@
    */
   Future<bool> any(bool test(T element)) {
     _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(() => test(element), (bool isMatch) {
-            if (isMatch) {
-              _cancelAndValue(subscription, future, true);
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(false);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      future._complete(false);
+    }, cancelOnError: true);
+    subscription.onData((T element) {
+      _runUserCode(() => test(element), (bool isMatch) {
+        if (isMatch) {
+          _cancelAndValue(subscription, future, true);
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -1015,16 +967,13 @@
    */
   Future<bool> get isEmpty {
     _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (_) {
-          _cancelAndValue(subscription, future, false);
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(true);
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      future._complete(true);
+    }, cancelOnError: true);
+    subscription.onData((_) {
+      _cancelAndValue(subscription, future, false);
+    });
     return future;
   }
 
@@ -1100,15 +1049,19 @@
    * When subscribing using [drain], cancelOnError will be true. This means
    * that the future will complete with the first error on this stream and then
    * cancel the subscription.
-   * If this stream emits an error, or the call to [combine] throws,
-   * the returned future is completed with that error,
-   * and processing is stopped.
+   *
+   * If this stream emits an error, the returned future is completed with
+   * that error, and processing is stopped.
    *
    * In case of a `done` event the future completes with the given
    * [futureValue].
+   *
+   * The [futureValue] must not be omitted if `null` is not assignable to [E].
    */
-  Future<E> drain<E>([E futureValue]) =>
-      listen(null, cancelOnError: true).asFuture<E>(futureValue);
+  Future<E> drain<E>([E? futureValue]) {
+    futureValue = futureValue as E;
+    return listen(null, cancelOnError: true).asFuture<E>(futureValue);
+  }
 
   /**
    * Provides at most the first [count] data events of this stream.
@@ -1223,7 +1176,7 @@
    * If a broadcast stream is listened to more than once, each subscription
    * will individually perform the `equals` test.
    */
-  Stream<T> distinct([bool equals(T previous, T next)]) {
+  Stream<T> distinct([bool equals(T previous, T next)?]) {
     return new _DistinctStream<T>(this, equals);
   }
 
@@ -1247,20 +1200,17 @@
    */
   Future<T> get first {
     _Future<T> future = new _Future<T>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T value) {
-          _cancelAndValue(subscription, future, value);
-        },
-        onError: future._completeError,
-        onDone: () {
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(future, e, s);
-          }
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      try {
+        throw IterableElementError.noElement();
+      } catch (e, s) {
+        _completeWithErrorCallback(future, e, s);
+      }
+    }, cancelOnError: true);
+    subscription.onData((T value) {
+      _cancelAndValue(subscription, future, value);
+    });
     return future;
   }
 
@@ -1276,7 +1226,7 @@
    */
   Future<T> get last {
     _Future<T> future = new _Future<T>();
-    T result;
+    late T result;
     bool foundResult = false;
     listen(
         (T value) {
@@ -1311,36 +1261,33 @@
    */
   Future<T> get single {
     _Future<T> future = new _Future<T>();
-    T result;
+    late T result;
     bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T value) {
-          if (foundResult) {
-            // This is the second element we get.
-            try {
-              throw IterableElementError.tooMany();
-            } catch (e, s) {
-              _cancelAndErrorWithReplacement(subscription, future, e, s);
-            }
-            return;
-          }
-          foundResult = true;
-          result = value;
-        },
-        onError: future._completeError,
-        onDone: () {
-          if (foundResult) {
-            future._complete(result);
-            return;
-          }
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(future, e, s);
-          }
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      if (foundResult) {
+        future._complete(result);
+        return;
+      }
+      try {
+        throw IterableElementError.noElement();
+      } catch (e, s) {
+        _completeWithErrorCallback(future, e, s);
+      }
+    }, cancelOnError: true);
+    subscription.onError((T value) {
+      if (foundResult) {
+        // This is the second element we get.
+        try {
+          throw IterableElementError.tooMany();
+        } catch (e, s) {
+          _cancelAndErrorWithReplacement(subscription, future, e, s);
+        }
+        return;
+      }
+      foundResult = true;
+      result = value;
+    });
     return future;
   }
 
@@ -1369,30 +1316,29 @@
    * with no [orElse] function provided,
    * the returned future is completed with an error.
    */
-  Future<T> firstWhere(bool test(T element), {T orElse()}) {
+  Future<T> firstWhere(bool test(T element), {T orElse()?}) {
     _Future<T> future = new _Future();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T value) {
-          _runUserCode(() => test(value), (bool isMatch) {
-            if (isMatch) {
-              _cancelAndValue(subscription, future, value);
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          if (orElse != null) {
-            _runUserCode(orElse, future._complete, future._completeError);
-            return;
-          }
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(future, e, s);
-          }
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      if (orElse != null) {
+        _runUserCode(orElse, future._complete, future._completeError);
+        return;
+      }
+      try {
+        // Sets stackTrace on error.
+        throw IterableElementError.noElement();
+      } catch (e, s) {
+        _completeWithErrorCallback(future, e, s);
+      }
+    }, cancelOnError: true);
+
+    subscription.onData((T value) {
+      _runUserCode(() => test(value), (bool isMatch) {
+        if (isMatch) {
+          _cancelAndValue(subscription, future, value);
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -1407,37 +1353,35 @@
    * That means that a non-error result cannot be provided before this stream
    * is done.
    */
-  Future<T> lastWhere(bool test(T element), {T orElse()}) {
+  Future<T> lastWhere(bool test(T element), {T orElse()?}) {
     _Future<T> future = new _Future();
-    T result;
+    late T result;
     bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T value) {
-          _runUserCode(() => true == test(value), (bool isMatch) {
-            if (isMatch) {
-              foundResult = true;
-              result = value;
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
-          if (foundResult) {
-            future._complete(result);
-            return;
-          }
-          if (orElse != null) {
-            _runUserCode(orElse, future._complete, future._completeError);
-            return;
-          }
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(future, e, s);
-          }
-        },
-        cancelOnError: true);
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      if (foundResult) {
+        future._complete(result);
+        return;
+      }
+      if (orElse != null) {
+        _runUserCode(orElse, future._complete, future._completeError);
+        return;
+      }
+      try {
+        throw IterableElementError.noElement();
+      } catch (e, s) {
+        _completeWithErrorCallback(future, e, s);
+      }
+    }, cancelOnError: true);
+
+    subscription.onData((T value) {
+      _runUserCode(() => test(value), (bool isMatch) {
+        if (isMatch) {
+          foundResult = true;
+          result = value;
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -1447,45 +1391,43 @@
    * Like [lastWhere], except that it is an error if more than one
    * matching element occurs in this stream.
    */
-  Future<T> singleWhere(bool test(T element), {T orElse()}) {
+  Future<T> singleWhere(bool test(T element), {T orElse()?}) {
     _Future<T> future = new _Future<T>();
-    T result;
+    late T result;
     bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T value) {
-          _runUserCode(() => true == test(value), (bool isMatch) {
-            if (isMatch) {
-              if (foundResult) {
-                try {
-                  throw IterableElementError.tooMany();
-                } catch (e, s) {
-                  _cancelAndErrorWithReplacement(subscription, future, e, s);
-                }
-                return;
-              }
-              foundResult = true;
-              result = value;
-            }
-          }, _cancelAndErrorClosure(subscription, future));
-        },
-        onError: future._completeError,
-        onDone: () {
+    StreamSubscription<T> subscription =
+        this.listen(null, onError: future._completeError, onDone: () {
+      if (foundResult) {
+        future._complete(result);
+        return;
+      }
+      if (orElse != null) {
+        _runUserCode(orElse, future._complete, future._completeError);
+        return;
+      }
+      try {
+        throw IterableElementError.noElement();
+      } catch (e, s) {
+        _completeWithErrorCallback(future, e, s);
+      }
+    }, cancelOnError: true);
+
+    subscription.onData((T value) {
+      _runUserCode(() => test(value), (bool isMatch) {
+        if (isMatch) {
           if (foundResult) {
-            future._complete(result);
+            try {
+              throw IterableElementError.tooMany();
+            } catch (e, s) {
+              _cancelAndErrorWithReplacement(subscription, future, e, s);
+            }
             return;
           }
-          try {
-            if (orElse != null) {
-              _runUserCode(orElse, future._complete, future._completeError);
-              return;
-            }
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(future, e, s);
-          }
-        },
-        cancelOnError: true);
+          foundResult = true;
+          result = value;
+        }
+      }, _cancelAndErrorClosure(subscription, future));
+    });
     return future;
   }
 
@@ -1506,26 +1448,24 @@
    * with a [RangeError].
    */
   Future<T> elementAt(int index) {
-    ArgumentError.checkNotNull(index, "index");
     RangeError.checkNotNegative(index, "index");
-    _Future<T> future = new _Future<T>();
-    StreamSubscription subscription;
+    _Future<T> result = new _Future<T>();
     int elementIndex = 0;
-    subscription = this.listen(
-        (T value) {
-          if (index == elementIndex) {
-            _cancelAndValue(subscription, future, value);
-            return;
-          }
-          elementIndex += 1;
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._completeError(
-              new RangeError.index(index, this, "index", null, elementIndex));
-        },
-        cancelOnError: true);
-    return future;
+    StreamSubscription<T> subscription;
+    subscription =
+        this.listen(null, onError: result._completeError, onDone: () {
+      result._completeError(
+          new RangeError.index(index, this, "index", null, elementIndex));
+    }, cancelOnError: true);
+    subscription.onData((T value) {
+      if (index == elementIndex) {
+        _cancelAndValue(subscription, result, value);
+        return;
+      }
+      elementIndex += 1;
+    });
+
+    return result;
   }
 
   /**
@@ -1555,81 +1495,75 @@
    * will have its individually timer that starts counting on listen,
    * and the subscriptions' timers can be paused individually.
    */
-  Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)}) {
-    _StreamControllerBase<T> controller;
-    // The following variables are set on listen.
-    StreamSubscription<T> subscription;
-    Timer timer;
-    Zone zone;
-    _TimerCallback timeout;
+  Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)?}) {
+    _StreamControllerBase<T> controller = isBroadcast
+        ? new _SyncBroadcastStreamController<T>(null, null)
+        : new _SyncStreamController<T>(null, null, null, null);
 
-    void onData(T event) {
-      timer.cancel();
-      timer = zone.createTimer(timeLimit, timeout);
-      // It might close the stream and cancel timer, so create recuring Timer
-      // before calling into add();
-      // issue: https://github.com/dart-lang/sdk/issues/37565
-      controller.add(event);
+    Zone zone = Zone.current;
+    // Register callback immediately.
+    _TimerCallback timeoutCallback;
+    if (onTimeout == null) {
+      timeoutCallback = () {
+        controller.addError(
+            new TimeoutException("No stream event", timeLimit), null);
+      };
+    } else {
+      // TODO(floitsch): the return type should be 'void', and the type
+      // should be inferred.
+      var registeredOnTimeout =
+          zone.registerUnaryCallback<void, EventSink<T>>(onTimeout);
+      var wrapper = new _ControllerEventSinkWrapper<T>(null);
+      timeoutCallback = () {
+        wrapper._sink = controller; // Only valid during call.
+        zone.runUnaryGuarded(registeredOnTimeout, wrapper);
+        wrapper._sink = null;
+      };
     }
 
-    void onError(error, StackTrace stackTrace) {
-      timer.cancel();
-      assert(controller is _StreamController ||
-          controller is _BroadcastStreamController);
-      controller._addError(error, stackTrace); // Avoid Zone error replacement.
-      timer = zone.createTimer(timeLimit, timeout);
-    }
-
-    void onDone() {
-      timer.cancel();
-      controller.close();
-    }
-
-    void onListen() {
-      // This is the onListen callback for of controller.
-      // It runs in the same zone that the subscription was created in.
-      // Use that zone for creating timers and running the onTimeout
-      // callback.
-      zone = Zone.current;
-      if (onTimeout == null) {
-        timeout = () {
-          controller.addError(
-              new TimeoutException("No stream event", timeLimit), null);
-        };
-      } else {
-        // TODO(floitsch): the return type should be 'void', and the type
-        // should be inferred.
-        var registeredOnTimeout =
-            zone.registerUnaryCallback<dynamic, EventSink<T>>(onTimeout);
-        var wrapper = new _ControllerEventSinkWrapper<T>(null);
-        timeout = () {
-          wrapper._sink = controller; // Only valid during call.
-          zone.runUnaryGuarded(registeredOnTimeout, wrapper);
-          wrapper._sink = null;
-        };
-      }
-
-      subscription = this.listen(onData, onError: onError, onDone: onDone);
-      timer = zone.createTimer(timeLimit, timeout);
-    }
-
-    Future onCancel() {
-      timer.cancel();
-      Future result = subscription.cancel();
-      subscription = null;
-      return result;
-    }
-
-    controller = isBroadcast
-        ? new _SyncBroadcastStreamController<T>(onListen, onCancel)
-        : new _SyncStreamController<T>(onListen, () {
-            // Don't null the timer, onCancel may call cancel again.
+    // All further setup happens inside `onListen`.
+    controller.onListen = () {
+      Timer timer = zone.createTimer(timeLimit, timeoutCallback);
+      var subscription = this.listen(null);
+      // Set up event forwarding. Each data or error event resets the timer
+      subscription
+        ..onData((T event) {
+          timer.cancel();
+          timer = zone.createTimer(timeLimit, timeoutCallback);
+          // Controller is synchronous, and the call might close the stream
+          // and cancel the timer,
+          // so create the Timer before calling into add();
+          // issue: https://github.com/dart-lang/sdk/issues/37565
+          controller.add(event);
+        })
+        ..onError((Object error, StackTrace? stackTrace) {
+          timer.cancel();
+          timer = zone.createTimer(timeLimit, timeoutCallback);
+          controller._addError(
+              error, stackTrace); // Avoid Zone error replacement.
+        })
+        ..onDone(() {
+          timer.cancel();
+          controller.close();
+        });
+      // Set up further controller callbacks.
+      controller.onCancel = () {
+        timer.cancel();
+        return subscription.cancel();
+      };
+      if (!isBroadcast) {
+        controller
+          ..onPause = () {
             timer.cancel();
             subscription.pause();
-          }, () {
+          }
+          ..onResume = () {
             subscription.resume();
-            timer = zone.createTimer(timeLimit, timeout);
-          }, onCancel);
+            timer = zone.createTimer(timeLimit, timeoutCallback);
+          };
+      }
+    };
+
     return controller.stream;
   }
 }
@@ -1669,7 +1603,7 @@
    * If the cleanup throws, which it really shouldn't, the returned future
    * completes with that error.
    */
-  Future cancel();
+  Future<void> cancel();
 
   /**
    * Replaces the data event handler of this subscription.
@@ -1681,7 +1615,7 @@
    * This method replaces the current handler set by the invocation of
    * [Stream.listen] or by a previous call to [onData].
    */
-  void onData(void handleData(T data));
+  void onData(void handleData(T data)?);
 
   /**
    * Replaces the error event handler of this subscription.
@@ -1700,7 +1634,7 @@
    * This method replaces the current handler set by the invocation of
    * [Stream.listen], by calling [asFuture], or by a previous call to [onError].
    */
-  void onError(Function handleError);
+  void onError(Function? handleError);
 
   /**
    * Replaces the done event handler of this subscription.
@@ -1711,7 +1645,7 @@
    * This method replaces the current handler set by the invocation of
    * [Stream.listen], by calling [asFuture], or by a previous call to [onDone].
    */
-  void onDone(void handleDone());
+  void onDone(void handleDone()?);
 
   /**
    * Request that the stream pauses events until further notice.
@@ -1748,7 +1682,7 @@
    * Currently DOM streams silently drop events when the stream is paused. This
    * is a bug and will be fixed.
    */
-  void pause([Future resumeSignal]);
+  void pause([Future<void>? resumeSignal]);
 
   /**
    * Resume after a pause.
@@ -1786,8 +1720,12 @@
    *
    * In case of a `done` event the future completes with the given
    * [futureValue].
+   *
+   * If [futureValue] is omitted, the value `null as E` is used as a default.
+   * If `E` is not nullable, this will throw immediately when [asFuture]
+   * is called.
    */
-  Future<E> asFuture<E>([E futureValue]);
+  Future<E> asFuture<E>([E? futureValue]);
 }
 
 /**
@@ -1813,7 +1751,7 @@
    *
    * Must not be called on a closed sink.
    */
-  void addError(Object error, [StackTrace stackTrace]);
+  void addError(Object error, [StackTrace? stackTrace]);
 
   /**
    * Closes the sink.
@@ -1836,12 +1774,12 @@
   bool get isBroadcast => _stream.isBroadcast;
 
   Stream<T> asBroadcastStream(
-          {void onListen(StreamSubscription<T> subscription),
-          void onCancel(StreamSubscription<T> subscription)}) =>
+          {void onListen(StreamSubscription<T> subscription)?,
+          void onCancel(StreamSubscription<T> subscription)?}) =>
       _stream.asBroadcastStream(onListen: onListen, onCancel: onCancel);
 
-  StreamSubscription<T> listen(void onData(T value),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  StreamSubscription<T> listen(void onData(T value)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
     return _stream.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
@@ -2094,9 +2032,10 @@
    * ```
    */
   factory StreamTransformer.fromHandlers(
-      {void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)}) = _StreamHandlerTransformer<S, T>;
+      {void handleData(S data, EventSink<T> sink)?,
+      void handleError(
+          Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+      void handleDone(EventSink<T> sink)?}) = _StreamHandlerTransformer<S, T>;
 
   /**
    * Creates a [StreamTransformer] based on a [bind] callback.
@@ -2254,18 +2193,24 @@
  * Wraps an [_EventSink] so it exposes only the [EventSink] interface.
  */
 class _ControllerEventSinkWrapper<T> implements EventSink<T> {
-  EventSink _sink;
+  EventSink? _sink;
   _ControllerEventSinkWrapper(this._sink);
 
-  void add(T data) {
-    _sink.add(data);
+  EventSink _ensureSink() {
+    var sink = _sink;
+    if (sink == null) throw StateError("Sink not available");
+    return sink;
   }
 
-  void addError(error, [StackTrace stackTrace]) {
-    _sink.addError(error, stackTrace);
+  void add(T data) {
+    _ensureSink().add(data);
+  }
+
+  void addError(error, [StackTrace? stackTrace]) {
+    _ensureSink().addError(error, stackTrace);
   }
 
   void close() {
-    _sink.close();
+    _ensureSink().close();
   }
 }
diff --git a/sdk_nnbd/lib/async/stream_controller.dart b/sdk_nnbd/lib/async/stream_controller.dart
index f8f2d6d..9303b86 100644
--- a/sdk_nnbd/lib/async/stream_controller.dart
+++ b/sdk_nnbd/lib/async/stream_controller.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 // -------------------------------------------------------------------
@@ -20,7 +18,7 @@
  *
  * The callback may return either `void` or a future.
  */
-typedef ControllerCancelCallback();
+typedef FutureOr<void> ControllerCancelCallback();
 
 /**
  * A controller with the stream it controls.
@@ -74,18 +72,18 @@
    * [onCancel] should return a future that completes when the cancel operation
    * is done.
    *
-   * If the stream is canceled before the controller needs new data the
+   * If the stream is canceled before the controller needs data the
    * [onResume] call might not be executed.
    */
   factory StreamController(
-      {void onListen(),
-      void onPause(),
-      void onResume(),
-      onCancel(),
-      bool sync: false}) {
+      {void onListen()?,
+      void onPause()?,
+      void onResume()?,
+      FutureOr<void> onCancel()?,
+      bool sync = false}) {
     return sync
-        ? new _SyncStreamController<T>(onListen, onPause, onResume, onCancel)
-        : new _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);
+        ? _SyncStreamController<T>(onListen, onPause, onResume, onCancel)
+        : _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);
   }
 
   /**
@@ -140,10 +138,10 @@
    * the [onListen] will be called again.
    */
   factory StreamController.broadcast(
-      {void onListen(), void onCancel(), bool sync: false}) {
+      {void onListen()?, void onCancel()?, bool sync = false}) {
     return sync
-        ? new _SyncBroadcastStreamController<T>(onListen, onCancel)
-        : new _AsyncBroadcastStreamController<T>(onListen, onCancel);
+        ? _SyncBroadcastStreamController<T>(onListen, onCancel)
+        : _AsyncBroadcastStreamController<T>(onListen, onCancel);
   }
 
   /**
@@ -151,9 +149,9 @@
    *
    * May be set to `null`, in which case no callback will happen.
    */
-  ControllerCallback get onListen;
+  void Function()? get onListen;
 
-  void set onListen(void onListenHandler());
+  void set onListen(void onListenHandler()?);
 
   /**
    * The callback which is called when the stream is paused.
@@ -162,9 +160,9 @@
    *
    * Pause related callbacks are not supported on broadcast stream controllers.
    */
-  ControllerCallback get onPause;
+  void Function()? get onPause;
 
-  void set onPause(void onPauseHandler());
+  void set onPause(void onPauseHandler()?);
 
   /**
    * The callback which is called when the stream is resumed.
@@ -173,18 +171,18 @@
    *
    * Pause related callbacks are not supported on broadcast stream controllers.
    */
-  ControllerCallback get onResume;
+  void Function()? get onResume;
 
-  void set onResume(void onResumeHandler());
+  void set onResume(void onResumeHandler()?);
 
   /**
    * The callback which is called when the stream is canceled.
    *
    * May be set to `null`, in which case no callback will happen.
    */
-  ControllerCancelCallback get onCancel;
+  FutureOr<void> Function()? get onCancel;
 
-  void set onCancel(onCancelHandler());
+  void set onCancel(FutureOr<void> onCancelHandler()?);
 
   /**
    * Returns a view of this object that only exposes the [StreamSink] interface.
@@ -244,7 +242,7 @@
    * controllers have to satisfy the preconditions mentioned in the
    * documentation of the constructors.
    */
-  void addError(Object error, [StackTrace stackTrace]);
+  void addError(Object error, [StackTrace? stackTrace]);
 
   /**
    * Closes the stream.
@@ -273,9 +271,9 @@
    * forwarded to the controller's stream, and the `addStream` ends
    * after this. If [cancelOnError] is false, all errors are forwarded
    * and only a done event will end the `addStream`.
-   * If [cancelOnError] is omitted, it defaults to false.
+   * If [cancelOnError] is omitted or `null`, it defaults to false.
    */
-  Future addStream(Stream<T> source, {bool cancelOnError});
+  Future addStream(Stream<T> source, {bool? cancelOnError});
 }
 
 /**
@@ -364,7 +362,7 @@
    * As [StreamController.addError], but must not be called while an event is
    * being added by [add], [addError] or [close].
    */
-  void addError(Object error, [StackTrace stackTrace]);
+  void addError(Object error, [StackTrace? stackTrace]);
 
   /**
    * Closes the controller's stream.
@@ -376,11 +374,11 @@
 }
 
 abstract class _StreamControllerLifecycle<T> {
-  StreamSubscription<T> _subscribe(
-      void onData(T data), Function onError, void onDone(), bool cancelOnError);
+  StreamSubscription<T> _subscribe(void onData(T data)?, Function? onError,
+      void onDone()?, bool cancelOnError);
   void _recordPause(StreamSubscription<T> subscription) {}
   void _recordResume(StreamSubscription<T> subscription) {}
-  Future _recordCancel(StreamSubscription<T> subscription) => null;
+  Future<void>? _recordCancel(StreamSubscription<T> subscription) => null;
 }
 
 // Base type for implementations of stream controllers.
@@ -445,9 +443,10 @@
    *
    * While [_state] is [_STATE_SUBSCRIBED], the field contains the subscription.
    *
-   * When [_state] is [_STATE_CANCELED] the field is currently not used.
+   * When [_state] is [_STATE_CANCELED] the field is currently not used,
+   * and will contain `null`.
    */
-  var _varData;
+  Object? _varData;
 
   /** Current state of the controller. */
   int _state = _STATE_INITIAL;
@@ -460,22 +459,22 @@
   // TODO(lrn): Could this be stored in the varData field too, if it's not
   // accessed until the call to "close"? Then we need to special case if it's
   // accessed earlier, or if close is called before subscribing.
-  _Future _doneFuture;
+  _Future<void>? _doneFuture;
 
-  ControllerCallback onListen;
-  ControllerCallback onPause;
-  ControllerCallback onResume;
-  ControllerCancelCallback onCancel;
+  void Function()? onListen;
+  void Function()? onPause;
+  void Function()? onResume;
+  FutureOr<void> Function()? onCancel;
 
   _StreamController(this.onListen, this.onPause, this.onResume, this.onCancel);
 
   // Return a new stream every time. The streams are equal, but not identical.
-  Stream<T> get stream => new _ControllerStream<T>(this);
+  Stream<T> get stream => _ControllerStream<T>(this);
 
   /**
    * Returns a view of this object that only exposes the [StreamSink] interface.
    */
-  StreamSink<T> get sink => new _StreamSinkWrapper<T>(this);
+  StreamSink<T> get sink => _StreamSinkWrapper<T>(this);
 
   /**
    * Whether a listener has existed and been canceled.
@@ -511,9 +510,9 @@
   _PendingEvents<T> get _pendingEvents {
     assert(_isInitialState);
     if (!_isAddingStream) {
-      return _varData;
+      return _varData as _PendingEvents<T>;
     }
-    _StreamControllerAddStreamState<T> state = _varData;
+    var state = _varData as _StreamControllerAddStreamState<T>;
     return state.varData;
   }
 
@@ -521,12 +520,18 @@
   _StreamImplEvents<T> _ensurePendingEvents() {
     assert(_isInitialState);
     if (!_isAddingStream) {
-      _varData ??= new _StreamImplEvents<T>();
-      return _varData;
+      Object? events = _varData;
+      if (events is! _StreamImplEvents<T>) {
+        _varData = events = _StreamImplEvents<T>();
+      }
+      return events;
     }
-    _StreamControllerAddStreamState<T> state = _varData;
-    if (state.varData == null) state.varData = new _StreamImplEvents<T>();
-    return state.varData;
+    var state = _varData as _StreamControllerAddStreamState<T>;
+    Object? events = state.varData;
+    if (events is! _StreamImplEvents<T>) {
+      state.varData = events = _StreamImplEvents<T>();
+    }
+    return events;
   }
 
   // Get the current subscription.
@@ -534,11 +539,11 @@
   // object to allow the state object to use the _varData field.
   _ControllerSubscription<T> get _subscription {
     assert(hasListener);
+    Object? varData = _varData;
     if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState = _varData;
-      return addState.varData;
+      varData = (varData as _StreamControllerAddStreamState<Object?>).varData;
     }
-    return _varData;
+    return _varData as _ControllerSubscription<T>;
   }
 
   /**
@@ -548,18 +553,18 @@
    */
   Error _badEventState() {
     if (isClosed) {
-      return new StateError("Cannot add event after closing");
+      return StateError("Cannot add event after closing");
     }
     assert(_isAddingStream);
-    return new StateError("Cannot add event while adding a stream");
+    return StateError("Cannot add event while adding a stream");
   }
 
   // StreamSink interface.
-  Future addStream(Stream<T> source, {bool cancelOnError}) {
+  Future addStream(Stream<T> source, {bool? cancelOnError}) {
     if (!_mayAddEvent) throw _badEventState();
-    if (_isCanceled) return new _Future.immediate(null);
+    if (_isCanceled) return _Future.immediate(null);
     _StreamControllerAddStreamState<T> addState =
-        new _StreamControllerAddStreamState<T>(
+        _StreamControllerAddStreamState<T>(
             this, _varData, source, cancelOnError ?? false);
     _varData = addState;
     _state |= _STATE_ADDSTREAM;
@@ -573,12 +578,10 @@
    * This happens either when the done event has been sent, or if the
    * subscriber of a single-subscription stream is cancelled.
    */
-  Future get done => _ensureDoneFuture();
+  Future<void> get done => _ensureDoneFuture();
 
-  Future _ensureDoneFuture() {
-    _doneFuture ??= _isCanceled ? Future._nullFuture : new _Future();
-    return _doneFuture;
-  }
+  Future<void> _ensureDoneFuture() =>
+      _doneFuture ??= _isCanceled ? Future._nullFuture : _Future<void>();
 
   /**
    * Send or enqueue a data event.
@@ -591,12 +594,11 @@
   /**
    * Send or enqueue an error event.
    */
-  void addError(Object error, [StackTrace stackTrace]) {
+  void addError(Object error, [StackTrace? stackTrace]) {
     if (!_mayAddEvent) throw _badEventState();
-    error = _nonNullError(error);
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
     if (replacement != null) {
-      error = _nonNullError(replacement.error);
+      error = replacement.error;
       stackTrace = replacement.stackTrace;
     }
     _addError(error, stackTrace);
@@ -641,22 +643,22 @@
     if (hasListener) {
       _sendData(value);
     } else if (_isInitialState) {
-      _ensurePendingEvents().add(new _DelayedData<T>(value));
+      _ensurePendingEvents().add(_DelayedData<T>(value));
     }
   }
 
-  void _addError(Object error, StackTrace stackTrace) {
+  void _addError(Object error, StackTrace? stackTrace) {
     if (hasListener) {
       _sendError(error, stackTrace);
     } else if (_isInitialState) {
-      _ensurePendingEvents().add(new _DelayedError(error, stackTrace));
+      _ensurePendingEvents().add(_DelayedError(error, stackTrace));
     }
   }
 
   void _close() {
     // End of addStream stream.
     assert(_isAddingStream);
-    _StreamControllerAddStreamState<T> addState = _varData;
+    var addState = _varData as _StreamControllerAddStreamState<T>;
     _varData = addState.varData;
     _state &= ~_STATE_ADDSTREAM;
     addState.complete();
@@ -664,18 +666,18 @@
 
   // _StreamControllerLifeCycle interface
 
-  StreamSubscription<T> _subscribe(void onData(T data), Function onError,
-      void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _subscribe(void onData(T data)?, Function? onError,
+      void onDone()?, bool cancelOnError) {
     if (!_isInitialState) {
-      throw new StateError("Stream has already been listened to.");
+      throw StateError("Stream has already been listened to.");
     }
-    _ControllerSubscription<T> subscription = new _ControllerSubscription<T>(
+    _ControllerSubscription<T> subscription = _ControllerSubscription<T>(
         this, onData, onError, onDone, cancelOnError);
 
     _PendingEvents<T> pendingEvents = _pendingEvents;
     _state |= _STATE_SUBSCRIBED;
     if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState = _varData;
+      var addState = _varData as _StreamControllerAddStreamState<T>;
       addState.varData = subscription;
       addState.resume();
     } else {
@@ -689,7 +691,7 @@
     return subscription;
   }
 
-  Future _recordCancel(StreamSubscription<T> subscription) {
+  Future<void>? _recordCancel(StreamSubscription<T> subscription) {
     // When we cancel, we first cancel any stream being added,
     // Then we call `onCancel`, and finally the _doneFuture is completed.
     // If either of addStream's cancel or `onCancel` returns a future,
@@ -698,26 +700,30 @@
     // If more errors happen, we act as if it happens inside nested try/finallys
     // or whenComplete calls, and only the last error ends up in the
     // returned future.
-    Future result;
+    Future<void>? result;
     if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState = _varData;
+      var addState = _varData as _StreamControllerAddStreamState<T>;
       result = addState.cancel();
     }
     _varData = null;
     _state =
         (_state & ~(_STATE_SUBSCRIBED | _STATE_ADDSTREAM)) | _STATE_CANCELED;
 
+    var onCancel = this.onCancel;
     if (onCancel != null) {
       if (result == null) {
         // Only introduce a future if one is needed.
         // If _onCancel returns null, no future is needed.
         try {
-          result = onCancel();
+          var cancelResult = onCancel();
+          if (cancelResult is Future<void>) {
+            result = cancelResult;
+          }
         } catch (e, s) {
           // Return the error in the returned future.
           // Complete it asynchronously, so there is time for a listener
           // to handle the error.
-          result = new _Future().._asyncCompleteError(e, s);
+          result = _Future().._asyncCompleteError(e, s);
         }
       } else {
         // Simpler case when we already know that we will return a future.
@@ -726,8 +732,9 @@
     }
 
     void complete() {
-      if (_doneFuture != null && _doneFuture._mayComplete) {
-        _doneFuture._asyncComplete(null);
+      var doneFuture = _doneFuture;
+      if (doneFuture != null && doneFuture._mayComplete) {
+        doneFuture._asyncComplete(null);
       }
     }
 
@@ -742,7 +749,7 @@
 
   void _recordPause(StreamSubscription<T> subscription) {
     if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState = _varData;
+      var addState = _varData as _StreamControllerAddStreamState<T>;
       addState.pause();
     }
     _runGuarded(onPause);
@@ -750,7 +757,7 @@
 
   void _recordResume(StreamSubscription<T> subscription) {
     if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState = _varData;
+      var addState = _varData as _StreamControllerAddStreamState<T>;
       addState.resume();
     }
     _runGuarded(onResume);
@@ -766,7 +773,7 @@
     _subscription._add(data);
   }
 
-  void _sendError(Object error, StackTrace stackTrace) {
+  void _sendError(Object error, StackTrace? stackTrace) {
     _subscription._addError(error, stackTrace);
   }
 
@@ -778,11 +785,11 @@
 abstract class _AsyncStreamControllerDispatch<T>
     implements _StreamController<T> {
   void _sendData(T data) {
-    _subscription._addPending(new _DelayedData<T>(data));
+    _subscription._addPending(_DelayedData<T>(data));
   }
 
-  void _sendError(Object error, StackTrace stackTrace) {
-    _subscription._addPending(new _DelayedError(error, stackTrace));
+  void _sendError(Object error, StackTrace? stackTrace) {
+    _subscription._addPending(_DelayedError(error, stackTrace));
   }
 
   void _sendDone() {
@@ -799,9 +806,7 @@
 class _SyncStreamController<T> = _StreamController<T>
     with _SyncStreamControllerDispatch<T>;
 
-typedef _NotificationHandler();
-
-void _runGuarded(_NotificationHandler notificationHandler) {
+void _runGuarded(void Function()? notificationHandler) {
   if (notificationHandler == null) return;
   try {
     notificationHandler();
@@ -815,8 +820,8 @@
 
   _ControllerStream(this._controller);
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-          Function onError, void onDone(), bool cancelOnError) =>
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+          Function? onError, void onDone()?, bool cancelOnError) =>
       _controller._subscribe(onData, onError, onDone, cancelOnError);
 
   // Override == and hashCode so that new streams returned by the same
@@ -835,11 +840,11 @@
 class _ControllerSubscription<T> extends _BufferingStreamSubscription<T> {
   final _StreamControllerLifecycle<T> _controller;
 
-  _ControllerSubscription(this._controller, void onData(T data),
-      Function onError, void onDone(), bool cancelOnError)
+  _ControllerSubscription(this._controller, void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError)
       : super(onData, onError, onDone, cancelOnError);
 
-  Future _onCancel() {
+  Future<void>? _onCancel() {
     return _controller._recordCancel(this);
   }
 
@@ -860,7 +865,7 @@
     _target.add(data);
   }
 
-  void addError(Object error, [StackTrace stackTrace]) {
+  void addError(Object error, [StackTrace? stackTrace]) {
     _target.addError(error, stackTrace);
   }
 
@@ -883,7 +888,7 @@
 
   _AddStreamState(
       _EventSink<T> controller, Stream<T> source, bool cancelOnError)
-      : addStreamFuture = new _Future(),
+      : addStreamFuture = _Future(),
         addSubscription = source.listen(controller._add,
             onError: cancelOnError
                 ? makeErrorHandler(controller)
@@ -891,7 +896,7 @@
             onDone: controller._close,
             cancelOnError: cancelOnError);
 
-  static makeErrorHandler(_EventSink controller) => (e, StackTrace s) {
+  static makeErrorHandler(_EventSink controller) => (Object e, StackTrace? s) {
         controller._addError(e, s);
         controller._close();
       };
@@ -912,11 +917,11 @@
    *
    * Return a future if the cancel takes time, otherwise return `null`.
    */
-  Future cancel() {
+  Future<void> cancel() {
     var cancel = addSubscription.cancel();
     if (cancel == null) {
       addStreamFuture._asyncComplete(null);
-      return null;
+      return Future._nullFuture;
     }
     return cancel.whenComplete(() {
       addStreamFuture._asyncComplete(null);
diff --git a/sdk_nnbd/lib/async/stream_impl.dart b/sdk_nnbd/lib/async/stream_impl.dart
index fac736c..c5f331c 100644
--- a/sdk_nnbd/lib/async/stream_impl.dart
+++ b/sdk_nnbd/lib/async/stream_impl.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /** Abstract and private interface for a place to put events. */
 abstract class _EventSink<T> {
   void _add(T data);
-  void _addError(Object error, StackTrace stackTrace);
+  void _addError(Object error, StackTrace? stackTrace);
   void _close();
 }
 
@@ -22,7 +20,7 @@
  */
 abstract class _EventDispatch<T> {
   void _sendData(T data);
-  void _sendError(Object error, StackTrace stackTrace);
+  void _sendError(Object error, StackTrace? stackTrace);
   void _sendDone();
 }
 
@@ -92,29 +90,33 @@
   _DataHandler<T> _onData;
   Function _onError;
   _DoneHandler _onDone;
-  final Zone _zone = Zone.current;
+
+  final Zone _zone;
 
   /** Bit vector based on state-constants above. */
   int _state;
 
   // TODO(floitsch): reuse another field
   /** The future [_onCancel] may return. */
-  Future _cancelFuture;
+  Future? _cancelFuture;
 
   /**
    * Queue of pending events.
    *
    * Is created when necessary, or set in constructor for preconfigured events.
    */
-  _PendingEvents<T> _pending;
+  _PendingEvents<T>? _pending;
 
-  _BufferingStreamSubscription(
-      void onData(T data), Function onError, void onDone(), bool cancelOnError)
-      : _state = (cancelOnError ? _STATE_CANCEL_ON_ERROR : 0) {
-    this.onData(onData);
-    this.onError(onError);
-    this.onDone(onDone);
-  }
+  _BufferingStreamSubscription(void onData(T data)?, Function? onError,
+      void onDone()?, bool cancelOnError)
+      : this.zoned(Zone.current, onData, onError, onDone, cancelOnError);
+
+  _BufferingStreamSubscription.zoned(this._zone, void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError)
+      : _state = (cancelOnError ? _STATE_CANCEL_ON_ERROR : 0),
+        _onData = _registerDataHandler<T>(_zone, onData),
+        _onError = _registerErrorHandler(_zone, onError),
+        _onDone = _registerDoneHandler(_zone, onDone);
 
   /**
    * Sets the subscription's pending events object.
@@ -128,45 +130,56 @@
     _pending = pendingEvents;
     if (!pendingEvents.isEmpty) {
       _state |= _STATE_HAS_PENDING;
-      _pending.schedule(this);
+      pendingEvents.schedule(this);
     }
   }
 
   // StreamSubscription interface.
 
-  void onData(void handleData(T event)) {
-    handleData ??= _nullDataHandler;
-    // TODO(floitsch): the return type should be 'void', and the type
-    // should be inferred.
-    _onData = _zone.registerUnaryCallback<dynamic, T>(handleData);
+  void onData(void handleData(T event)?) {
+    _onData = _registerDataHandler<T>(_zone, handleData);
   }
 
-  void onError(Function handleError) {
+  static void Function(T) _registerDataHandler<T>(
+      Zone zone, void Function(T)? handleData) {
+    return zone.registerUnaryCallback<void, T>(handleData ?? _nullDataHandler);
+  }
+
+  void onError(Function? handleError) {
+    _onError = _registerErrorHandler(_zone, handleError);
+  }
+
+  static Function _registerErrorHandler(Zone zone, Function? handleError) {
+    // TODO(lrn): Consider whether we need to register the null handler.
     handleError ??= _nullErrorHandler;
-    if (handleError is void Function(Object, StackTrace)) {
-      _onError = _zone
-          .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
-    } else if (handleError is void Function(Object)) {
-      _onError = _zone.registerUnaryCallback<dynamic, Object>(handleError);
-    } else {
-      throw new ArgumentError("handleError callback must take either an Object "
-          "(the error), or both an Object (the error) and a StackTrace.");
+    if (handleError is void Function(Object, StackTrace?)) {
+      return zone
+          .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
     }
+    if (handleError is void Function(Object)) {
+      return zone.registerUnaryCallback<dynamic, Object>(handleError);
+    }
+    throw new ArgumentError("handleError callback must take either an Object "
+        "(the error), or both an Object (the error) and a StackTrace.");
   }
 
-  void onDone(void handleDone()) {
-    handleDone ??= _nullDoneHandler;
-    _onDone = _zone.registerCallback(handleDone);
+  void onDone(void handleDone()?) {
+    _onDone = _registerDoneHandler(_zone, handleDone);
   }
 
-  void pause([Future resumeSignal]) {
+  static void Function() _registerDoneHandler(
+      Zone zone, void Function()? handleDone) {
+    return zone.registerCallback(handleDone ?? _nullDoneHandler);
+  }
+
+  void pause([Future<void>? resumeSignal]) {
     if (_isCanceled) return;
     bool wasPaused = _isPaused;
     bool wasInputPaused = _isInputPaused;
     // Increment pause count and mark input paused (if it isn't already).
     _state = (_state + _STATE_PAUSE_COUNT) | _STATE_INPUT_PAUSED;
-    if (resumeSignal != null) resumeSignal.whenComplete(resume);
-    if (!wasPaused && _pending != null) _pending.cancelSchedule();
+    resumeSignal?.whenComplete(resume);
+    if (!wasPaused) _pending?.cancelSchedule();
     if (!wasInputPaused && !_inCallback) _guardCallback(_onPause);
   }
 
@@ -175,9 +188,9 @@
     if (_isPaused) {
       _decrementPauseCount();
       if (!_isPaused) {
-        if (_hasPending && !_pending.isEmpty) {
+        if (_hasPending && !_pending!.isEmpty) {
           // Input is still paused.
-          _pending.schedule(this);
+          _pending!.schedule(this);
         } else {
           assert(_mayResumeInput);
           _state &= ~_STATE_INPUT_PAUSED;
@@ -198,25 +211,27 @@
     return _cancelFuture ?? Future._nullFuture;
   }
 
-  Future<E> asFuture<E>([E futureValue]) {
-    _Future<E> result = new _Future<E>();
-
-    // Overwrite the onDone and onError handlers.
-    _onDone = () {
-      result._complete(futureValue);
-    };
-    _onError = (error, StackTrace stackTrace) {
-      Future cancelFuture = cancel();
-      if (!identical(cancelFuture, Future._nullFuture)) {
-        cancelFuture.whenComplete(() {
+  Future<E> asFuture<E>([E? futureValue]) {
+    if (futureValue is E) {
+      // Overwrite the onDone and onError handlers.
+      _Future<E> result = new _Future<E>();
+      E resultValue = futureValue;
+      _onDone = () {
+        result._complete(resultValue);
+      };
+      _onError = (Object error, StackTrace? stackTrace) {
+        Future cancelFuture = cancel();
+        if (!identical(cancelFuture, Future._nullFuture)) {
+          cancelFuture.whenComplete(() {
+            result._completeError(error, stackTrace);
+          });
+        } else {
           result._completeError(error, stackTrace);
-        });
-      } else {
-        result._completeError(error, stackTrace);
-      }
-    };
-
-    return result;
+        }
+      };
+      return result;
+    }
+    throw ArgumentError.notNull("futureValue");
   }
 
   // State management.
@@ -229,8 +244,7 @@
   bool get _hasPending => (_state & _STATE_HAS_PENDING) != 0;
   bool get _isPaused => _state >= _STATE_PAUSE_COUNT;
   bool get _canFire => _state < _STATE_IN_CALLBACK;
-  bool get _mayResumeInput =>
-      !_isPaused && (_pending == null || _pending.isEmpty);
+  bool get _mayResumeInput => !_isPaused && (_pending?.isEmpty ?? true);
   bool get _cancelOnError => (_state & _STATE_CANCEL_ON_ERROR) != 0;
 
   bool get isPaused => _isPaused;
@@ -238,7 +252,7 @@
   void _cancel() {
     _state |= _STATE_CANCELED;
     if (_hasPending) {
-      _pending.cancelSchedule();
+      _pending!.cancelSchedule();
     }
     if (!_inCallback) _pending = null;
     _cancelFuture = _onCancel();
@@ -268,7 +282,7 @@
     }
   }
 
-  void _addError(Object error, StackTrace stackTrace) {
+  void _addError(Object error, StackTrace? stackTrace) {
     if (_isCanceled) return;
     if (_canFire) {
       _sendError(error, stackTrace); // Reports cancel after sending.
@@ -300,7 +314,7 @@
     assert(!_isInputPaused);
   }
 
-  Future _onCancel() {
+  Future<void>? _onCancel() {
     assert(_isCanceled);
     return null;
   }
@@ -314,15 +328,17 @@
    * of pending events later (if necessary).
    */
   void _addPending(_DelayedEvent event) {
-    _StreamImplEvents<T> pending = _pending;
-    if (_pending == null) {
-      pending = _pending = new _StreamImplEvents<T>();
-    }
+    // TODO(lrn): Restore to:
+    // _StreamImplEvents<T> pending = (_pending ??= _StreamImplEvents<T>());
+    // when that type-checks.
+    var streamEvents = _StreamImplEvents<T>();
+    _pending ??= streamEvents;
+    _StreamImplEvents<T> pending = streamEvents;
     pending.add(event);
     if (!_hasPending) {
       _state |= _STATE_HAS_PENDING;
       if (!_isPaused) {
-        _pending.schedule(this);
+        pending.schedule(this);
       }
     }
   }
@@ -340,7 +356,7 @@
     _checkState(wasInputPaused);
   }
 
-  void _sendError(Object error, StackTrace stackTrace) {
+  void _sendError(Object error, StackTrace? stackTrace) {
     assert(!_isCanceled);
     assert(!_isPaused);
     assert(!_inCallback);
@@ -353,11 +369,10 @@
       _state |= _STATE_IN_CALLBACK;
       // TODO(floitsch): this dynamic should be 'void'.
       var onError = _onError;
-      if (onError is void Function(Object, StackTrace)) {
-        _zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
+      if (onError is void Function(Object, StackTrace?)) {
+        _zone.runBinaryGuarded<Object, StackTrace?>(onError, error, stackTrace);
       } else {
-        assert(_onError is void Function(Object));
-        _zone.runUnaryGuarded<Object>(_onError, error);
+        _zone.runUnaryGuarded<Object>(_onError as void Function(Object), error);
       }
       _state &= ~_STATE_IN_CALLBACK;
     }
@@ -365,9 +380,10 @@
     if (_cancelOnError) {
       _state |= _STATE_WAIT_FOR_CANCEL;
       _cancel();
-      if (_cancelFuture != null &&
-          !identical(_cancelFuture, Future._nullFuture)) {
-        _cancelFuture.whenComplete(sendError);
+      var cancelFuture = _cancelFuture;
+      if (cancelFuture != null &&
+          !identical(cancelFuture, Future._nullFuture)) {
+        cancelFuture.whenComplete(sendError);
       } else {
         sendError();
       }
@@ -394,9 +410,10 @@
 
     _cancel();
     _state |= _STATE_WAIT_FOR_CANCEL;
-    if (_cancelFuture != null &&
-        !identical(_cancelFuture, Future._nullFuture)) {
-      _cancelFuture.whenComplete(sendDone);
+    var cancelFuture = _cancelFuture;
+    if (cancelFuture != null &&
+        !identical(cancelFuture, Future._nullFuture)) {
+      cancelFuture.whenComplete(sendDone);
     } else {
       sendDone();
     }
@@ -430,7 +447,7 @@
    */
   void _checkState(bool wasInputPaused) {
     assert(!_inCallback);
-    if (_hasPending && _pending.isEmpty) {
+    if (_hasPending && _pending!.isEmpty) {
       _state &= ~_STATE_HAS_PENDING;
       if (_isInputPaused && _mayResumeInput) {
         _state &= ~_STATE_INPUT_PAUSED;
@@ -455,7 +472,7 @@
       wasInputPaused = isInputPaused;
     }
     if (_hasPending && !_isPaused) {
-      _pending.schedule(this);
+      _pending!.schedule(this);
     }
   }
 }
@@ -467,9 +484,9 @@
   // ------------------------------------------------------------------
   // Stream interface.
 
-  StreamSubscription<T> listen(void onData(T data),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
+  StreamSubscription<T> listen(void onData(T data)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    cancelOnError ??= false;
     StreamSubscription<T> subscription =
         _createSubscription(onData, onError, onDone, cancelOnError);
     _onListen(subscription);
@@ -478,8 +495,8 @@
 
   // -------------------------------------------------------------------
   /** Create a subscription object. Called by [subcribe]. */
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
     return new _BufferingStreamSubscription<T>(
         onData, onError, onDone, cancelOnError);
   }
@@ -502,8 +519,8 @@
    */
   _GeneratedStreamImpl(this._pending);
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
     if (_isUsed) throw new StateError("Stream has already been listened to.");
     _isUsed = true;
     return new _BufferingStreamSubscription<T>(
@@ -516,14 +533,15 @@
 class _IterablePendingEvents<T> extends _PendingEvents<T> {
   // The iterator providing data for data events.
   // Set to null when iteration has completed.
-  Iterator<T> _iterator;
+  Iterator<T>? _iterator;
 
   _IterablePendingEvents(Iterable<T> data) : _iterator = data.iterator;
 
   bool get isEmpty => _iterator == null;
 
   void handleNext(_EventDispatch<T> dispatch) {
-    if (_iterator == null) {
+    var iterator = _iterator;
+    if (iterator == null) {
       throw new StateError("No events pending.");
     }
     // Send one event per call to moveNext.
@@ -532,25 +550,23 @@
     // If moveNext returns false, send a done event and clear the _iterator.
     // If moveNext throws an error, send an error and prepare to send a done
     // event afterwards.
-    bool hasMore;
+    bool movedNext = false;
     try {
-      hasMore = _iterator.moveNext();
-      if (hasMore) {
-        dispatch._sendData(_iterator.current);
+      if (iterator.moveNext()) {
+        movedNext = true;
+        dispatch._sendData(iterator.current);
       } else {
         _iterator = null;
         dispatch._sendDone();
       }
     } catch (e, s) {
-      if (hasMore == null) {
+      if (!movedNext) {
         // Threw in .moveNext().
         // Ensure that we send a done afterwards.
-        _iterator = const EmptyIterator<Null>();
-        dispatch._sendError(e, s);
-      } else {
-        // Threw in .current.
-        dispatch._sendError(e, s);
+        _iterator = const EmptyIterator<Never>();
       }
+      // Else threw in .current.
+      dispatch._sendError(e, s);
     }
   }
 
@@ -570,7 +586,7 @@
 void _nullDataHandler(Object value) {}
 
 /** Default error handler, reports the error to the current zone's handler. */
-void _nullErrorHandler(Object error, [StackTrace stackTrace]) {
+void _nullErrorHandler(Object error, [StackTrace? stackTrace]) {
   Zone.current.handleUncaughtError(error, stackTrace);
 }
 
@@ -580,7 +596,7 @@
 /** A delayed event on a buffering stream subscription. */
 abstract class _DelayedEvent<T> {
   /** Added as a linked list on the [StreamController]. */
-  _DelayedEvent next;
+  _DelayedEvent? next;
   /** Execute the delayed event on the [StreamController]. */
   void perform(_EventDispatch<T> dispatch);
 }
@@ -596,8 +612,8 @@
 
 /** A delayed error event. */
 class _DelayedError extends _DelayedEvent {
-  final error;
-  final StackTrace stackTrace;
+  final Object error;
+  final StackTrace? stackTrace;
 
   _DelayedError(this.error, this.stackTrace);
   void perform(_EventDispatch dispatch) {
@@ -612,9 +628,9 @@
     dispatch._sendDone();
   }
 
-  _DelayedEvent get next => null;
+  _DelayedEvent? get next => null;
 
-  void set next(_DelayedEvent _) {
+  void set next(_DelayedEvent? _) {
     throw new StateError("No events after a done.");
   }
 }
@@ -684,26 +700,29 @@
 /** Class holding pending events for a [_StreamImpl]. */
 class _StreamImplEvents<T> extends _PendingEvents<T> {
   /// Single linked list of [_DelayedEvent] objects.
-  _DelayedEvent firstPendingEvent;
+  _DelayedEvent? firstPendingEvent;
 
   /// Last element in the list of pending events. New events are added after it.
-  _DelayedEvent lastPendingEvent;
+  _DelayedEvent? lastPendingEvent;
 
   bool get isEmpty => lastPendingEvent == null;
 
   void add(_DelayedEvent event) {
-    if (lastPendingEvent == null) {
+    var lastEvent = lastPendingEvent;
+    if (lastEvent == null) {
       firstPendingEvent = lastPendingEvent = event;
     } else {
-      lastPendingEvent = lastPendingEvent.next = event;
+      lastPendingEvent = lastEvent.next = event;
     }
   }
 
   void handleNext(_EventDispatch<T> dispatch) {
     assert(!isScheduled);
-    _DelayedEvent event = firstPendingEvent;
-    firstPendingEvent = event.next;
-    if (firstPendingEvent == null) {
+    assert(!isEmpty);
+    _DelayedEvent event = firstPendingEvent!;
+    _DelayedEvent? nextEvent = event.next;
+    firstPendingEvent = nextEvent;
+    if (nextEvent == null) {
       lastPendingEvent = null;
     }
     event.perform(dispatch);
@@ -727,7 +746,7 @@
 
   final Zone _zone;
   int _state = 0;
-  _DoneHandler _onDone;
+  _DoneHandler? _onDone;
 
   _DoneStreamSubscription(this._onDone) : _zone = Zone.current {
     _schedule();
@@ -743,13 +762,13 @@
     _state |= _SCHEDULED;
   }
 
-  void onData(void handleData(T data)) {}
-  void onError(Function handleError) {}
-  void onDone(void handleDone()) {
+  void onData(void handleData(T data)?) {}
+  void onError(Function? handleError) {}
+  void onDone(void handleDone()?) {
     _onDone = handleDone;
   }
 
-  void pause([Future resumeSignal]) {
+  void pause([Future<void>? resumeSignal]) {
     _state += _PAUSED;
     if (resumeSignal != null) resumeSignal.whenComplete(resume);
   }
@@ -765,42 +784,45 @@
 
   Future cancel() => Future._nullFuture;
 
-  Future<E> asFuture<E>([E futureValue]) {
-    _Future<E> result = new _Future<E>();
-    _onDone = () {
-      result._completeWithValue(futureValue);
-    };
-    return result;
+  Future<E> asFuture<E>([E? futureValue]) {
+    if (futureValue is E) {
+      _Future<E> result = new _Future<E>();
+      E resultValue = futureValue;
+      _onDone = () {
+        result._completeWithValue(resultValue);
+      };
+      return result;
+    }
+    throw ArgumentError.notNull("futureValue");
   }
 
   void _sendDone() {
     _state &= ~_SCHEDULED;
     if (isPaused) return;
     _state |= _DONE_SENT;
-    if (_onDone != null) _zone.runGuarded(_onDone);
+    var doneHandler = _onDone;
+    if (doneHandler != null) _zone.runGuarded(doneHandler);
   }
 }
 
 class _AsBroadcastStream<T> extends Stream<T> {
   final Stream<T> _source;
-  final _BroadcastCallback<T> _onListenHandler;
-  final _BroadcastCallback<T> _onCancelHandler;
+  final _BroadcastCallback<T>? _onListenHandler;
+  final _BroadcastCallback<T>? _onCancelHandler;
   final Zone _zone;
 
-  _AsBroadcastStreamController<T> _controller;
-  StreamSubscription<T> _subscription;
+  late _AsBroadcastStreamController<T>? _controller;
+  StreamSubscription<T>? _subscription;
 
   _AsBroadcastStream(
       this._source,
-      void onListenHandler(StreamSubscription<T> subscription),
-      void onCancelHandler(StreamSubscription<T> subscription))
-      // TODO(floitsch): the return type should be void and should be
-      // inferred.
-      : _onListenHandler = Zone.current
-            .registerUnaryCallback<dynamic, StreamSubscription<T>>(
+      void onListenHandler(StreamSubscription<T> subscription)?,
+      void onCancelHandler(StreamSubscription<T> subscription)?)
+      : _onListenHandler = onListenHandler == null ? null : Zone.current
+            .registerUnaryCallback<void, StreamSubscription<T>>(
                 onListenHandler),
-        _onCancelHandler = Zone.current
-            .registerUnaryCallback<dynamic, StreamSubscription<T>>(
+        _onCancelHandler = onCancelHandler == null ? null : Zone.current
+            .registerUnaryCallback<void, StreamSubscription<T>>(
                 onCancelHandler),
         _zone = Zone.current {
     _controller = new _AsBroadcastStreamController<T>(_onListen, _onCancel);
@@ -808,63 +830,66 @@
 
   bool get isBroadcast => true;
 
-  StreamSubscription<T> listen(void onData(T data),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    if (_controller == null || _controller.isClosed) {
+  StreamSubscription<T> listen(void onData(T data)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    var controller = _controller;
+    if (controller == null || controller.isClosed) {
       // Return a dummy subscription backed by nothing, since
       // it will only ever send one done event.
       return new _DoneStreamSubscription<T>(onDone);
     }
-    _subscription ??= _source.listen(_controller.add,
-        onError: _controller.addError, onDone: _controller.close);
-    cancelOnError = identical(true, cancelOnError);
-    return _controller._subscribe(onData, onError, onDone, cancelOnError);
+    _subscription ??= _source.listen(controller.add,
+        onError: controller.addError, onDone: controller.close);
+    return controller._subscribe(
+        onData, onError, onDone, cancelOnError ?? false);
   }
 
   void _onCancel() {
-    bool shutdown = (_controller == null) || _controller.isClosed;
-    if (_onCancelHandler != null) {
+    var controller = _controller;
+    bool shutdown = (controller == null) || controller.isClosed;
+    var cancelHandler = _onCancelHandler;
+    if (cancelHandler != null) {
       _zone.runUnary(
-          _onCancelHandler, new _BroadcastSubscriptionWrapper<T>(this));
+          cancelHandler, new _BroadcastSubscriptionWrapper<T>(this));
     }
     if (shutdown) {
-      if (_subscription != null) {
-        _subscription.cancel();
+      var subscription = _subscription;
+      if (subscription != null) {
+        subscription.cancel();
         _subscription = null;
       }
     }
   }
 
   void _onListen() {
-    if (_onListenHandler != null) {
+    var listenHandler = _onListenHandler;
+    if (listenHandler != null) {
       _zone.runUnary(
-          _onListenHandler, new _BroadcastSubscriptionWrapper<T>(this));
+          listenHandler, new _BroadcastSubscriptionWrapper<T>(this));
     }
   }
 
   // Methods called from _BroadcastSubscriptionWrapper.
   void _cancelSubscription() {
-    if (_subscription == null) return;
     // Called by [_controller] when it has no subscribers left.
-    StreamSubscription subscription = _subscription;
-    _subscription = null;
-    _controller = null; // Marks the stream as no longer listenable.
-    subscription.cancel();
+    var subscription = _subscription;
+    if (subscription != null) {
+      _subscription = null;
+      _controller = null; // Marks the stream as no longer listenable.
+      subscription.cancel();
+    }
   }
 
-  void _pauseSubscription(Future resumeSignal) {
-    if (_subscription == null) return;
-    _subscription.pause(resumeSignal);
+  void _pauseSubscription(Future<void>? resumeSignal) {
+    _subscription?.pause(resumeSignal);
   }
 
   void _resumeSubscription() {
-    if (_subscription == null) return;
-    _subscription.resume();
+    _subscription?.resume();
   }
 
   bool get _isSubscriptionPaused {
-    if (_subscription == null) return false;
-    return _subscription.isPaused;
+    return _subscription?.isPaused ?? false;
   }
 }
 
@@ -876,22 +901,22 @@
 
   _BroadcastSubscriptionWrapper(this._stream);
 
-  void onData(void handleData(T data)) {
+  void onData(void handleData(T data)?) {
     throw new UnsupportedError(
         "Cannot change handlers of asBroadcastStream source subscription.");
   }
 
-  void onError(Function handleError) {
+  void onError(Function? handleError) {
     throw new UnsupportedError(
         "Cannot change handlers of asBroadcastStream source subscription.");
   }
 
-  void onDone(void handleDone()) {
+  void onDone(void handleDone()?) {
     throw new UnsupportedError(
         "Cannot change handlers of asBroadcastStream source subscription.");
   }
 
-  void pause([Future resumeSignal]) {
+  void pause([Future<void>? resumeSignal]) {
     _stream._pauseSubscription(resumeSignal);
   }
 
@@ -908,7 +933,7 @@
     return _stream._isSubscriptionPaused;
   }
 
-  Future<E> asFuture<E>([E futureValue]) {
+  Future<E> asFuture<E>([E? futureValue]) {
     throw new UnsupportedError(
         "Cannot change handlers of asBroadcastStream source subscription.");
   }
@@ -947,7 +972,7 @@
   /// Subscription being listened to.
   ///
   /// Set to `null` when the stream subscription is done or canceled.
-  StreamSubscription _subscription;
+  StreamSubscription<T>? _subscription;
 
   /// Data value depending on the current state.
   ///
@@ -961,7 +986,7 @@
   ///
   /// After calling [moveNext] and the returned future has completed
   /// with `false`, or after calling [cancel]: `null`.
-  Object _stateData;
+  Object? _stateData;
 
   /// Whether the iterator is between calls to `moveNext`.
   /// This will usually cause the [_subscription] to be paused, but as an
@@ -970,22 +995,23 @@
   bool _isPaused = false;
 
   _StreamIterator(final Stream<T> stream)
-      : _stateData = stream ?? (throw ArgumentError.notNull("stream"));
+      : _stateData = stream;
 
   T get current {
     if (_subscription != null && _isPaused) {
-      return _stateData;
+      return _stateData as T;
     }
-    return null;
+    return null as T;
   }
 
   Future<bool> moveNext() {
-    if (_subscription != null) {
+    var subscription = _subscription;
+    if (subscription != null) {
       if (_isPaused) {
         var future = new _Future<bool>();
         _stateData = future;
         _isPaused = false;
-        _subscription.resume();
+        subscription.resume();
         return future;
       }
       throw new StateError("Already waiting for next.");
@@ -1002,7 +1028,7 @@
     assert(_subscription == null);
     var stateData = _stateData;
     if (stateData != null) {
-      Stream<T> stream = stateData;
+      var stream = stateData as Stream<T>;
       _subscription = stream.listen(_onData,
           onError: _onError, onDone: _onDone, cancelOnError: true);
       var future = new _Future<bool>();
@@ -1013,13 +1039,13 @@
   }
 
   Future cancel() {
-    StreamSubscription<T> subscription = _subscription;
-    Object stateData = _stateData;
+    StreamSubscription<T>? subscription = _subscription;
+    Object? stateData = _stateData;
     _stateData = null;
     if (subscription != null) {
       _subscription = null;
       if (!_isPaused) {
-        _Future<bool> future = stateData;
+        var future = stateData as _Future<bool>;
         future._asyncComplete(false);
       }
       return subscription.cancel();
@@ -1029,16 +1055,16 @@
 
   void _onData(T data) {
     assert(_subscription != null && !_isPaused);
-    _Future<bool> moveNextFuture = _stateData;
+    var moveNextFuture = _stateData as _Future<bool>;
     _stateData = data;
     _isPaused = true;
     moveNextFuture._complete(true);
-    if (_subscription != null && _isPaused) _subscription.pause();
+    if (_isPaused) _subscription?.pause();
   }
 
-  void _onError(Object error, [StackTrace stackTrace]) {
+  void _onError(Object error, [StackTrace? stackTrace]) {
     assert(_subscription != null && !_isPaused);
-    _Future<bool> moveNextFuture = _stateData;
+    var moveNextFuture = _stateData as _Future<bool>;
     _subscription = null;
     _stateData = null;
     moveNextFuture._completeError(error, stackTrace);
@@ -1046,7 +1072,7 @@
 
   void _onDone() {
     assert(_subscription != null && !_isPaused);
-    _Future<bool> moveNextFuture = _stateData;
+    var moveNextFuture = _stateData as _Future<bool>;
     _subscription = null;
     _stateData = null;
     moveNextFuture._complete(false);
@@ -1057,8 +1083,8 @@
 class _EmptyStream<T> extends Stream<T> {
   const _EmptyStream() : super._internal();
   bool get isBroadcast => true;
-  StreamSubscription<T> listen(void onData(T data),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  StreamSubscription<T> listen(void onData(T data)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
     return new _DoneStreamSubscription<T>(onDone);
   }
 }
diff --git a/sdk_nnbd/lib/async/stream_pipe.dart b/sdk_nnbd/lib/async/stream_pipe.dart
index 1549ad5..b307ed6 100644
--- a/sdk_nnbd/lib/async/stream_pipe.dart
+++ b/sdk_nnbd/lib/async/stream_pipe.dart
@@ -2,21 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /** Runs user code and takes actions depending on success or failure. */
 _runUserCode<T>(
-    T userCode(), onSuccess(T value), onError(error, StackTrace stackTrace)) {
+    T userCode(), onSuccess(T value), onError(Object error, StackTrace? stackTrace)) {
   try {
     onSuccess(userCode());
   } catch (e, s) {
-    AsyncError replacement = Zone.current.errorCallback(e, s);
+    AsyncError? replacement = Zone.current.errorCallback(e, s);
     if (replacement == null) {
       onError(e, s);
     } else {
-      var error = _nonNullError(replacement.error);
+      var error = replacement.error;
       var stackTrace = replacement.stackTrace;
       onError(error, stackTrace);
     }
@@ -25,8 +23,8 @@
 
 /** Helper function to cancel a subscription and wait for the potential future,
   before completing with an error. */
-void _cancelAndError(StreamSubscription subscription, _Future future, error,
-    StackTrace stackTrace) {
+void _cancelAndError(StreamSubscription subscription, _Future future,
+    Object error, StackTrace? stackTrace) {
   var cancelFuture = subscription.cancel();
   if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
     cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
@@ -36,21 +34,21 @@
 }
 
 void _cancelAndErrorWithReplacement(StreamSubscription subscription,
-    _Future future, error, StackTrace stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    _Future future, Object error, StackTrace? stackTrace) {
+  AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
-    error = _nonNullError(replacement.error);
+    error = replacement.error;
     stackTrace = replacement.stackTrace;
   }
   _cancelAndError(subscription, future, error, stackTrace);
 }
 
-typedef void _ErrorCallback(error, StackTrace stackTrace);
+typedef void _ErrorCallback(Object error, StackTrace? stackTrace);
 
 /** Helper function to make an onError argument to [_runUserCode]. */
 _ErrorCallback _cancelAndErrorClosure(
     StreamSubscription subscription, _Future future) {
-  return (error, StackTrace stackTrace) {
+  return (Object error, StackTrace? stackTrace) {
     _cancelAndError(subscription, future, error, stackTrace);
   };
 }
@@ -82,25 +80,22 @@
 
   bool get isBroadcast => _source.isBroadcast;
 
-  StreamSubscription<T> listen(void onData(T value),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
-    return _createSubscription(onData, onError, onDone, cancelOnError);
+  StreamSubscription<T> listen(void onData(T value)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    return _createSubscription(onData, onError, onDone, cancelOnError ?? false);
   }
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
     return new _ForwardingStreamSubscription<S, T>(
         this, onData, onError, onDone, cancelOnError);
   }
 
   // Override the following methods in subclasses to change the behavior.
 
-  void _handleData(S data, _EventSink<T> sink) {
-    sink._add(data as Object);
-  }
+  void _handleData(S data, _EventSink<T> sink);
 
-  void _handleError(error, StackTrace stackTrace, _EventSink<T> sink) {
+  void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
     sink._addError(error, stackTrace);
   }
 
@@ -116,10 +111,10 @@
     extends _BufferingStreamSubscription<T> {
   final _ForwardingStream<S, T> _stream;
 
-  StreamSubscription<S> _subscription;
+  StreamSubscription<S>? _subscription;
 
-  _ForwardingStreamSubscription(this._stream, void onData(T data),
-      Function onError, void onDone(), bool cancelOnError)
+  _ForwardingStreamSubscription(this._stream, void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError)
       : super(onData, onError, onDone, cancelOnError) {
     _subscription = _stream._source
         .listen(_handleData, onError: _handleError, onDone: _handleDone);
@@ -134,7 +129,7 @@
     super._add(data);
   }
 
-  void _addError(Object error, StackTrace stackTrace) {
+  void _addError(Object error, StackTrace? stackTrace) {
     if (_isClosed) return;
     super._addError(error, stackTrace);
   }
@@ -142,18 +137,16 @@
   // StreamSubscription callbacks.
 
   void _onPause() {
-    if (_subscription == null) return;
-    _subscription.pause();
+    _subscription?.pause();
   }
 
   void _onResume() {
-    if (_subscription == null) return;
-    _subscription.resume();
+    _subscription?.resume();
   }
 
-  Future _onCancel() {
-    if (_subscription != null) {
-      StreamSubscription subscription = _subscription;
+  Future<void>? _onCancel() {
+    var subscription = _subscription;
+    if (subscription != null) {
       _subscription = null;
       return subscription.cancel();
     }
@@ -166,7 +159,7 @@
     _stream._handleData(data, this);
   }
 
-  void _handleError(error, StackTrace stackTrace) {
+  void _handleError(error, StackTrace? stackTrace) {
     _stream._handleError(error, stackTrace, this);
   }
 
@@ -179,19 +172,18 @@
 // Stream transformers used by the default Stream implementation.
 // -------------------------------------------------------------------
 
-typedef bool _Predicate<T>(T value);
-
-void _addErrorWithReplacement(_EventSink sink, error, StackTrace stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+void _addErrorWithReplacement(
+    _EventSink sink, Object error, StackTrace? stackTrace) {
+  AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
-    error = _nonNullError(replacement.error);
+    error = replacement.error;
     stackTrace = replacement.stackTrace;
   }
   sink._addError(error, stackTrace);
 }
 
 class _WhereStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
+  final bool Function(T) _test;
 
   _WhereStream(Stream<T> source, bool test(T value))
       : _test = test,
@@ -258,26 +250,30 @@
   }
 }
 
-typedef bool _ErrorTest(error);
-
 /**
  * A stream pipe that converts or disposes error events
  * before passing them on.
  */
 class _HandleErrorStream<T> extends _ForwardingStream<T, T> {
   final Function _transform;
-  final _ErrorTest _test;
+  final bool Function(Object)? _test;
 
-  _HandleErrorStream(Stream<T> source, Function onError, bool test(error))
+  _HandleErrorStream(
+      Stream<T> source, Function onError, bool test(Object error)?)
       : this._transform = onError,
         this._test = test,
         super(source);
 
-  void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
+  void _handleData(T data, _EventSink<T> sink) {
+    sink._add(data);
+  }
+
+  void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
     bool matches = true;
-    if (_test != null) {
+    var test = _test;
+    if (test != null) {
       try {
-        matches = _test(error);
+        matches = test(error);
       } catch (e, s) {
         _addErrorWithReplacement(sink, e, s);
         return;
@@ -305,29 +301,25 @@
 
   _TakeStream(Stream<T> source, int count)
       : this._count = count,
-        super(source) {
-    // This test is done early to avoid handling an async error
-    // in the _handleData method.
-    ArgumentError.checkNotNull(count, "count");
-  }
+        super(source);
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
     if (_count == 0) {
       _source.listen(null).cancel();
       return new _DoneStreamSubscription<T>(onDone);
     }
-    return new _StateStreamSubscription<T>(
+    return new _StateStreamSubscription<int, T>(
         this, onData, onError, onDone, cancelOnError, _count);
   }
 
   void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    int count = subscription._count;
+    var subscription = sink as _StateStreamSubscription<int, T>;
+    int count = subscription._subState;
     if (count > 0) {
       sink._add(inputEvent);
       count -= 1;
-      subscription._count = count;
+      subscription._subState = count;
       if (count == 0) {
         // Closing also unsubscribes all subscribers, which unsubscribes
         // this from source.
@@ -342,32 +334,17 @@
  *
  * Use by several different classes, storing an integer, bool or general.
  */
-class _StateStreamSubscription<T> extends _ForwardingStreamSubscription<T, T> {
-  // Raw state field. Typed access provided by getters and setters below.
-  var _sharedState;
+class _StateStreamSubscription<S, T>
+    extends _ForwardingStreamSubscription<T, T> {
+  S _subState;
 
-  _StateStreamSubscription(_ForwardingStream<T, T> stream, void onData(T data),
-      Function onError, void onDone(), bool cancelOnError, this._sharedState)
+  _StateStreamSubscription(_ForwardingStream<T, T> stream, void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError, this._subState)
       : super(stream, onData, onError, onDone, cancelOnError);
-
-  bool get _flag => _sharedState;
-  void set _flag(bool flag) {
-    _sharedState = flag;
-  }
-
-  int get _count => _sharedState;
-  void set _count(int count) {
-    _sharedState = count;
-  }
-
-  Object get _value => _sharedState;
-  void set _value(Object value) {
-    _sharedState = value;
-  }
 }
 
 class _TakeWhileStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
+  final bool Function(T) _test;
 
   _TakeWhileStream(Stream<T> source, bool test(T value))
       : this._test = test,
@@ -399,21 +376,20 @@
         super(source) {
     // This test is done early to avoid handling an async error
     // in the _handleData method.
-    ArgumentError.checkNotNull(count, "count");
     RangeError.checkNotNegative(count, "count");
   }
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
+    return new _StateStreamSubscription<int, T>(
         this, onData, onError, onDone, cancelOnError, _count);
   }
 
   void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    int count = subscription._count;
+    var subscription = sink as _StateStreamSubscription<int, T>;
+    int count = subscription._subState;
     if (count > 0) {
-      subscription._count = count - 1;
+      subscription._subState = count - 1;
       return;
     }
     sink._add(inputEvent);
@@ -421,21 +397,21 @@
 }
 
 class _SkipWhileStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
+  final bool Function(T) _test;
 
   _SkipWhileStream(Stream<T> source, bool test(T value))
       : this._test = test,
         super(source);
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
+    return new _StateStreamSubscription<bool, T>(
         this, onData, onError, onDone, cancelOnError, false);
   }
 
   void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    bool hasFailed = subscription._flag;
+    var subscription = sink as _StateStreamSubscription<bool, T>;
+    bool hasFailed = subscription._subState;
     if (hasFailed) {
       sink._add(inputEvent);
       return;
@@ -446,48 +422,47 @@
     } catch (e, s) {
       _addErrorWithReplacement(sink, e, s);
       // A failure to return a boolean is considered "not matching".
-      subscription._flag = true;
+      subscription._subState = true;
       return;
     }
     if (!satisfies) {
-      subscription._flag = true;
+      subscription._subState = true;
       sink._add(inputEvent);
     }
   }
 }
 
-typedef bool _Equality<T>(T a, T b);
-
 class _DistinctStream<T> extends _ForwardingStream<T, T> {
   static final _SENTINEL = new Object();
 
-  final _Equality<T> _equals;
+  final bool Function(T, T)? _equals;
 
-  _DistinctStream(Stream<T> source, bool equals(T a, T b))
+  _DistinctStream(Stream<T> source, bool equals(T a, T b)?)
       : _equals = equals,
         super(source);
 
-  StreamSubscription<T> _createSubscription(void onData(T data),
-      Function onError, void onDone(), bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
+  StreamSubscription<T> _createSubscription(void onData(T data)?,
+      Function? onError, void onDone()?, bool cancelOnError) {
+    return new _StateStreamSubscription<Object?, T>(
         this, onData, onError, onDone, cancelOnError, _SENTINEL);
   }
 
   void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    var previous = subscription._value;
+    var subscription = sink as _StateStreamSubscription<Object?, T>;
+    var previous = subscription._subState;
     if (identical(previous, _SENTINEL)) {
-      // First event.
-      subscription._value = inputEvent;
+      // First event. Cannot use [_equals].
+      subscription._subState = inputEvent;
       sink._add(inputEvent);
     } else {
-      T previousEvent = previous;
+      T previousEvent = previous as T;
+      var equals = _equals;
       bool isEqual;
       try {
-        if (_equals == null) {
+        if (equals == null) {
           isEqual = (previousEvent == inputEvent);
         } else {
-          isEqual = _equals(previousEvent, inputEvent);
+          isEqual = equals(previousEvent, inputEvent);
         }
       } catch (e, s) {
         _addErrorWithReplacement(sink, e, s);
@@ -495,7 +470,7 @@
       }
       if (!isEqual) {
         sink._add(inputEvent);
-        subscription._value = inputEvent;
+        subscription._subState = inputEvent;
       }
     }
   }
diff --git a/sdk_nnbd/lib/async/stream_transformers.dart b/sdk_nnbd/lib/async/stream_transformers.dart
index 5c788fe..3e332b4 100644
--- a/sdk_nnbd/lib/async/stream_transformers.dart
+++ b/sdk_nnbd/lib/async/stream_transformers.dart
@@ -2,22 +2,20 @@
 // 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.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /**
  * Wraps an [_EventSink] so it exposes only the [EventSink] interface.
  */
 class _EventSinkWrapper<T> implements EventSink<T> {
-  _EventSink _sink;
+  _EventSink<T> _sink;
   _EventSinkWrapper(this._sink);
 
   void add(T data) {
     _sink._add(data);
   }
 
-  void addError(error, [StackTrace stackTrace]) {
+  void addError(Object error, [StackTrace? stackTrace]) {
     _sink._addError(error, stackTrace);
   }
 
@@ -36,24 +34,25 @@
 class _SinkTransformerStreamSubscription<S, T>
     extends _BufferingStreamSubscription<T> {
   /// The transformer's input sink.
-  EventSink<S> _transformerSink;
+  late EventSink<S> _transformerSink;
 
   /// The subscription to the input stream.
-  StreamSubscription<S> _subscription;
+  StreamSubscription<S>? _subscription;
 
-  _SinkTransformerStreamSubscription(Stream<S> source, _SinkMapper<S, T> mapper,
-      void onData(T data), Function onError, void onDone(), bool cancelOnError)
+  _SinkTransformerStreamSubscription(
+      Stream<S> source,
+      _SinkMapper<S, T> mapper,
+      void onData(T data)?,
+      Function? onError,
+      void onDone()?,
+      bool cancelOnError)
       // We set the adapter's target only when the user is allowed to send data.
       : super(onData, onError, onDone, cancelOnError) {
-    _EventSinkWrapper<T> eventSink = new _EventSinkWrapper<T>(this);
-    _transformerSink = mapper(eventSink);
+    _transformerSink = mapper(_EventSinkWrapper<T>(this));
     _subscription =
         source.listen(_handleData, onError: _handleError, onDone: _handleDone);
   }
 
-  /** Whether this subscription is still subscribed to its source. */
-  bool get _isSubscribed => _subscription != null;
-
   // _EventSink interface.
 
   /**
@@ -65,7 +64,7 @@
    */
   void _add(T data) {
     if (_isClosed) {
-      throw new StateError("Stream is already closed");
+      throw StateError("Stream is already closed");
     }
     super._add(data);
   }
@@ -77,7 +76,7 @@
    * events when the stream is already closed. Report them as state
    * error.
    */
-  void _addError(Object error, StackTrace stackTrace) {
+  void _addError(Object error, StackTrace? stackTrace) {
     if (_isClosed) {
       throw new StateError("Stream is already closed");
     }
@@ -101,16 +100,16 @@
   // _BufferingStreamSubscription hooks.
 
   void _onPause() {
-    if (_isSubscribed) _subscription.pause();
+    _subscription?.pause();
   }
 
   void _onResume() {
-    if (_isSubscribed) _subscription.resume();
+    _subscription?.resume();
   }
 
-  Future _onCancel() {
-    if (_isSubscribed) {
-      StreamSubscription subscription = _subscription;
+  Future<void>? _onCancel() {
+    var subscription = _subscription;
+    if (subscription != null) {
       _subscription = null;
       return subscription.cancel();
     }
@@ -125,7 +124,7 @@
     }
   }
 
-  void _handleError(error, [StackTrace stackTrace]) {
+  void _handleError(Object error, StackTrace? stackTrace) {
     try {
       _transformerSink.addError(error, stackTrace);
     } catch (e, s) {
@@ -180,12 +179,11 @@
 
   _BoundSinkStream(this._stream, this._sinkMapper);
 
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
+  StreamSubscription<T> listen(void onData(T event)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
     StreamSubscription<T> subscription =
-        new _SinkTransformerStreamSubscription<S, T>(
-            _stream, _sinkMapper, onData, onError, onDone, cancelOnError);
+        _SinkTransformerStreamSubscription<S, T>(_stream, _sinkMapper, onData,
+            onError, onDone, cancelOnError ?? false);
     return subscription;
   }
 }
@@ -195,7 +193,7 @@
 
 /// Error-handler coming from [StreamTransformer.fromHandlers].
 typedef void _TransformErrorHandler<T>(
-    Object error, StackTrace stackTrace, EventSink<T> sink);
+    Object error, StackTrace? stackTrace, EventSink<T> sink);
 
 /// Done-handler coming from [StreamTransformer.fromHandlers].
 typedef void _TransformDoneHandler<T>(EventSink<T> sink);
@@ -206,50 +204,50 @@
  * This way we can reuse the code from [_StreamSinkTransformer].
  */
 class _HandlerEventSink<S, T> implements EventSink<S> {
-  final _TransformDataHandler<S, T> _handleData;
-  final _TransformErrorHandler<T> _handleError;
-  final _TransformDoneHandler<T> _handleDone;
+  final _TransformDataHandler<S, T>? _handleData;
+  final _TransformErrorHandler<T>? _handleError;
+  final _TransformDoneHandler<T>? _handleDone;
 
   /// The output sink where the handlers should send their data into.
-  EventSink<T> _sink;
+  /// Set to `null` when closed.
+  EventSink<T>? _sink;
 
-  _HandlerEventSink(
-      this._handleData, this._handleError, this._handleDone, this._sink) {
-    if (_sink == null) {
-      throw new ArgumentError("The provided sink must not be null.");
-    }
-  }
-
-  bool get _isClosed => _sink == null;
+  _HandlerEventSink(this._handleData, this._handleError, this._handleDone,
+      EventSink<T> this._sink);
 
   void add(S data) {
-    if (_isClosed) {
+    var sink = _sink;
+    if (sink == null) {
       throw StateError("Sink is closed");
     }
-    if (_handleData != null) {
-      _handleData(data, _sink);
+    var handleData = _handleData;
+    if (handleData != null) {
+      handleData(data, sink);
     } else {
-      _sink.add(data as T);
+      sink.add(data as T);
     }
   }
 
-  void addError(Object error, [StackTrace stackTrace]) {
-    if (_isClosed) {
+  void addError(Object error, [StackTrace? stackTrace]) {
+    var sink = _sink;
+    if (sink == null) {
       throw StateError("Sink is closed");
     }
-    if (_handleError != null) {
-      _handleError(error, stackTrace, _sink);
+    var handleError = _handleError;
+    if (handleError != null) {
+      handleError(error, stackTrace, sink);
     } else {
-      _sink.addError(error, stackTrace);
+      sink.addError(error, stackTrace);
     }
   }
 
   void close() {
-    if (_isClosed) return;
     var sink = _sink;
+    if (sink == null) return;
     _sink = null;
-    if (_handleDone != null) {
-      _handleDone(sink);
+    var handleDone = _handleDone;
+    if (handleDone != null) {
+      handleDone(sink);
     } else {
       sink.close();
     }
@@ -263,9 +261,10 @@
  */
 class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> {
   _StreamHandlerTransformer(
-      {void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)})
+      {void handleData(S data, EventSink<T> sink)?,
+      void handleError(
+          Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+      void handleDone(EventSink<T> sink)?})
       : super((EventSink<T> outputSink) {
           return new _HandlerEventSink<S, T>(
               handleData, handleError, handleDone, outputSink);
@@ -326,10 +325,9 @@
 
   _BoundSubscriptionStream(this._stream, this._onListen);
 
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
-    StreamSubscription<T> result = _onListen(_stream, cancelOnError);
+  StreamSubscription<T> listen(void onData(T event)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    StreamSubscription<T> result = _onListen(_stream, cancelOnError ?? false);
     result.onData(onData);
     result.onError(onError);
     result.onDone(onDone);
diff --git a/sdk_nnbd/lib/async/timer.dart b/sdk_nnbd/lib/async/timer.dart
index c1089bc..97560a9 100644
--- a/sdk_nnbd/lib/async/timer.dart
+++ b/sdk_nnbd/lib/async/timer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 /**
diff --git a/sdk_nnbd/lib/async/zone.dart b/sdk_nnbd/lib/async/zone.dart
index 6a2d015..4e956a2 100644
--- a/sdk_nnbd/lib/async/zone.dart
+++ b/sdk_nnbd/lib/async/zone.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart.async;
 
 typedef R ZoneCallback<R>();
@@ -11,7 +9,7 @@
 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
 
 typedef HandleUncaughtErrorHandler = void Function(Zone self,
-    ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace);
+    ZoneDelegate parent, Zone zone, Object error, StackTrace? stackTrace);
 typedef RunHandler = R Function<R>(
     Zone self, ZoneDelegate parent, Zone zone, R Function() f);
 typedef RunUnaryHandler = R Function<R, T>(
@@ -25,8 +23,8 @@
 typedef RegisterBinaryCallbackHandler
     = ZoneBinaryCallback<R, T1, T2> Function<R, T1, T2>(Zone self,
         ZoneDelegate parent, Zone zone, R Function(T1 arg1, T2 arg2) f);
-typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
-    Zone zone, Object error, StackTrace stackTrace);
+typedef AsyncError? ErrorCallbackHandler(Zone self, ZoneDelegate parent,
+    Zone zone, Object error, StackTrace? stackTrace);
 typedef void ScheduleMicrotaskHandler(
     Zone self, ZoneDelegate parent, Zone zone, void f());
 typedef Timer CreateTimerHandler(
@@ -36,12 +34,12 @@
 typedef void PrintHandler(
     Zone self, ZoneDelegate parent, Zone zone, String line);
 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
-    ZoneSpecification specification, Map zoneValues);
+    ZoneSpecification? specification, Map<Object?, Object?>? zoneValues);
 
 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
 class AsyncError implements Error {
   final Object error;
-  final StackTrace stackTrace;
+  final StackTrace? stackTrace;
 
   AsyncError(this.error, this.stackTrace);
 
@@ -78,38 +76,38 @@
    * Creates a specification with the provided handlers.
    */
   const factory ZoneSpecification(
-      {HandleUncaughtErrorHandler handleUncaughtError,
-      RunHandler run,
-      RunUnaryHandler runUnary,
-      RunBinaryHandler runBinary,
-      RegisterCallbackHandler registerCallback,
-      RegisterUnaryCallbackHandler registerUnaryCallback,
-      RegisterBinaryCallbackHandler registerBinaryCallback,
-      ErrorCallbackHandler errorCallback,
-      ScheduleMicrotaskHandler scheduleMicrotask,
-      CreateTimerHandler createTimer,
-      CreatePeriodicTimerHandler createPeriodicTimer,
-      PrintHandler print,
-      ForkHandler fork}) = _ZoneSpecification;
+      {HandleUncaughtErrorHandler? handleUncaughtError,
+      RunHandler? run,
+      RunUnaryHandler? runUnary,
+      RunBinaryHandler? runBinary,
+      RegisterCallbackHandler? registerCallback,
+      RegisterUnaryCallbackHandler? registerUnaryCallback,
+      RegisterBinaryCallbackHandler? registerBinaryCallback,
+      ErrorCallbackHandler? errorCallback,
+      ScheduleMicrotaskHandler? scheduleMicrotask,
+      CreateTimerHandler? createTimer,
+      CreatePeriodicTimerHandler? createPeriodicTimer,
+      PrintHandler? print,
+      ForkHandler? fork}) = _ZoneSpecification;
 
   /**
    * Creates a specification from [other] with the provided handlers overriding
    * the ones in [other].
    */
   factory ZoneSpecification.from(ZoneSpecification other,
-      {HandleUncaughtErrorHandler handleUncaughtError,
-      RunHandler run,
-      RunUnaryHandler runUnary,
-      RunBinaryHandler runBinary,
-      RegisterCallbackHandler registerCallback,
-      RegisterUnaryCallbackHandler registerUnaryCallback,
-      RegisterBinaryCallbackHandler registerBinaryCallback,
-      ErrorCallbackHandler errorCallback,
-      ScheduleMicrotaskHandler scheduleMicrotask,
-      CreateTimerHandler createTimer,
-      CreatePeriodicTimerHandler createPeriodicTimer,
-      PrintHandler print,
-      ForkHandler fork}) {
+      {HandleUncaughtErrorHandler? handleUncaughtError,
+      RunHandler? run,
+      RunUnaryHandler? runUnary,
+      RunBinaryHandler? runBinary,
+      RegisterCallbackHandler? registerCallback,
+      RegisterUnaryCallbackHandler? registerUnaryCallback,
+      RegisterBinaryCallbackHandler? registerBinaryCallback,
+      ErrorCallbackHandler? errorCallback,
+      ScheduleMicrotaskHandler? scheduleMicrotask,
+      CreateTimerHandler? createTimer,
+      CreatePeriodicTimerHandler? createPeriodicTimer,
+      PrintHandler? print,
+      ForkHandler? fork}) {
     return new ZoneSpecification(
         handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError,
         run: run ?? other.run,
@@ -128,19 +126,19 @@
         fork: fork ?? other.fork);
   }
 
-  HandleUncaughtErrorHandler get handleUncaughtError;
-  RunHandler get run;
-  RunUnaryHandler get runUnary;
-  RunBinaryHandler get runBinary;
-  RegisterCallbackHandler get registerCallback;
-  RegisterUnaryCallbackHandler get registerUnaryCallback;
-  RegisterBinaryCallbackHandler get registerBinaryCallback;
-  ErrorCallbackHandler get errorCallback;
-  ScheduleMicrotaskHandler get scheduleMicrotask;
-  CreateTimerHandler get createTimer;
-  CreatePeriodicTimerHandler get createPeriodicTimer;
-  PrintHandler get print;
-  ForkHandler get fork;
+  HandleUncaughtErrorHandler? get handleUncaughtError;
+  RunHandler? get run;
+  RunUnaryHandler? get runUnary;
+  RunBinaryHandler? get runBinary;
+  RegisterCallbackHandler? get registerCallback;
+  RegisterUnaryCallbackHandler? get registerUnaryCallback;
+  RegisterBinaryCallbackHandler? get registerBinaryCallback;
+  ErrorCallbackHandler? get errorCallback;
+  ScheduleMicrotaskHandler? get scheduleMicrotask;
+  CreateTimerHandler? get createTimer;
+  CreatePeriodicTimerHandler? get createPeriodicTimer;
+  PrintHandler? get print;
+  ForkHandler? get fork;
 }
 
 /**
@@ -166,19 +164,19 @@
       this.print,
       this.fork});
 
-  final HandleUncaughtErrorHandler handleUncaughtError;
-  final RunHandler run;
-  final RunUnaryHandler runUnary;
-  final RunBinaryHandler runBinary;
-  final RegisterCallbackHandler registerCallback;
-  final RegisterUnaryCallbackHandler registerUnaryCallback;
-  final RegisterBinaryCallbackHandler registerBinaryCallback;
-  final ErrorCallbackHandler errorCallback;
-  final ScheduleMicrotaskHandler scheduleMicrotask;
-  final CreateTimerHandler createTimer;
-  final CreatePeriodicTimerHandler createPeriodicTimer;
-  final PrintHandler print;
-  final ForkHandler fork;
+  final HandleUncaughtErrorHandler? handleUncaughtError;
+  final RunHandler? run;
+  final RunUnaryHandler? runUnary;
+  final RunBinaryHandler? runBinary;
+  final RegisterCallbackHandler? registerCallback;
+  final RegisterUnaryCallbackHandler? registerUnaryCallback;
+  final RegisterBinaryCallbackHandler? registerBinaryCallback;
+  final ErrorCallbackHandler? errorCallback;
+  final ScheduleMicrotaskHandler? scheduleMicrotask;
+  final CreateTimerHandler? createTimer;
+  final CreatePeriodicTimerHandler? createPeriodicTimer;
+  final PrintHandler? print;
+  final ForkHandler? fork;
 }
 
 /**
@@ -204,7 +202,7 @@
  *   to skip zones that would just delegate to their parents.
  */
 abstract class ZoneDelegate {
-  void handleUncaughtError(Zone zone, error, StackTrace stackTrace);
+  void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace);
   R run<R>(Zone zone, R f());
   R runUnary<R, T>(Zone zone, R f(T arg), T arg);
   R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
@@ -212,12 +210,12 @@
   ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(Zone zone, R f(T arg));
   ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
       Zone zone, R f(T1 arg1, T2 arg2));
-  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
+  AsyncError? errorCallback(Zone zone, Object error, StackTrace? stackTrace);
   void scheduleMicrotask(Zone zone, void f());
   Timer createTimer(Zone zone, Duration duration, void f());
   Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
   void print(Zone zone, String line);
-  Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
+  Zone fork(Zone zone, ZoneSpecification? specification, Map? zoneValues);
 }
 
 /**
@@ -288,7 +286,7 @@
   static const Zone root = _rootZone;
 
   /** The currently running zone. */
-  static Zone _current = _rootZone;
+  static _Zone _current = _rootZone;
 
   /** The zone that is currently active. */
   static Zone get current => _current;
@@ -311,7 +309,7 @@
    * By default, when handled by the root zone, uncaught asynchronous errors are
    * treated like uncaught synchronous exceptions.
    */
-  void handleUncaughtError(error, StackTrace stackTrace);
+  void handleUncaughtError(Object error, StackTrace? stackTrace);
 
   /**
    * The parent zone of the this zone.
@@ -322,7 +320,7 @@
    * forks the [current] zone. The new zone's parent zone is the zone it was
    * forked from.
    */
-  Zone get parent;
+  Zone? get parent;
 
   /**
    * The error zone is the one that is responsible for dealing with uncaught
@@ -343,7 +341,7 @@
    *   runZoned(() {
    *     // The asynchronous error is caught by the custom zone which prints
    *     // 'asynchronous error'.
-   *     future = new Future.error("asynchronous error");
+   *     future = Future.error("asynchronous error");
    *   }, onError: (e) { print(e); });  // Creates a zone with an error handler.
    *   // The following `catchError` handler is never invoked, because the
    *   // custom zone created by the call to `runZoned` provides an
@@ -364,7 +362,7 @@
    *     // with different error handlers.
    *     // Instead the error is handled by the current error handler,
    *     // printing "Caught by outer zone: asynchronous error".
-   *     var future = new Future.error("asynchronous error");
+   *     var future = Future.error("asynchronous error");
    *     runZoned(() {
    *       future.catchError((e) { throw "is never reached"; });
    *     }, onError: (e) { throw "is never reached"; });
@@ -396,7 +394,8 @@
    * the zone specification (or zone values), giving the forking zone full
    * control over the child zone.
    */
-  Zone fork({ZoneSpecification specification, Map zoneValues});
+  Zone fork(
+      {ZoneSpecification? specification, Map<Object?, Object?>? zoneValues});
 
   /**
    * Executes [action] in this zone.
@@ -604,7 +603,7 @@
    * errors are usually reported through future completers or stream
    * controllers.
    */
-  AsyncError errorCallback(Object error, StackTrace stackTrace);
+  AsyncError? errorCallback(Object error, StackTrace? stackTrace);
 
   /**
    * Runs [callback] asynchronously in this zone.
@@ -656,10 +655,9 @@
    *
    * The previous current zone is returned.
    */
-  static Zone _enter(Zone zone) {
-    assert(zone != null);
+  static _Zone _enter(_Zone zone) {
     assert(!identical(zone, _current));
-    Zone previous = _current;
+    _Zone previous = _current;
     _current = zone;
     return previous;
   }
@@ -669,7 +667,7 @@
    *
    * The previous Zone must be provided as `previous`.
    */
-  static void _leave(Zone previous) {
+  static void _leave(_Zone previous) {
     assert(previous != null);
     Zone._current = previous;
   }
@@ -685,12 +683,7 @@
    * By controlling access to the key, a zone can grant or deny access to the
    * zone value.
    */
-  operator [](Object key);
-}
-
-ZoneDelegate _parentDelegate(_Zone zone) {
-  if (zone.parent == null) return null;
-  return zone.parent._delegate;
+  dynamic operator [](Object? key);
 }
 
 class _ZoneDelegate implements ZoneDelegate {
@@ -698,100 +691,99 @@
 
   _ZoneDelegate(this._delegationTarget);
 
-  void handleUncaughtError(Zone zone, error, StackTrace stackTrace) {
+  void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace) {
     var implementation = _delegationTarget._handleUncaughtError;
     _Zone implZone = implementation.zone;
     HandleUncaughtErrorHandler handler = implementation.function;
-    return handler(
-        implZone, _parentDelegate(implZone), zone, error, stackTrace);
+    return handler(implZone, implZone._parentDelegate, zone, error, stackTrace);
   }
 
   R run<R>(Zone zone, R f()) {
     var implementation = _delegationTarget._run;
     _Zone implZone = implementation.zone;
-    RunHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f);
+    var handler = implementation.function as RunHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f);
   }
 
   R runUnary<R, T>(Zone zone, R f(T arg), T arg) {
     var implementation = _delegationTarget._runUnary;
     _Zone implZone = implementation.zone;
-    RunUnaryHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f, arg);
+    var handler = implementation.function as RunUnaryHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f, arg);
   }
 
   R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
     var implementation = _delegationTarget._runBinary;
     _Zone implZone = implementation.zone;
-    RunBinaryHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f, arg1, arg2);
+    var handler = implementation.function as RunBinaryHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f, arg1, arg2);
   }
 
   ZoneCallback<R> registerCallback<R>(Zone zone, R f()) {
     var implementation = _delegationTarget._registerCallback;
     _Zone implZone = implementation.zone;
-    RegisterCallbackHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f);
+    var handler = implementation.function as RegisterCallbackHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f);
   }
 
   ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(Zone zone, R f(T arg)) {
     var implementation = _delegationTarget._registerUnaryCallback;
     _Zone implZone = implementation.zone;
-    RegisterUnaryCallbackHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f);
+    var handler = implementation.function as RegisterUnaryCallbackHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f);
   }
 
   ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
       Zone zone, R f(T1 arg1, T2 arg2)) {
     var implementation = _delegationTarget._registerBinaryCallback;
     _Zone implZone = implementation.zone;
-    RegisterBinaryCallbackHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, f);
+    var handler = implementation.function as RegisterBinaryCallbackHandler;
+    return handler(implZone, implZone._parentDelegate, zone, f);
   }
 
-  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
+  AsyncError? errorCallback(Zone zone, Object error, StackTrace? stackTrace) {
     var implementation = _delegationTarget._errorCallback;
     _Zone implZone = implementation.zone;
     if (identical(implZone, _rootZone)) return null;
     ErrorCallbackHandler handler = implementation.function;
-    return handler(
-        implZone, _parentDelegate(implZone), zone, error, stackTrace);
+    return handler(implZone, implZone._parentDelegate, zone, error, stackTrace);
   }
 
   void scheduleMicrotask(Zone zone, f()) {
     var implementation = _delegationTarget._scheduleMicrotask;
     _Zone implZone = implementation.zone;
     ScheduleMicrotaskHandler handler = implementation.function;
-    handler(implZone, _parentDelegate(implZone), zone, f);
+    handler(implZone, implZone._parentDelegate, zone, f);
   }
 
   Timer createTimer(Zone zone, Duration duration, void f()) {
     var implementation = _delegationTarget._createTimer;
     _Zone implZone = implementation.zone;
     CreateTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, duration, f);
+    return handler(implZone, implZone._parentDelegate, zone, duration, f);
   }
 
   Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) {
     var implementation = _delegationTarget._createPeriodicTimer;
     _Zone implZone = implementation.zone;
     CreatePeriodicTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, period, f);
+    return handler(implZone, implZone._parentDelegate, zone, period, f);
   }
 
   void print(Zone zone, String line) {
     var implementation = _delegationTarget._print;
     _Zone implZone = implementation.zone;
     PrintHandler handler = implementation.function;
-    handler(implZone, _parentDelegate(implZone), zone, line);
+    handler(implZone, implZone._parentDelegate, zone, line);
   }
 
-  Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues) {
+  Zone fork(Zone zone, ZoneSpecification? specification,
+      Map<Object?, Object?>? zoneValues) {
     var implementation = _delegationTarget._fork;
     _Zone implZone = implementation.zone;
     ForkHandler handler = implementation.function;
     return handler(
-        implZone, _parentDelegate(implZone), zone, specification, zoneValues);
+        implZone, implZone._parentDelegate, zone, specification, zoneValues);
   }
 }
 
@@ -816,9 +808,11 @@
   _ZoneFunction<PrintHandler> get _print;
   _ZoneFunction<ForkHandler> get _fork;
   _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError;
-  _Zone get parent;
+  // Parent zone. Only `null` for the root zone.
+  _Zone? get parent;
   ZoneDelegate get _delegate;
-  Map get _map;
+  ZoneDelegate get _parentDelegate;
+  Map<Object?, Object?> get _map;
 
   bool inSameErrorZone(Zone otherZone) {
     return identical(this, otherZone) ||
@@ -830,7 +824,7 @@
   // The actual zone and implementation of each of these
   // inheritable zone functions.
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
-  // all fields.
+  // all fields, but we can't use generic function types as type arguments.
   _ZoneFunction<Function> _run;
   _ZoneFunction<Function> _runUnary;
   _ZoneFunction<Function> _runBinary;
@@ -846,7 +840,7 @@
   _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError;
 
   // A cached delegate to this zone.
-  ZoneDelegate _delegateCache;
+  ZoneDelegate? _delegateCache;
 
   /// The parent zone.
   final _Zone parent;
@@ -854,62 +848,85 @@
   /// The zone's scoped value declaration map.
   ///
   /// This is always a [HashMap].
-  final Map _map;
+  final Map<Object?, Object?> _map;
 
-  ZoneDelegate get _delegate {
-    if (_delegateCache != null) return _delegateCache;
-    _delegateCache = new _ZoneDelegate(this);
-    return _delegateCache;
-  }
+  ZoneDelegate get _delegate => _delegateCache ??= _ZoneDelegate(this);
+  ZoneDelegate get _parentDelegate => parent._delegate;
 
-  _CustomZone(this.parent, ZoneSpecification specification, this._map) {
+  _CustomZone(this.parent, ZoneSpecification specification, this._map)
+      : _run = parent._run,
+        _runUnary = parent._runUnary,
+        _runBinary = parent._runBinary,
+        _registerCallback = parent._registerCallback,
+        _registerUnaryCallback = parent._registerUnaryCallback,
+        _registerBinaryCallback = parent._registerBinaryCallback,
+        _errorCallback = parent._errorCallback,
+        _scheduleMicrotask = parent._scheduleMicrotask,
+        _createTimer = parent._createTimer,
+        _createPeriodicTimer = parent._createPeriodicTimer,
+        _print = parent._print,
+        _fork = parent._fork,
+        _handleUncaughtError = parent._handleUncaughtError {
     // The root zone will have implementations of all parts of the
     // specification, so it will never try to access the (null) parent.
     // All other zones have a non-null parent.
-    _run = (specification.run != null)
-        ? new _ZoneFunction<Function>(this, specification.run)
-        : parent._run;
-    _runUnary = (specification.runUnary != null)
-        ? new _ZoneFunction<Function>(this, specification.runUnary)
-        : parent._runUnary;
-    _runBinary = (specification.runBinary != null)
-        ? new _ZoneFunction<Function>(this, specification.runBinary)
-        : parent._runBinary;
-    _registerCallback = (specification.registerCallback != null)
-        ? new _ZoneFunction<Function>(this, specification.registerCallback)
-        : parent._registerCallback;
-    _registerUnaryCallback = (specification.registerUnaryCallback != null)
-        ? new _ZoneFunction<Function>(this, specification.registerUnaryCallback)
-        : parent._registerUnaryCallback;
-    _registerBinaryCallback = (specification.registerBinaryCallback != null)
-        ? new _ZoneFunction<Function>(
-            this, specification.registerBinaryCallback)
-        : parent._registerBinaryCallback;
-    _errorCallback = (specification.errorCallback != null)
-        ? new _ZoneFunction<ErrorCallbackHandler>(
-            this, specification.errorCallback)
-        : parent._errorCallback;
-    _scheduleMicrotask = (specification.scheduleMicrotask != null)
-        ? new _ZoneFunction<ScheduleMicrotaskHandler>(
-            this, specification.scheduleMicrotask)
-        : parent._scheduleMicrotask;
-    _createTimer = (specification.createTimer != null)
-        ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer)
-        : parent._createTimer;
-    _createPeriodicTimer = (specification.createPeriodicTimer != null)
-        ? new _ZoneFunction<CreatePeriodicTimerHandler>(
-            this, specification.createPeriodicTimer)
-        : parent._createPeriodicTimer;
-    _print = (specification.print != null)
-        ? new _ZoneFunction<PrintHandler>(this, specification.print)
-        : parent._print;
-    _fork = (specification.fork != null)
-        ? new _ZoneFunction<ForkHandler>(this, specification.fork)
-        : parent._fork;
-    _handleUncaughtError = (specification.handleUncaughtError != null)
-        ? new _ZoneFunction<HandleUncaughtErrorHandler>(
-            this, specification.handleUncaughtError)
-        : parent._handleUncaughtError;
+    var run = specification.run;
+    if (run != null) {
+      _run = _ZoneFunction<Function>(this, run);
+    }
+    var runUnary = specification.runUnary;
+    if (runUnary != null) {
+      _runUnary = _ZoneFunction<Function>(this, runUnary);
+    }
+    var runBinary = specification.runBinary;
+    if (runBinary != null) {
+      _runBinary = _ZoneFunction<Function>(this, runBinary);
+    }
+    var registerCallback = specification.registerCallback;
+    if (registerCallback != null) {
+      _registerCallback = _ZoneFunction<Function>(this, registerCallback);
+    }
+    var registerUnaryCallback = specification.registerUnaryCallback;
+    if (registerUnaryCallback != null) {
+      _registerUnaryCallback =
+          _ZoneFunction<Function>(this, registerUnaryCallback);
+    }
+    var registerBinaryCallback = specification.registerBinaryCallback;
+    if (registerBinaryCallback != null) {
+      _registerBinaryCallback =
+          _ZoneFunction<Function>(this, registerBinaryCallback);
+    }
+    var errorCallback = specification.errorCallback;
+    if (errorCallback != null) {
+      _errorCallback = _ZoneFunction<ErrorCallbackHandler>(this, errorCallback);
+    }
+    var scheduleMicrotask = specification.scheduleMicrotask;
+    if (scheduleMicrotask != null) {
+      _scheduleMicrotask =
+          _ZoneFunction<ScheduleMicrotaskHandler>(this, scheduleMicrotask);
+    }
+    var createTimer = specification.createTimer;
+    if (createTimer != null) {
+      _createTimer = _ZoneFunction<CreateTimerHandler>(this, createTimer);
+    }
+    var createPeriodicTimer = specification.createPeriodicTimer;
+    if (createPeriodicTimer != null) {
+      _createPeriodicTimer =
+          _ZoneFunction<CreatePeriodicTimerHandler>(this, createPeriodicTimer);
+    }
+    var print = specification.print;
+    if (print != null) {
+      _print = _ZoneFunction<PrintHandler>(this, print);
+    }
+    var fork = specification.fork;
+    if (fork != null) {
+      _fork = _ZoneFunction<ForkHandler>(this, fork);
+    }
+    var handleUncaughtError = specification.handleUncaughtError;
+    if (handleUncaughtError != null) {
+      _handleUncaughtError =
+          _ZoneFunction<HandleUncaughtErrorHandler>(this, handleUncaughtError);
+    }
   }
 
   /**
@@ -976,7 +993,7 @@
     return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2);
   }
 
-  operator [](Object key) {
+  dynamic operator [](Object? key) {
     var result = _map[key];
     if (result != null || _map.containsKey(key)) return result;
     // If we are not the root zone, look up in the parent zone.
@@ -997,19 +1014,18 @@
 
   // Methods that can be customized by the zone specification.
 
-  void handleUncaughtError(error, StackTrace stackTrace) {
+  void handleUncaughtError(Object error, StackTrace? stackTrace) {
     var implementation = this._handleUncaughtError;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     HandleUncaughtErrorHandler handler = implementation.function;
     return handler(
         implementation.zone, parentDelegate, this, error, stackTrace);
   }
 
-  Zone fork({ZoneSpecification specification, Map zoneValues}) {
+  Zone fork(
+      {ZoneSpecification? specification, Map<Object?, Object?>? zoneValues}) {
     var implementation = this._fork;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     ForkHandler handler = implementation.function;
     return handler(
         implementation.zone, parentDelegate, this, specification, zoneValues);
@@ -1017,111 +1033,103 @@
 
   R run<R>(R f()) {
     var implementation = this._run;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RunHandler;
     return handler(implementation.zone, parentDelegate, this, f);
   }
 
   R runUnary<R, T>(R f(T arg), T arg) {
     var implementation = this._runUnary;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunUnaryHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RunUnaryHandler;
     return handler(implementation.zone, parentDelegate, this, f, arg);
   }
 
   R runBinary<R, T1, T2>(R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
     var implementation = this._runBinary;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunBinaryHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RunBinaryHandler;
     return handler(implementation.zone, parentDelegate, this, f, arg1, arg2);
   }
 
   ZoneCallback<R> registerCallback<R>(R callback()) {
     var implementation = this._registerCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterCallbackHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RegisterCallbackHandler;
     return handler(implementation.zone, parentDelegate, this, callback);
   }
 
   ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(R callback(T arg)) {
     var implementation = this._registerUnaryCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterUnaryCallbackHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RegisterUnaryCallbackHandler;
     return handler(implementation.zone, parentDelegate, this, callback);
   }
 
   ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
       R callback(T1 arg1, T2 arg2)) {
     var implementation = this._registerBinaryCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterBinaryCallbackHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
+    var handler = implementation.function as RegisterBinaryCallbackHandler;
     return handler(implementation.zone, parentDelegate, this, callback);
   }
 
-  AsyncError errorCallback(Object error, StackTrace stackTrace) {
+  AsyncError? errorCallback(Object error, StackTrace? stackTrace) {
     var implementation = this._errorCallback;
-    assert(implementation != null);
-    final Zone implementationZone = implementation.zone;
+    final _Zone implementationZone = implementation.zone;
     if (identical(implementationZone, _rootZone)) return null;
-    final ZoneDelegate parentDelegate = _parentDelegate(implementationZone);
+    final ZoneDelegate parentDelegate = implementationZone._parentDelegate;
     ErrorCallbackHandler handler = implementation.function;
     return handler(implementationZone, parentDelegate, this, error, stackTrace);
   }
 
   void scheduleMicrotask(void f()) {
     var implementation = this._scheduleMicrotask;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     ScheduleMicrotaskHandler handler = implementation.function;
     return handler(implementation.zone, parentDelegate, this, f);
   }
 
   Timer createTimer(Duration duration, void f()) {
     var implementation = this._createTimer;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     CreateTimerHandler handler = implementation.function;
     return handler(implementation.zone, parentDelegate, this, duration, f);
   }
 
   Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
     var implementation = this._createPeriodicTimer;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     CreatePeriodicTimerHandler handler = implementation.function;
     return handler(implementation.zone, parentDelegate, this, duration, f);
   }
 
   void print(String line) {
     var implementation = this._print;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     PrintHandler handler = implementation.function;
     return handler(implementation.zone, parentDelegate, this, line);
   }
 }
 
-void _rootHandleUncaughtError(
-    Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
+void _rootHandleUncaughtError(Zone? self, ZoneDelegate? parent, Zone zone,
+    Object error, StackTrace? stackTrace) {
   _schedulePriorityAsyncCallback(() {
-    error ??= new NullThrownError();
     if (stackTrace == null) throw error;
     _rethrow(error, stackTrace);
   });
 }
 
-external void _rethrow(Object error, StackTrace stackTrace);
+external void _rethrow(Object error, StackTrace? stackTrace);
 
-R _rootRun<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) {
-  if (Zone._current == zone) return f();
+R _rootRun<R>(Zone? self, ZoneDelegate? parent, Zone zone, R f()) {
+  if (identical(Zone._current, zone)) return f();
 
-  Zone old = Zone._enter(zone);
+  if (zone is! _Zone) {
+    throw ArgumentError.value(zone, "zone", "Can only run in platform zones");
+  }
+
+  _Zone old = Zone._enter(zone);
   try {
     return f();
   } finally {
@@ -1130,10 +1138,14 @@
 }
 
 R _rootRunUnary<R, T>(
-    Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) {
-  if (Zone._current == zone) return f(arg);
+    Zone? self, ZoneDelegate? parent, Zone zone, R f(T arg), T arg) {
+  if (identical(Zone._current, zone)) return f(arg);
 
-  Zone old = Zone._enter(zone);
+  if (zone is! _Zone) {
+    throw ArgumentError.value(zone, "zone", "Can only run in platform zones");
+  }
+
+  _Zone old = Zone._enter(zone);
   try {
     return f(arg);
   } finally {
@@ -1141,11 +1153,15 @@
   }
 }
 
-R _rootRunBinary<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone,
+R _rootRunBinary<R, T1, T2>(Zone? self, ZoneDelegate? parent, Zone zone,
     R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
-  if (Zone._current == zone) return f(arg1, arg2);
+  if (identical(Zone._current, zone)) return f(arg1, arg2);
 
-  Zone old = Zone._enter(zone);
+  if (zone is! _Zone) {
+    throw ArgumentError.value(zone, "zone", "Can only run in platform zones");
+  }
+
+  _Zone old = Zone._enter(zone);
   try {
     return f(arg1, arg2);
   } finally {
@@ -1168,12 +1184,12 @@
   return f;
 }
 
-AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
-        Object error, StackTrace stackTrace) =>
+AsyncError? _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
+        Object error, StackTrace? stackTrace) =>
     null;
 
 void _rootScheduleMicrotask(
-    Zone self, ZoneDelegate parent, Zone zone, void f()) {
+    Zone? self, ZoneDelegate? parent, Zone zone, void f()) {
   if (!identical(_rootZone, zone)) {
     bool hasErrorHandler = !_rootZone.inSameErrorZone(zone);
     if (hasErrorHandler) {
@@ -1181,8 +1197,6 @@
     } else {
       f = zone.bindCallback(f);
     }
-    // Use root zone as event zone if the function is already bound.
-    zone = _rootZone;
   }
   _scheduleAsyncCallback(f);
 }
@@ -1198,8 +1212,7 @@
 Timer _rootCreatePeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
     Duration duration, void callback(Timer timer)) {
   if (!identical(_rootZone, zone)) {
-    // TODO(floitsch): the return type should be 'void'.
-    callback = zone.bindUnaryCallback<dynamic, Timer>(callback);
+    callback = zone.bindUnaryCallback<void, Timer>(callback);
   }
   return Timer._createPeriodicTimer(duration, callback);
 }
@@ -1212,8 +1225,11 @@
   Zone.current.print(line);
 }
 
-Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone,
-    ZoneSpecification specification, Map zoneValues) {
+Zone _rootFork(Zone? self, ZoneDelegate? parent, Zone zone,
+    ZoneSpecification? specification, Map<Object?, Object?>? zoneValues) {
+  if (zone is! _Zone) {
+    throw ArgumentError.value(zone, "zone", "Can only fork a platform zone");
+  }
   // TODO(floitsch): it would be nice if we could get rid of this hack.
   // Change the static zoneOrDirectPrint function to go through zones
   // from now on.
@@ -1222,20 +1238,17 @@
   if (specification == null) {
     specification = const ZoneSpecification();
   } else if (specification is! _ZoneSpecification) {
-    throw new ArgumentError("ZoneSpecifications must be instantiated"
-        " with the provided constructor.");
+    specification = ZoneSpecification.from(specification);
   }
-  Map valueMap;
+  Map<Object?, Object?> valueMap;
   if (zoneValues == null) {
-    if (zone is _Zone) {
-      valueMap = zone._map;
-    } else {
-      valueMap = new HashMap();
-    }
+    valueMap = zone._map;
   } else {
-    valueMap = new HashMap.from(zoneValues);
+    valueMap = HashMap<Object?, Object?>.from(zoneValues);
   }
-  return new _CustomZone(zone, specification, valueMap);
+  if (specification == null)
+    throw "unreachable"; // TODO(lrn): Remove when type promotion works.
+  return _CustomZone(zone, specification, valueMap);
 }
 
 class _RootZone extends _Zone {
@@ -1272,21 +1285,20 @@
           _rootZone, _rootHandleUncaughtError);
 
   // The parent zone.
-  _Zone get parent => null;
+  _Zone? get parent => null;
 
   /// The zone's scoped value declaration map.
   ///
   /// This is always a [HashMap].
-  Map get _map => _rootMap;
+  Map<Object?, Object?> get _map => _rootMap;
 
-  static final _rootMap = new HashMap();
+  static final _rootMap = HashMap();
 
-  static ZoneDelegate _rootDelegate;
+  static ZoneDelegate? _rootDelegate;
 
-  ZoneDelegate get _delegate {
-    if (_rootDelegate != null) return _rootDelegate;
-    return _rootDelegate = new _ZoneDelegate(this);
-  }
+  ZoneDelegate get _delegate => _rootDelegate ??= new _ZoneDelegate(this);
+  // It's a lie, but the root zone never uses the parent delegate.
+  ZoneDelegate get _parentDelegate => _delegate;
 
   /**
    * The closest error-handling zone.
@@ -1360,15 +1372,16 @@
     return (arg1, arg2) => this.runBinaryGuarded(f, arg1, arg2);
   }
 
-  operator [](Object key) => null;
+  dynamic operator [](Object? key) => null;
 
   // Methods that can be customized by the zone specification.
 
-  void handleUncaughtError(error, StackTrace stackTrace) {
+  void handleUncaughtError(Object error, StackTrace? stackTrace) {
     _rootHandleUncaughtError(null, null, this, error, stackTrace);
   }
 
-  Zone fork({ZoneSpecification specification, Map zoneValues}) {
+  Zone fork(
+      {ZoneSpecification? specification, Map<Object?, Object?>? zoneValues}) {
     return _rootFork(null, null, this, specification, zoneValues);
   }
 
@@ -1395,7 +1408,7 @@
           R f(T1 arg1, T2 arg2)) =>
       f;
 
-  AsyncError errorCallback(Object error, StackTrace stackTrace) => null;
+  AsyncError? errorCallback(Object error, StackTrace? stackTrace) => null;
 
   void scheduleMicrotask(void f()) {
     _rootScheduleMicrotask(null, null, this, f);
@@ -1414,7 +1427,7 @@
   }
 }
 
-const _rootZone = const _RootZone();
+const _Zone _rootZone = const _RootZone();
 
 /**
  * Runs [body] in its own zone.
@@ -1441,7 +1454,7 @@
  * Errors that try to cross error-zone boundaries are considered uncaught in
  * their originating error zone.
  *
- *     var future = new Future.value(499);
+ *     var future = Future.value(499);
  *     runZoned(() {
  *       var future2 = future.then((_) { throw "error in first error-zone"; });
  *       runZoned(() {
@@ -1460,13 +1473,15 @@
  * occur in the original zone where [runZoned] was called.
  */
 R runZoned<R>(R body(),
-    {Map zoneValues, ZoneSpecification zoneSpecification, Function onError}) {
+    {Map<Object?, Object?>? zoneValues,
+    ZoneSpecification? zoneSpecification,
+    Function? onError}) {
   if (onError == null) {
     return _runZoned<R>(body, zoneValues, zoneSpecification);
   }
-  void Function(Object) unaryOnError;
-  void Function(Object, StackTrace) binaryOnError;
-  if (onError is void Function(Object, StackTrace)) {
+  void Function(Object)? unaryOnError;
+  void Function(Object, StackTrace?)? binaryOnError;
+  if (onError is void Function(Object, StackTrace?)) {
     binaryOnError = onError;
   } else if (onError is void Function(Object)) {
     unaryOnError = onError;
@@ -1474,14 +1489,15 @@
     throw new ArgumentError("onError callback must take either an Object "
         "(the error), or both an Object (the error) and a StackTrace.");
   }
+  _Zone parentZone = Zone._current;
   HandleUncaughtErrorHandler errorHandler = (Zone self, ZoneDelegate parent,
-      Zone zone, error, StackTrace stackTrace) {
+      Zone zone, Object error, StackTrace? stackTrace) {
     try {
       if (binaryOnError != null) {
-        self.parent.runBinary(binaryOnError, error, stackTrace);
+        parentZone.runBinary(binaryOnError, error, stackTrace);
       } else {
         assert(unaryOnError != null);
-        self.parent.runUnary(unaryOnError, error);
+        parentZone.runUnary(unaryOnError!, error);
       }
     } catch (e, s) {
       if (identical(e, error)) {
@@ -1495,7 +1511,7 @@
     zoneSpecification =
         new ZoneSpecification(handleUncaughtError: errorHandler);
   } else {
-    zoneSpecification = new ZoneSpecification.from(zoneSpecification,
+    zoneSpecification = ZoneSpecification.from(zoneSpecification,
         handleUncaughtError: errorHandler);
   }
   try {
@@ -1505,14 +1521,17 @@
       binaryOnError(e, stackTrace);
     } else {
       assert(unaryOnError != null);
-      unaryOnError(e);
+      unaryOnError!(e);
     }
   }
-  return null;
+  // TODO(lrn): Change behavior to throw the actual resulting error,
+  // perhaps even synchronously.
+  return null as R;
 }
 
 /// Runs [body] in a new zone based on [zoneValues] and [specification].
-R _runZoned<R>(R body(), Map zoneValues, ZoneSpecification specification) =>
+R _runZoned<R>(R body(), Map<Object?, Object?>? zoneValues,
+        ZoneSpecification? specification) =>
     Zone.current
         .fork(specification: specification, zoneValues: zoneValues)
         .run<R>(body);
diff --git a/sdk_nnbd/lib/collection/list.dart b/sdk_nnbd/lib/collection/list.dart
index 262490f..2ae10f0 100644
--- a/sdk_nnbd/lib/collection/list.dart
+++ b/sdk_nnbd/lib/collection/list.dart
@@ -102,7 +102,7 @@
     return this[0];
   }
 
-  bool contains(Object element) {
+  bool contains(Object? element) {
     int length = this.length;
     for (int i = 0; i < length; i++) {
       if (this[i] == element) return true;
@@ -269,7 +269,7 @@
     }
   }
 
-  bool remove(Object element) {
+  bool remove(Object? element) {
     for (int i = 0; i < this.length; i++) {
       if (this[i] == element) {
         this._closeGap(i, i + 1);
@@ -456,7 +456,7 @@
     }
   }
 
-  int indexOf(Object element, [int start = 0]) {
+  int indexOf(E element, [int start = 0]) {
     if (start < 0) start = 0;
     for (int i = start; i < this.length; i++) {
       if (this[i] == element) return i;
@@ -472,7 +472,7 @@
     return -1;
   }
 
-  int lastIndexOf(Object element, [int? start]) {
+  int lastIndexOf(E element, [int? start]) {
     if (start == null || start >= this.length) start = this.length - 1;
 
     // TODO(38493): The previous line should promote.
diff --git a/sdk_nnbd/lib/collection/queue.dart b/sdk_nnbd/lib/collection/queue.dart
index 685f5dc..c2fc394 100644
--- a/sdk_nnbd/lib/collection/queue.dart
+++ b/sdk_nnbd/lib/collection/queue.dart
@@ -89,7 +89,7 @@
   ///
   /// Returns `true` if a value was removed, or `false` if the queue
   /// contained no element equal to [value].
-  bool remove(Object value);
+  bool remove(Object? value);
 
   /// Adds all elements of [iterable] at the end of the queue. The
   /// length of the queue is extended by the length of [iterable].
diff --git a/sdk_nnbd/lib/core/errors.dart b/sdk_nnbd/lib/core/errors.dart
index 044e2aa..46b852a 100644
--- a/sdk_nnbd/lib/core/errors.dart
+++ b/sdk_nnbd/lib/core/errors.dart
@@ -590,3 +590,8 @@
         : "Reading static variable '$variableName' during its initialization";
   }
 }
+
+/**
+ * Error thrown when a late field is set or get when it shouldn't be.
+ */
+class LateInitializationError extends Error {}
diff --git a/sdk_nnbd/lib/core/list.dart b/sdk_nnbd/lib/core/list.dart
index 2ef1601..f72158f 100644
--- a/sdk_nnbd/lib/core/list.dart
+++ b/sdk_nnbd/lib/core/list.dart
@@ -544,7 +544,7 @@
    *
    * An [UnsupportedError] occurs if the list is fixed-length.
    */
-  bool remove(Object value);
+  bool remove(Object? value);
 
   /**
    * Removes the object at position [index] from this list.
diff --git a/sdk_nnbd/lib/developer/developer.dart b/sdk_nnbd/lib/developer/developer.dart
index 5e0df5a..e9df841 100644
--- a/sdk_nnbd/lib/developer/developer.dart
+++ b/sdk_nnbd/lib/developer/developer.dart
@@ -39,7 +39,7 @@
 /// Send a reference to [object] to any attached debuggers.
 ///
 /// Debuggers may open an inspector on the object. Returns the argument.
-external Object inspect(Object? object);
+external Object? inspect(Object? object);
 
 /// Emit a log event.
 ///
diff --git a/sdk_nnbd/lib/developer/extension.dart b/sdk_nnbd/lib/developer/extension.dart
index bf03cd9..184a00f 100644
--- a/sdk_nnbd/lib/developer/extension.dart
+++ b/sdk_nnbd/lib/developer/extension.dart
@@ -158,5 +158,5 @@
 // these into Dart code unless you can ensure that the operations will can be
 // done atomically. Native code lives in vm/isolate.cc-
 // LookupServiceExtensionHandler and RegisterServiceExtensionHandler.
-external ServiceExtensionHandler _lookupExtension(String method);
+external ServiceExtensionHandler? _lookupExtension(String method);
 external _registerExtension(String method, ServiceExtensionHandler handler);
diff --git a/sdk_nnbd/lib/developer/service.dart b/sdk_nnbd/lib/developer/service.dart
index a9757e4..9fab7f4 100644
--- a/sdk_nnbd/lib/developer/service.dart
+++ b/sdk_nnbd/lib/developer/service.dart
@@ -19,7 +19,7 @@
 
   /// The Uri to access the service. If the web server is not running, this
   /// will be null.
-  final Uri serverUri;
+  final Uri? serverUri;
 
   ServiceProtocolInfo(this.serverUri);
 
@@ -77,7 +77,7 @@
   ///
   /// Returns null if the running Dart environment does not support the service
   /// protocol.
-  static String getIsolateID(Isolate isolate) {
+  static String? getIsolateID(Isolate isolate) {
     // TODO: When NNBD is complete, delete the following line.
     ArgumentError.checkNotNull(isolate, 'isolate');
     return _getIsolateIDFromSendPort(isolate.controlPort);
@@ -97,4 +97,4 @@
 external int _getServiceMinorVersion();
 
 /// Returns the service id for the isolate that owns [sendPort].
-external String _getIsolateIDFromSendPort(SendPort sendPort);
+external String? _getIsolateIDFromSendPort(SendPort sendPort);
diff --git a/sdk_nnbd/lib/ffi/ffi.dart b/sdk_nnbd/lib/ffi/ffi.dart
index a8428bc..1962918 100644
--- a/sdk_nnbd/lib/ffi/ffi.dart
+++ b/sdk_nnbd/lib/ffi/ffi.dart
@@ -7,8 +7,7 @@
 /**
  * Foreign Function Interface for interoperability with the C programming language.
  *
- * **NOTE**: Dart:FFI is in technical preview. The overall feature is incomplete,
- * may contain issues, and breaking API changes are still expected.
+ * **NOTE**: Dart:FFI is in beta, and breaking API changes might still happen.
  *
  * For further details, please see: https://dart.dev/server/c-interop
  *
diff --git a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
index bcad33f..c7913ec 100644
--- a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
+++ b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * HTML elements and other resources for web-based applications that need to
  * interact with the browser and the DOM (Document Object Model).
diff --git a/sdk_nnbd/lib/html/html_common/conversions_dart2js.dart b/sdk_nnbd/lib/html/html_common/conversions_dart2js.dart
index b287be1..1ff21ba 100644
--- a/sdk_nnbd/lib/html/html_common/conversions_dart2js.dart
+++ b/sdk_nnbd/lib/html/html_common/conversions_dart2js.dart
@@ -100,14 +100,6 @@
 bool isJavaScriptPromise(value) =>
     JS('bool', r'typeof Promise != "undefined" && # instanceof Promise', value);
 
-Future<T> promiseToFuture<T>(promise) {
-  var completer = new Completer<T>();
-  var then = convertDartClosureToJS((r) => completer.complete(r), 1);
-  var error = convertDartClosureToJS((e) => completer.completeError(e), 1);
-  JS('', '#.then(#, #)', promise, then, error);
-  return completer.future;
-}
-
 const String _serializedScriptValue = 'num|String|bool|'
     'JSExtendableArray|=Object|'
     'Blob|File|NativeByteBuffer|NativeTypedData|MessagePort'
diff --git a/sdk_nnbd/lib/html/html_common/html_common_dart2js.dart b/sdk_nnbd/lib/html/html_common/html_common_dart2js.dart
index 710d1f1..73141ac 100644
--- a/sdk_nnbd/lib/html/html_common/html_common_dart2js.dart
+++ b/sdk_nnbd/lib/html/html_common/html_common_dart2js.dart
@@ -17,6 +17,9 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray, JSObject;
 
+import 'dart:js_util' show promiseToFuture;
+export 'dart:js_util' show promiseToFuture;
+
 import 'dart:_metadata';
 export 'dart:_metadata';
 
diff --git a/sdk_nnbd/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk_nnbd/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index baefa2a..f1acb15 100644
--- a/sdk_nnbd/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk_nnbd/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * A client-side key-value store with support for indexes.
  *
diff --git a/sdk_nnbd/lib/internal/async_cast.dart b/sdk_nnbd/lib/internal/async_cast.dart
index 9f4448d..677f303 100644
--- a/sdk_nnbd/lib/internal/async_cast.dart
+++ b/sdk_nnbd/lib/internal/async_cast.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 // Casting wrappers for asynchronous classes.
@@ -13,8 +11,8 @@
   CastStream(this._source);
   bool get isBroadcast => _source.isBroadcast;
 
-  StreamSubscription<T> listen(void onData(T data),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  StreamSubscription<T> listen(void Function(T data)? onData,
+      {Function? onError, void Function()? onDone, bool? cancelOnError}) {
     return new CastStreamSubscription<S, T>(
         _source.listen(null, onDone: onDone, cancelOnError: cancelOnError))
       ..onData(onData)
@@ -30,12 +28,11 @@
   /// Zone where listen was called.
   final Zone _zone = Zone.current;
 
-  /// User's data handler. May be null.
-  void Function(T) _handleData;
+  /// User's data handler.
+  void Function(T)? _handleData;
 
   /// Copy of _source's handleError so we can report errors in onData.
-  /// May be null.
-  Function _handleError;
+  Function? _handleError;
 
   CastStreamSubscription(this._source) {
     _source.onData(_onData);
@@ -43,25 +40,28 @@
 
   Future cancel() => _source.cancel();
 
-  void onData(void handleData(T data)) {
+  void onData(void Function(T data)? handleData) {
     _handleData = handleData == null
         ? null
         : _zone.registerUnaryCallback<dynamic, T>(handleData);
   }
 
-  void onError(Function handleError) {
+  void onError(Function? handleError) {
     _source.onError(handleError);
     if (handleError == null) {
       _handleError = null;
-    } else if (handleError is Function(Null, Null)) {
+    } else if (handleError is void Function(Object, StackTrace?)) {
       _handleError = _zone
-          .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
-    } else {
+          .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
+    } else if (handleError is void Function(Object)) {
       _handleError = _zone.registerUnaryCallback<dynamic, Object>(handleError);
+    } else {
+      throw ArgumentError("handleError callback must take either an Object "
+          "(the error), or both an Object (the error) and a StackTrace.");
     }
   }
 
-  void onDone(void handleDone()) {
+  void onDone(void handleDone()?) {
     _source.onDone(handleDone);
   }
 
@@ -71,19 +71,21 @@
     try {
       targetData = data as T;
     } catch (error, stack) {
-      if (_handleError == null) {
+      var handleError = _handleError;
+      if (handleError == null) {
         _zone.handleUncaughtError(error, stack);
-      } else if (_handleError is Function(Null, Null)) {
-        _zone.runBinaryGuarded(_handleError, error, stack);
+      } else if (handleError is void Function(Object, StackTrace?)) {
+        _zone.runBinaryGuarded<Object, StackTrace?>(handleError, error, stack);
       } else {
-        _zone.runUnaryGuarded(_handleError, error);
+        _zone.runUnaryGuarded<Object>(
+            handleError as void Function(Object), error);
       }
       return;
     }
-    _zone.runUnaryGuarded(_handleData, targetData);
+    _zone.runUnaryGuarded(_handleData!, targetData);
   }
 
-  void pause([Future resumeSignal]) {
+  void pause([Future? resumeSignal]) {
     _source.pause(resumeSignal);
   }
 
@@ -93,7 +95,7 @@
 
   bool get isPaused => _source.isPaused;
 
-  Future<E> asFuture<E>([E futureValue]) => _source.asFuture<E>(futureValue);
+  Future<E> asFuture<E>([E? futureValue]) => _source.asFuture<E>(futureValue);
 }
 
 class CastStreamTransformer<SS, ST, TS, TT>
diff --git a/sdk_nnbd/lib/internal/cast.dart b/sdk_nnbd/lib/internal/cast.dart
index ae20c66..f994dab 100644
--- a/sdk_nnbd/lib/internal/cast.dart
+++ b/sdk_nnbd/lib/internal/cast.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 // Casting wrappers for collection classes.
@@ -46,11 +44,11 @@
   T get last => _source.last as T;
   T get single => _source.single as T;
 
-  bool contains(Object other) => _source.contains(other);
+  bool contains(Object? other) => _source.contains(other);
 
   // Might be implemented by testing backwards from the end,
   // so use the _source's implementation.
-  T lastWhere(bool test(T element), {T orElse()}) =>
+  T lastWhere(bool test(T element), {T Function()? orElse}) =>
       _source.lastWhere((S element) => test(element as T),
           orElse: (orElse == null) ? null : () => orElse() as S) as T;
 
@@ -116,12 +114,12 @@
     _source.addAll(new CastIterable<T, S>(values));
   }
 
-  void sort([int compare(T v1, T v2)]) {
+  void sort([int Function(T v1, T v2)? compare]) {
     _source.sort(
         compare == null ? null : (S v1, S v2) => compare(v1 as T, v2 as T));
   }
 
-  void shuffle([Random random]) {
+  void shuffle([Random? random]) {
     _source.shuffle(random);
   }
 
@@ -137,7 +135,7 @@
     _source.setAll(index, new CastIterable<T, S>(elements));
   }
 
-  bool remove(Object value) => _source.remove(value);
+  bool remove(Object? value) => _source.remove(value);
 
   T removeAt(int index) => _source.removeAt(index) as T;
 
@@ -162,7 +160,7 @@
     _source.removeRange(start, end);
   }
 
-  void fillRange(int start, int end, [T fillValue]) {
+  void fillRange(int start, int end, [T? fillValue]) {
     _source.fillRange(start, end, fillValue as S);
   }
 
@@ -184,7 +182,7 @@
   /// Creates a new empty set of the same *kind* as [_source],
   /// but with `<R>` as type argument.
   /// Used by [toSet] and [union].
-  final Set<R> Function<R>() _emptySet;
+  final Set<R> Function<R>()? _emptySet;
 
   CastSet(this._source, this._emptySet);
 
@@ -197,13 +195,13 @@
     _source.addAll(new CastIterable<T, S>(elements));
   }
 
-  bool remove(Object object) => _source.remove(object);
+  bool remove(Object? object) => _source.remove(object);
 
-  void removeAll(Iterable<Object> objects) {
+  void removeAll(Iterable<Object?> objects) {
     _source.removeAll(objects);
   }
 
-  void retainAll(Iterable<Object> objects) {
+  void retainAll(Iterable<Object?> objects) {
     _source.retainAll(objects);
   }
 
@@ -215,20 +213,21 @@
     _source.retainWhere((S element) => test(element as T));
   }
 
-  bool containsAll(Iterable<Object> objects) => _source.containsAll(objects);
+  bool containsAll(Iterable<Object?> objects) => _source.containsAll(objects);
 
-  Set<T> intersection(Set<Object> other) {
+  Set<T> intersection(Set<Object?> other) {
     if (_emptySet != null) return _conditionalAdd(other, true);
     return new CastSet<S, T>(_source.intersection(other), null);
   }
 
-  Set<T> difference(Set<Object> other) {
+  Set<T> difference(Set<Object?> other) {
     if (_emptySet != null) return _conditionalAdd(other, false);
     return new CastSet<S, T>(_source.difference(other), null);
   }
 
-  Set<T> _conditionalAdd(Set<Object> other, bool otherContains) {
-    Set<T> result = (_emptySet == null) ? new Set<T>() : _emptySet<T>();
+  Set<T> _conditionalAdd(Set<Object?> other, bool otherContains) {
+    var emptySet = _emptySet;
+    Set<T> result = (emptySet == null) ? new Set<T>() : emptySet<T>();
     for (var element in _source) {
       T castElement = element as T;
       if (otherContains == other.contains(castElement)) result.add(castElement);
@@ -243,14 +242,15 @@
   }
 
   Set<T> _clone() {
-    Set<T> result = (_emptySet == null) ? new Set<T>() : _emptySet<T>();
+    var emptySet = _emptySet;
+    Set<T> result = (emptySet == null) ? new Set<T>() : emptySet<T>();
     result.addAll(this);
     return result;
   }
 
   Set<T> toSet() => _clone();
 
-  T lookup(Object key) => _source.lookup(key) as T;
+  T lookup(Object? key) => _source.lookup(key) as T;
 }
 
 class CastMap<SK, SV, K, V> extends MapBase<K, V> {
@@ -260,11 +260,11 @@
 
   Map<RK, RV> cast<RK, RV>() => new CastMap<SK, SV, RK, RV>(_source);
 
-  bool containsValue(Object value) => _source.containsValue(value);
+  bool containsValue(Object? value) => _source.containsValue(value);
 
-  bool containsKey(Object key) => _source.containsKey(key);
+  bool containsKey(Object? key) => _source.containsKey(key);
 
-  V operator [](Object key) => _source[key] as V;
+  V? operator [](Object? key) => _source[key] as V?;
 
   void operator []=(K key, V value) {
     _source[key as SK] = value as SV;
@@ -277,7 +277,7 @@
     _source.addAll(new CastMap<K, V, SK, SV>(other));
   }
 
-  V remove(Object key) => _source.remove(key) as V;
+  V remove(Object? key) => _source.remove(key) as V;
 
   void clear() {
     _source.clear();
@@ -299,7 +299,7 @@
 
   bool get isNotEmpty => _source.isNotEmpty;
 
-  V update(K key, V update(V value), {V ifAbsent()}) {
+  V update(K key, V update(V value), {V Function()? ifAbsent}) {
     return _source.update(key as SK, (SV value) => update(value as V) as SV,
         ifAbsent: (ifAbsent == null) ? null : () => ifAbsent() as SV) as V;
   }
@@ -344,7 +344,7 @@
     _source.addLast(value as S);
   }
 
-  bool remove(Object other) => _source.remove(other);
+  bool remove(Object? other) => _source.remove(other);
   void addAll(Iterable<T> elements) {
     _source.addAll(new CastIterable<T, S>(elements));
   }
diff --git a/sdk_nnbd/lib/internal/internal.dart b/sdk_nnbd/lib/internal/internal.dart
index 94fb13e..11ee996 100644
--- a/sdk_nnbd/lib/internal/internal.dart
+++ b/sdk_nnbd/lib/internal/internal.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 library dart._internal;
 
 import 'dart:collection';
diff --git a/sdk_nnbd/lib/internal/iterable.dart b/sdk_nnbd/lib/internal/iterable.dart
index 55cf780..3865626 100644
--- a/sdk_nnbd/lib/internal/iterable.dart
+++ b/sdk_nnbd/lib/internal/iterable.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /**
@@ -63,7 +61,7 @@
     return elementAt(0);
   }
 
-  bool contains(Object element) {
+  bool contains(Object? element) {
     int length = this.length;
     for (int i = 0; i < length; i++) {
       if (elementAt(i) == element) return true;
@@ -96,7 +94,7 @@
     return false;
   }
 
-  E firstWhere(bool test(E element), {E orElse()}) {
+  E firstWhere(bool test(E element), {E Function()? orElse}) {
     int length = this.length;
     for (int i = 0; i < length; i++) {
       E element = elementAt(i);
@@ -109,7 +107,7 @@
     throw IterableElementError.noElement();
   }
 
-  E lastWhere(bool test(E element), {E orElse()}) {
+  E lastWhere(bool test(E element), {E Function()? orElse}) {
     int length = this.length;
     for (int i = length - 1; i >= 0; i--) {
       E element = elementAt(i);
@@ -122,9 +120,9 @@
     throw IterableElementError.noElement();
   }
 
-  E singleWhere(bool test(E element), {E orElse()}) {
+  E singleWhere(bool test(E element), {E Function()? orElse}) {
     int length = this.length;
-    E match = null;
+    late E match;
     bool matchFound = false;
     for (int i = 0; i < length; i++) {
       E element = elementAt(i);
@@ -210,18 +208,7 @@
 
   Iterable<E> takeWhile(bool test(E element)) => super.takeWhile(test);
 
-  List<E> toList({bool growable: true}) {
-    List<E> result;
-    if (growable) {
-      result = <E>[]..length = length;
-    } else {
-      result = new List<E>(length);
-    }
-    for (int i = 0; i < length; i++) {
-      result[i] = elementAt(i);
-    }
-    return result;
-  }
+  List<E> toList({bool growable: true}) => List<E>.of(this, growable: growable);
 
   Set<E> toSet() {
     Set<E> result = new Set<E>();
@@ -236,22 +223,24 @@
   final Iterable<E> _iterable; // Has efficient length and elementAt.
   final int _start;
   /** If null, represents the length of the iterable. */
-  final int _endOrLength;
+  final int? _endOrLength;
 
   SubListIterable(this._iterable, this._start, this._endOrLength) {
     RangeError.checkNotNegative(_start, "start");
-    if (_endOrLength != null) {
-      RangeError.checkNotNegative(_endOrLength, "end");
-      if (_start > _endOrLength) {
-        throw new RangeError.range(_start, 0, _endOrLength, "start");
+    int? endOrLength = _endOrLength;
+    if (endOrLength != null) {
+      RangeError.checkNotNegative(endOrLength, "end");
+      if (_start > endOrLength) {
+        throw new RangeError.range(_start, 0, endOrLength, "start");
       }
     }
   }
 
   int get _endIndex {
     int length = _iterable.length;
-    if (_endOrLength == null || _endOrLength > length) return length;
-    return _endOrLength;
+    int? endOrLength = _endOrLength;
+    if (endOrLength == null || endOrLength > length) return length;
+    return endOrLength;
   }
 
   int get _startIndex {
@@ -263,10 +252,11 @@
   int get length {
     int length = _iterable.length;
     if (_start >= length) return 0;
-    if (_endOrLength == null || _endOrLength >= length) {
+    int? endOrLength = _endOrLength;
+    if (endOrLength == null || endOrLength >= length) {
       return length - _start;
     }
-    return _endOrLength - _start;
+    return endOrLength - _start;
   }
 
   E elementAt(int index) {
@@ -280,7 +270,8 @@
   Iterable<E> skip(int count) {
     RangeError.checkNotNegative(count, "count");
     int newStart = _start + count;
-    if (_endOrLength != null && newStart >= _endOrLength) {
+    int? endOrLength = _endOrLength;
+    if (endOrLength != null && newStart >= endOrLength) {
       return new EmptyIterable<E>();
     }
     return new SubListIterable<E>(_iterable, newStart, _endOrLength);
@@ -288,11 +279,12 @@
 
   Iterable<E> take(int count) {
     RangeError.checkNotNegative(count, "count");
-    if (_endOrLength == null) {
+    int? endOrLength = _endOrLength;
+    if (endOrLength == null) {
       return new SubListIterable<E>(_iterable, _start, _start + count);
     } else {
       int newEnd = _start + count;
-      if (_endOrLength < newEnd) return this;
+      if (endOrLength < newEnd) return this;
       return new SubListIterable<E>(_iterable, _start, newEnd);
     }
   }
@@ -300,12 +292,14 @@
   List<E> toList({bool growable: true}) {
     int start = _start;
     int end = _iterable.length;
-    if (_endOrLength != null && _endOrLength < end) end = _endOrLength;
+    int? endOrLength = _endOrLength;
+    if (endOrLength != null && endOrLength < end) end = endOrLength;
     int length = end - start;
-    if (length < 0) length = 0;
+    if (length <= 0) return List<E>.empty(growable: growable);
+
     List<E> result =
-        growable ? (new List<E>()..length = length) : new List<E>(length);
-    for (int i = 0; i < length; i++) {
+        List<E>.filled(length, _iterable.elementAt(start), growable: growable);
+    for (int i = 1; i < length; i++) {
       result[i] = _iterable.elementAt(start + i);
       if (_iterable.length < end) throw new ConcurrentModificationError(this);
     }
@@ -324,14 +318,14 @@
   final Iterable<E> _iterable;
   final int _length;
   int _index;
-  E _current;
+  E? _current;
 
   ListIterator(Iterable<E> iterable)
       : _iterable = iterable,
         _length = iterable.length,
         _index = 0;
 
-  E get current => _current;
+  E get current => _current as E;
 
   @pragma("vm:prefer-inline")
   bool moveNext() {
@@ -384,7 +378,7 @@
 }
 
 class MappedIterator<S, T> extends Iterator<T> {
-  T _current;
+  T? _current;
   final Iterator<S> _iterator;
   final _Transformation<S, T> _f;
 
@@ -399,7 +393,7 @@
     return false;
   }
 
-  T get current => _current;
+  T get current => _current as T;
 }
 
 /**
@@ -466,16 +460,16 @@
   // Initialize _currentExpansion to an empty iterable. A null value
   // marks the end of iteration, and we don't want to call _f before
   // the first moveNext call.
-  Iterator<T> _currentExpansion = const EmptyIterator();
-  T _current;
+  Iterator<T>? _currentExpansion = const EmptyIterator<Never>();
+  T? _current;
 
   ExpandIterator(this._iterator, this._f);
 
-  T get current => _current;
+  T get current => _current as T;
 
   bool moveNext() {
     if (_currentExpansion == null) return false;
-    while (!_currentExpansion.moveNext()) {
+    while (!_currentExpansion!.moveNext()) {
       _current = null;
       if (_iterator.moveNext()) {
         // If _f throws, this ends iteration. Otherwise _currentExpansion and
@@ -486,7 +480,7 @@
         return false;
       }
     }
-    _current = _currentExpansion.current;
+    _current = _currentExpansion!.current;
     return true;
   }
 }
@@ -541,7 +535,11 @@
   }
 
   E get current {
-    if (_remaining < 0) return null;
+    // Before NNBD, this returned null when iteration was complete. In order to
+    // avoid a hard breaking change, we return "null as E" in that case so that
+    // if strong checking is not enabled or E is nullable, the existing
+    // behavior is preserved.
+    if (_remaining < 0) return null as E;
     return _iterator.current;
   }
 }
@@ -574,7 +572,7 @@
   }
 
   E get current {
-    if (_isFinished) return null;
+    if (_isFinished) throw IterableElementError.noElement();
     return _iterator.current;
   }
 }
@@ -682,7 +680,7 @@
 class EmptyIterable<E> extends EfficientLengthIterable<E> {
   const EmptyIterable();
 
-  Iterator<E> get iterator => const EmptyIterator();
+  Iterator<E> get iterator => const EmptyIterator<Never>();
 
   void forEach(void action(E element)) {}
 
@@ -706,23 +704,23 @@
     throw new RangeError.range(index, 0, 0, "index");
   }
 
-  bool contains(Object element) => false;
+  bool contains(Object? element) => false;
 
   bool every(bool test(E element)) => true;
 
   bool any(bool test(E element)) => false;
 
-  E firstWhere(bool test(E element), {E orElse()}) {
+  E firstWhere(bool test(E element), {E Function()? orElse}) {
     if (orElse != null) return orElse();
     throw IterableElementError.noElement();
   }
 
-  E lastWhere(bool test(E element), {E orElse()}) {
+  E lastWhere(bool test(E element), {E Function()? orElse}) {
     if (orElse != null) return orElse();
     throw IterableElementError.noElement();
   }
 
-  E singleWhere(bool test(E element), {E orElse()}) {
+  E singleWhere(bool test(E element), {E Function()? orElse}) {
     if (orElse != null) return orElse();
     throw IterableElementError.noElement();
   }
@@ -755,7 +753,7 @@
 
   Iterable<E> takeWhile(bool test(E element)) => this;
 
-  List<E> toList({bool growable: true}) => growable ? <E>[] : new List<E>(0);
+  List<E> toList({bool growable: true}) => List<E>.empty(growable: growable);
 
   Set<E> toSet() => new Set<E>();
 }
@@ -764,11 +762,13 @@
 class EmptyIterator<E> implements Iterator<E> {
   const EmptyIterator();
   bool moveNext() => false;
-  E get current => null;
+  E get current {
+    throw IterableElementError.noElement();
+  }
 }
 
 class FollowedByIterable<E> extends Iterable<E> {
-  final Iterable<E> _first;
+  final EfficientLengthIterable<E> _first;
   final Iterable<E> _second;
   FollowedByIterable(this._first, this._second);
 
@@ -787,7 +787,7 @@
   bool get isNotEmpty => _first.isNotEmpty || _second.isNotEmpty;
 
   // May be more efficient if either iterable is a Set.
-  bool contains(Object value) =>
+  bool contains(Object? value) =>
       _first.contains(value) || _second.contains(value);
 
   E get first {
@@ -816,20 +816,6 @@
       EfficientLengthIterable<E> first, EfficientLengthIterable<E> second)
       : super(first, second);
 
-  Iterable<E> skip(int count) {
-    int firstLength = _first.length;
-    if (count >= firstLength) return _second.skip(count - firstLength);
-    return new EfficientLengthFollowedByIterable<E>(
-        _first.skip(count), _second);
-  }
-
-  Iterable<E> take(int count) {
-    int firstLength = _first.length;
-    if (count <= firstLength) return _first.take(count);
-    return new EfficientLengthFollowedByIterable<E>(
-        _first, _second.take(count - firstLength));
-  }
-
   E elementAt(int index) {
     int firstLength = _first.length;
     if (index < firstLength) return _first.elementAt(index);
@@ -849,7 +835,7 @@
 
 class FollowedByIterator<E> implements Iterator<E> {
   Iterator<E> _currentIterator;
-  Iterable<E> _nextIterable;
+  Iterable<E>? _nextIterable;
 
   FollowedByIterator(Iterable<E> first, this._nextIterable)
       : _currentIterator = first.iterator;
@@ -857,7 +843,7 @@
   bool moveNext() {
     if (_currentIterator.moveNext()) return true;
     if (_nextIterable != null) {
-      _currentIterator = _nextIterable.iterator;
+      _currentIterator = _nextIterable!.iterator;
       _nextIterable = null;
       return _currentIterator.moveNext();
     }
@@ -883,7 +869,7 @@
     return false;
   }
 
-  T get current => _source.current;
+  T get current => _source.current as T;
 }
 
 /**
diff --git a/sdk_nnbd/lib/internal/linked_list.dart b/sdk_nnbd/lib/internal/linked_list.dart
index 5c2e79a..e11cd7d 100644
--- a/sdk_nnbd/lib/internal/linked_list.dart
+++ b/sdk_nnbd/lib/internal/linked_list.dart
@@ -2,14 +2,16 @@
 // 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.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /// A rudimentary linked list.
 class LinkedList<T extends LinkedListEntry<T>> extends IterableBase<T> {
-  T first;
-  T last;
+  T get first => _first as T;
+  T? _first;
+
+  T get last => _last as T;
+  T? _last;
+
   int length = 0;
 
   bool get isEmpty => length == 0;
@@ -19,15 +21,15 @@
    */
   void add(T newLast) {
     assert(newLast._next == null && newLast._previous == null);
-    if (last != null) {
-      assert(last._next == null);
-      last._next = newLast;
+    if (_last != null) {
+      assert(_last!._next == null);
+      _last!._next = newLast;
     } else {
-      first = newLast;
+      _first = newLast;
     }
-    newLast._previous = last;
-    last = newLast;
-    last._list = this;
+    newLast._previous = _last;
+    _last = newLast;
+    _last!._list = this;
     length++;
   }
 
@@ -35,15 +37,15 @@
    * Adds [newFirst] to the beginning of this linked list.
    */
   void addFirst(T newFirst) {
-    if (first != null) {
-      assert(first._previous == null);
-      first._previous = newFirst;
+    if (_first != null) {
+      assert(_first!._previous == null);
+      _first!._previous = newFirst;
     } else {
-      last = newFirst;
+      _last = newFirst;
     }
-    newFirst._next = first;
-    first = newFirst;
-    first._list = this;
+    newFirst._next = _first;
+    _first = newFirst;
+    _first!._list = this;
     length++;
   }
 
@@ -58,16 +60,16 @@
     if (node._list != this) return;
     length--;
     if (node._previous == null) {
-      assert(identical(node, first));
-      first = node._next;
+      assert(identical(node, _first));
+      _first = node._next;
     } else {
-      node._previous._next = node._next;
+      node._previous!._next = node._next;
     }
     if (node._next == null) {
-      assert(identical(node, last));
-      last = node._previous;
+      assert(identical(node, _last));
+      _last = node._previous;
     } else {
-      node._next._previous = node._previous;
+      node._next!._previous = node._previous;
     }
     node._next = node._previous = null;
     node._list = null;
@@ -77,9 +79,9 @@
 }
 
 class LinkedListEntry<T extends LinkedListEntry<T>> {
-  T _next;
-  T _previous;
-  LinkedList<T> _list;
+  T? _next;
+  T? _previous;
+  LinkedList<T>? _list;
 
   /**
    * Unlinks the element from its linked list.
@@ -89,15 +91,14 @@
    * is currently in.
    */
   void unlink() {
-    if (_list == null) return;
-    _list.remove(this);
+    _list?.remove(this as T);
   }
 }
 
 class _LinkedListIterator<T extends LinkedListEntry<T>> implements Iterator<T> {
   /// The current element of the iterator.
-  // This field is writeable, but should only read by users of this class.
-  T current;
+  T? _current;
+  T get current => _current as T;
 
   /// The list the iterator iterates over.
   ///
@@ -106,23 +107,24 @@
   ///
   /// Set to [null] as soon as [moveNext] was invoked (indicating that the
   /// iterator has to work with [current] from now on.
-  LinkedList<T> _list;
+  LinkedList<T>? _list;
 
-  _LinkedListIterator(this._list) {
-    if (_list.length == 0) _list = null;
+  _LinkedListIterator(LinkedList<T> list) : _list = list {
+    if (list.length == 0) _list = null;
   }
 
   bool moveNext() {
     // current is null if the iterator hasn't started iterating, or if the
     // iteration is finished. In the first case, the [_list] field is not null.
-    if (current == null) {
-      if (_list == null) return false;
-      assert(_list.length > 0);
-      current = _list.first;
+    if (_current == null) {
+      var list = _list;
+      if (list == null) return false;
+      assert(list.length > 0);
+      _current = list.first;
       _list = null;
       return true;
     }
-    current = current._next;
-    return current != null;
+    _current = _current!._next;
+    return _current != null;
   }
 }
diff --git a/sdk_nnbd/lib/internal/list.dart b/sdk_nnbd/lib/internal/list.dart
index be15f36..f1d59ff 100644
--- a/sdk_nnbd/lib/internal/list.dart
+++ b/sdk_nnbd/lib/internal/list.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /**
@@ -39,7 +37,7 @@
   }
 
   /** This operation is not supported by a fixed length list. */
-  bool remove(Object element) {
+  bool remove(Object? element) {
     throw new UnsupportedError("Cannot remove from a fixed-length list");
   }
 
@@ -132,7 +130,7 @@
   }
 
   /** This operation is not supported by an unmodifiable list. */
-  bool remove(Object element) {
+  bool remove(Object? element) {
     throw new UnsupportedError("Cannot remove from an unmodifiable list");
   }
 
@@ -147,12 +145,12 @@
   }
 
   /** This operation is not supported by an unmodifiable list. */
-  void sort([Comparator<E> compare]) {
+  void sort([Comparator<E>? compare]) {
     throw new UnsupportedError("Cannot modify an unmodifiable list");
   }
 
   /** This operation is not supported by an unmodifiable list. */
-  void shuffle([Random random]) {
+  void shuffle([Random? random]) {
     throw new UnsupportedError("Cannot modify an unmodifiable list");
   }
 
@@ -187,7 +185,7 @@
   }
 
   /** This operation is not supported by an unmodifiable list. */
-  void fillRange(int start, int end, [E fillValue]) {
+  void fillRange(int start, int end, [E? fillValue]) {
     throw new UnsupportedError("Cannot modify an unmodifiable list");
   }
 }
@@ -227,7 +225,7 @@
 
   ListMapView(this._values);
 
-  E operator [](Object key) => containsKey(key) ? _values[key] : null;
+  E? operator [](Object? key) => containsKey(key) ? _values[key as int] : null;
   int get length => _values.length;
 
   Iterable<E> get values => new SubListIterable<E>(_values, 0, null);
@@ -235,8 +233,8 @@
 
   bool get isEmpty => _values.isEmpty;
   bool get isNotEmpty => _values.isNotEmpty;
-  bool containsValue(Object value) => _values.contains(value);
-  bool containsKey(Object key) => key is int && key >= 0 && key < length;
+  bool containsValue(Object? value) => _values.contains(value);
+  bool containsKey(Object? key) => key is int && key >= 0 && key < length;
 
   void forEach(void f(int key, E value)) {
     int length = _values.length;
diff --git a/sdk_nnbd/lib/internal/patch.dart b/sdk_nnbd/lib/internal/patch.dart
index 1d05fda..3fc9733 100644
--- a/sdk_nnbd/lib/internal/patch.dart
+++ b/sdk_nnbd/lib/internal/patch.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of "dart:_internal";
 
 class _Patch {
diff --git a/sdk_nnbd/lib/internal/print.dart b/sdk_nnbd/lib/internal/print.dart
index ce5bb2a..2028503 100644
--- a/sdk_nnbd/lib/internal/print.dart
+++ b/sdk_nnbd/lib/internal/print.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /**
@@ -14,6 +12,6 @@
  *
  * This decouples the core library from the async library.
  */
-void Function(String) printToZone = null;
+void Function(String)? printToZone = null;
 
 external void printToConsole(String line);
diff --git a/sdk_nnbd/lib/internal/sort.dart b/sdk_nnbd/lib/internal/sort.dart
index ad79811..d6cca2e 100644
--- a/sdk_nnbd/lib/internal/sort.dart
+++ b/sdk_nnbd/lib/internal/sort.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /**
diff --git a/sdk_nnbd/lib/internal/symbol.dart b/sdk_nnbd/lib/internal/symbol.dart
index d6f05d7..bf48493 100644
--- a/sdk_nnbd/lib/internal/symbol.dart
+++ b/sdk_nnbd/lib/internal/symbol.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.5
-
 part of dart._internal;
 
 /**
@@ -111,7 +109,7 @@
   // This is called by dart2js.
   Symbol.validated(String name) : this._name = validatePublicSymbol(name);
 
-  bool operator ==(other) => other is Symbol && _name == other._name;
+  bool operator ==(Object other) => other is Symbol && _name == other._name;
 
   external int get hashCode;
 
diff --git a/sdk_nnbd/lib/js_util/dart2js/js_util_dart2js.dart b/sdk_nnbd/lib/js_util/dart2js/js_util_dart2js.dart
index 558bdaa..a01a537 100644
--- a/sdk_nnbd/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk_nnbd/lib/js_util/dart2js/js_util_dart2js.dart
@@ -15,6 +15,8 @@
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:collection' show HashMap;
+import 'dart:async' show Completer;
+import 'dart:_js_helper' show convertDartClosureToJS;
 
 /// WARNING: performance of this method is much worse than other util
 /// methods in this library. Only use this method as a last resort.
@@ -128,3 +130,23 @@
   //         []..addAll(arguments.map(_convertToJS)));
   //     return _wrapToDart(jsObj);
 }
+
+/// Converts a JavaScript Promise to a Dart [Future].
+///
+/// ```dart
+/// @JS()
+/// external Promise<num> get threePromise; // Resolves to 3
+///
+/// final Future<num> threeFuture = promiseToFuture(threePromise);
+///
+/// final three = await threeFuture; // == 3
+/// ```
+Future<T> promiseToFuture<T>(jsPromise) {
+  final completer = Completer<T>();
+
+  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
+  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
+
+  JS('', '#.then(#, #)', jsPromise, success, error);
+  return completer.future;
+}
diff --git a/sdk_nnbd/lib/svg/dart2js/svg_dart2js.dart b/sdk_nnbd/lib/svg/dart2js/svg_dart2js.dart
index bdf30e3..f81c43a 100644
--- a/sdk_nnbd/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk_nnbd/lib/svg/dart2js/svg_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * Scalable Vector Graphics:
  * Two-dimensional vector graphics with support for events and animation.
diff --git a/sdk_nnbd/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk_nnbd/lib/web_audio/dart2js/web_audio_dart2js.dart
index 95a7805..57f93f6 100644
--- a/sdk_nnbd/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk_nnbd/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * High-fidelity audio programming in the browser.
  *
diff --git a/sdk_nnbd/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk_nnbd/lib/web_gl/dart2js/web_gl_dart2js.dart
index b7cf4b8..77e0a9f 100644
--- a/sdk_nnbd/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk_nnbd/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * 3D programming in the browser.
  *
diff --git a/sdk_nnbd/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk_nnbd/lib/web_sql/dart2js/web_sql_dart2js.dart
index d7a857a..106ae4d 100644
--- a/sdk_nnbd/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk_nnbd/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -1,5 +1,4 @@
 // @dart = 2.5
-
 /**
  * An API for storing data in the browser that can be queried with SQL.
  *
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
index 678911c..beb067d 100644
--- a/tests/compiler/dart2js/inference/data/general.dart
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -675,8 +675,7 @@
   A.generative();
 
   /*member: A.==:[exact=JSBool]*/
-  operator ==(/*Union([exact=JSString], [exact=JSUInt31])*/ other) =>
-      42 as dynamic;
+  operator ==(/*[null|subclass=Object]*/ other) => 42 as dynamic;
 
   /*member: A.myField:[exact=JSUInt31]*/
   get myField => 42;
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
index 2e5a44f..40b9f69 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
@@ -5,6 +5,7 @@
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
+import 'dart:_foreign_helper' show JS_GET_FLAG;
 
 class Class<T> {
   Class();
@@ -17,7 +18,11 @@
   var toString = '${local1.runtimeType}';
   if ('$Object' == 'Object') {
     // `true` if non-minified.
-    Expect.equals("main_local1", toString);
+    if (JS_GET_FLAG('USE_NEW_RTI')) {
+      Expect.equals("Closure", toString);
+    } else {
+      Expect.equals("main_local1", toString);
+    }
   }
   print(toString);
   local2(0);
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
index dddd5e2..6425113 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
@@ -5,6 +5,7 @@
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
+import 'dart:_foreign_helper' show JS_GET_FLAG;
 
 class Class<T> {
   Class();
@@ -17,7 +18,11 @@
   var toString = '${local1.runtimeType}';
   if ('$Object' == 'Object') {
     // `true` if non-minified.
-    Expect.equals("main_local1", toString);
+    if (JS_GET_FLAG('USE_NEW_RTI')) {
+      Expect.equals("Closure", toString);
+    } else {
+      Expect.equals("main_local1", toString);
+    }
   }
   print(toString);
   local2(0);
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
new file mode 100644
index 0000000..6d77543
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+import 'dart:_foreign_helper' show JS_GET_FLAG;
+
+class Class<T> {
+  Class();
+}
+
+@pragma('dart2js:noInline')
+test<Q>() {
+  Q local1(Q) {}
+  local2(int i) => i;
+
+  var toString = '${local1.runtimeType}';
+  if ('$Object' == 'Object') {
+    // `true` if non-minified.
+    if (JS_GET_FLAG('USE_NEW_RTI')) {
+      Expect.equals("Closure", toString);
+    } else {
+      Expect.equals("test_local1", toString);
+    }
+  }
+  print(toString);
+  local2(0);
+  new Class();
+}
+
+main() {
+  test<int>();
+  test<String>();
+}
diff --git a/tests/compiler/dartdevc_native/assertion_failure_message_test.dart b/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
new file mode 100644
index 0000000..4a7fe7b
--- /dev/null
+++ b/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "utils.dart";
+
+void main() {
+  try {
+    assert(false, "failure message");
+  } on AssertionError catch (error) {
+    var message = error.toString();
+    expectStringContains('Assertion failed:', message);
+    expectStringContains('assertion_failure_message_test.dart:9:12', message);
+    expectStringContains('false', message);
+    expectStringContains('failure message', message);
+  }
+
+  // 失 All offsets and source code extractions should still be correct after
+  // non-UTF8 characters. See: https://github.com/dart-lang/sdk/issues/39271
+  try {
+    assert(false, "after a non-UTF8 character");
+  } on AssertionError catch (error) {
+    var message = error.toString();
+    expectStringContains('Assertion failed:', message);
+    expectStringContains('assertion_failure_message_test.dart:21:12', message);
+    expectStringContains('false', message);
+    expectStringContains('after a non-UTF8 character', message);
+  }
+}
diff --git a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart b/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
index 1298c38..1edcf7e 100644
--- a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
+++ b/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
@@ -2,14 +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.
 
-import "package:expect/expect.dart";
-
-_expectInErrorMessage(String expected, String actual) {
-  Expect.isTrue(
-      actual.contains(expected),
-      'Error message should contain "$expected", '
-      'but was ${actual.toString()}.');
-}
+import "utils.dart";
 
 class A {
   int x = 42;
@@ -33,8 +26,8 @@
     instanceOfA();
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'call'", message);
-    _expectInErrorMessage("Receiver: Instance of 'A'", message);
+    expectStringContains("NoSuchMethodError: 'call'", message);
+    expectStringContains("Receiver: Instance of 'A'", message);
   }
 
   dynamic tearOff = instanceOfA.arity1;
@@ -43,8 +36,8 @@
     tearOff(1, 2);
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'bound arity1'", message);
-    _expectInErrorMessage("too many arguments", message);
+    expectStringContains("NoSuchMethodError: 'bound arity1'", message);
+    expectStringContains("too many arguments", message);
   }
 
   // Dynamic call of a class method with too few arguments.
@@ -52,8 +45,8 @@
     tearOff();
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'bound arity1'", message);
-    _expectInErrorMessage("too few arguments", message);
+    expectStringContains("NoSuchMethodError: 'bound arity1'", message);
+    expectStringContains("too few arguments", message);
   }
 
   // Dynamic call of a top level funciton with too many arguments.
@@ -61,8 +54,8 @@
     dynamicFunction(1, 2);
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'arity1'", message);
-    _expectInErrorMessage("too many arguments", message);
+    expectStringContains("NoSuchMethodError: 'arity1'", message);
+    expectStringContains("too many arguments", message);
   }
 
   // Dynamic call of a top level funciton with too few arguments.
@@ -70,8 +63,8 @@
     dynamicFunction();
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'arity1'", message);
-    _expectInErrorMessage("too few arguments", message);
+    expectStringContains("NoSuchMethodError: 'arity1'", message);
+    expectStringContains("too few arguments", message);
   }
 
   // Function.apply() with too many arguments.
@@ -79,8 +72,8 @@
     Function.apply(dynamicFunction, [1, 2]);
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'arity1'", message);
-    _expectInErrorMessage("too many arguments", message);
+    expectStringContains("NoSuchMethodError: 'arity1'", message);
+    expectStringContains("too many arguments", message);
   }
 
   // Function.apply() with too few arguments.
@@ -88,7 +81,7 @@
     Function.apply(dynamicFunction, []);
   } on NoSuchMethodError catch (error) {
     var message = error.toString();
-    _expectInErrorMessage("NoSuchMethodError: 'arity1'", message);
-    _expectInErrorMessage("too few arguments", message);
+    expectStringContains("NoSuchMethodError: 'arity1'", message);
+    expectStringContains("too few arguments", message);
   }
 }
diff --git a/tests/compiler/dartdevc_native/utils.dart b/tests/compiler/dartdevc_native/utils.dart
new file mode 100644
index 0000000..79440f7
--- /dev/null
+++ b/tests/compiler/dartdevc_native/utils.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+/// Expects that [expected] appears as a substring in [actual].
+expectStringContains(String expected, String actual) {
+  Expect.isTrue(actual.contains(expected),
+      'Failure: "$expected" should appear in: "$actual".');
+}
diff --git a/tests/language_2/extension_methods/helpers/also_on_object.dart b/tests/language_2/extension_methods/helpers/also_on_object.dart
new file mode 100644
index 0000000..afe30e34
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/also_on_object.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// An extension conflicting with the one from "on_object.dart";
+extension AlsoOnObject on Object {
+  String get onObject => "also object";
+}
diff --git a/tests/language_2/extension_methods/helpers/class_no_shadow.dart b/tests/language_2/extension_methods/helpers/class_no_shadow.dart
index cba1e87..31e8195 100644
--- a/tests/language_2/extension_methods/helpers/class_no_shadow.dart
+++ b/tests/language_2/extension_methods/helpers/class_no_shadow.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 
 const String instanceValue = "1";
diff --git a/tests/language_2/extension_methods/helpers/class_shadow.dart b/tests/language_2/extension_methods/helpers/class_shadow.dart
index 73925be..2e603d1a 100644
--- a/tests/language_2/extension_methods/helpers/class_shadow.dart
+++ b/tests/language_2/extension_methods/helpers/class_shadow.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 
 import "class_no_shadow.dart";
diff --git a/tests/language_2/extension_methods/helpers/extension_all.dart b/tests/language_2/extension_methods/helpers/extension_all.dart
index 518948d..80656a7 100644
--- a/tests/language_2/extension_methods/helpers/extension_all.dart
+++ b/tests/language_2/extension_methods/helpers/extension_all.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 import "class_no_shadow.dart";
 
diff --git a/tests/language_2/extension_methods/helpers/extension_global_instance.dart b/tests/language_2/extension_methods/helpers/extension_global_instance.dart
index fd33bcb..1fbbe7b 100644
--- a/tests/language_2/extension_methods/helpers/extension_global_instance.dart
+++ b/tests/language_2/extension_methods/helpers/extension_global_instance.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 import "class_no_shadow.dart";
 
diff --git a/tests/language_2/extension_methods/helpers/extension_only.dart b/tests/language_2/extension_methods/helpers/extension_only.dart
index da7d1c4..d625af7 100644
--- a/tests/language_2/extension_methods/helpers/extension_only.dart
+++ b/tests/language_2/extension_methods/helpers/extension_only.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 import "class_no_shadow.dart";
 
diff --git a/tests/language_2/extension_methods/helpers/global_scope.dart b/tests/language_2/extension_methods/helpers/global_scope.dart
index 2ba1533..ae6f4fe 100644
--- a/tests/language_2/extension_methods/helpers/global_scope.dart
+++ b/tests/language_2/extension_methods/helpers/global_scope.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=extension-methods
-
 import "package:expect/expect.dart";
 
 const int globalValue = 0;
diff --git a/tests/language_2/extension_methods/helpers/on_int.dart b/tests/language_2/extension_methods/helpers/on_int.dart
new file mode 100644
index 0000000..a835f16
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/on_int.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension OnInt on int {
+  String get onObject => "int";
+  String get onInt => "int";
+}
diff --git a/tests/language_2/extension_methods/helpers/on_object.dart b/tests/language_2/extension_methods/helpers/on_object.dart
new file mode 100644
index 0000000..dfca4d6
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/on_object.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension OnObject on Object {
+  String get onObject => "object";
+}
diff --git a/tests/language_2/extension_methods/static_extension_deferred_double_import_test.dart b/tests/language_2/extension_methods/static_extension_deferred_double_import_test.dart
new file mode 100644
index 0000000..0ef1f33
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_deferred_double_import_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_object.dart" deferred as p1 hide OnObject;
+
+// Allow explicit and implicit access to non-deferred import extensions.
+
+void main() async {
+  Object o = 1;
+  Expect.equals("object", OnObject(o).onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_deferred_import_error_test.dart b/tests/language_2/extension_methods/static_extension_deferred_import_error_test.dart
new file mode 100644
index 0000000..3d0c5ba
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_deferred_import_error_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// It is an error to import a deferred library containing extensions without
+// hiding them.
+import "helpers/on_object.dart" deferred as p1;
+// [error line 9, column 1]
+// [cfe] Extension 'OnObject' cannot be imported through a deferred import.
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.DEFERRED_IMPORT_OF_EXTENSION
+
+void main() async {}
diff --git a/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
new file mode 100644
index 0000000..59920e7
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" deferred as p1 hide OnObject;
+
+void main() {
+  Object o = 1;
+  OnObject(o).onObject;
+//^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [cfe] Method not found: 'OnObject'.
+  o.onObject;
+  //^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
+}
diff --git a/tests/language_2/extension_methods/static_extension_deferred_import_test.dart b/tests/language_2/extension_methods/static_extension_deferred_import_test.dart
new file mode 100644
index 0000000..829a242
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_deferred_import_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" deferred as p1 hide OnObject;
+
+void main() {}
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
index f4cd928..6ca87af 100644
--- a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -11,13 +11,13 @@
 class C0 {
   int get m1 => 0;
   void set m2(int x) {}
-  int operator[](int index) => 0;
+  int operator [](int index) => 0;
 }
 
 extension E0 on C0 {
   void set m1(int x) {}
   int get m2 => 0;
-  void operator[]=(int index, int value) {}
+  void operator []=(int index, int value) {}
 }
 
 void test0() {
@@ -61,37 +61,31 @@
 
   c0[0];
   c0[0] = 0;
-  //^
+  //^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C0'.
-  // ^^^^^^
-  // [analyzer] unspecified
   E0(c0)[0];
-  // ^^^^^^
-  // [analyzer] unspecified
-  //    ^
+  //    ^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
   // [cfe] Getter not found: '[]'.
   E0(c0)[0] = 0;
 
   c0[0] += 0;
-  //^
+  //^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C0'.
-  // ^^^^^^
-  // [analyzer] unspecified
   c0[0]++;
-  //^
+  //^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C0'.
-  // ^^^^^^
-  // [analyzer] unspecified
 
   E0(c0)[0] += 0;
-  // ^^^^^^
-  // [analyzer] unspecified
-  //    ^
+  //    ^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
   // [cfe] The method '[]' isn't defined for the class 'dynamic'.
   E0(c0)[0]++;
-  // ^^^^^^
-  // [analyzer] unspecified
-  //    ^
+  //    ^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
   // [cfe] The method '[]' isn't defined for the class 'dynamic'.
 }
 
@@ -102,13 +96,13 @@
 extension E1A<T> on C1<T> {
   int get m1 => 0;
   void set m2(int x) {}
-  int operator[](int index) => 0;
+  int operator [](int index) => 0;
 }
 
 extension E1B on C1<Object> {
   void set m1(int x) {}
   int get m2 => 0;
-  void operator[]=(int index, int value) {}
+  void operator []=(int index, int value) {}
 }
 
 void test1() {
@@ -128,22 +122,19 @@
   c1a.m2 = 0;
 
   c1a[0] = 0;
-  // ^
+  // ^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1a[0] += 0;
-  // ^
+  // ^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1a[0]++;
-  // ^
+  // ^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
   // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1a[0];
 
@@ -179,32 +170,32 @@
   // [cfe] The getter 'm2' isn't defined for the class 'C1<Object>'.
 
   c1b[0];
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
   // ^
   // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1b[0] = 0;
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
   // ^
   // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1b[0] += 0;
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
   // ^
   // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
   // ^
   // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
-  //  ^^
-  // [analyzer] unspecified
 
   c1b[0]++;
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
   // ^
   // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
   // ^
   // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
-  //  ^^
-  // [analyzer] unspecified
 }
 
 // Getter on the extension itself.
@@ -212,15 +203,14 @@
   int get m1 => 0;
   void set m2(int x) {}
   int get mc => 0;
-  void operator[]=(int index, int value) {}
+  void operator []=(int index, int value) {}
 }
 
 extension E2 on C2 {
   void set m1(int x) {}
   int get m2 => 0;
   String get me => "";
-  int operator[](int index) => 0;
-
+  int operator [](int index) => 0;
 
   void test2() {
     // Using `this.member` means using the `on` type.
@@ -239,22 +229,19 @@
 
     this[0] = 0;
     this[0];
-    //  ^
+    //  ^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
     // [cfe] The method '[]' isn't defined for the class 'C2'.
-    //   ^^
-    // [analyzer] unspecified
 
     this[0] += 0;
-    //  ^
+    //  ^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
     // [cfe] The method '[]' isn't defined for the class 'C2'.
-    //   ^^
-    // [analyzer] unspecified
 
-    this[0] ++;
-    //  ^
+    this[0]++;
+    //  ^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
     // [cfe] The method '[]' isn't defined for the class 'C2'.
-    //   ^^
-    // [analyzer] unspecified
 
     // Check that `this.mc` refers to `C2.mc`.
     this.mc.toRadixString(16);
diff --git a/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
new file mode 100644
index 0000000..9a93aa0
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_int.dart" hide OnInt;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  i.onInt;
+  //^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [cfe] The getter 'onInt' isn't defined for the class 'int'.
+  i.onObject;
+  o.onObject;
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_hide_test.dart b/tests/language_2/extension_methods/static_extension_import_hide_test.dart
new file mode 100644
index 0000000..33efb80
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_hide_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_int.dart" hide OnInt;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("object", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
new file mode 100644
index 0000000..3c485e8
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_int.dart" as p1 hide OnInt;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  i.onInt;
+  //^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [cfe] The getter 'onInt' isn't defined for the class 'int'.
+  i.onObject;
+  o.onObject;
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_test.dart
new file mode 100644
index 0000000..eb24f4d
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_int.dart" as p1 hide OnInt;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("object", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_show_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_show_test.dart
new file mode 100644
index 0000000..caae31c
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_show_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" as p1 show OnObject;
+import "helpers/on_int.dart";
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_test.dart
new file mode 100644
index 0000000..bc64023
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" as p1;
+import "helpers/on_int.dart";
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_test.dart b/tests/language_2/extension_methods/static_extension_import_test.dart
new file mode 100644
index 0000000..2585595
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_int.dart";
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_import_unprefixed_show_test.dart b/tests/language_2/extension_methods/static_extension_import_unprefixed_show_test.dart
new file mode 100644
index 0000000..5a45148
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_import_unprefixed_show_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" show OnObject;
+import "helpers/on_int.dart";
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_prefix_double_import_test.dart b/tests/language_2/extension_methods/static_extension_prefix_double_import_test.dart
new file mode 100644
index 0000000..3df4552
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_prefix_double_import_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/on_object.dart" as p2;
+
+void main() {
+  Object o = 1;
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
new file mode 100644
index 0000000..666fbcf7
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart";
+import "helpers/also_on_object.dart" as p2;
+
+void main() {
+  Object o = 1;
+  o.onObject;
+  //^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
+  // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
+}
diff --git a/tests/language_2/extension_methods/static_extension_prefix_import_show_test.dart b/tests/language_2/extension_methods/static_extension_prefix_import_show_test.dart
new file mode 100644
index 0000000..8f5cf73
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_prefix_import_show_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" as p1 show OnObject;
+import "helpers/on_int.dart" as p2 show OnInt;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/extension_methods/static_extension_prefix_import_test.dart b/tests/language_2/extension_methods/static_extension_prefix_import_test.dart
new file mode 100644
index 0000000..eba2e94
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_prefix_import_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+import "helpers/on_object.dart" as p1;
+import "helpers/on_int.dart" as p2;
+
+void main() {
+  int i = 0;
+  Object o = i;
+  Expect.equals("int", i.onInt);
+  Expect.equals("int", i.onObject);
+  Expect.equals("object", o.onObject);
+}
diff --git a/tests/language_2/nnbd/static_errors/use_nnbd_sdk_test.dart b/tests/language_2/nnbd/static_errors/use_nnbd_sdk_test.dart
new file mode 100644
index 0000000..e43cb63
--- /dev/null
+++ b/tests/language_2/nnbd/static_errors/use_nnbd_sdk_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import "package:expect/expect.dart";
+
+// SharedOptions=--enable-experiment=non-nullable
+void main() {
+}
+
+/// These tests will all pass only if run with the NNBD migrated SDK.
+/// In not migrated SDK all types are unprefixed, so look non-nullable.
+void f(List<int> list, Map<int, String> map, int a, int? b) {
+  // List: E operator [](int index);
+  list[a]; //# 00: ok
+  list[b]; //# 01: compile-time error
+
+  // Map: V? operator [](Object? key);
+  map[a]; //# 02: ok
+  map[b]; //# 03: ok
+
+  // Map: void operator []=(K key, V value);
+  map[a].length; //# 04: compile-time error
+  map[a]?.length; //# 05: ok
+
+  map[b] = ''; //# 06: compile-time error
+  map[a] = b; //# 07: compile-time error
+}
diff --git a/tests/language_2/nnbd/syntax/cascade_nullcheck_test.dart b/tests/language_2/nnbd/syntax/cascade_nullcheck_test.dart
new file mode 100644
index 0000000..7391fc0
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/cascade_nullcheck_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+import "package:expect/expect.dart";
+
+class C {
+  int? y;
+  D? f() => new D();
+  C? h() => this;
+}
+
+class D {
+  D g() => this;
+  bool? operator [](String s) => true;
+}
+
+void test(C x) {
+  x..f()!.g()['Hi!']!..h()!.y = 2;
+}
+
+main() {
+  test(new C());
+}
diff --git a/tests/language_2/nnbd/syntax/late_modifier_final_field_test.dart b/tests/language_2/nnbd/syntax/late_modifier_final_field_test.dart
new file mode 100644
index 0000000..91d1865
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/late_modifier_final_field_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'package:expect/expect.dart';
+
+int initCalls = 0;
+int init() {
+  ++initCalls;
+  return 123;
+}
+
+class Base {
+  late final int fieldWithInit;
+}
+
+// A inherits from Base to bypass the compile time error caused by assigning to
+// a late final field that has an initializer. This allows us to test the
+// runtime exception.
+class A extends Base {
+  late final int fieldWithInit = init();
+}
+
+class B {
+  late final int fieldWithNoInit;
+}
+
+main() {
+  Base a = A();
+  Expect.equals(0, initCalls);
+  Expect.equals(123, a.fieldWithInit);
+  Expect.equals(1, initCalls);
+  Expect.equals(123, a.fieldWithInit);
+  Expect.equals(1, initCalls);
+  Expect.throws(() => {a.fieldWithInit = 456},
+      (error) => error is LateInitializationError);
+  Expect.equals(1, initCalls);
+  Expect.equals(123, a.fieldWithInit);
+  Expect.equals(1, initCalls);
+  initCalls = 0;
+
+  Base a2 = A();
+  Expect.equals(0, initCalls);
+  Expect.throws(() => {a2.fieldWithInit = 456},
+      (error) => error is LateInitializationError);
+  Expect.equals(0, initCalls);
+  Expect.equals(123, a2.fieldWithInit);
+  Expect.equals(1, initCalls);
+
+  B b = B();
+  Expect.throws(
+      () => b.fieldWithNoInit, (error) => error is LateInitializationError);
+  b.fieldWithNoInit = 123;
+  Expect.equals(123, b.fieldWithNoInit);
+  Expect.throws(() => {b.fieldWithNoInit = 456},
+      (error) => error is LateInitializationError);
+  Expect.equals(123, b.fieldWithNoInit);
+}
diff --git a/tests/language_2/nnbd/syntax/late_modifier_non_final_field_test.dart b/tests/language_2/nnbd/syntax/late_modifier_non_final_field_test.dart
new file mode 100644
index 0000000..804e519
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/late_modifier_non_final_field_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'package:expect/expect.dart';
+
+int initCalls = 0;
+int init() {
+  ++initCalls;
+  return 123;
+}
+
+class A {
+  late int? fieldWithInit = init();
+  late int fieldWithTrivialInit = 123;
+  late int? fieldWithNullInit = null;
+  late int fieldWithNoInit;
+}
+
+main() {
+  // Late, non-final, with init.
+  var a = A();
+  Expect.equals(0, initCalls);
+  Expect.equals(123, a.fieldWithInit);
+  Expect.equals(123, a.fieldWithTrivialInit);
+  Expect.equals(null, a.fieldWithNullInit);
+  Expect.throws(
+      () => a.fieldWithNoInit, (error) => error is LateInitializationError);
+  Expect.equals(1, initCalls);
+  Expect.equals(123, a.fieldWithInit);
+  Expect.equals(123, a.fieldWithTrivialInit);
+  Expect.equals(null, a.fieldWithNullInit);
+  Expect.throws(
+      () => a.fieldWithNoInit, (error) => error is LateInitializationError);
+  Expect.equals(1, initCalls);
+  a.fieldWithInit = 456;
+  a.fieldWithTrivialInit = 456;
+  a.fieldWithNullInit = 456;
+  a.fieldWithNoInit = 456;
+  Expect.equals(1, initCalls);
+  Expect.equals(456, a.fieldWithInit);
+  Expect.equals(456, a.fieldWithTrivialInit);
+  Expect.equals(456, a.fieldWithNullInit);
+  Expect.equals(456, a.fieldWithNoInit);
+  Expect.equals(1, initCalls);
+  initCalls = 0;
+
+  // Late, non-final, with init that's pre-empted by setter.
+  var b = A();
+  Expect.equals(0, initCalls);
+  b.fieldWithInit = 456;
+  Expect.equals(0, initCalls);
+  Expect.equals(456, b.fieldWithInit);
+  Expect.equals(0, initCalls);
+
+  // Late, non-final, with init that's pre-empted by null setter.
+  var c = A();
+  Expect.equals(0, initCalls);
+  c.fieldWithInit = null;
+  Expect.equals(0, initCalls);
+  Expect.equals(null, c.fieldWithInit);
+  Expect.equals(0, initCalls);
+}
diff --git a/tests/language_2/nnbd/syntax/late_modifier_static_field_test.dart b/tests/language_2/nnbd/syntax/late_modifier_static_field_test.dart
new file mode 100644
index 0000000..ffa8b37
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/late_modifier_static_field_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'package:expect/expect.dart';
+
+int initCalls = 0;
+int init() {
+  ++initCalls;
+  return 123;
+}
+
+class A {
+  static late int fieldWithInit = init();
+  static late int fieldWithTrivialInit = 123;
+  static late int? fieldWithNullInit = null;
+  static late int fieldWithNoInit;
+}
+
+class B {
+  static late int fieldWithInit = init();
+}
+
+class C {
+  static late int? fieldWithInit = init();
+}
+
+main() {
+  Expect.equals(0, initCalls);
+  Expect.equals(123, A.fieldWithInit);
+  Expect.equals(123, A.fieldWithTrivialInit);
+  Expect.equals(null, A.fieldWithNullInit);
+  Expect.throws(
+      () => A.fieldWithNoInit, (error) => error is LateInitializationError);
+  Expect.equals(1, initCalls);
+  Expect.equals(123, A.fieldWithInit);
+  Expect.equals(123, A.fieldWithTrivialInit);
+  Expect.equals(null, A.fieldWithNullInit);
+  Expect.throws(
+      () => A.fieldWithNoInit, (error) => error is LateInitializationError);
+  Expect.equals(1, initCalls);
+  A.fieldWithInit = 456;
+  A.fieldWithTrivialInit = 456;
+  A.fieldWithNullInit = 456;
+  A.fieldWithNoInit = 456;
+  Expect.equals(1, initCalls);
+  Expect.equals(456, A.fieldWithInit);
+  Expect.equals(456, A.fieldWithTrivialInit);
+  Expect.equals(456, A.fieldWithNullInit);
+  Expect.equals(456, A.fieldWithNoInit);
+  Expect.equals(1, initCalls);
+  initCalls = 0;
+
+  // Late, non-final, with init that's pre-empted by setter.
+  Expect.equals(0, initCalls);
+  B.fieldWithInit = 456;
+  Expect.equals(0, initCalls);
+  Expect.equals(456, B.fieldWithInit);
+  Expect.equals(0, initCalls);
+
+  // Late, non-final, with init that's pre-empted by null setter.
+  Expect.equals(0, initCalls);
+  C.fieldWithInit = null;
+  Expect.equals(0, initCalls);
+  Expect.equals(null, C.fieldWithInit);
+  Expect.equals(0, initCalls);
+}
diff --git a/tests/language_2/variance/variance_downwards_inference_test.dart b/tests/language_2/variance/variance_downwards_inference_test.dart
new file mode 100644
index 0000000..7de0e22
--- /dev/null
+++ b/tests/language_2/variance/variance_downwards_inference_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests downwards inference for explicit variance modifiers.
+
+// SharedOptions=--enable-experiment=variance
+
+class A<out T> {
+  final T _x;
+  A(T x):_x = x;
+  T get x => _x;
+  void set x(Object value) {}
+}
+
+class B<in T> {
+  B(List<T> x);
+  void set x(T val) {}
+}
+
+class C<out T, S> {
+  final T _x;
+  C(T x, S y):_x = x;
+  T get x => _x;
+  void set x(Object value) {}
+  void set y(S _value) {}
+}
+
+main() {
+  // int <: T <: Object
+  // Choose int
+  A<Object> a = new A(3)..x+=1;
+
+  // int <: T
+  // num <: T
+  // Choose num
+  B<int> b = new B(<num>[])..x=2.2;
+
+  // int <: T <: Object
+  // Choose int
+  // int <: S <: Object
+  // Choose Object
+  C<Object, Object> c = new C(3, 3)..x+=1..y="hello";
+}
diff --git a/tests/language_2/variance/variance_in_inference_error_test.dart b/tests/language_2/variance/variance_in_inference_error_test.dart
new file mode 100644
index 0000000..35b994d
--- /dev/null
+++ b/tests/language_2/variance/variance_in_inference_error_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference errors for the `in` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+class Contravariant<in T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferCovContra<T>(Covariant<T> x, Contravariant<T> y) => new Exactly<T>();
+Exactly<T> inferContraContra<T>(Contravariant<T> x, Contravariant<T> y) => new Exactly<T>();
+
+main() {
+  Exactly<Upper> upper;
+
+  var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
+  upper = inferredMiddle;
+  //      ^
+  // [analyzer] unspecified
+  // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Upper>'.
+
+  var inferredLower = inferContraContra(Contravariant<Upper>(), Contravariant<Lower>());
+  upper = inferredLower;
+  //      ^
+  // [analyzer] unspecified
+  // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
+
+  // int <: T <: String is not a valid constraint.
+  inferCovContra(Covariant<int>(), Contravariant<String>());
+  //                               ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Contravariant<String>' can't be assigned to the parameter type 'Contravariant<int>'.
+
+  // String <: T <: int is not a valid constraint.
+  inferCovContra(Covariant<String>(), Contravariant<int>());
+  //                                  ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Contravariant<int>' can't be assigned to the parameter type 'Contravariant<String>'.
+
+  // Middle <: T <: Lower is not a valid constraint
+  inferCovContra(Covariant<Middle>(), Contravariant<Lower>());
+  //                                  ^
+  // [analyzer] unspecified
+  // [cfe] The constructor returns type 'Contravariant<Lower>' that isn't of expected type 'Contravariant<Middle>'.
+
+  // Upper <: T <: Lower is not a valid constraint
+  inferCovContra(Covariant<Upper>(), Contravariant<Lower>());
+  //                                 ^
+  // [analyzer] unspecified
+  // [cfe] The constructor returns type 'Contravariant<Lower>' that isn't of expected type 'Contravariant<Upper>'.
+
+  // Upper <: T <: Middle is not a valid constraint
+  inferCovContra(Covariant<Upper>(), Contravariant<Middle>());
+  //                                 ^
+  // [analyzer] unspecified
+  // [cfe] The constructor returns type 'Contravariant<Middle>' that isn't of expected type 'Contravariant<Upper>'.
+}
diff --git a/tests/language_2/variance/variance_in_inference_test.dart b/tests/language_2/variance/variance_in_inference_test.dart
new file mode 100644
index 0000000..742911d
--- /dev/null
+++ b/tests/language_2/variance/variance_in_inference_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference for the `in` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+class Contravariant<in T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferCovContra<T>(Covariant<T> x, Contravariant<T> y) => new Exactly<T>();
+Exactly<T> inferContraContra<T>(Contravariant<T> x, Contravariant<T> y) => new Exactly<T>();
+
+main() {
+  Exactly<Middle> middle;
+  Exactly<Lower> lower;
+
+  // Lower <: T
+  // T <: Lower
+  // Choose Lower for Lower <: T <: Lower
+  var inferredLower = inferCovContra(Covariant<Lower>(), Contravariant<Lower>());
+  lower = inferredLower;
+
+  // Lower <: T
+  // T <: Middle
+  // Choose Lower for Lower <: T <: Middle
+  var inferredLower2 = inferCovContra(Covariant<Lower>(), Contravariant<Middle>());
+  lower = inferredLower2;
+
+  // Lower <: T
+  // T <: Upper
+  // Choose Lower for Lower <: T <: Upper
+  var inferredLower3 = inferCovContra(Covariant<Lower>(), Contravariant<Upper>());
+  lower = inferredLower3;
+
+  // T <: Upper
+  // T <: Middle
+  // Choose Middle since it is the greatest lower bound of Upper and Middle.
+  var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
+  middle = inferredMiddle;
+
+  // T <: Upper
+  // T <: Lower
+  // Choose Lower since it is the greatest lower bound of Upper and Lower.
+  var inferredLower4 = inferContraContra(Contravariant<Lower>(), Contravariant<Upper>());
+  lower = inferredLower4;
+
+  // T <: Middle
+  // T <: Lower
+  // Choose Lower since it is the greatest lower bound of Middle and Lower.
+  var inferredLower5 = inferContraContra(Contravariant<Lower>(), Contravariant<Middle>());
+  lower = inferredLower5;
+}
diff --git a/tests/language_2/variance/variance_in_method_error_test.dart b/tests/language_2/variance/variance_in_method_error_test.dart
index af5ef41..98c8033 100644
--- a/tests/language_2/variance/variance_in_method_error_test.dart
+++ b/tests/language_2/variance/variance_in_method_error_test.dart
@@ -294,3 +294,15 @@
     return null;
   }
 }
+
+class C<T> {
+  void method(T x) {}
+}
+
+class D<in T> extends C<void Function(T)> {
+  @override
+  void method(void Function(T) x) {}
+  //                           ^
+  // [analyzer] unspecified
+  // [cfe] Can't use 'in' type variable 'T' in an 'out' position.
+}
diff --git a/tests/language_2/variance/variance_in_method_test.dart b/tests/language_2/variance/variance_in_method_test.dart
index f209a16..c06264b 100644
--- a/tests/language_2/variance/variance_in_method_test.dart
+++ b/tests/language_2/variance/variance_in_method_test.dart
@@ -110,6 +110,21 @@
   }
 }
 
+class D<T> {
+  T x;
+  T method() => null;
+  void method2(T x) {}
+  void method3(covariant T x) {}
+}
+
+class E<in T> extends D<void Function(T)> {
+  @override
+  void Function(T) method() => (T x) {};
+
+  @override
+  void method3(covariant void Function(T) x) {}
+}
+
 void testClass() {
   A<int> a = new A();
 
@@ -208,8 +223,24 @@
   Expect.type<A<int>>(c.method2());
 }
 
+void testOverrideLegacyMethods() {
+  E<int> e = new E();
+  Expect.isTrue(e.method() is Function);
+  e.method2(contraFunction);
+  e.method3(contraFunction);
+  e.x = contraFunction;
+
+  D<Object> d = e;
+  Expect.throws(() => d.x = "test");
+
+  e = new E<Object>();
+  Expect.throws(() => e.method2(contraFunction));
+  Expect.throws(() => e.method3(contraFunction));
+}
+
 main() {
   testClass();
   testMixin();
   testClassInMethods();
+  testOverrideLegacyMethods();
 }
diff --git a/tests/language_2/variance/variance_in_subtyping_error_test.dart b/tests/language_2/variance/variance_in_subtyping_error_test.dart
index bf51bff..d5697c7 100644
--- a/tests/language_2/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_in_subtyping_error_test.dart
@@ -23,16 +23,17 @@
 class B extends A {
   @override
   Contravariant<Lower> method1() {
-  //                   ^
-  // [analyzer] unspecified
+  //                   ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   // [cfe] The return type of the method 'B.method1' is 'Contravariant<Lower>', which does not match the return type, 'Contravariant<Middle>', of the overridden method, 'A.method1'.
     return new Contravariant<Lower>();
   }
 
   @override
   void method2(Contravariant<Upper> x) {}
+  //   ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   //                                ^
-  // [analyzer] unspecified
   // [cfe] The parameter 'x' of the method 'B.method2' has type 'Contravariant<Upper>', which does not match the corresponding type, 'Contravariant<Middle>', in the overridden method, 'A.method2'.
 }
 
@@ -40,13 +41,15 @@
 
 class D {
   C<Contravariant<Lower>> method1() {
+  //^^^^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   //                             ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C' in the return type.
     return C<Contravariant<Lower>>();
     //     ^
-    // [analyzer] unspecified
     // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
+    //       ^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   }
 }
 
@@ -54,22 +57,24 @@
 
 main() {
   C<Contravariant<Lower>> c = new C<Contravariant<Lower>>();
+  //^^^^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   //                      ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
   //                              ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
+  //                                ^^^^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
   Iterable<Contravariant<Middle>> iterableMiddle = [new Contravariant<Middle>()];
   List<Contravariant<Lower>> listLower = [new Contravariant<Lower>()];
   iterableMiddle = listLower;
-  //               ^
-  // [analyzer] unspecified
+  //               ^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Contravariant<Lower>>' can't be assigned to a variable of type 'Iterable<Contravariant<Middle>>'.
 
   testCall(listLower);
-  //       ^
-  // [analyzer] unspecified
+  //       ^^^^^^^^^
+  // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] The argument type 'List<Contravariant<Lower>>' can't be assigned to the parameter type 'Iterable<Contravariant<Middle>>'.
 }
diff --git a/tests/language_2/variance/variance_inout_inference_error_test.dart b/tests/language_2/variance/variance_inout_inference_error_test.dart
new file mode 100644
index 0000000..361ec92
--- /dev/null
+++ b/tests/language_2/variance/variance_inout_inference_error_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference errors for the `inout` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+class Contravariant<in T> {}
+class Invariant<inout T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferInvInv<T>(Invariant<T> x, Invariant<T> y) => new Exactly<T>();
+Exactly<T> inferInvCov<T>(Invariant<T> x, Covariant<T> y) => new Exactly<T>();
+Exactly<T> inferInvContra<T>(Invariant<T> x, Contravariant<T> y) => new Exactly<T>();
+
+main() {
+  // Middle <: T <: Middle and int <: T <: int are not valid constraints.
+  inferInvInv(Invariant<Middle>(), Invariant<int>());
+  //          ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Invariant<Middle>' can't be assigned to the parameter type 'Invariant<Object>'.
+  //                               ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Invariant<int>' can't be assigned to the parameter type 'Invariant<Object>'.
+
+  // Middle <: T <: Middle and Upper <: T <: Upper are not valid constraints.
+  inferInvInv(Invariant<Middle>(), Invariant<Upper>());
+  //          ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Invariant<Middle>' can't be assigned to the parameter type 'Invariant<Upper>'.
+
+  // Middle <: T <: Middle and Lower <: T <: Lower are not valid constraints.
+  inferInvInv(Invariant<Middle>(), Invariant<Lower>());
+  //                               ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Invariant<Lower>' can't be assigned to the parameter type 'Invariant<Middle>'.
+
+  // Upper <: T
+  // Middle <: T <: Middle
+  // Upper <: T <: Middle is not a valid constraint.
+  inferInvCov(Invariant<Middle>(), Covariant<Upper>());
+  //          ^
+  // [analyzer] unspecified
+  // [cfe] The argument type 'Invariant<Middle>' can't be assigned to the parameter type 'Invariant<Upper>'.
+
+  // T <: Lower
+  // Middle <: T <: Lower
+  // Middle <: T <: Lower is not a valid constraint
+  inferInvContra(Invariant<Middle>(), Contravariant<Lower>());
+  //                                  ^
+  // [analyzer] unspecified
+  // [cfe] The constructor returns type 'Contravariant<Lower>' that isn't of expected type 'Contravariant<Middle>'.
+}
diff --git a/tests/language_2/variance/variance_inout_inference_test.dart b/tests/language_2/variance/variance_inout_inference_test.dart
new file mode 100644
index 0000000..8a5e3c5
--- /dev/null
+++ b/tests/language_2/variance/variance_inout_inference_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference for the `inout` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+class Contravariant<in T> {}
+class Invariant<inout T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferInvInv<T>(Invariant<T> x, Invariant<T> y) => new Exactly<T>();
+Exactly<T> inferInvCov<T>(Invariant<T> x, Covariant<T> y) => new Exactly<T>();
+Exactly<T> inferInvContra<T>(Invariant<T> x, Contravariant<T> y) => new Exactly<T>();
+
+main() {
+  Exactly<Middle> middle;
+
+  // Middle <: T <: Middle
+  // Choose Middle
+  var inferredMiddle = inferInvInv(Invariant<Middle>(), Invariant<Middle>());
+  middle = inferredMiddle;
+
+  // Lower <: T
+  // Middle <: T <: Middle
+  // Choose Middle since this merges to Middle <: T <: Middle
+  var inferredMiddle2 = inferInvCov(Invariant<Middle>(), Covariant<Lower>());
+  middle = inferredMiddle2;
+
+  // Middle <: T
+  // Middle <: T <: Middle
+  // Choose Middle since this merges to Middle <: T <: Middle
+  var inferredMiddle3 = inferInvCov(Invariant<Middle>(), Covariant<Middle>());
+  middle = inferredMiddle3;
+
+  // T <: Upper
+  // Middle <: T <: Middle
+  // Choose Middle since this merges to Middle <: T <: Middle
+  var inferredMiddle4 = inferInvContra(Invariant<Middle>(), Contravariant<Upper>());
+  middle = inferredMiddle4;
+
+  // T <: Middle
+  // Middle <: T <: Middle
+  // Choose Middle since this merges to Middle <: T <: Middle
+  var inferredMiddle5 = inferInvContra(Invariant<Middle>(), Contravariant<Middle>());
+  middle = inferredMiddle5;
+}
diff --git a/tests/language_2/variance/variance_inout_method_test.dart b/tests/language_2/variance/variance_inout_method_test.dart
index f533b71..62b1f2e 100644
--- a/tests/language_2/variance/variance_inout_method_test.dart
+++ b/tests/language_2/variance/variance_inout_method_test.dart
@@ -116,6 +116,39 @@
   }
 }
 
+class D<T> {
+  T method() => null;
+  void method2(T x) {}
+  void method3(covariant T x) {}
+}
+
+class E<inout T> extends D<T> {
+  @override
+  T method() => null;
+
+  @override
+  void method2(T x) {}
+
+  @override
+  void method3(covariant T x) {}
+}
+
+abstract class F<T> {
+  int method(T x);
+}
+
+class G<inout T> {
+  final void Function(T) f;
+  G(this.f);
+  int method(T x) {
+    f(x);
+  }
+}
+
+class H<inout T> extends G<T> implements F<T> {
+  H(void Function(T) f) : super(f);
+}
+
 void testClass() {
   A<int> a = new A();
 
@@ -228,8 +261,23 @@
   Expect.type<A<int>>(c.method3());
 }
 
+void testOverrideLegacyMethods() {
+  E<int> e = new E();
+  Expect.isNull(e.method());
+  e.method2(3);
+  e.method3(3);
+
+  D<Object> d = e;
+  Expect.throws(() => d.method2("test"));
+  Expect.throws(() => d.method3("test"));
+
+  F<Object> f = new H<String>((String s) {});
+  Expect.throws(() => f.method(3));
+}
+
 main() {
   testClass();
   testMixin();
   testClassInMethods();
+  testOverrideLegacyMethods();
 }
diff --git a/tests/language_2/variance/variance_inout_subtyping_error_test.dart b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
index 0ca248a..d06f336 100644
--- a/tests/language_2/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
@@ -40,16 +40,17 @@
 class C extends A {
   @override
   Invariant<Lower> method1() {
-  //               ^
-  // [analyzer] unspecified
+  //               ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   // [cfe] The return type of the method 'C.method1' is 'Invariant<Lower>', which does not match the return type, 'Invariant<Middle>', of the overridden method, 'A.method1'.
     return new Invariant<Lower>();
   }
 
   @override
   void method2(Invariant<Upper> x) {}
+  //   ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   //                            ^
-  // [analyzer] unspecified
   // [cfe] The parameter 'x' of the method 'C.method2' has type 'Invariant<Upper>', which does not match the corresponding type, 'Invariant<Middle>', in the overridden method, 'A.method2'.
 }
 
@@ -69,13 +70,15 @@
   }
 
   D<Invariant<Lower>> method2() {
+  //^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   //                         ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D' in the return type.
     return D<Invariant<Lower>>();
     //     ^
-    // [analyzer] unspecified
     // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
+    //       ^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   }
 }
 
@@ -92,12 +95,14 @@
   //                                 ^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   D<Invariant<Lower>> dLower = new D<Invariant<Lower>>();
+  //^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   //                  ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //                               ^
-  // [analyzer] unspecified
   // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
+  //                                 ^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
   Iterable<Invariant<Lower>> iterableLower = [new Invariant<Lower>()];
   List<Invariant<Middle>> listMiddle = [new Invariant<Middle>()];
@@ -109,8 +114,8 @@
   Iterable<Invariant<Middle>> iterableMiddle = [new Invariant<Middle>()];
   List<Invariant<Lower>> listLower = [new Invariant<Lower>()];
   iterableMiddle = listLower;
-  //               ^
-  // [analyzer] unspecified
+  //               ^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Invariant<Lower>>' can't be assigned to a variable of type 'Iterable<Invariant<Middle>>'.
 
   testCall<Lower>(listMiddle);
@@ -119,7 +124,7 @@
   // [cfe] The argument type 'List<Invariant<Middle>>' can't be assigned to the parameter type 'Iterable<Invariant<Lower>>'.
 
   testCall<Middle>(listLower);
-  //               ^
-  // [analyzer] unspecified
+  //               ^^^^^^^^^
+  // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] The argument type 'List<Invariant<Lower>>' can't be assigned to the parameter type 'Iterable<Invariant<Middle>>'.
 }
diff --git a/tests/language_2/variance/variance_out_inference_error_test.dart b/tests/language_2/variance/variance_out_inference_error_test.dart
new file mode 100644
index 0000000..cc2f448
--- /dev/null
+++ b/tests/language_2/variance/variance_out_inference_error_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference errors for the `out` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferCovCov<T>(Covariant<T> x, Covariant<T> y) => new Exactly<T>();
+
+main() {
+  Exactly<Lower> lower;
+
+  var inferredMiddle = inferCovCov(Covariant<Lower>(), Covariant<Middle>());
+  lower = inferredMiddle;
+  //      ^
+  // [analyzer] unspecified
+  // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
+
+  var inferredUpper = inferCovCov(Covariant<Lower>(), Covariant<Upper>());
+  lower = inferredUpper;
+  //      ^
+  // [analyzer] unspecified
+  // [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
+}
diff --git a/tests/language_2/variance/variance_out_inference_test.dart b/tests/language_2/variance/variance_out_inference_test.dart
new file mode 100644
index 0000000..8ba2f49
--- /dev/null
+++ b/tests/language_2/variance/variance_out_inference_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests local inference for the `out` variance modifier.
+
+// SharedOptions=--enable-experiment=variance
+
+class Covariant<out T> {}
+
+class Exactly<inout T> {}
+
+class Upper {}
+class Middle extends Upper {}
+class Lower extends Middle {}
+
+Exactly<T> inferCovCov<T>(Covariant<T> x, Covariant<T> y) => new Exactly<T>();
+
+main() {
+  Exactly<Upper> upper;
+
+  // Upper <: T
+  // Upper <: T
+  // Choose Upper
+  var inferredUpper = inferCovCov(Covariant<Upper>(), Covariant<Upper>());
+  upper = inferredUpper;
+
+  // Upper <: T
+  // Middle <: T
+  // Choose Upper since it is the lowest upper bound of Upper and Middle.
+  var inferredUpper2 = inferCovCov(Covariant<Upper>(), Covariant<Middle>());
+  upper = inferredUpper2;
+
+  // Upper <: T
+  // Lower <: T
+  // Choose Upper since it is the lowest upper bound of Upper and Lower.
+  var inferredUpper3 = inferCovCov(Covariant<Upper>(), Covariant<Lower>());
+  upper = inferredUpper3;
+}
diff --git a/tests/language_2/variance/variance_out_method_error_test.dart b/tests/language_2/variance/variance_out_method_error_test.dart
index fc4264b..905763a 100644
--- a/tests/language_2/variance/variance_out_method_error_test.dart
+++ b/tests/language_2/variance/variance_out_method_error_test.dart
@@ -298,3 +298,15 @@
     return null;
   }
 }
+
+class C<T> {
+  void method(T x) {}
+}
+
+class D<out T> extends C<T> {
+  @override
+  void method(T x) {}
+  //            ^
+  // [analyzer] unspecified
+  // [cfe] Can't use 'out' type variable 'T' in an 'in' position.
+}
diff --git a/tests/language_2/variance/variance_out_method_test.dart b/tests/language_2/variance/variance_out_method_test.dart
index 64bde43..7e0da23 100644
--- a/tests/language_2/variance/variance_out_method_test.dart
+++ b/tests/language_2/variance/variance_out_method_test.dart
@@ -104,6 +104,20 @@
   }
 }
 
+class D<T> {
+  T method() => null;
+  void method2(T x) {}
+  void method3(covariant T x) {}
+}
+
+class E<out T> extends D<T> {
+  @override
+  T method() => null;
+
+  @override
+  void method3(covariant T x) {}
+}
+
 void testClass() {
   A<int> a = new A();
 
@@ -200,8 +214,20 @@
   Expect.type<A<int>>(c.method2());
 }
 
+void testOverrideLegacyMethods() {
+  E<int> e = new E();
+  Expect.isNull(e.method());
+  e.method2(3);
+  e.method3(3);
+
+  D<Object> d = e;
+  Expect.throws(() => d.method2("test"));
+  Expect.throws(() => d.method3("test"));
+}
+
 main() {
   testClass();
   testMixin();
   testClassInMethods();
+  testOverrideLegacyMethods();
 }
diff --git a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
index cd6e13b..2c69097 100644
--- a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
+++ b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
@@ -27,76 +27,76 @@
   var contraLowerActual =
       exactly(condition ? Contravariant<Upper>() : Contravariant<Lower>());
   Exactly<Contravariant<Upper>> contraUpperExpected = contraLowerActual;
-  //                                                  ^
-  // [analyzer] unspecified
+  //                                                  ^^^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Lower>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var contraMiddleActual =
       exactly(condition ? Contravariant<Upper>() : Contravariant<Middle>());
   contraUpperExpected = contraMiddleActual;
-  //                    ^
-  // [analyzer] unspecified
+  //                    ^^^^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Middle>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var covMiddleActual =
       exactly(condition ? Covariant<Middle>() : Covariant<Lower>());
   Exactly<Covariant<Lower>> covLowerExpected = covMiddleActual;
-  //                                           ^
-  // [analyzer] unspecified
+  //                                           ^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Middle>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var covUpperActual =
       exactly(condition ? Covariant<Upper>() : Covariant<Lower>());
   covLowerExpected = covUpperActual;
-  //                 ^
-  // [analyzer] unspecified
+  //                 ^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Upper>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var invObjectActual =
       exactly(condition ? Invariant<Upper>() : Invariant<Middle>());
   Exactly<Invariant<Middle>> invMiddleExpected = invObjectActual;
-  //                                             ^
-  // [analyzer] unspecified
+  //                                             ^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Middle>>'.
   Exactly<Invariant<Upper>> invUpperExpected = invObjectActual;
-  //                                           ^
-  // [analyzer] unspecified
+  //                                           ^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Upper>>'.
 
   var legacyCovMiddleActual =
       exactly(condition ? LegacyCovariant<Middle>() : LegacyCovariant<Lower>());
   Exactly<LegacyCovariant<Lower>> legacyCovLowerExpected =
       legacyCovMiddleActual;
-  //  ^
-  // [analyzer] unspecified
+  //  ^^^^^^^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Middle>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var legacyCovUpperActual =
       exactly(condition ? LegacyCovariant<Upper>() : LegacyCovariant<Lower>());
   legacyCovLowerExpected = legacyCovUpperActual;
-  //                       ^
-  // [analyzer] unspecified
+  //                       ^^^^^^^^^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Upper>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var multiActual = exactly(condition
       ? Multi<Middle, Middle, Middle>()
       : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Lower, Middle, Lower>> multiExpected = multiActual;
-  //                                                   ^
-  // [analyzer] unspecified
+  //                                                   ^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Middle, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Multi<Lower, Middle, Lower>>'.
 
   var multiActual2 = exactly(
       condition ? Multi<Middle, int, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Middle, Object, Lower>> multiObjectExpected = multiActual2;
-  //                                                          ^
-  // [analyzer] unspecified
+  //                                                          ^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Multi<Middle, Object, Lower>>'.
 
   var multiActual3 = exactly(
       condition ? Multi<int, Middle, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Object> multiObjectExpected2 = multiActual3;
-  //                                     ^
-  // [analyzer] unspecified
+  //                                     ^^^^^^^^^^^^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Object, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Object>'.
 }
diff --git a/tests/language_2/vm/regress_39283_test.dart b/tests/language_2/vm/regress_39283_test.dart
new file mode 100644
index 0000000..0638fb8
--- /dev/null
+++ b/tests/language_2/vm/regress_39283_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  dynamic foo(a) {
+    baz() {
+      Expect.fail('Should not be reachable');
+    }
+
+    return baz;
+  }
+}
+
+main() {
+  Expect.throws(() {
+    dynamic x = A().foo(1);
+    x<List>();
+  }, (e) => e is NoSuchMethodError);
+}
diff --git a/tests/lib_2/html/js_util_test.dart b/tests/lib_2/html/js_util_test.dart
index 78ea380..1a4ebe6 100644
--- a/tests/lib_2/html/js_util_test.dart
+++ b/tests/lib_2/html/js_util_test.dart
@@ -12,7 +12,8 @@
 
 import 'package:js/js.dart';
 import 'package:js/js_util.dart' as js_util;
-import 'package:expect/minitest.dart';
+import 'package:unittest/unittest.dart';
+import 'package:async_helper/async_helper.dart';
 
 _injectJs() {
   final script = new ScriptElement();
@@ -55,6 +56,12 @@
     return false;
 }
 
+var rejectedPromise = new Promise((resolve, reject) => reject('rejected'));
+var resolvedPromise = new Promise(resolve => resolve('resolved'));
+function getResolvedPromise() {
+  return resolvedPromise;
+}
+
 """;
   document.body.append(script);
 }
@@ -103,6 +110,18 @@
   external set JS$class(v);
 }
 
+@JS()
+abstract class Promise<T> {}
+
+@JS()
+external Promise get resolvedPromise;
+
+@JS()
+external Promise get rejectedPromise;
+
+@JS()
+external Promise getResolvedPromise();
+
 @JS("Object.prototype.hasOwnProperty")
 external get _hasOwnProperty;
 
@@ -340,4 +359,25 @@
       expect(f.a, equals(42));
     });
   });
+
+  group('promiseToFuture', () {
+    test('resolved promise', () async {
+      final String result = await js_util.promiseToFuture(resolvedPromise);
+      expect(result, equals('resolved'));
+    });
+
+    test('rejected promise', () async {
+      try {
+        final String result = await promiseToFuture(rejectedPromise);
+        fail('expected Future to throw an error');
+      } catch (error) {
+        expect(error, equals('rejected'));
+      }
+    });
+
+    test('function that returns a resolved promise', () async {
+      final String result = await promiseToFuture(getResolvedPromise());
+      expect(result, equals('resolved'));
+    });
+  });
 }
diff --git a/tests/standalone_2/io/http_headers_test.dart b/tests/standalone_2/io/http_headers_test.dart
index 3b2f9cb..3a2cbb3 100644
--- a/tests/standalone_2/io/http_headers_test.dart
+++ b/tests/standalone_2/io/http_headers_test.dart
@@ -563,6 +563,21 @@
   Expect.isFalse(headers.chunkedTransferEncoding);
 }
 
+void testFolding() {
+  _HttpHeaders headers = new _HttpHeaders("1.1");
+  headers.add("a", "b");
+  headers.add("a", "c");
+  headers.add("a", "d");
+  // no folding by default
+  Expect.isTrue(headers.toString().contains('b, c, d'));
+  // Header name should be case insensitive
+  headers.noFolding('A');
+  var str = headers.toString();
+  Expect.isTrue(str.contains(': b'));
+  Expect.isTrue(str.contains(': c'));
+  Expect.isTrue(str.contains(': d'));
+}
+
 main() {
   testMultiValue();
   testDate();
@@ -581,4 +596,5 @@
   testInvalidFieldName();
   testInvalidFieldValue();
   testClear();
+  testFolding();
 }
diff --git a/tests/standalone_2/io/shared_socket_test.dart b/tests/standalone_2/io/shared_socket_test.dart
new file mode 100644
index 0000000..939695d
--- /dev/null
+++ b/tests/standalone_2/io/shared_socket_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:http/http.dart' as http;
+
+void main() async {
+  final workers = List<ServerWorker>.generate(4, (i) => ServerWorker(i));
+  workers.forEach((w) => w.start());
+  await Future.delayed(Duration(seconds: 1));
+  // spawn client isolate
+  final clientisolate = await Isolate.spawn(client, 0);
+  // Wait for 20 secs. It used to crash within 10 seconds.
+  await Future.delayed(Duration(seconds: 20));
+
+  workers.forEach((w) {
+    w.respawn = false;
+    w.terminate();
+  });
+  print('kill client isolates');
+  clientisolate.kill();
+}
+
+class ServerWorker {
+  final int workerid;
+  Isolate _isolate;
+  bool respawn = true;
+
+  ServerWorker(this.workerid);
+
+  Future<void> start() async {
+    final onExit = ReceivePort();
+    onExit.listen((_) {
+      onExit.close();
+      // Respawn another isolate
+      if (respawn) start();
+    });
+    _isolate = await Isolate.spawn(_main, workerid,
+        errorsAreFatal: true, onExit: onExit.sendPort);
+    if (workerid == 0) terminate();
+  }
+
+  void terminate() {
+    Future.delayed(Duration(seconds: 1), () {
+      print('terminate ${workerid}');
+      if (_isolate != null) {
+        _isolate.kill();
+        _isolate = null;
+      }
+    });
+  }
+
+  static _main(int workerid) async {
+    bool shared = true;
+    final server = await HttpServer.bind('::1', 1234, shared: shared);
+    server.listen((HttpRequest request) {
+      print('from worker ${workerid}');
+      final response = request.response;
+      response.statusCode = HttpStatus.ok;
+      response.write('server worker ${workerid}');
+      response.close();
+    });
+  }
+}
+
+Future<String> get(String url) async {
+  while (true) {
+    try {
+      await http.get(url);
+      return '';
+    } catch (err) {}
+  }
+}
+
+void client(int i) async {
+  while (true) {
+    final futures = <Future>[];
+    final numAtOnce = 16; // enough to keep the server busy
+    for (int i = 0; i < numAtOnce; ++i) {
+      futures.add(get('http://localhost:1234').then((_) {}));
+    }
+    await Future.wait(futures);
+  }
+}
diff --git a/tools/VERSION b/tools/VERSION
index 97be2aa..200c0df 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 7
 PATCH 0
-PRERELEASE 0
+PRERELEASE 1
 PRERELEASE_PATCH 0
-ABI_VERSION 21
-OLDEST_SUPPORTED_ABI_VERSION 19
+ABI_VERSION 23
+OLDEST_SUPPORTED_ABI_VERSION 23
diff --git a/tools/bots/aot_smoke_tests.dart b/tools/bots/aot_smoke_tests.dart
index 0e912cd..b9a035e 100755
--- a/tools/bots/aot_smoke_tests.dart
+++ b/tools/bots/aot_smoke_tests.dart
@@ -10,9 +10,7 @@
 // run the resulting AOT blob with the AOT runtime.
 
 import 'dart:io';
-import 'dart:convert';
 
-import 'package:args/args.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
diff --git a/tools/copy_dart.py b/tools/copy_dart.py
index 2bfb582..059b85b 100755
--- a/tools/copy_dart.py
+++ b/tools/copy_dart.py
@@ -120,6 +120,9 @@
 
             # Create file containing all imports, and inlining all sources
             with open(outpath, 'w') as f:
+                prefix = os.environ.get('DART_HTML_PREFIX')
+                if prefix:
+                    f.write(prefix + '\n')
                 if library.name:
                     if library.comment:
                         f.write('%s' % (''.join(library.comment)))
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 3e1368e..b255a8e 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -191,15 +191,16 @@
     monitored.FinishMonitoring(dart2js_output_dir, _logger)
 
 
-def GenerateSingleFile(library_path, output_dir, generated_output_dir=None):
+def GenerateSingleFile(library_path, output_dir, generated_output_dir=None, prefix=None):
     library_dir = os.path.dirname(library_path)
     library_filename = os.path.basename(library_path)
     copy_dart_script = os.path.relpath('../../copy_dart.py', library_dir)
     output_dir = os.path.relpath(output_dir, library_dir)
     if not os.path.exists(library_dir):
         os.makedirs(library_dir)
+    prefix_arg = 'export DART_HTML_PREFIX="' + prefix + '";' if prefix else ""
     command = ' '.join([
-        'cd', library_dir, ';', copy_dart_script, output_dir, library_filename
+        prefix_arg, 'cd', library_dir, ';', copy_dart_script, output_dir, library_filename
     ])
     subprocess.call([command], shell=True)
     prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt')
@@ -340,11 +341,18 @@
         _logger.info('Generating dart2js single files.')
 
         for library_name in HTML_LIBRARY_NAMES:
+            source = os.path.join(dart2js_output_dir,
+                                  '%s_dart2js.dart' % library_name)
             GenerateSingleFile(
-                os.path.join(dart2js_output_dir,
-                             '%s_dart2js.dart' % library_name),
-                os.path.join('..', '..', '..', 'sdk', 'lib', library_name,
-                             'dart2js'))
+                source,
+                os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js'))
+            # TODO(Issue 38701): We won't need two copies once the NNBD SDK is
+            # unforked.
+            GenerateSingleFile(
+                source,
+                os.path.join('..', '..', '..', 'sdk_nnbd', 'lib', library_name, 'dart2js'),
+                None,
+                '// @dart = 2.5')
 
     print '\nGenerating single file %s seconds' % round(
         time.time() - file_generation_start_time, 2)
diff --git a/tools/gn.py b/tools/gn.py
index c98246a..81da03d 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -246,11 +246,13 @@
     gn_args['is_msan'] = args.msan
     gn_args['is_tsan'] = args.tsan
     gn_args['is_ubsan'] = args.ubsan
+    gn_args['include_dart2native'] = True
 
     if not args.platform_sdk and not gn_args['target_cpu'].startswith('arm'):
         gn_args['dart_platform_sdk'] = args.platform_sdk
     gn_args['dart_stripped_binary'] = 'exe.stripped/dart'
-    gn_args['dartaotruntime_stripped_binary'] = 'exe.stripped/dartaotruntime'
+    gn_args[
+        'dart_precompiled_runtime_stripped_binary'] = 'exe.stripped/dart_precompiled_runtime'
     gn_args['gen_snapshot_stripped_binary'] = 'exe.stripped/gen_snapshot'
 
     # Setup the user-defined sysroot.
diff --git a/tools/make_version.py b/tools/make_version.py
index 184699d..70f2900 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -5,6 +5,8 @@
 #
 # This python script creates a version string in a C++ file.
 
+from __future__ import print_function
+
 import hashlib
 import os
 import sys
@@ -14,7 +16,7 @@
 
 
 def debugLog(message):
-    print >> sys.stderr, message
+    print(message, file=sys.stderr)
     sys.stderr.flush()
 
 
@@ -55,16 +57,15 @@
         else:
             git_hash = utils.GetShortGitHash()
             version_string = ("%s.%s-%s" % (latest, custom_for_pub, git_hash))
-        # TODO(athom): remove the custom 2.5.0 logic post release.
-        # For 2.5.0, we want flutter to claim Dart is 2.5.0 even before it is
-        # decided what exactly 2.5.0 will be. Dart & Flutter stable releases
-        # will be synced, so that what will be released as Dart 2.5.0 will also
+        # TODO(athom): remove the custom 2.7.0 logic post release.
+        # For 2.7.0, we want flutter to claim Dart is 2.7.0 even before it is
+        # decided what exactly 2.7.0 will be. Dart & Flutter stable releases
+        # will be synced, so that what will be released as Dart 2.7.0 will also
         # be what will be packaged with Flutter.
         version = utils.ReadVersionFile()
         custom_version_string = "%s.%s.%s" % (version.major, version.minor, version.patch)
-        if custom_version_string == "2.5.0" and custom_for_pub == "flutter":
-            version_string = "2.5.0"
-
+        if custom_version_string == "2.7.0" and custom_for_pub == "flutter":
+            version_string = "2.7.0"
 
     else:
         version_string = utils.GetSemanticSDKVersion(no_git_hash=no_git_hash)
@@ -78,7 +79,7 @@
     for vmfilename in VM_SNAPSHOT_FILES:
         vmfilepath = os.path.join(utils.DART_DIR, 'runtime', 'vm', vmfilename)
         with open(vmfilepath) as vmfile:
-            vmhash.update(vmfile.read())
+            vmhash.update(vmfile.read().encode('utf-8'))
     return vmhash.hexdigest()
 
 
@@ -98,7 +99,7 @@
     version_time = utils.GetGitTimestamp()
     if no_git_hash or version_time == None:
         version_time = "Unknown timestamp"
-    version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}", version_time)
+    version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}", version_time.decode("utf-8"))
     abi_version = utils.GetAbiVersion(version_file)
     version_cc_text = version_cc_text.replace("{{ABI_VERSION}}", abi_version)
     oldest_supported_abi_version = utils.GetOldestSupportedAbiVersion(
diff --git a/tools/test.dart b/tools/test.dart
index 1e1b405..5a47fb3 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -6,7 +6,6 @@
 // Run tests like on the given builder and/or named configuration.
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 
@@ -136,16 +135,22 @@
       orElse: () => "master");
 }
 
+class ResolvedConfigurations {
+  final Set<String> configurationNames;
+  final Set<String> builders;
+  ResolvedConfigurations(this.configurationNames, this.builders);
+}
+
 /// Finds the named configuration to test according to the test matrix
 /// information and the command line options.
-bool resolveNamedConfiguration(
+ResolvedConfigurations resolveNamedConfigurations(
     List<String> branches,
     List<dynamic> buildersConfigurations,
     String requestedBranch,
-    String requestedNamedConfiguration,
-    String requestedBuilder,
-    Set<String> outputNamedConfiguration,
-    Set<String> outputBuilders) {
+    List<String> requestedNamedConfigurations,
+    String requestedBuilder) {
+  Set<String> namedConfigurations = {};
+  Set<String> builders = {};
   bool foundBuilder = false;
   for (final builderConfiguration in buildersConfigurations) {
     for (final builder in builderConfiguration["builders"]) {
@@ -160,7 +165,7 @@
         stderr.writeln("error: Builder $requestedBuilder is on branch $branch "
             "rather than $requestedBranch");
         stderr.writeln("error: To compare with that branch, use: -B $branch");
-        return false;
+        return null;
       }
       foundBuilder = true;
       final steps = (builderConfiguration["steps"] as List).cast<Map>();
@@ -172,50 +177,50 @@
         final arguments = step["arguments"]
             .map((argument) => expandVariables(argument, builder))
             .toList();
-        final namedConfiguration = arguments
+        final String namedConfiguration = arguments
             .firstWhere((argument) => (argument as String).startsWith("-n"))
             .substring(2);
-        if (requestedNamedConfiguration == null ||
-            requestedNamedConfiguration == namedConfiguration) {
-          outputNamedConfiguration.add(namedConfiguration);
-          outputBuilders.add(builder);
+        if (namedConfiguration.contains(",")) {
+          throw "Multiple named configurations in builder configurations: "
+              "are currently not supported: '$arguments'";
+        }
+        if (requestedNamedConfigurations.isEmpty ||
+            requestedNamedConfigurations.contains(namedConfiguration)) {
+          namedConfigurations.add(namedConfiguration);
+          builders.add(builder);
         }
       }
     }
   }
   if (requestedBuilder != null && !foundBuilder) {
     stderr.writeln("error: Builder $requestedBuilder doesn't exist");
-    return false;
+    return null;
   }
   if (requestedBuilder != null &&
-      requestedNamedConfiguration == null &&
-      outputNamedConfiguration.isEmpty) {
+      requestedNamedConfigurations == null &&
+      namedConfigurations.isEmpty) {
     stderr.writeln("error: Builder $requestedBuilder isn't testing any named "
         "configurations");
-    return false;
+    return null;
   }
   if (requestedBuilder != null &&
-      requestedNamedConfiguration != null &&
-      outputNamedConfiguration.isEmpty) {
+      requestedNamedConfigurations != null &&
+      namedConfigurations.isEmpty) {
     stderr.writeln("error: The builder $requestedBuilder isn't testing the "
-        "named configuration $requestedNamedConfiguration");
-    return false;
+        "named configuration $requestedNamedConfigurations");
+    return null;
   }
-  if (requestedNamedConfiguration != null && outputBuilders.isEmpty) {
+  if (requestedNamedConfigurations != null && builders.isEmpty) {
     stderr.writeln("error: The named configuration "
-        "$requestedNamedConfiguration isn't tested on any builders");
-    return false;
+        "$requestedNamedConfigurations isn't tested on any builders");
+    return null;
   }
-  return true;
+
+  return ResolvedConfigurations(namedConfigurations, builders);
 }
 
 /// Locates the merge base between head and the [branch] on the given [remote].
-/// If a particular [commit] was requested, use that.
-Future<String> findMergeBase(
-    String commit, String remote, String branch) async {
-  if (commit != null) {
-    return commit;
-  }
+Future<String> findMergeBase(String remote, String branch) async {
   final arguments = ["merge-base", "$remote/$branch", "HEAD"];
   final result =
       await Process.run("git", arguments, runInShell: Platform.isWindows);
@@ -313,6 +318,42 @@
   }
 }
 
+void overrideConfiguration(Map<String, Map<String, dynamic>> results,
+    String configuration, String newConfiguration) {
+  results.forEach((String key, Map<String, dynamic> result) {
+    if (result["configuration"] == configuration) {
+      result["configuration"] = newConfiguration;
+    }
+  });
+}
+
+void printUsage(ArgParser parser, {String error, bool printOptions: false}) {
+  if (error != null) {
+    print("$error\n");
+    exitCode = 1;
+  }
+  print("""
+Usage: test.dart -b [BUILDER] -n [CONFIGURATION] [OPTION]... [--]
+                 [TEST.PY OPTION]... [SELECTOR]...
+
+Run tests and compare with the results on the given builder. Either the -n or
+the -b option, or both, must be used. Any options following -- and non-option
+arguments will be forwarded to test.py invocations. The specified named
+configuration's results will be downloaded from the specified builder. If only a
+named configuration is specified, the results are downloaded from the
+appropriate builders. If only a builder is specified, the default named
+configuration is used if the builder only has a single named configuration.
+Otherwise the available named configurations are listed.
+
+See the documentation at https://goto.google.com/dart-status-file-free-workflow
+""");
+  if (printOptions) {
+    print(parser.usage);
+  } else {
+    print("Run test.dart --help to see all options.");
+  }
+}
+
 void main(List<String> args) async {
   final parser = new ArgParser();
   parser.addOption("builder",
@@ -330,9 +371,9 @@
           "detected by --deflake will remain hidden");
   parser.addFlag("list-configurations",
       help: "Output list of configurations.", negatable: false);
-  parser.addOption("named-configuration",
+  parser.addMultiOption("named-configuration",
       abbr: "n",
-      help: "The named test configuration that supplies the\nvalues for all "
+      help: "The named test configuration(s) that supplies the\nvalues for all "
           "test options, specifying how tests\nshould be run.");
   parser.addOption("local-configuration",
       abbr: "N",
@@ -346,27 +387,16 @@
       defaultsTo: "origin");
   parser.addFlag("help", help: "Show the program usage.", negatable: false);
 
-  final options = parser.parse(args);
-  if (options["help"] ||
-      (options["builder"] == null &&
-          options["named-configuration"] == null &&
-          !options["list-configurations"])) {
-    print("""
-Usage: test.dart -b [BUILDER] -n [CONFIGURATION] [OPTION]... [--]
-                 [TEST.PY OPTION]... [SELECTOR]...
+  ArgResults options;
+  try {
+    options = parser.parse(args);
+  } on FormatException catch (exception) {
+    printUsage(parser, error: exception.message);
+    return;
+  }
 
-Run tests and compare with the results on the given builder. Either the -n or
-the -b option, or both, must be used. Any options following -- and non-option
-arguments will be forwarded to test.py invocations. The specified named
-configuration's results will be downloaded from the specified builder. If only a
-named configuration is specified, the results are downloaded from the
-appropriate builders. If only a builder is specified, the default named
-configuration is used if the builder only has a single named configuration.
-Otherwise the available named configurations are listed.
-
-See the documentation at https://goto.google.com/dart-status-file-free-workflow
-
-${parser.usage}""");
+  if (options["help"]) {
+    printUsage(parser, printOptions: true);
     return;
   }
 
@@ -378,6 +408,25 @@
     return;
   }
 
+  final requestedBuilder = options["builder"];
+  final namedConfigurations =
+      (options["named-configuration"] as List).cast<String>();
+  final localConfiguration = options["local-configuration"] as String;
+
+  if (requestedBuilder == null && namedConfigurations.isEmpty) {
+    printUsage(parser,
+        error: "Please specify either a configuration (-n) or "
+            "a builder (-b)");
+    return;
+  }
+
+  if (localConfiguration != null && namedConfigurations.length > 1) {
+    printUsage(parser,
+        error: "Local configuration (-N) can only be used with a"
+            " single named configuration (-n)");
+    return;
+  }
+
   // Locate gsutil.py.
   gsutilPy =
       Platform.script.resolve("../third_party/gsutil/gsutil.py").toFilePath();
@@ -394,47 +443,34 @@
 
   // Determine what named configuration to run and which builders to download
   // existing results from.
-  final namedConfigurations = new SplayTreeSet<String>();
-  final builders = new SplayTreeSet<String>();
-  if (!resolveNamedConfiguration(
+  ResolvedConfigurations configurations = resolveNamedConfigurations(
       branches,
       buildersConfigurations,
       options["branch"],
-      options["named-configuration"],
-      options["builder"],
       namedConfigurations,
-      builders)) {
+      requestedBuilder);
+  if (configurations == null) {
+    // No valid configuration could be found. The error has already been
+    // reported by [resolveConfiguration].
     exitCode = 1;
     return;
   }
-  if (namedConfigurations.length > 1) {
-    final builder = builders.single;
-    stderr.writeln(
-        "error: The builder $builder is testing multiple named configurations");
-    stderr.writeln(
-        "error: Please select the desired named configuration using -n:");
-    for (final namedConfiguration in namedConfigurations) {
-      stderr.writeln("  -n $namedConfiguration");
-    }
-    exitCode = 1;
-    return;
-  }
-  final namedConfiguration = namedConfigurations.single;
-  final localConfiguration =
-      options["local-configuration"] as String ?? namedConfiguration;
-  for (final builder in builders) {
-    if (localConfiguration != namedConfiguration) {
+
+  for (final builder in configurations.builders) {
+    if (localConfiguration != null) {
       print("Testing the named configuration $localConfiguration "
-          "compared with builder $builder's configuration $namedConfiguration");
+          "compared with builder $builder's configuration "
+          "${namedConfigurations.single}");
     } else {
-      print("Testing the named configuration $localConfiguration "
+      print("Testing the named configuration(s) "
+          "${namedConfigurations.join(",")} "
           "compared with builder $builder");
     }
   }
 
-  // Find out where the current HEAD branched.
-  final commit = await findMergeBase(
-      options["commit"], options["remote"], options["branch"]);
+  // Use given commit or find out where the current HEAD branched.
+  final commit = options["commit"] ??
+      await findMergeBase(options["remote"], options["branch"]);
   print("Base commit is $commit");
 
   // Store the downloaded results and our test results in a temporary directory.
@@ -443,9 +479,13 @@
     final mergedResults = <String, Map<String, dynamic>>{};
     final mergedFlaky = <String, Map<String, dynamic>>{};
 
+    bool needsConfigurationOverride = localConfiguration != null &&
+        localConfiguration != namedConfigurations.single;
+    bool needsMerge = configurations.builders.length > 1;
+
     // Use the buildbucket API to search for builds of the right commit.
-    final inexactBuilds = new SplayTreeMap<String, String>();
-    for (final builder in builders) {
+    final inexactBuilds = <String, String>{};
+    for (final builder in configurations.builders) {
       // Download the previous results and flakiness info from cloud storage.
       print("Finding build on builder $builder to compare with...");
       final buildSearchResult =
@@ -463,64 +503,63 @@
         await cpGsutil(buildFileCloudPath(builder, buildNumber, "flaky.json"),
             "${outDirectory.path}/flaky.json");
       }
-      print("Downloaded baseline results from builder $builder");
       // Merge the results for the builders.
-      if (builders.length > 1) {
-        mergedResults
-            .addAll(await loadResultsMap("${outDirectory.path}/previous.json"));
+      if (needsMerge || needsConfigurationOverride) {
+        var results =
+            await loadResultsMap("${outDirectory.path}/previous.json");
+        if (needsConfigurationOverride) {
+          overrideConfiguration(
+              results, namedConfigurations.single, localConfiguration);
+        }
+        mergedResults.addAll(results);
         if (!options["report-flakes"]) {
-          mergedFlaky
-              .addAll(await loadResultsMap("${outDirectory.path}/flaky.json"));
+          var flakyTests =
+              await loadResultsMap("${outDirectory.path}/flaky.json");
+          if (needsConfigurationOverride) {
+            overrideConfiguration(
+                flakyTests, namedConfigurations.single, localConfiguration);
+          }
+          mergedFlaky.addAll(flakyTests);
         }
       }
     }
 
     // Write out the merged results for the builders.
-    if (builders.length > 1) {
+    if (needsMerge || needsConfigurationOverride) {
       await new File("${outDirectory.path}/previous.json").writeAsString(
           mergedResults.values.map((data) => jsonEncode(data) + "\n").join(""));
     }
 
     // Ensure that there is a flaky.json even if it wasn't downloaded.
-    if (builders.length > 1 || options["report-flakes"]) {
+    if (needsMerge || needsConfigurationOverride || options["report-flakes"]) {
       await new File("${outDirectory.path}/flaky.json").writeAsString(
           mergedFlaky.values.map((data) => jsonEncode(data) + "\n").join(""));
     }
 
-    // Override the named configuration in the baseline data if needed.
-    if (namedConfiguration != localConfiguration) {
-      for (final path in [
-        "${outDirectory.path}/previous.json",
-        "${outDirectory.path}/flaky.json"
-      ]) {
-        final results = await loadResultsMap(path);
-        final records = results.values
-            .where((r) => r["configuration"] == namedConfiguration)
-            .toList()
-              ..forEach((r) => r["configuration"] = localConfiguration);
-        await new File(path).writeAsString(
-            records.map((data) => jsonEncode(data) + "\n").join(""));
-      }
-    }
+    final configurationsToRun = localConfiguration != null
+        ? <String>[localConfiguration]
+        : namedConfigurations;
 
     // Run the tests.
-    final arguments = [
-      "--named-configuration=$localConfiguration",
-      "--output-directory=${outDirectory.path}",
-      "--clean-exit",
-      "--silent-failures",
-      "--write-results",
-      "--write-logs",
-      ...options.rest,
-    ];
     print("".padLeft(80, "="));
     print("Running tests");
     print("".padLeft(80, "="));
-    await runProcessInheritStdio("python", ["tools/test.py", ...arguments],
+    await runProcessInheritStdio(
+        "python",
+        [
+          "tools/test.py",
+          "--named-configuration=${configurationsToRun.join(",")}",
+          "--output-directory=${outDirectory.path}",
+          "--clean-exit",
+          "--silent-failures",
+          "--write-results",
+          "--write-logs",
+          ...options.rest,
+        ],
         runInShell: Platform.isWindows);
 
     if (options["deflake"]) {
-      await deflake(outDirectory, localConfiguration, options.rest);
+      await deflake(outDirectory, configurationsToRun, options.rest);
     }
 
     // Write out the final comparison.
@@ -546,16 +585,19 @@
     }
     if (inexactBuilds.isNotEmpty) {
       print("");
-      inexactBuilds.forEach((String builder, String inexactCommit) => print(
-          "Warning: Results may be inexact because commit ${inexactCommit} "
-          "was used as the baseline for $builder instead of $commit"));
+      final builders = inexactBuilds.keys.toList()..sort();
+      for (var builder in builders) {
+        final inexactCommit = inexactBuilds[builder];
+        print("Warning: Results may be inexact because commit ${inexactCommit} "
+            "was used as the baseline for $builder instead of $commit");
+      }
     }
   } finally {
     await outDirectory.delete(recursive: true);
   }
 }
 
-void deflake(Directory outDirectory, String localConfiguration,
+void deflake(Directory outDirectory, List<String> configurations,
     List<String> testPyArgs) async {
   // Find the list of tests to deflake.
   final deflakeListOutput = await runProcess(Platform.resolvedExecutable, [
@@ -580,7 +622,7 @@
     final deflakeDirectory = new Directory("${outDirectory.path}/$i");
     await deflakeDirectory.create();
     final deflakeArguments = <String>[
-      "--named-configuration=$localConfiguration",
+      "--named-configuration=${configurations.join(",")}",
       "--output-directory=${deflakeDirectory.path}",
       "--clean-exit",
       "--silent-failures",
