Version 2.10.0-5.0.dev

Merge commit '9d279d41e3677a94bf75f6efb8d5cd98cadd1c7b' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 57c4b70..706d694 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-07-14T07:50:57.318843",
+  "generated": "2020-08-07T16:47:24.963156",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -21,6 +21,41 @@
       "languageVersion": "2.2"
     },
     {
+      "name": "_fe_analyzer_shared_assigned_variables",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_definite_assignment",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_definite_unassignment",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_inheritance",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/inheritance",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_nullability",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/nullability",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_reachability",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/reachability",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_type_promotion",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion",
+      "packageUri": ".nonexisting/"
+    },
+    {
       "name": "_js_interop_checks",
       "rootUri": "../pkg/_js_interop_checks",
       "packageUri": "lib/",
@@ -48,7 +83,7 @@
       "name": "analyzer",
       "rootUri": "../pkg/analyzer",
       "packageUri": "lib/",
-      "languageVersion": "2.6"
+      "languageVersion": "2.7"
     },
     {
       "name": "analyzer_cli",
@@ -107,7 +142,7 @@
       "name": "charcode",
       "rootUri": "../third_party/pkg/charcode",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.9"
     },
     {
       "name": "cli_util",
@@ -131,7 +166,7 @@
       "name": "convert",
       "rootUri": "../third_party/pkg/convert",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "crypto",
@@ -356,7 +391,6 @@
     {
       "name": "language_versioning_2.7_test",
       "rootUri": "../pkg/language_versioning_2.7_test",
-      "packageUri": "lib/",
       "languageVersion": "2.7"
     },
     {
@@ -375,7 +409,7 @@
       "name": "markdown",
       "rootUri": "../third_party/pkg/markdown",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.6"
     },
     {
       "name": "matcher",
@@ -566,7 +600,7 @@
       "name": "sse",
       "rootUri": "../third_party/pkg/sse",
       "packageUri": "lib/",
-      "languageVersion": "2.6"
+      "languageVersion": "2.2"
     },
     {
       "name": "stack_trace",
@@ -602,7 +636,7 @@
       "name": "sync_http",
       "rootUri": "../third_party/pkg/sync_http",
       "packageUri": "lib/",
-      "languageVersion": "2.6"
+      "languageVersion": "2.0"
     },
     {
       "name": "telemetry",
@@ -713,12 +747,6 @@
       "languageVersion": "2.2"
     },
     {
-      "name": "webdriver",
-      "rootUri": "../third_party/pkg/webdriver",
-      "packageUri": "lib/",
-      "languageVersion": "2.6"
-    },
-    {
       "name": "web_components",
       "rootUri": "../third_party/pkg/web_components",
       "packageUri": "lib/",
@@ -731,10 +759,16 @@
       "languageVersion": "2.0"
     },
     {
+      "name": "webdriver",
+      "rootUri": "../third_party/pkg/webdriver",
+      "packageUri": "lib/",
+      "languageVersion": "2.0"
+    },
+    {
       "name": "yaml",
       "rootUri": "../third_party/pkg/yaml",
       "packageUri": "lib/",
       "languageVersion": "2.4"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/BUILD.gn b/BUILD.gn
index fe0376d..d59ce8e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -163,22 +163,30 @@
     manifest = "build/fuchsia/dart.cmx"
 
     resource_files = [
-      ".packages",
+      ".dart_tool/package_config.json",
       "pkg/testing/test/hello_test.dart",
+      "tools/addlatexhash.dart",
     ]
     resource_dirs = [
-      "tests/standalone",
-      "tests/language_2",
+      "tests/standalone_2",
       "pkg/async_helper",
       "pkg/expect",
       "pkg/meta",
+      "pkg/native_stack_traces",
       "pkg/smith",
       "third_party/pkg/args",
       "third_party/pkg/async",
+      "third_party/pkg/charcode",
       "third_party/pkg/collection",
+      "third_party/pkg/convert",
+      "third_party/pkg/crypto",
+      "third_party/pkg/http",
+      "third_party/pkg/http_parser",
       "third_party/pkg/path",
       "third_party/pkg/pool",
       "third_party/pkg/stack_trace",
+      "third_party/pkg/string_scanner",
+      "third_party/pkg/typed_data",
     ]
 
     resources = []
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54a5a2f..a03d376 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,23 @@
 *   Introduces `Dart_FinalizableHandle`s. They do auto-delete, and the weakly
     referred object cannot be accessed through them.
 
+### Tools
+
+#### Linter
+
+Updated the Linter to `0.1.118`, which includes:
+
+* New lint: `unnecessary_nullable_for_final_variable_declarations`.
+* Fixed NPE in `prefer_asserts_in_initializer_lists`.
+* Fixed range error in `unnecessary_string_escapes`.
+* `unsafe_html` updated to support unique error codes.
+* Updates to `diagnostic_describe_all_properties` to check for `Diagnosticable`s (not `DiagnosticableMixin`s).
+* New lint: `use_late`.
+* Fixed `unnecessary_lambdas` to respect deferred imports.
+* Updated `public_member_api_docs` to check mixins.
+* Updated `unnecessary_statements` to skip `as` expressions.
+* Fixed `prefer_relative_imports` to work with path dependencies.
+
 ## 2.9.0 - 2020-08-05
 
 ### Language
diff --git a/DEPS b/DEPS
index 042e77d..e03a4be 100644
--- a/DEPS
+++ b/DEPS
@@ -39,16 +39,16 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.10.0-0.0.dev",
+  "sdk_tag": "version:2.10.0-3.0.dev",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "a9bd47e85862b4af9006c24ea0cb626850bc5de7",
+  "co19_rev": "74eec903ea06fa09dc8799b0552d55b581a82996",
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
-  "benchmarks_internal_rev": "1682e8c568cf1899a6da6b5993f0506949253b22",
+  "benchmarks_internal_rev": "991d4cb32af0e914763ebbdeced91395bed874d8",
   "checkout_benchmarks_internal": False,
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
@@ -75,9 +75,9 @@
   "browser-compat-data_tag": "v1.0.22",
   "charcode_rev": "af1e2d59a9c383da94f99ea51dac4b93fb0626c4",
   "chrome_rev" : "19997",
-  "cli_util_tag" : "0.1.4",
+  "cli_util_tag" : "0.2.0",
   "collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
-  "convert_rev": "49bde5b371eb5c2c8e721557cf762f17c75e49fc",
+  "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "7422fb2f6584fe1839eb30bc4ca56e9f9760b801",
   "csslib_rev": "451448a9ac03f87a8d0377fc0b411d8c388a6cb4",
   "dart2js_info_tag" : "0.6.0",
@@ -113,7 +113,7 @@
   "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "d589e635d8ccb7cda6a804bd571f88abbabab146",
-  "linter_tag": "0.1.117",
+  "linter_tag": "0.1.118",
   "logging_rev": "9561ba016ae607747ae69b846c0e10958ca58ed4",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_rev": "acaddfe74217f62498b5cf0cf5429efa6a700be3",
@@ -677,12 +677,6 @@
     'pattern': '.',
     'action': ['python', 'sdk/build/vs_toolchain.py', 'update'],
   },
-  {
-    # Download dill files for all supported ABI versions, if necessary.
-    'name': 'abiversions',
-    'pattern': '.',
-    'action': ['python', 'sdk/tools/download_abi_dills.py'],
-  },
 ]
 
 hooks_os = {
diff --git a/benchmarks/IsolateSpawn/dart/helloworld.dart b/benchmarks/IsolateSpawn/dart/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawn/dart/helloworld.dart
+++ b/benchmarks/IsolateSpawn/dart/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawn/dart2/helloworld.dart b/benchmarks/IsolateSpawn/dart2/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawn/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawn/dart2/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
+++ b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/build/fuchsia/dart.cmx b/build/fuchsia/dart.cmx
index b4546c1..f8f5750 100644
--- a/build/fuchsia/dart.cmx
+++ b/build/fuchsia/dart.cmx
@@ -8,7 +8,8 @@
       "deprecated-ambient-replace-as-executable",
       "root-ssl-certificates",
       "isolated-cache-storage",
-      "isolated-persistent-storage"
+      "isolated-persistent-storage",
+      "isolated-temp"
     ],
     "services": [
       "fuchsia.deprecatedtimezone.Timezone",
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 531cf04..7ee3d3f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -5421,6 +5421,27 @@
         tip: r"""Try replacing them with named parameters instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropEnclosingClassJSAnnotation =
+    messageJsInteropEnclosingClassJSAnnotation;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropEnclosingClassJSAnnotation = const MessageCode(
+    "JsInteropEnclosingClassJSAnnotation",
+    message:
+        r"""Member has a JS interop annotation but the enclosing class does not.""",
+    tip: r"""Try adding the annotation to the enclosing class.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropEnclosingClassJSAnnotationContext =
+    messageJsInteropEnclosingClassJSAnnotationContext;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropEnclosingClassJSAnnotationContext =
+    const MessageCode("JsInteropEnclosingClassJSAnnotationContext",
+        severity: Severity.context,
+        message: r"""This is the enclosing class.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropIndexNotSupported =
     messageJsInteropIndexNotSupported;
 
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 08cbb83..2355b50 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -9,6 +9,8 @@
         Message,
         LocatedMessage,
         messageJsInteropAnonymousFactoryPositionalParameters,
+        messageJsInteropEnclosingClassJSAnnotation,
+        messageJsInteropEnclosingClassJSAnnotationContext,
         messageJsInteropIndexNotSupported,
         messageJsInteropNamedParameters,
         messageJsInteropNonExternalConstructor;
@@ -21,7 +23,15 @@
   JsInteropChecks(this._diagnosticsReporter);
 
   @override
+  void defaultMember(Member member) {
+    _checkMemberJSInteropAnnotation(member);
+    super.defaultMember(member);
+  }
+
+  @override
   void visitProcedure(Procedure procedure) {
+    _checkMemberJSInteropAnnotation(procedure);
+
     if (!procedure.isExternal || !isJSInteropMember(procedure)) return;
 
     if (!procedure.isStatic &&
@@ -55,6 +65,8 @@
 
   @override
   void visitConstructor(Constructor constructor) {
+    _checkMemberJSInteropAnnotation(constructor);
+
     if (!isJSInteropMember(constructor)) return;
 
     if (!constructor.isExternal && !constructor.isSynthetic) {
@@ -79,4 +91,21 @@
           firstNamedParam.location.file);
     }
   }
+
+  /// Reports an error if [m] has a JS interop annotation and is part of a class
+  /// that does not.
+  void _checkMemberJSInteropAnnotation(Member m) {
+    if (!hasJSInteropAnnotation(m)) return;
+    var enclosingClass = m.enclosingClass;
+    if (enclosingClass != null && !hasJSInteropAnnotation(enclosingClass)) {
+      _diagnosticsReporter.report(messageJsInteropEnclosingClassJSAnnotation,
+          m.fileOffset, m.name.name.length, m.location.file,
+          context: <LocatedMessage>[
+            messageJsInteropEnclosingClassJSAnnotationContext.withLocation(
+                enclosingClass.location.file,
+                enclosingClass.fileOffset,
+                enclosingClass.name.length)
+          ]);
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index a9414fd..c0d5406 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -299,14 +299,6 @@
     flutterWidgetDescriptions.flush();
   }
 
-  /// Read all files, resolve all URIs, and perform required analysis in
-  /// all current analysis drivers.
-  void reanalyze() {
-    for (var driver in driverMap.values) {
-      driver.resetUriResolution();
-    }
-  }
-
   /// Send the given [notification] to the client.
   void sendNotification(Notification notification) {
     channel.sendNotification(notification);
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 966baae..06cc63c 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -412,6 +412,14 @@
   /// given [path] was changed - added, updated, or removed.
   void notifyFlutterWidgetDescriptions(String path) {}
 
+  /// Read all files, resolve all URIs, and perform required analysis in
+  /// all current analysis drivers.
+  void reanalyze() {
+    for (var driver in driverMap.values) {
+      driver.resetUriResolution();
+    }
+  }
+
   /// Sends an error notification to the user.
   void sendServerErrorNotification(
     String message,
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index a0d7ff9..3d4a474 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -474,6 +474,8 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
+    computer._addRegion_token(
+        node.abstractKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     super.visitFieldDeclaration(node);
   }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 4178ea1..ada8fc5 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -565,6 +565,8 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
+    computer._addRegion_token(
+        node.abstractKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     super.visitFieldDeclaration(node);
   }
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index ba91e4b..93bf55a 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -53,6 +53,7 @@
 
 abstract class CustomMethods {
   static const DiagnosticServer = Method('dart/diagnosticServer');
+  static const Reanalyze = Method('dart/reanalyze');
   static const PublishClosingLabels =
       Method('dart/textDocument/publishClosingLabels');
   static const PublishOutline = Method('dart/textDocument/publishOutline');
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
new file mode 100644
index 0000000..ad5c1b3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2020, 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/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class ReanalyzeHandler extends MessageHandler<void, void> {
+  ReanalyzeHandler(LspAnalysisServer server) : super(server);
+  @override
+  Method get handlesMessage => CustomMethods.Reanalyze;
+
+  @override
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
+
+  @override
+  Future<ErrorOr<void>> handle(void _, CancellationToken token) async {
+    server.reanalyze();
+    return success();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index 48c5ec010..acecc86 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/custom/handler_diagnostic_server.dart';
+import 'package:analysis_server/src/lsp/handlers/custom/handler_reanalyze.dart';
 import 'package:analysis_server/src/lsp/handlers/custom/handler_super.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_change_workspace_folders.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_code_actions.dart';
@@ -102,6 +103,7 @@
     registerHandler(DiagnosticServerHandler(server));
     registerHandler(WorkspaceSymbolHandler(server));
     registerHandler(WorkspaceDidChangeConfigurationMessageHandler(server));
+    registerHandler(ReanalyzeHandler(server));
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index d4ce68a1..44939fc 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -349,7 +349,12 @@
     analysisServerOptions.configurationOverrides = sdkConfig;
 
     // ML model configuration.
-    final bool enableCompletionModel = results[ENABLE_COMPLETION_MODEL];
+    // TODO(brianwilkerson) Uncomment the line below and delete the second line
+    //  when there is a new completion model to query. Until then we ignore the
+    //  flag to enable the model so that we can't try to read from a file that
+    //  doesn't exist.
+//    final bool enableCompletionModel = results[ENABLE_COMPLETION_MODEL];
+    final enableCompletionModel = false;
     analysisServerOptions.completionModelFolder =
         results[COMPLETION_MODEL_FOLDER];
     if (results.wasParsed(ENABLE_COMPLETION_MODEL) && !enableCompletionModel) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index fa4ff8f..0e66786 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -306,6 +306,9 @@
     if (variables.isEmpty || request.offset > variables.first.beginToken.end) {
       return;
     }
+    if (node.abstractKeyword == null) {
+      _addSuggestion(Keyword.ABSTRACT);
+    }
     if (node.covariantKeyword == null) {
       _addSuggestion(Keyword.COVARIANT);
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 88f78e0..50910b8 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -149,6 +149,8 @@
       AssistKind('dart.assist.flutter.wrap.padding', 32, 'Wrap with Padding');
   static const FLUTTER_WRAP_ROW =
       AssistKind('dart.assist.flutter.wrap.row', 32, 'Wrap with Row');
+  static const FLUTTER_WRAP_SIZED_BOX =
+      AssistKind('dart.assist.flutter.wrap.sizedBox', 32, 'Wrap with SizedBox');
   static const FLUTTER_WRAP_STREAM_BUILDER = AssistKind(
       'dart.assist.flutter.wrap.streamBuilder', 32, 'Wrap with StreamBuilder');
 
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index f1c93bf..ce9d943 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -24,7 +24,9 @@
 import 'package:analysis_server/src/services/correction/dart/remove_empty_else.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_statement.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_this_expression.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_new.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_cascade_with_dot.dart';
@@ -32,6 +34,7 @@
 import 'package:analysis_server/src/services/correction/dart/replace_null_with_closure.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_conditional_assignment.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_is_empty.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_with_tear_off.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
 import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/use_is_not_empty.dart';
@@ -82,8 +85,12 @@
     LintNames.prefer_single_quotes: ConvertToSingleQuotes.newInstance,
     LintNames.prefer_spread_collections: ConvertAddAllToSpread.newInstance,
     LintNames.slash_for_doc_comments: ConvertDocumentationIntoLine.newInstance,
+    LintNames.type_init_formals: RemoveTypeAnnotation.newInstance,
     LintNames.unnecessary_const: RemoveUnnecessaryConst.newInstance,
+    LintNames.unnecessary_lambdas: ReplaceWithTearOff.newInstance,
     LintNames.unnecessary_new: RemoveUnnecessaryNew.newInstance,
+    LintNames.unnecessary_overrides: RemoveMethodDeclaration.newInstance,
+    LintNames.unnecessary_this: RemoveThisExpression.newInstance,
   };
 
   /// A map from an error code to a generator used to create the correction
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 8b24ec7..cb91e3b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -383,6 +383,11 @@
     _context = context;
   }
 
+  /// Return the text that should be displayed to users when referring to the
+  /// given [type].
+  String displayStringForType(DartType type) => type.getDisplayString(
+      withNullability: libraryElement.isNonNullableByDefault);
+
   /// Return the function body of the most deeply nested method or function that
   /// encloses the [node], or `null` if the node is not in a method or function.
   FunctionBody getEnclosingFunctionBody() {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
index 77d58d78..d4426a0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
@@ -16,7 +16,11 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    if (node is! SwitchStatement) {
+      return;
+    }
     var statement = node as SwitchStatement;
+
     String enumName;
     var enumConstantNames = <String>[];
     var expressionType = statement.expression.staticType;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_type_annotation.dart
index 480f825..0dfea8a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_type_annotation.dart
@@ -34,9 +34,8 @@
           Expression initializer = coveredNode;
           var newType = initializer.staticType;
           if (newType is InterfaceType || newType is FunctionType) {
-            _oldAnnotation =
-                typeNode.type.getDisplayString(withNullability: false);
-            _newAnnotation = newType.getDisplayString(withNullability: false);
+            _oldAnnotation = displayStringForType(typeNode.type);
+            _newAnnotation = displayStringForType(newType);
             await builder.addDartFileEdit(file, (builder) {
               builder.addReplacement(range.node(typeNode), (builder) {
                 builder.writeType(newType);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
index 389ad42..c8c935b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
@@ -29,6 +29,9 @@
       if (!flutter.isExactWidgetTypePadding(widgetType)) {
         yield _FlutterWrapPadding(widgetExpr);
       }
+      if (!flutter.isExactWidgetTypeSizedBox(widgetType)) {
+        yield _FlutterWrapSizedBox(widgetExpr);
+      }
     }
     yield* _wrapMultipleWidgets();
   }
@@ -167,6 +170,21 @@
 
 /// A correction processor that can make one of the possible change computed by
 /// the [FlutterWrap] producer.
+class _FlutterWrapSizedBox extends _WrapSingleWidget {
+  _FlutterWrapSizedBox(Expression widgetExpr) : super(widgetExpr);
+
+  @override
+  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_SIZED_BOX;
+
+  @override
+  String get _parentClassName => 'SizedBox';
+
+  @override
+  String get _parentLibraryUri => flutter.widgetsUri;
+}
+
+/// A correction processor that can make one of the possible change computed by
+/// the [FlutterWrap] producer.
 abstract class _WrapMultipleWidgets extends CorrectionProducer {
   final Expression firstWidget;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_return_type_nullable.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_return_type_nullable.dart
new file mode 100644
index 0000000..5fdea07
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_return_type_nullable.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2020, 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/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class MakeReturnTypeNullable extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.MAKE_RETURN_TYPE_NULLABLE;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    if (!unit.featureSet.isEnabled(Feature.non_nullable)) {
+      return;
+    }
+    if (node is! Expression) {
+      return;
+    }
+    var body = node.thisOrAncestorOfType<FunctionBody>();
+    TypeAnnotation returnType;
+    var function = body.parent;
+    if (function is FunctionExpression) {
+      function = function.parent;
+    }
+    if (function is MethodDeclaration) {
+      returnType = function.returnType;
+    } else if (function is FunctionDeclaration) {
+      returnType = function.returnType;
+    } else {
+      return;
+    }
+    if (body.isAsynchronous || body.isGenerator) {
+      if (returnType is! NamedType) {
+        return null;
+      }
+      var typeArguments = (returnType as NamedType).typeArguments;
+      if (typeArguments == null) {
+        return null;
+      }
+      var arguments = typeArguments.arguments;
+      if (arguments.length != 1) {
+        return null;
+      }
+      returnType = arguments[0];
+    }
+    if (node is! NullLiteral &&
+        !typeSystem.isAssignableTo(returnType.type,
+            typeSystem.promoteToNonNull((node as Expression).staticType))) {
+      return;
+    }
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addSimpleInsertion(returnType.end, '?');
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static MakeReturnTypeNullable newInstance() => MakeReturnTypeNullable();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
new file mode 100644
index 0000000..75d20bcb
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, 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/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ReplaceWithNotNullAware extends CorrectionProducer {
+  /// The operator that will replace the existing operator.
+  String _newOperator;
+
+  @override
+  List<Object> get fixArguments => [_newOperator];
+
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    var node = coveredNode;
+    if (node is MethodInvocation) {
+      _newOperator =
+          node.operator.type == TokenType.QUESTION_PERIOD ? '.' : '..';
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleReplacement(range.token(node.operator), _newOperator);
+      });
+    } else if (node is PropertyAccess) {
+      _newOperator =
+          node.operator.type == TokenType.QUESTION_PERIOD ? '.' : '..';
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleReplacement(range.token(node.operator), _newOperator);
+      });
+    } else if (node is IndexExpression) {
+      if (node.period != null) {
+        _newOperator = '..';
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addSimpleReplacement(range.token(node.period), '..');
+        });
+      } else if (node.question != null) {
+        _newOperator = '[';
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addDeletion(range.token(node.question));
+        });
+      }
+    } else if (node is SpreadElement) {
+      _newOperator = '...';
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleReplacement(
+            range.token(node.spreadOperator), _newOperator);
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ReplaceWithNotNullAware newInstance() => ReplaceWithNotNullAware();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 83b5c92..0f67130 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -315,6 +315,8 @@
   static const MAKE_FIELD_NOT_FINAL =
       FixKind('dart.fix.makeFieldNotFinal', 50, "Make field '{0}' not final");
   static const MAKE_FINAL = FixKind('dart.fix.makeFinal', 50, 'Make final');
+  static const MAKE_RETURN_TYPE_NULLABLE = FixKind(
+      'dart.fix.makeReturnTypeNullable', 50, 'Make the return type nullable');
   static const MOVE_TYPE_ARGUMENTS_TO_CLASS = FixKind(
       'dart.fix.moveTypeArgumentsToClass',
       50,
@@ -446,6 +448,8 @@
       FixKind('dart.fix.replace.withIsEmpty', 50, "Replace with 'isEmpty'");
   static const REPLACE_WITH_IS_NOT_EMPTY = FixKind(
       'dart.fix.replace.withIsNotEmpty', 50, "Replace with 'isNotEmpty'");
+  static const REPLACE_WITH_NOT_NULL_AWARE =
+      FixKind('dart.fix.replace.withNotNullAware', 50, "Replace with '{0}'");
   static const REPLACE_WITH_NULL_AWARE = FixKind(
       'dart.fix.replace.withNullAware',
       50,
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 17d2049..ec4ab2e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -79,6 +79,7 @@
 import 'package:analysis_server/src/services/correction/dart/make_class_abstract.dart';
 import 'package:analysis_server/src/services/correction/dart/make_field_not_final.dart';
 import 'package:analysis_server/src/services/correction/dart/make_final.dart';
+import 'package:analysis_server/src/services/correction/dart/make_return_type_nullable.dart';
 import 'package:analysis_server/src/services/correction/dart/make_variable_not_final.dart';
 import 'package:analysis_server/src/services/correction/dart/move_type_arguments_to_class.dart';
 import 'package:analysis_server/src/services/correction/dart/organize_imports.dart';
@@ -132,6 +133,7 @@
 import 'package:analysis_server/src/services/correction/dart/replace_with_identifier.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_interpolation.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_is_empty.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_with_not_null_aware.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_null_aware.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_tear_off.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
@@ -750,6 +752,12 @@
     CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE: [
       RemoveQuestionMark.newInstance,
     ],
+    CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION: [
+      MakeReturnTypeNullable.newInstance,
+    ],
+    CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD: [
+      MakeReturnTypeNullable.newInstance,
+    ],
     CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME: [
       ChangeTo.classOrMixin,
       CreateClass.newInstance,
@@ -842,6 +850,9 @@
       MoveTypeArgumentsToClass.newInstance,
       RemoveTypeArguments.newInstance,
     ],
+    CompileTimeErrorCode.YIELD_OF_INVALID_TYPE: [
+      MakeReturnTypeNullable.newInstance,
+    ],
 
     HintCode.CAN_BE_NULL_AFTER_NULL_AWARE: [
       ReplaceWithNullAware.newInstance,
@@ -1004,6 +1015,9 @@
     StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION: [
       RemoveDeadIfNull.newInstance,
     ],
+    StaticWarningCode.INVALID_NULL_AWARE_OPERATOR: [
+      ReplaceWithNotNullAware.newInstance,
+    ],
     StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH: [
       AddMissingEnumCaseClauses.newInstance,
     ],
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index c7f167f..d5a48c5 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -16,6 +16,7 @@
   static const _nameCenter = 'Center';
   static const _nameContainer = 'Container';
   static const _namePadding = 'Padding';
+  static const _nameSizedBox = 'SizedBox';
   static const _nameState = 'State';
   static const _nameStatefulWidget = 'StatefulWidget';
   static const _nameStatelessWidget = 'StatelessWidget';
@@ -450,6 +451,12 @@
         _isExactWidget(type.element, _namePadding, _uriBasic);
   }
 
+  /// Return `true` if the given [type] is the Flutter class `SizedBox`.
+  bool isExactWidgetTypeSizedBox(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameSizedBox, _uriBasic);
+  }
+
   /// Return `true` if the given [type] is the Flutter class `StreamBuilder`.
   bool isExactWidgetTypeStreamBuilder(DartType type) {
     return type is InterfaceType &&
diff --git a/pkg/analysis_server/test/lsp/reanalyze_test.dart b/pkg/analysis_server/test/lsp/reanalyze_test.dart
new file mode 100644
index 0000000..69afce8
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/reanalyze_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2020, 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/lsp_protocol/protocol_generated.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReanalyzeTest);
+  });
+}
+
+@reflectiveTest
+class ReanalyzeTest extends AbstractLspAnalysisServerTest {
+  Future<void> test_reanalyze() async {
+    const initialContents = 'int a = 1;';
+    newFile(mainFilePath, content: initialContents);
+
+    final initialAnalysis = waitForAnalysisComplete();
+
+    await initialize();
+    await initialAnalysis;
+
+    // Set up futures to wait for the new events.
+    final startNotification = waitForAnalysisStart();
+    final completeNotification = waitForAnalysisComplete();
+
+    final request = makeRequest(Method.fromJson(r'dart/reanalyze'), null);
+    await channel.sendRequestToServer(request);
+
+    // Ensure the notifications come through again.
+    await startNotification;
+    await completeNotification;
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index 0870436..628b142 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -30,6 +30,7 @@
 import 'mapping_test.dart' as mapping;
 import 'outline_test.dart' as outline;
 import 'priority_files_test.dart' as priority_files;
+import 'reanalyze_test.dart' as reanalyze;
 import 'references_test.dart' as references;
 import 'rename_test.dart' as rename;
 import 'server_test.dart' as server;
@@ -66,6 +67,7 @@
     mapping.main();
     outline.main();
     priority_files.main();
+    reanalyze.main();
     references.main();
     rename.main();
     server.main();
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
index 761a15c..68ecbc6 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
@@ -65,6 +65,30 @@
   const Center({Key key, double heightFactor, Widget child});
 }
 
+class SizedBox extends SingleChildRenderObjectWidget {
+  const SizedBox({Key key, this.width, this.height, Widget child})
+      : super(key: key, child: child);
+
+  const SizedBox.expand({Key key, Widget child})
+      : width = double.infinity,
+        height = double.infinity,
+        super(key: key, child: child);
+
+  const SizedBox.shrink({Key key, Widget child})
+      : width = 0.0,
+        height = 0.0,
+        super(key: key, child: child);
+
+  SizedBox.fromSize({Key key, Widget child, Size size})
+      : width = size?.width,
+        height = size?.height,
+        super(key: key, child: child);
+
+  final double width;
+
+  final double height;
+}
+
 class ClipRect extends SingleChildRenderObjectWidget {
   const ClipRect({Key key, Widget child}) : super(key: key, child: child);
 
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 203a14c..93e5edc 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -76,7 +76,6 @@
       bool includeColon = true,
       bool includeComma = false}) {
     var expected = <CompletionSuggestion>[];
-    var paramIndex = 0;
     namedArgumentsWithTypes.forEach((String name, String type) {
       var completion = includeColon ? '$name: ' : name;
       // Selection should be before any trailing commas.
@@ -84,12 +83,8 @@
       if (includeComma) {
         completion = '$completion,';
       }
-      var relevance = requiredParamIndices.contains(paramIndex++)
-          ? DART_RELEVANCE_NAMED_PARAMETER_REQUIRED
-          : DART_RELEVANCE_NAMED_PARAMETER;
       expected.add(assertSuggest(completion,
           csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          relevance: relevance,
           paramName: name,
           paramType: type,
           selectionOffset: selectionOffset));
@@ -106,7 +101,6 @@
           suggestion.endsWith(',') ? suggestion.length - 1 : suggestion.length;
       expected.add(assertSuggest('$suggestion',
           csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          relevance: DART_RELEVANCE_NAMED_PARAMETER,
           selectionOffset: selectionOffset));
     }
     assertNoOtherSuggestions(expected);
@@ -253,7 +247,6 @@
 
     assertSuggest(
       '(a, b) => ,',
-      relevance: DART_RELEVANCE_HIGH,
       selectionOffset: 10,
     );
 
@@ -349,7 +342,6 @@
 
     assertSuggest(
       '(a, {b, c}) => ,',
-      relevance: DART_RELEVANCE_HIGH,
       selectionOffset: 15,
     );
   }
@@ -382,7 +374,6 @@
 
     assertSuggest(
       '(a, [b, c]) => ,',
-      relevance: DART_RELEVANCE_HIGH,
       selectionOffset: 15,
     );
   }
@@ -402,7 +393,6 @@
 
     assertSuggest('children: [],',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null,
         selectionOffset: 11,
         defaultArgumentListTextRanges: null);
@@ -425,7 +415,6 @@
 
     assertSuggest('backgroundColor: ,',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null, // No default values.
         selectionOffset: 17);
   }
@@ -446,7 +435,6 @@
 
     assertSuggest('children: [],',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null,
         selectionOffset: 11,
         defaultArgumentListTextRanges: null);
@@ -468,7 +456,6 @@
 
     assertSuggest('children: [],',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null,
         selectionOffset: 11,
         defaultArgumentListTextRanges: null);
@@ -496,7 +483,6 @@
 
     assertSuggest('children: [],',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null,
         selectionOffset: 11,
         defaultArgumentListTextRanges: null);
@@ -523,7 +509,6 @@
 
     assertSuggest('children: ,',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         selectionOffset: 10,
         defaultArgListString: null);
   }
@@ -548,7 +533,6 @@
 
     assertSuggest('slivers: [],',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null,
         selectionOffset: 10,
         defaultArgumentListTextRanges: null);
@@ -575,7 +559,6 @@
 
     assertSuggest('children: ',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null);
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index f984fb0..f5faa6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -55,15 +55,9 @@
       class X {}''');
 
     await computeSuggestions();
-    assertSuggestClass('A',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestClass('B',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestClass('PB',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('PB', kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestTopLevelVar('T1', null,
         kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestFunction('F1', 'PB',
@@ -104,23 +98,15 @@
       class X {}''');
 
     await computeSuggestions();
-    assertSuggestClass('A',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestClass('B',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('_AB');
-    assertSuggestClass('PB',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('PB', kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestTopLevelVar('T1', null,
         kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestFunction('F1', 'PB',
         kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestClass('Clz',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('Clz', kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestFunctionTypeAlias('F2', null,
         kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('C');
@@ -147,9 +133,7 @@
 import 'b.dart' show ^;
 ''');
     await computeSuggestions();
-    assertSuggestClass('A',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('B');
   }
 
@@ -173,11 +157,7 @@
 import "b.dart" show ^;
 ''');
     await computeSuggestions();
-    assertSuggestClass('A',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
-    assertSuggestClass('B',
-        relevance: DART_RELEVANCE_DEFAULT,
-        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER);
+    assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 2242171..d326ca1 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -183,7 +183,6 @@
 
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind = CompletionSuggestionKind.INVOCATION,
-      int relevance,
       ElementKind elemKind,
       bool isDeprecated = false,
       bool isPotential = false,
@@ -202,11 +201,6 @@
       failedCompletion('expected $completion $csKind $elemKind', suggestions);
     }
     expect(cs.kind, equals(csKind));
-    // todo (pq): remove when all relevance tests have been migrated
-    // see: https://github.com/dart-lang/sdk/issues/40104
-    if (relevance != null) {
-      expect(cs.relevance, equals(relevance), reason: completion);
-    }
     expect(cs.selectionOffset, equals(selectionOffset ?? completion.length));
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
@@ -241,15 +235,13 @@
   }
 
   CompletionSuggestion assertSuggestClass(String name,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
       String elemFile,
       String elemName,
       int elemOffset}) {
     var cs = assertSuggest(name,
         csKind: kind,
-        relevance: relevance,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemKind: ElementKind.CLASS,
@@ -265,9 +257,8 @@
   }
 
   CompletionSuggestion assertSuggestClassTypeAlias(String name,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
-    var cs = assertSuggest(name, csKind: kind, relevance: relevance);
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    var cs = assertSuggest(name, csKind: kind);
     var element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.CLASS_TYPE_ALIAS));
@@ -279,13 +270,11 @@
   }
 
   CompletionSuggestion assertSuggestConstructor(String name,
-      {int relevance,
-      String elementName,
+      {String elementName,
       int elemOffset,
       String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
-        relevance: relevance,
         elemKind: ElementKind.CONSTRUCTOR,
         elemOffset: elemOffset,
         defaultArgListString: defaultArgListString,
@@ -308,19 +297,8 @@
   }
 
   CompletionSuggestion assertSuggestEnumConst(String completion,
-      {int relevance = DART_RELEVANCE_DEFAULT,
-      bool isDeprecated = false,
-      bool hasTypeBoost = false}) {
-    // todo (pq): remove when all relevance tests have been migrated
-    // see: https://github.com/dart-lang/sdk/issues/40104
-    if (isDeprecated) {
-      relevance = DART_RELEVANCE_LOW;
-    }
-    if (hasTypeBoost) {
-      relevance += DART_RELEVANCE_BOOST_TYPE;
-    }
-    var suggestion = assertSuggest(completion,
-        relevance: relevance, isDeprecated: isDeprecated);
+      {bool isDeprecated = false}) {
+    var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
     expect(suggestion.completion, completion);
     expect(suggestion.isDeprecated, isDeprecated);
     expect(suggestion.element.kind, ElementKind.ENUM_CONSTANT);
@@ -328,14 +306,10 @@
   }
 
   CompletionSuggestion assertSuggestField(String name, String type,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
     var cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        elemKind: ElementKind.FIELD,
-        isDeprecated: isDeprecated);
+        csKind: kind, elemKind: ElementKind.FIELD, isDeprecated: isDeprecated);
     // The returnType represents the type of a field
     expect(cs.returnType, type ?? 'dynamic');
     var element = cs.element;
@@ -352,12 +326,10 @@
   CompletionSuggestion assertSuggestFunction(String name, String returnType,
       {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
-      int relevance,
       String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     var cs = assertSuggest(name,
         csKind: kind,
-        relevance: relevance,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -388,11 +360,9 @@
     String name,
     String returnType, {
     bool isDeprecated = false,
-    int relevance,
     CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
-    var cs = assertSuggest(name,
-        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
+    var cs = assertSuggest(name, csKind: kind, isDeprecated: isDeprecated);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -417,14 +387,10 @@
   }
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false}) {
     var cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        elemKind: ElementKind.GETTER,
-        isDeprecated: isDeprecated);
+        csKind: kind, elemKind: ElementKind.GETTER, isDeprecated: isDeprecated);
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element;
     expect(element, isNotNull);
@@ -437,18 +403,9 @@
   }
 
   CompletionSuggestion assertSuggestLocalVariable(
-      String name, String returnType,
-      {int relevance = DART_RELEVANCE_LOCAL_VARIABLE,
-      bool hasTypeBoost = false,
-      bool hasSubtypeBoost = false}) {
-    if (hasTypeBoost) {
-      relevance += DART_RELEVANCE_BOOST_TYPE;
-    } else if (hasSubtypeBoost) {
-      relevance += DART_RELEVANCE_BOOST_SUBTYPE;
-    }
+      String name, String returnType) {
     // Local variables should only be suggested by LocalReferenceContributor
-    var cs = assertSuggest(name,
-        csKind: CompletionSuggestionKind.INVOCATION, relevance: relevance);
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element;
     expect(element, isNotNull);
@@ -462,15 +419,13 @@
 
   CompletionSuggestion assertSuggestMethod(
       String name, String declaringType, String returnType,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
       String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges,
       bool skipLocationCheck = false}) {
     var cs = assertSuggest(name,
         csKind: kind,
-        relevance: relevance,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges,
@@ -491,15 +446,13 @@
   }
 
   CompletionSuggestion assertSuggestMixin(String name,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
       bool isDeprecated = false,
       String elemFile,
       String elemName,
       int elemOffset}) {
     var cs = assertSuggest(name,
         csKind: kind,
-        relevance: relevance,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemKind: ElementKind.MIXIN,
@@ -515,21 +468,17 @@
   }
 
   CompletionSuggestion assertSuggestName(String name,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER,
       bool isDeprecated = false}) {
-    var cs = assertSuggest(name,
-        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
+    var cs = assertSuggest(name, csKind: kind, isDeprecated: isDeprecated);
     expect(cs.completion, equals(name));
     expect(cs.element, isNull);
     assertHasNoParameterInfo(cs);
     return cs;
   }
 
-  CompletionSuggestion assertSuggestParameter(String name, String returnType,
-      {int relevance = DART_RELEVANCE_PARAMETER}) {
-    var cs = assertSuggest(name,
-        csKind: CompletionSuggestionKind.INVOCATION, relevance: relevance);
+  CompletionSuggestion assertSuggestParameter(String name, String returnType) {
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
     expect(cs.returnType, returnType ?? 'dynamic');
     var element = cs.element;
     expect(element, isNotNull);
@@ -541,10 +490,8 @@
   }
 
   CompletionSuggestion assertSuggestSetter(String name,
-      {int relevance,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
-    var cs = assertSuggest(name,
-        csKind: kind, relevance: relevance, elemKind: ElementKind.SETTER);
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    var cs = assertSuggest(name, csKind: kind, elemKind: ElementKind.SETTER);
     var element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.SETTER));
@@ -562,10 +509,9 @@
   CompletionSuggestion assertSuggestTopLevelVar(
     String name,
     String returnType, {
-    int relevance,
     CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
-    var cs = assertSuggest(name, csKind: kind, relevance: relevance);
+    var cs = assertSuggest(name, csKind: kind);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -585,10 +531,8 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestTypeParameter(String name,
-      {int relevance = DART_RELEVANCE_TYPE_PARAMETER}) {
-    var cs = assertSuggest(name,
-        csKind: CompletionSuggestionKind.IDENTIFIER, relevance: relevance);
+  CompletionSuggestion assertSuggestTypeParameter(String name) {
+    var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
     expect(cs.returnType, isNull);
     var element = cs.element;
     expect(element, isNotNull);
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
index 9c45414..d28095f 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
@@ -50,8 +50,8 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('sb');
     assertNotSuggested('d');
     assertNotSuggested('_e');
@@ -86,8 +86,8 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('d');
     assertNotSuggested('_e');
     assertNotSuggested('f');
@@ -121,8 +121,8 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 1);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('d');
     assertNotSuggested('_e');
     assertNotSuggested('f');
@@ -157,7 +157,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertNotSuggested('b');
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('d');
     assertNotSuggested('_e');
     assertNotSuggested('f');
@@ -186,7 +186,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('y', 'int', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('y', 'int');
     assertNotSuggested('x');
   }
 
@@ -202,7 +202,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('y', 'int', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('y', 'int');
     assertNotSuggested('x');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index b043bd3..7e7ce51 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -1018,8 +1018,7 @@
     assertNotSuggested('_B');
     // hidden element not suggested
     assertNotSuggested('D');
-    assertSuggestFunction('D1', 'dynamic',
-        isDeprecated: true, relevance: DART_RELEVANCE_LOW);
+    assertSuggestFunction('D1', 'dynamic', isDeprecated: true);
     assertNotSuggested('D2');
     // Not imported, so not suggested
     assertNotSuggested('D3');
@@ -1873,8 +1872,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2769,15 +2768,9 @@
 ''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 32b6dc8..b651d8a 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -385,7 +385,12 @@
   }
 
   List<Keyword> get staticMember {
-    var keywords = <Keyword>[Keyword.CONST, Keyword.COVARIANT, Keyword.FINAL];
+    var keywords = <Keyword>[
+      Keyword.ABSTRACT,
+      Keyword.CONST,
+      Keyword.COVARIANT,
+      Keyword.FINAL
+    ];
     if (isEnabled(ExperimentalFeatures.non_nullable)) {
       keywords.add(Keyword.LATE);
     }
@@ -393,8 +398,7 @@
   }
 
   void assertSuggestKeywords(Iterable<Keyword> expectedKeywords,
-      {List<String> pseudoKeywords = NO_PSEUDO_KEYWORDS,
-      int relevance = DART_RELEVANCE_KEYWORD}) {
+      {List<String> pseudoKeywords = NO_PSEUDO_KEYWORDS}) {
     var expectedCompletions = <String>{};
     var expectedOffsets = <String, int>{};
     var actualCompletions = <String>{};
@@ -431,16 +435,6 @@
     }
     for (var s in suggestions) {
       if (s.kind == CompletionSuggestionKind.KEYWORD) {
-        if (s.completion.startsWith(Keyword.IMPORT.lexeme)) {
-          var importRelevance = relevance;
-          expect(s.relevance, equals(importRelevance), reason: s.completion);
-        } else {
-          if (s.completion == Keyword.RETHROW.lexeme) {
-            expect(s.relevance, equals(relevance - 1), reason: s.completion);
-          } else {
-            expect(s.relevance, equals(relevance), reason: s.completion);
-          }
-        }
         var expectedOffset = expectedOffsets[s.completion];
         expectedOffset ??= s.completion.length;
         expect(
@@ -467,35 +461,31 @@
   Future<void> test_after_class_noPrefix() async {
     addTestSource('class A {} ^');
     await computeSuggestions();
-    assertSuggestKeywords(declarationKeywords, relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(declarationKeywords);
   }
 
   Future<void> test_after_class_prefix() async {
     addTestSource('class A {} c^');
     await computeSuggestions();
-    assertSuggestKeywords(declarationKeywords, relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(declarationKeywords);
   }
 
   Future<void> test_after_import_noPrefix() async {
     addTestSource('import "foo"; ^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveAndDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveAndDeclarationKeywords);
   }
 
   Future<void> test_after_import_prefix() async {
     addTestSource('import "foo"; c^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveAndDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveAndDeclarationKeywords);
   }
 
   Future<void> test_anonymous_function_async() async {
     addTestSource('main() {foo(() ^ {}}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_anonymous_function_async2() async {
@@ -505,9 +495,7 @@
     // and reports a single function expression argument
     // while analyzer adds the closing paren before the `a`
     // and adds synthetic `;`s making `a` a statement.
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_anonymous_function_async3() async {
@@ -519,8 +507,7 @@
   Future<void> test_anonymous_function_async4() async {
     addTestSource('main() {foo(() ^ => 2}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async']);
   }
 
   Future<void> test_anonymous_function_async5() async {
@@ -533,9 +520,7 @@
   Future<void> test_anonymous_function_async6() async {
     addTestSource('main() {foo("bar", () as^{}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_anonymous_function_async7() async {
@@ -543,16 +528,13 @@
     await computeSuggestions();
     assertSuggestKeywords([],
         pseudoKeywords:
-            usingFastaParser ? ['async'] : ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+            usingFastaParser ? ['async'] : ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_anonymous_function_async8() async {
     addTestSource('main() {foo(() ^ {})}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_anonymous_function_async9() async {
@@ -560,9 +542,7 @@
     await computeSuggestions();
     // Fasta interprets the argument as a function expression
     // while analyzer adds synthetic `;`s making `a` a statement.
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_argument() async {
@@ -643,8 +623,7 @@
     addTestSource('^ import foo;');
     await computeSuggestions();
     assertSuggestKeywords(
-        [Keyword.EXPORT, Keyword.IMPORT, Keyword.LIBRARY, Keyword.PART],
-        relevance: DART_RELEVANCE_HIGH);
+        [Keyword.EXPORT, Keyword.IMPORT, Keyword.LIBRARY, Keyword.PART]);
   }
 
   Future<void> test_catch_1a() async {
@@ -848,8 +827,7 @@
   Future<void> test_class() async {
     addTestSource('class A e^ { }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_body() async {
@@ -906,22 +884,19 @@
   Future<void> test_class_extends() async {
     addTestSource('class A extends foo ^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH]);
   }
 
   Future<void> test_class_extends2() async {
     addTestSource('class A extends foo i^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH]);
   }
 
   Future<void> test_class_extends3() async {
     addTestSource('class A extends foo i^ { }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH]);
   }
 
   Future<void> test_class_extends_name() async {
@@ -933,27 +908,23 @@
   Future<void> test_class_implements() async {
     addTestSource('class A ^ implements foo');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.EXTENDS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS]);
   }
 
   Future<void> test_class_implements2() async {
     addTestSource('class A e^ implements foo');
     await computeSuggestions();
-    assertSuggestKeywords(
-        usingFastaParser
-            ? [Keyword.EXTENDS]
-            : [Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(usingFastaParser
+        ? [Keyword.EXTENDS]
+        : [Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_implements3() async {
     addTestSource('class A e^ implements foo { }');
     await computeSuggestions();
-    assertSuggestKeywords(
-        usingFastaParser
-            ? [Keyword.EXTENDS]
-            : [Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(usingFastaParser
+        ? [Keyword.EXTENDS]
+        : [Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_implements_name() async {
@@ -991,40 +962,37 @@
   Future<void> test_class_noBody() async {
     addTestSource('class A ^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_noBody2() async {
     addTestSource('class A e^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_noBody3() async {
     addTestSource('class A e^ String foo;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_with() async {
     addTestSource('class A extends foo with bar ^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_with2() async {
     addTestSource('class A extends foo with bar i^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_with3() async {
     addTestSource('class A extends foo with bar i^ { }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_class_with_name() async {
@@ -1074,22 +1042,19 @@
   Future<void> test_do_break_continue_insideClass() async {
     addTestSource('class A {foo() {do {^} while (true);}}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopInClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopInClass);
   }
 
   Future<void> test_do_break_continue_outsideClass() async {
     addTestSource('main() {do {^} while (true);}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopOutsideClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopOutsideClass);
   }
 
   Future<void> test_empty() async {
     addTestSource('^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_extension_body_beginning() async {
@@ -1133,39 +1098,37 @@
   Future<void> test_extension_noBody_named() async {
     addTestSource('extension E ^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.ON], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.ON]);
   }
 
   Future<void> test_extension_noBody_unnamed() async {
     addTestSource('extension ^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.ON], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.ON]);
   }
 
   Future<void> test_for_break_continue_insideClass() async {
     addTestSource('class A {foo() {for (int x in myList) {^}}}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopInClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopInClass);
   }
 
   Future<void> test_for_break_continue_outsideClass() async {
     addTestSource('main() {for (int x in myList) {^}}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopOutsideClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopOutsideClass);
   }
 
   Future<void> test_for_expression_in() async {
     addTestSource('main() {for (int x i^)}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IN], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IN]);
   }
 
   Future<void> test_for_expression_in2() async {
     addTestSource('main() {for (int x in^)}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IN], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IN]);
   }
 
   Future<void> test_for_expression_in_inInitializer() async {
@@ -1189,47 +1152,39 @@
   Future<void> test_for_initialization_var() async {
     addTestSource('main() {for (^)}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.VAR], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.VAR]);
   }
 
   Future<void> test_function_async() async {
     addTestSource('main()^');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_function_async2() async {
     addTestSource('main()^{}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_function_async3() async {
     addTestSource('main()a^');
     await computeSuggestions();
     assertSuggestKeywords(declarationKeywords,
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_function_async4() async {
     addTestSource('main()a^{}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_function_async5() async {
     addTestSource('main()a^ Foo foo;');
     await computeSuggestions();
     assertSuggestKeywords(declarationKeywords,
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_function_body_inClass_constructorInitializer() async {
@@ -1399,8 +1354,7 @@
   Future<void> test_if_after_else() async {
     addTestSource('main() { if (true) {} else ^ }');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartOutsideClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartOutsideClass);
   }
 
   Future<void> test_if_afterThen_nextCloseCurlyBrace0() async {
@@ -1409,7 +1363,7 @@
     var keywords = <Keyword>[];
     keywords.addAll(statementStartOutsideClass);
     keywords.add(Keyword.ELSE);
-    assertSuggestKeywords(keywords, relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(keywords);
   }
 
   Future<void> test_if_afterThen_nextCloseCurlyBrace1() async {
@@ -1418,7 +1372,7 @@
     var keywords = <Keyword>[];
     keywords.addAll(statementStartOutsideClass);
     keywords.add(Keyword.ELSE);
-    assertSuggestKeywords(keywords, relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(keywords);
   }
 
   Future<void> test_if_afterThen_nextStatement0() async {
@@ -1427,19 +1381,19 @@
     var keywords = <Keyword>[];
     keywords.addAll(statementStartOutsideClass);
     keywords.add(Keyword.ELSE);
-    assertSuggestKeywords(keywords, relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(keywords);
   }
 
   Future<void> test_if_condition_isKeyword() async {
     addTestSource('main() { if (v i^) {} }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IS]);
   }
 
   Future<void> test_if_condition_isKeyword2() async {
     addTestSource('main() { if (v i^ && false) {} }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IS]);
   }
 
   Future<void> test_if_expression_in_class() async {
@@ -1637,115 +1591,104 @@
   Future<void> test_import() async {
     addTestSource('import "foo" deferred as foo ^;');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['show', 'hide'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['show', 'hide']);
   }
 
   Future<void> test_import_as() async {
     addTestSource('import "foo" deferred ^;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.AS]);
   }
 
   Future<void> test_import_as2() async {
     addTestSource('import "foo" deferred a^;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.AS]);
   }
 
   Future<void> test_import_as3() async {
     addTestSource('import "foo" deferred a^');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.AS]);
   }
 
   Future<void> test_import_deferred() async {
     addTestSource('import "foo" ^ as foo;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.DEFERRED]);
   }
 
   Future<void> test_import_deferred2() async {
     addTestSource('import "foo" d^ as foo;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.DEFERRED]);
   }
 
   Future<void> test_import_deferred3() async {
     addTestSource('import "foo" d^ show foo;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.AS], pseudoKeywords: ['deferred as']);
   }
 
   Future<void> test_import_deferred4() async {
     addTestSource('import "foo" d^ hide foo;');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.AS], pseudoKeywords: ['deferred as']);
   }
 
   Future<void> test_import_deferred5() async {
     addTestSource('import "foo" d^');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred6() async {
     addTestSource('import "foo" d^ import');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_as() async {
     addTestSource('import "foo" ^;');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_as2() async {
     addTestSource('import "foo" d^;');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_as3() async {
     addTestSource('import "foo" ^');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_as4() async {
     addTestSource('import "foo" d^');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_as5() async {
     addTestSource('import "foo" sh^ import "bar"; import "baz";');
     await computeSuggestions();
     assertSuggestKeywords([Keyword.AS],
-        pseudoKeywords: ['deferred as', 'show', 'hide'],
-        relevance: DART_RELEVANCE_HIGH);
+        pseudoKeywords: ['deferred as', 'show', 'hide']);
   }
 
   Future<void> test_import_deferred_not() async {
     addTestSource('import "foo" as foo ^;');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['show', 'hide'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['show', 'hide']);
   }
 
   Future<void> test_import_deferred_partial() async {
@@ -1753,7 +1696,7 @@
     await computeSuggestions();
     expect(replacementOffset, 30);
     expect(replacementLength, 3);
-    assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.DEFERRED]);
     expect(suggestions[0].selectionOffset, 8);
     expect(suggestions[0].selectionLength, 0);
   }
@@ -1770,8 +1713,7 @@
     expect(replacementOffset, 0);
     expect(replacementLength, 3);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_import_partial2() async {
@@ -1780,8 +1722,7 @@
     expect(replacementOffset, 0);
     expect(replacementLength, 3);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_import_partial3() async {
@@ -1790,8 +1731,7 @@
     expect(replacementOffset, 1);
     expect(replacementLength, 3);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_import_partial4() async {
@@ -1800,8 +1740,7 @@
     expect(replacementOffset, 0);
     expect(replacementLength, 0);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_import_partial5() async {
@@ -1810,8 +1749,7 @@
     expect(replacementOffset, 14);
     expect(replacementLength, 3);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationKeywords);
   }
 
   Future<void> test_import_partial6() async {
@@ -1821,8 +1759,7 @@
     expect(replacementOffset, 32);
     expect(replacementLength, 3);
     // TODO(danrubel) should not suggest declaration keywords
-    assertSuggestKeywords(directiveDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationKeywords);
   }
 
   Future<void> test_integerLiteral_inArgumentList() async {
@@ -1840,20 +1777,19 @@
   Future<void> test_is_expression() async {
     addTestSource('main() {if (x is^)}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IS]);
   }
 
   Future<void> test_is_expression_partial() async {
     addTestSource('main() {if (x i^)}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IS]);
   }
 
   Future<void> test_library() async {
     addTestSource('library foo;^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveAndDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveAndDeclarationKeywords);
   }
 
   Future<void> test_library_declaration() async {
@@ -1890,9 +1826,7 @@
   Future<void> test_method_async2() async {
     addTestSource('class A { foo() ^{}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_method_async3() async {
@@ -1905,9 +1839,7 @@
   Future<void> test_method_async4() async {
     addTestSource('class A { foo() a^{}}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async', 'async*', 'sync*'],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
   Future<void> test_method_async5() async {
@@ -1927,8 +1859,7 @@
   Future<void> test_method_async7() async {
     addTestSource('class A { foo() ^ => Foo foo;}');
     await computeSuggestions();
-    assertSuggestKeywords([],
-        pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([], pseudoKeywords: ['async']);
   }
 
   Future<void> test_method_async8() async {
@@ -2109,14 +2040,13 @@
   Future<void> test_mixin() async {
     addTestSource('mixin M o^ { }');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.ON, Keyword.IMPLEMENTS],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.ON, Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_mixin_afterOnClause() async {
     addTestSource('mixin M on A i^ { } class A {}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.IMPLEMENTS]);
   }
 
   Future<void> test_named_constructor_invocation() async {
@@ -2152,22 +2082,19 @@
   Future<void> test_part_of() async {
     addTestSource('part of foo;^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveAndDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveAndDeclarationKeywords);
   }
 
   Future<void> test_partial_class() async {
     addTestSource('cl^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveDeclarationAndLibraryKeywords);
   }
 
   Future<void> test_partial_class2() async {
     addTestSource('library a; cl^');
     await computeSuggestions();
-    assertSuggestKeywords(directiveAndDeclarationKeywords,
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords(directiveAndDeclarationKeywords);
   }
 
   Future<void> test_prefixed_field() async {
@@ -2235,29 +2162,25 @@
   Future<void> test_switch_start() async {
     addTestSource('main() {switch(1) {^}}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start2() async {
     addTestSource('main() {switch(1) {^ case 1:}}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start3() async {
     addTestSource('main() {switch(1) {^default:}}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start4() async {
     addTestSource('main() {switch(1) {^ default:}}');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start5() async {
@@ -2265,8 +2188,7 @@
     await computeSuggestions();
     expect(replacementOffset, 19);
     expect(replacementLength, 1);
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start6() async {
@@ -2274,8 +2196,7 @@
     await computeSuggestions();
     expect(replacementOffset, 19);
     expect(replacementLength, 1);
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_start7() async {
@@ -2283,8 +2204,7 @@
     await computeSuggestions();
     expect(replacementOffset, 20);
     expect(replacementLength, 1);
-    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT],
-        relevance: DART_RELEVANCE_HIGH);
+    assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT]);
   }
 
   Future<void> test_switch_statement_case_break_insideClass() async {
@@ -2320,15 +2240,13 @@
   Future<void> test_while_break_continue() async {
     addTestSource('main() {while (true) {^}}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopOutsideClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopOutsideClass);
   }
 
   Future<void> test_while_break_continue2() async {
     addTestSource('class A {foo() {while (true) {^}}}');
     await computeSuggestions();
-    assertSuggestKeywords(statementStartInLoopInClass,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(statementStartInLoopInClass);
   }
 
   void _appendCompletions(
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index 7d420a4..6e8832b 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
@@ -19,9 +19,8 @@
 @reflectiveTest
 class LabelContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestLabel(String name,
-      {int relevance = DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
-    var cs = assertSuggest(name, csKind: kind, relevance: relevance);
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
+    var cs = assertSuggest(name, csKind: kind);
     expect(cs.returnType, isNull);
     var element = cs.element;
     expect(element, isNotNull);
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index f9de3eb..1f1a333 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -121,7 +121,7 @@
     addTestSource('import "b.dart" as foo; main() {foo.^} class C { }');
     await computeSuggestions();
     assertSuggestClass('B');
-    assertSuggestClass('B1', relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    assertSuggestClass('B1', isDeprecated: true);
     assertSuggestClass('A');
     assertNotSuggested('C');
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index 7d13c2d..0cdcb90 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -20,9 +20,8 @@
 class LibraryPrefixContributorTest extends DartCompletionContributorTest {
   void assertSuggestLibraryPrefixes(List<String> expectedPrefixes) {
     for (var prefix in expectedPrefixes) {
-      var cs = assertSuggest(prefix,
-          csKind: CompletionSuggestionKind.IDENTIFIER,
-          relevance: DART_RELEVANCE_DEFAULT);
+      var cs =
+          assertSuggest(prefix, csKind: CompletionSuggestionKind.IDENTIFIER);
       var element = cs.element;
       expect(element, isNotNull);
       expect(element.kind, equals(ElementKind.LIBRARY));
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index 498d1f2..e6724b6 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -133,15 +133,9 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     // A is suggested with a higher relevance
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     // D has the default relevance
     assertSuggestConstructor('D', elemOffset: -1);
 
@@ -184,15 +178,9 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     // A is suggested with a higher relevance
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     // D has the default relevance
     assertSuggestConstructor('D', elemOffset: -1);
 
@@ -235,12 +223,9 @@
     if (suggestConstructorsWithoutNew) {
       assertSuggestConstructor('A');
     }
-    assertSuggestFunction('af', 'int',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestTopLevelVar('m', null,
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestFunctionTypeAlias('t1', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('af', 'int');
+    assertSuggestTopLevelVar('m', null);
+    assertSuggestFunctionTypeAlias('t1', null);
     assertNotSuggested('a1');
     assertNotSuggested('a2');
     // Suggested by LocalConstructorContributor
@@ -281,12 +266,9 @@
     if (suggestConstructorsWithoutNew) {
       assertSuggestConstructor('B');
     }
-    assertSuggestFunction('bf', 'int',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestTopLevelVar('n', null,
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestFunctionTypeAlias('t1', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bf', 'int');
+    assertSuggestTopLevelVar('n', null);
+    assertSuggestFunctionTypeAlias('t1', null);
     assertNotSuggested('b1');
     assertNotSuggested('b2');
     // Suggested by ConstructorContributor
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 475f6e5..bb0f9a8 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -33,7 +33,6 @@
     await computeSuggestions();
 
     assertSuggestFunction('hasLength', 'bool',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
         defaultArgListString: 'a, b',
         defaultArgumentListTextRanges: [0, 1, 3, 1]);
   }
@@ -45,9 +44,7 @@
     await computeSuggestions();
 
     assertSuggestFunction('hasLength', 'bool',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
-        defaultArgListString: null,
-        defaultArgumentListTextRanges: null);
+        defaultArgListString: null, defaultArgumentListTextRanges: null);
   }
 
   Future<void> test_ArgDefaults_function_with_optional_positional() async {
@@ -60,9 +57,7 @@
     await computeSuggestions();
 
     assertSuggestFunction('foo', 'bool',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
-        defaultArgListString: 'bar',
-        defaultArgumentListTextRanges: [0, 3]);
+        defaultArgListString: 'bar', defaultArgumentListTextRanges: [0, 3]);
   }
 
   Future<void> test_ArgDefaults_function_with_required_named() async {
@@ -75,7 +70,6 @@
     await computeSuggestions();
 
     assertSuggestFunction('foo', 'bool',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
         defaultArgListString: 'bar, baz: null',
         defaultArgumentListTextRanges: [0, 3, 10, 4]);
   }
@@ -115,7 +109,6 @@
     await computeSuggestions();
 
     assertSuggestMethod('foo', 'A', 'bool',
-        relevance: DART_RELEVANCE_LOCAL_METHOD,
         defaultArgListString: 'bar, baz: null',
         defaultArgumentListTextRanges: [0, 3, 10, 4]);
   }
@@ -135,8 +128,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'String');
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B');
@@ -162,8 +154,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'String');
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B');
@@ -192,8 +183,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestFunction('bar', 'String',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
@@ -223,8 +213,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestFunction('bar', 'String',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
@@ -251,8 +240,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'String');
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B');
@@ -278,8 +266,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'String');
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B');
@@ -307,11 +294,9 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestFunction('bar', 'String',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
     assertSuggestFunction('boo', 'Null',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
@@ -339,14 +324,16 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance:
-            DART_RELEVANCE_LOCAL_FUNCTION + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestFunction('boo', 'Null',
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance:
-            DART_RELEVANCE_LOCAL_FUNCTION + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestFunction(
+      'bar',
+      'String',
+      kind: CompletionSuggestionKind.IDENTIFIER,
+    );
+    assertSuggestFunction(
+      'boo',
+      'Null',
+      kind: CompletionSuggestionKind.IDENTIFIER,
+    );
     assertNotSuggested('hasLength');
     assertNotSuggested('identical');
     assertSuggestClass('B', kind: CompletionSuggestionKind.IDENTIFIER);
@@ -426,8 +413,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('bar', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'String');
     assertNotSuggested('hasLength');
     assertNotSuggested('main');
   }
@@ -454,19 +440,11 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestTopLevelVar('a', 'A',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE +
-            DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestTopLevelVar('b', 'B',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE +
-            DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestTopLevelVar('c', 'C',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE +
-            DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestTopLevelVar('d', 'D',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestTopLevelVar('e', 'E',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('a', 'A');
+    assertSuggestTopLevelVar('b', 'B');
+    assertSuggestTopLevelVar('c', 'C');
+    assertSuggestTopLevelVar('d', 'D');
+    assertSuggestTopLevelVar('e', 'E');
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off() async {
@@ -629,9 +607,8 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestLocalVariable('a', 'int', hasTypeBoost: true);
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestLocalVariable('a', 'int');
+    assertSuggestFunction('main', null);
     assertSuggestClass('A');
     assertNotSuggested('Object');
   }
@@ -679,8 +656,7 @@
     // if newline follows first identifier
     // because user is probably starting a new statement
     assertSuggestLocalVariable('a', 'int');
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
     assertNotSuggested('identical');
   }
 
@@ -727,8 +703,7 @@
     // if newline follows first identifier
     // because user is probably starting a new statement
     assertSuggestLocalVariable('a', 'int');
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
     assertNotSuggested('identical');
   }
 
@@ -742,8 +717,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestLocalVariable('a', 'A');
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
     assertSuggestClass('A');
     assertNotSuggested('Object');
   }
@@ -760,8 +734,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestMethod('y', 'A', 'Future<dynamic>',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('y', 'A', 'Future<dynamic>');
     assertSuggestClass('A');
     assertNotSuggested('Object');
   }
@@ -804,7 +777,7 @@
     // The reason is that coveringNode is VariableDeclaration, and the
     // entity is BinaryExpression, so the expected type is int.
     // It would be more correct to use BinaryExpression as coveringNode.
-    assertSuggestLocalVariable('a', 'int', hasTypeBoost: true);
+    assertSuggestLocalVariable('a', 'int');
     assertNotSuggested('Object');
     assertNotSuggested('b');
   }
@@ -817,7 +790,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestLocalVariable('a', 'int', hasSubtypeBoost: true);
+    assertSuggestLocalVariable('a', 'int');
     assertNotSuggested('Object');
     assertNotSuggested('b');
     assertNotSuggested('==');
@@ -871,11 +844,9 @@
 
     assertSuggestClass('X', elemFile: testFile);
     assertSuggestClass('Z');
-    assertSuggestMethod('a', 'X', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
-    assertSuggestMethod('b', 'X', 'void',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
-    assertSuggestFunction('localF', 'Null',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestMethod('a', 'X', null);
+    assertSuggestMethod('b', 'X', 'void');
+    assertSuggestFunction('localF', 'Null');
     assertSuggestLocalVariable('f', null);
     // Don't suggest locals out of scope
     assertNotSuggested('r');
@@ -891,7 +862,7 @@
     //assertNotSuggested('D');
     //assertNotSuggested(
     //    'D1', null, true, COMPLETION_RELEVANCE_LOW);
-    assertSuggestFunction('D2', 'Z', relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('D2', 'Z');
     assertNotSuggested('EE');
     // hidden element suggested as low relevance
     //assertNotSuggested('F');
@@ -904,16 +875,13 @@
     assertNotSuggested('_T2');
     //assertNotSuggested('T3');
     assertNotSuggested('_T4');
-    assertSuggestTopLevelVar('T5', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestTopLevelVar('_T6', null, relevance: DART_RELEVANCE_DEFAULT);
+    assertSuggestTopLevelVar('T5', 'int');
+    assertSuggestTopLevelVar('_T6', null);
     assertNotSuggested('==');
-    assertSuggestGetter('T7', 'String',
-        relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
-    assertSuggestSetter('T8', relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
-    assertSuggestGetter('clog', 'int',
-        relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
-    assertSuggestSetter('blog', relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
+    assertSuggestGetter('T7', 'String');
+    assertSuggestSetter('T8');
+    assertSuggestGetter('clog', 'int');
+    assertSuggestSetter('blog');
     // TODO (danrubel) suggest HtmlElement as low relevance
     assertNotSuggested('HtmlElement');
     assertNotSuggested('Uri');
@@ -1269,9 +1237,8 @@
 
     assertSuggestClass('X');
     assertSuggestClass('Z');
-    assertSuggestMethod('a', 'X', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
-    assertSuggestMethod('b', 'X', 'void',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('a', 'X', null);
+    assertSuggestMethod('b', 'X', 'void');
     assertSuggestLocalVariable('f', null);
     // Don't suggest locals out of scope
     assertNotSuggested('r');
@@ -1284,7 +1251,7 @@
     // hidden element suggested as low relevance
     assertNotSuggested('D');
     assertNotSuggested('D1');
-    assertSuggestFunction('D2', 'Z', relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('D2', 'Z');
     // unimported elements suggested with low relevance
     assertNotSuggested('D3');
     //assertNotSuggested('EE');
@@ -1527,7 +1494,7 @@
 ''');
     await computeSuggestions();
 
-    assertSuggestSetter('foo', relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
+    assertSuggestSetter('foo');
   }
 
   Future<void> test_Block_unimported() async {
@@ -1678,7 +1645,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestParameter('e', 'E');
-    assertSuggestMethod('a', 'A', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('a', 'A', null);
     assertNotSuggested('Object');
     assertNotSuggested('x');
   }
@@ -1692,7 +1659,7 @@
     expect(replacementLength, 0);
     assertSuggestParameter('e', null);
     assertSuggestParameter('s', 'StackTrace');
-    assertSuggestMethod('a', 'A', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('a', 'A', null);
     assertNotSuggested('Object');
     assertNotSuggested('x');
   }
@@ -1710,8 +1677,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var suggestionA = assertSuggestClass('A',
-        relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    var suggestionA = assertSuggestClass('A', isDeprecated: true);
     if (suggestionA != null) {
       expect(suggestionA.element.isDeprecated, isTrue);
       expect(suggestionA.element.isPrivate, isFalse);
@@ -1924,8 +1890,7 @@
     await computeSuggestions();
 
     // top level results are partially filtered based on first char
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
     // TODO (danrubel) getter is being suggested instead of top level var
     //assertNotSuggested('T1');
   }
@@ -1946,12 +1911,10 @@
 
     assertNotSuggested('x');
     assertSuggestLocalVariable('f', null);
-    assertSuggestMethod('foo', 'C', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('foo', 'C', null);
     assertSuggestClass('C');
-    assertSuggestFunction('F2', null, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestFunction('F2', null);
+    assertSuggestTopLevelVar('T2', 'int');
     assertNotSuggested('A');
     assertNotSuggested('F1');
     // TODO (danrubel) getter is being suggested instead of top level var
@@ -1973,8 +1936,7 @@
     await computeSuggestions();
 
     // top level results are partially filtered based on first char
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
     // TODO (danrubel) getter is being suggested instead of top level var
     //assertNotSuggested('T1');
   }
@@ -1995,12 +1957,10 @@
 
     assertNotSuggested('x');
     assertSuggestLocalVariable('f', null);
-    assertSuggestMethod('foo', 'C', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('foo', 'C', null);
     assertSuggestClass('C');
-    assertSuggestFunction('F2', null, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestFunction('F2', null);
+    assertSuggestTopLevelVar('T2', 'int');
     assertNotSuggested('A');
     assertNotSuggested('F1');
     // TODO (danrubel) getter is being suggested instead of top level var
@@ -2022,8 +1982,7 @@
     await computeSuggestions();
 
     // top level results are partially filtered based on first char
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
     // TODO (danrubel) getter is being suggested instead of top level var
     //assertNotSuggested('T1');
   }
@@ -2075,7 +2034,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('foo', 'int', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('foo', 'int');
   }
 
   Future<void> test_ConstructorFieldInitializer_value() async {
@@ -2091,11 +2050,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestTopLevelVar(
-      'foo',
-      'int',
-      relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE,
-    );
+    assertSuggestTopLevelVar('foo', 'int');
   }
 
   Future<void> test_ConstructorName_importedClass() async {
@@ -2218,9 +2173,8 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('foo', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestMethod('a', 'A', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestFunction('foo', null);
+    assertSuggestMethod('a', 'A', null);
     assertSuggestClass('A');
     assertNotSuggested('String');
     assertNotSuggested('identical');
@@ -2254,18 +2208,15 @@
 }''');
     await computeSuggestions();
     {
-      var suggestion = assertSuggestField('myField', 'int',
-          relevance: DART_RELEVANCE_LOCAL_FIELD);
+      var suggestion = assertSuggestField('myField', 'int');
       assertDoc(suggestion);
     }
     {
-      var suggestion = assertSuggestMethod('myMethod', 'C', null,
-          relevance: DART_RELEVANCE_LOCAL_METHOD);
+      var suggestion = assertSuggestMethod('myMethod', 'C', null);
       assertDoc(suggestion);
     }
     {
-      var suggestion = assertSuggestGetter('myGetter', 'int',
-          relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
+      var suggestion = assertSuggestGetter('myGetter', 'int');
       assertDoc(suggestion);
     }
   }
@@ -2339,13 +2290,11 @@
       assertDoc(suggestion);
     }
     {
-      var suggestion = assertSuggestFunction('myFunction', 'void',
-          relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+      var suggestion = assertSuggestFunction('myFunction', 'void');
       assertDoc(suggestion);
     }
     {
-      var suggestion = assertSuggestTopLevelVar('myVariable', 'int',
-          relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+      var suggestion = assertSuggestTopLevelVar('myVariable', 'int');
       assertDoc(suggestion);
     }
   }
@@ -2384,8 +2333,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2405,8 +2354,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2425,8 +2374,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2447,8 +2396,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2467,8 +2416,8 @@
     await computeSuggestions();
 
     assertSuggestEnum('E');
-    assertSuggestEnumConst('E.one', hasTypeBoost: true);
-    assertSuggestEnumConst('E.two', hasTypeBoost: true);
+    assertSuggestEnumConst('E.one');
+    assertSuggestEnumConst('E.two');
 
     assertSuggestEnum('F');
     assertSuggestEnumConst('F.three');
@@ -2627,10 +2576,8 @@
     assertNotSuggested('A');
     assertNotSuggested('F1');
     assertSuggestClass('C');
-    assertSuggestMethod('foo', 'C', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
-    assertSuggestMethod('bar', 'C', 'void',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('foo', 'C', null);
+    assertSuggestMethod('bar', 'C', 'void');
     assertSuggestFunctionTypeAlias('F2', 'int');
     assertSuggestClass('Clz');
     assertSuggestClass('C');
@@ -2888,8 +2835,7 @@
     await computeSuggestions();
     // We don't actually use anything from the `for`, and `v` is suggested
     // just because it is a visible top-level declaration.
-    assertSuggestTopLevelVar('v', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('v', 'int');
   }
 
   Future<void> test_ForEachStatement() async {
@@ -3092,8 +3038,7 @@
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     assertSuggestLocalVariable('index', 'int');
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
     assertNotSuggested('bar');
   }
 
@@ -3105,8 +3050,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, hasLength(2));
     expect(suggestion.parameterNames[0], 'x');
     expect(suggestion.parameterTypes[0], 'dynamic');
@@ -3124,8 +3068,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, hasLength(2));
     expect(suggestion.parameterNames[0], 'x');
     expect(suggestion.parameterTypes[0], 'dynamic');
@@ -3143,8 +3086,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, hasLength(2));
     expect(suggestion.parameterNames[0], 'x');
     expect(suggestion.parameterTypes[0], 'dynamic');
@@ -3162,8 +3104,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, isEmpty);
     expect(suggestion.parameterTypes, isEmpty);
     expect(suggestion.requiredParameterCount, 0);
@@ -3178,8 +3119,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, hasLength(2));
     expect(suggestion.parameterNames[0], 'x');
     expect(suggestion.parameterTypes[0], 'dynamic');
@@ -3197,8 +3137,7 @@
 }
 ''');
     await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var suggestion = assertSuggestFunction('m', 'void');
     expect(suggestion.parameterNames, hasLength(2));
     expect(suggestion.parameterNames[0], 'x');
     expect(suggestion.parameterTypes[0], 'dynamic');
@@ -3326,13 +3265,11 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var f = assertSuggestFunction('foo', 'String',
-        isDeprecated: false, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    var f = assertSuggestFunction('foo', 'String', isDeprecated: false);
     if (f != null) {
       expect(f.element.isPrivate, isFalse);
     }
-    assertSuggestFunction('bar', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('bar', 'void');
     assertSuggestParameter('args', 'List<dynamic>');
     assertSuggestParameter('b', 'R');
     assertNotSuggested('Object');
@@ -3387,8 +3324,8 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_DEFAULT);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('Object');
     assertSuggestClass('A');
     assertNotSuggested('==');
@@ -3404,8 +3341,7 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestLocalVariable('a', null);
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
     assertSuggestClass('A');
     assertNotSuggested('Object');
   }
@@ -3427,8 +3363,8 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_DEFAULT);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('Object');
     assertSuggestClass('A');
     assertNotSuggested('==');
@@ -3451,8 +3387,8 @@
 
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
-    assertSuggestField('b', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestField('_c', 'X', relevance: DART_RELEVANCE_DEFAULT);
+    assertSuggestField('b', null);
+    assertSuggestField('_c', 'X');
     assertNotSuggested('Object');
     assertSuggestClass('A');
     assertNotSuggested('==');
@@ -3506,8 +3442,7 @@
 main(aaa, bbb) {}''');
     await computeSuggestions();
     assertSuggestFunction('main', null,
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
   }
 
   Future<void> test_inDartDoc_reference4() async {
@@ -3516,8 +3451,7 @@
 main(aaa, bbb) {}''');
     await computeSuggestions();
     assertSuggestFunction('main', null,
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+        kind: CompletionSuggestionKind.IDENTIFIER);
   }
 
   Future<void> test_IndexExpression() async {
@@ -3536,12 +3470,10 @@
 
     assertNotSuggested('x');
     assertSuggestLocalVariable('f', null);
-    assertSuggestMethod('foo', 'C', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('foo', 'C', null);
     assertSuggestClass('C');
-    assertSuggestFunction('F2', null, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestFunction('F2', null);
+    assertSuggestTopLevelVar('T2', 'int');
     assertNotSuggested('A');
     assertNotSuggested('F1');
     // TODO (danrubel) getter is being suggested instead of top level var
@@ -3563,8 +3495,7 @@
     await computeSuggestions();
 
     // top level results are partially filtered based on first char
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
     // TODO (danrubel) getter is being suggested instead of top level var
     //assertNotSuggested('T1');
   }
@@ -3700,15 +3631,9 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
@@ -3722,15 +3647,9 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
@@ -3774,12 +3693,8 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
     assertSuggestConstructor('C', elemOffset: -1);
   }
 
@@ -3793,12 +3708,8 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
     assertSuggestConstructor('C', elemOffset: -1);
   }
 
@@ -3823,15 +3734,9 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
@@ -3844,15 +3749,9 @@
 }''');
     await computeSuggestions();
 
-    assertSuggestConstructor('A',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE);
-    assertSuggestConstructor('B',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
-    assertSuggestConstructor('C',
-        elemOffset: -1,
-        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE);
+    assertSuggestConstructor('A', elemOffset: -1);
+    assertSuggestConstructor('B', elemOffset: -1);
+    assertSuggestConstructor('C', elemOffset: -1);
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
@@ -3879,9 +3778,8 @@
     assertNotSuggested('F1');
     assertNotSuggested('D1');
     assertNotSuggested('C1');
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestFunction('F2', null, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestTopLevelVar('T2', 'int');
+    assertSuggestFunction('F2', null);
     assertSuggestFunctionTypeAlias('D2', 'dynamic');
     assertSuggestClass('C2');
     assertSuggestLocalVariable('name', 'String');
@@ -3962,10 +3860,8 @@
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
     assertSuggestLocalVariable('a', null);
-    assertSuggestFunction('main', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestFunction('foo', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('main', null);
+    assertSuggestFunction('foo', null);
     assertNotSuggested('bar');
     assertSuggestClass('A');
     assertNotSuggested('Object');
@@ -4068,10 +3964,8 @@
     assertNotSuggested('T1');
     assertNotSuggested('newT1');
     assertNotSuggested('z');
-    assertSuggestTopLevelVar('m', 'dynamic',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestFunction('newer', 'String',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestTopLevelVar('m', 'dynamic');
+    assertSuggestFunction('newer', 'String');
   }
 
   Future<void> test_Literal_list() async {
@@ -4222,9 +4116,8 @@
     assertNotSuggested('F1');
     assertNotSuggested('D1');
     assertNotSuggested('C1');
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
-    assertSuggestFunction('F2', null, relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestTopLevelVar('T2', 'int');
+    assertSuggestFunction('F2', null);
     assertSuggestFunctionTypeAlias('D2', 'dynamic');
     assertSuggestClass('C2');
   }
@@ -4248,8 +4141,7 @@
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T1');
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
   }
 
   Future<void> test_MapLiteralEntry2() async {
@@ -4271,8 +4163,7 @@
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     assertNotSuggested('T1');
-    assertSuggestTopLevelVar('T2', 'int',
-        relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+    assertSuggestTopLevelVar('T2', 'int');
   }
 
   Future<void> test_method_inClass() async {
@@ -4559,20 +4450,17 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA = assertSuggestMethod('a', 'A', 'Z',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    var methodA = assertSuggestMethod('a', 'A', 'Z');
     if (methodA != null) {
       expect(methodA.element.isDeprecated, isFalse);
       expect(methodA.element.isPrivate, isFalse);
     }
-    var getterF = assertSuggestGetter('f', 'X',
-        relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    var getterF = assertSuggestGetter('f', 'X', isDeprecated: true);
     if (getterF != null) {
       expect(getterF.element.isDeprecated, isTrue);
       expect(getterF.element.isPrivate, isFalse);
     }
-    var getterG =
-        assertSuggestGetter('_g', null, relevance: DART_RELEVANCE_DEFAULT);
+    var getterG = assertSuggestGetter('_g', null);
     if (getterG != null) {
       expect(getterG.element.isDeprecated, isFalse);
       expect(getterG.element.isPrivate, isTrue);
@@ -4604,9 +4492,8 @@
 
     assertNotSuggested('a1');
     assertNotSuggested('a2');
-    assertSuggestMethod('a3', 'A', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
-    assertSuggestField('a4', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestMethod('a3', 'A', null);
+    assertSuggestField('a4', null);
     assertNotSuggested('b1');
     assertNotSuggested('b2');
     assertNotSuggested('b3');
@@ -4632,22 +4519,19 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA =
-        assertSuggestMethod('_a', 'A', 'Z', relevance: DART_RELEVANCE_DEFAULT);
+    var methodA = assertSuggestMethod('_a', 'A', 'Z');
     if (methodA != null) {
       expect(methodA.element.isDeprecated, isFalse);
       expect(methodA.element.isPrivate, isTrue);
     }
-    var getterF = assertSuggestField('f', 'X',
-        relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    var getterF = assertSuggestField('f', 'X', isDeprecated: true);
     if (getterF != null) {
       expect(getterF.element.isDeprecated, isTrue);
       expect(getterF.element.isPrivate, isFalse);
       expect(getterF.element.parameters, isNull);
     }
     // If user did not type '_' then relevance of private members is not raised
-    var getterG =
-        assertSuggestField('_g', null, relevance: DART_RELEVANCE_DEFAULT);
+    var getterG = assertSuggestField('_g', null);
     if (getterG != null) {
       expect(getterG.element.isDeprecated, isFalse);
       expect(getterG.element.isPrivate, isTrue);
@@ -4672,14 +4556,12 @@
 
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
-    var methodA =
-        assertSuggestMethod('_a', 'A', 'Z', relevance: DART_RELEVANCE_DEFAULT);
+    var methodA = assertSuggestMethod('_a', 'A', 'Z');
     if (methodA != null) {
       expect(methodA.element.isDeprecated, isFalse);
       expect(methodA.element.isPrivate, isTrue);
     }
-    var getterF = assertSuggestField('f', 'X',
-        relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    var getterF = assertSuggestField('f', 'X', isDeprecated: true);
     if (getterF != null) {
       expect(getterF.element.isDeprecated, isTrue);
       expect(getterF.element.isPrivate, isFalse);
@@ -4687,8 +4569,7 @@
     }
     // If user prefixed completion with '_' then suggestion of private members
     // should be the same as public members
-    var getterG =
-        assertSuggestField('_g', null, relevance: DART_RELEVANCE_DEFAULT);
+    var getterG = assertSuggestField('_g', null);
     if (getterG != null) {
       expect(getterG.element.isDeprecated, isFalse);
       expect(getterG.element.isPrivate, isTrue);
@@ -4711,8 +4592,7 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    var methodA = assertSuggestMethod('a', 'A', 'Z',
-        relevance: DART_RELEVANCE_LOW, isDeprecated: true);
+    var methodA = assertSuggestMethod('a', 'A', 'Z', isDeprecated: true);
     if (methodA != null) {
       expect(methodA.element.isDeprecated, isTrue);
       expect(methodA.element.isPrivate, isFalse);
@@ -4739,11 +4619,9 @@
 
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('foo', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestFunction('bar', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    assertSuggestMethod('a', 'A', 'Z', relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestFunction('foo', null);
+    assertSuggestFunction('bar', 'void');
+    assertSuggestMethod('a', 'A', 'Z');
     assertSuggestParameter('x', 'X');
     assertSuggestParameter('y', 'int');
     assertNotSuggested('String');
@@ -5160,7 +5038,7 @@
 class B extends A {m() {^}}
 ''');
     await computeSuggestions();
-    assertSuggestMethod('m', 'B', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('m', 'B', null);
   }
 
   Future<void> test_parameterName_excludeTypes() async {
@@ -5424,8 +5302,7 @@
     expect(replacementLength, 1);
     assertNotSuggested('A');
     assertSuggestClass('X');
-    assertSuggestMethod('foo', 'X', null,
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('foo', 'X', null);
     assertNotSuggested('bar');
     assertNotSuggested('_B');
   }
@@ -5610,7 +5487,7 @@
   Future<void> test_shadowed_name() async {
     addTestSource('var a; class A { var a; m() { ^ } }');
     await computeSuggestions();
-    assertSuggestField('a', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestField('a', null);
   }
 
   Future<void> test_static_field() async {
@@ -5711,8 +5588,7 @@
     await computeSuggestions();
 
     assertSuggestClass('A');
-    assertSuggestMethod('g', 'A', 'String',
-        relevance: DART_RELEVANCE_LOCAL_METHOD);
+    assertSuggestMethod('g', 'A', 'String');
     assertSuggestLocalVariable('t', null);
     assertNotSuggested('String');
   }
@@ -5722,10 +5598,9 @@
     addTestSource('g(int x) {var t; switch(x) {case 0: var bar; b^}}');
     await computeSuggestions();
 
-    assertSuggestFunction('g', 'dynamic',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('g', 'dynamic');
     assertSuggestLocalVariable('t', 'dynamic');
-    assertSuggestParameter('x', 'int', relevance: DART_RELEVANCE_PARAMETER);
+    assertSuggestParameter('x', 'int');
     assertSuggestLocalVariable('bar', 'dynamic');
     assertNotSuggested('String');
   }
@@ -6138,8 +6013,7 @@
     assertNotSuggested('X');
     assertNotSuggested('foo1');
     assertNotSuggested('bar1');
-    assertSuggestFunction('foo2', null,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    assertSuggestFunction('foo2', null);
     assertNotSuggested('bar2');
     assertNotSuggested('_B');
     assertSuggestClass('Y');
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index b014fe0..68a9878 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -20,9 +20,8 @@
 class NamedConstructorContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestNamedConstructor(
       String name, String returnType,
-      [int relevance = DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
-    var cs = assertSuggest(name, csKind: kind, relevance: relevance);
+      [CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+    var cs = assertSuggest(name, csKind: kind);
     var element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index d0df1f8..7edebfc 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -525,7 +525,6 @@
       failedCompletion('expected $completion', suggestions);
     }
     expect(cs.kind, equals(CompletionSuggestionKind.OVERRIDE));
-    expect(cs.relevance, equals(DART_RELEVANCE_HIGH));
     if (selectionOffset != null && selectionLength != null) {
       expect(cs.selectionOffset, selectionOffset);
       expect(cs.selectionLength, selectionLength);
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 0ee70bf..8698dd5 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -50,8 +50,8 @@
     addTestSource('enum E { one, two } main() {E.^}');
     await computeSuggestions();
     assertNotSuggested('E');
-    assertSuggestEnumConst('one', relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestEnumConst('two', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestEnumConst('one');
+    assertSuggestEnumConst('two');
     assertNotSuggested('index');
     assertSuggestField('values', 'List<E>');
   }
@@ -60,8 +60,8 @@
     addTestSource('enum E { one, two } main() {E.o^}');
     await computeSuggestions();
     assertNotSuggested('E');
-    assertSuggestEnumConst('one', relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestEnumConst('two', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestEnumConst('one');
+    assertSuggestEnumConst('two');
     assertNotSuggested('index');
     assertSuggestField('values', 'List<E>');
   }
@@ -70,8 +70,8 @@
     addTestSource('enum E { one, two } main() {E.^ int g;}');
     await computeSuggestions();
     assertNotSuggested('E');
-    assertSuggestEnumConst('one', relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestEnumConst('two', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestEnumConst('one');
+    assertSuggestEnumConst('two');
     assertNotSuggested('index');
     assertSuggestField('values', 'List<E>');
   }
@@ -86,8 +86,8 @@
     addTestSource('enum E { one, two } main() {E.^.}');
     await computeSuggestions();
     assertNotSuggested('E');
-    assertSuggestEnumConst('one', relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestEnumConst('two', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestEnumConst('one');
+    assertSuggestEnumConst('two');
     assertNotSuggested('index');
     assertSuggestField('values', 'List<E>');
   }
@@ -102,8 +102,8 @@
     addTestSource('enum E { one, two } main() {E.^.o}');
     await computeSuggestions();
     assertNotSuggested('E');
-    assertSuggestEnumConst('one', relevance: DART_RELEVANCE_LOCAL_FIELD);
-    assertSuggestEnumConst('two', relevance: DART_RELEVANCE_LOCAL_FIELD);
+    assertSuggestEnumConst('one');
+    assertSuggestEnumConst('two');
     assertNotSuggested('index');
     assertSuggestField('values', 'List<E>');
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 3ac6f0f..2d7372c 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -3053,10 +3053,8 @@
     expect(replacementLength, 0);
     assertSuggestGetter('f', 'X');
     assertSuggestGetter('_g', null);
-    assertSuggestField(r'$p', 'dynamic',
-        relevance: useNewRelevance ? null : DART_RELEVANCE_LOW);
-    assertSuggestMethod(r'$q', 'I', 'void',
-        relevance: useNewRelevance ? null : DART_RELEVANCE_LOW);
+    assertSuggestField(r'$p', 'dynamic');
+    assertSuggestMethod(r'$q', 'I', 'void');
     assertNotSuggested('b');
     assertNotSuggested('_c');
     assertNotSuggested('d');
@@ -3829,8 +3827,7 @@
     assertNotSuggested('fs2');
     assertSuggestMethod('mi2', 'C2', null);
     assertNotSuggested('ms2');
-    assertSuggestMethod('m', 'C2', null,
-        relevance: useNewRelevance ? null : DART_RELEVANCE_HIGH);
+    assertSuggestMethod('m', 'C2', null);
     assertNotSuggested('fi3');
     assertNotSuggested('fs3');
     assertNotSuggested('mi3');
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index bcfffa1..cf86d79 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -123,8 +123,7 @@
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
-    assertSuggest('dart:core',
-        csKind: CompletionSuggestionKind.IMPORT, relevance: DART_RELEVANCE_LOW);
+    assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
     assertNotSuggested('dart:_internal');
     assertSuggest('dart:async', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('dart:math', csKind: CompletionSuggestionKind.IMPORT);
@@ -136,8 +135,7 @@
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
-    assertSuggest('dart:core',
-        csKind: CompletionSuggestionKind.IMPORT, relevance: DART_RELEVANCE_LOW);
+    assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
     assertNotSuggested('dart:_internal');
     assertSuggest('dart:async', csKind: CompletionSuggestionKind.IMPORT);
     assertSuggest('dart:math', csKind: CompletionSuggestionKind.IMPORT);
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index e8abf70..cef8019 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -416,6 +416,21 @@
     _assertHasClass(text: 'A');
   }
 
+  Future<void> test_limitedResolution_inPart() async {
+    newFile('/workspace/dart/test/lib/a.dart', content: r'''
+part 'test.dart';
+class A {}
+''');
+
+    await _compute(r'''
+part of 'a.dart';
+^
+''');
+
+    _assertHasClass(text: 'int');
+    _assertHasClass(text: 'A');
+  }
+
   Future<void> test_limitedResolution_unit_function_body() async {
     _configureToCheckNotResolved(
       identifiers: {'print'},
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart
new file mode 100644
index 0000000..b9b6947
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2020, 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/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+// todo: update for SizedBox
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapSizedBoxTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapSizedBoxTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_SIZED_BOX;
+
+  Future<void> test_aroundContainer() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/Container();
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return SizedBox(child: Container());
+  }
+}
+''');
+  }
+
+  Future<void> test_aroundNamedConstructor() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return MyWidget./*caret*/named();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return SizedBox(child: MyWidget.named());
+}
+''');
+  }
+
+  Future<void> test_aroundSizedBox() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/SizedBox();
+  }
+}
+''');
+    await assertNoAssist();
+  }
+
+  Future<void> test_assignment() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = SizedBox(child: Container());
+}
+''');
+  }
+
+  Future<void> test_expressionFunctionBody() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => SizedBox(child: Container());
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index 18c3539..a521dec 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -58,6 +58,7 @@
 import 'flutter_wrap_generic_test.dart' as flutter_wrap_generic;
 import 'flutter_wrap_padding_test.dart' as flutter_wrap_padding;
 import 'flutter_wrap_row_test.dart' as flutter_wrap_row;
+import 'flutter_wrap_sized_box.dart' as flutter_wrap_sized_box;
 import 'flutter_wrap_stream_builder_test.dart' as flutter_wrap_stream_builder;
 import 'import_add_show_test.dart' as import_add_show;
 import 'inline_invocation_test.dart' as inline_invocation;
@@ -135,6 +136,7 @@
     flutter_wrap_generic.main();
     flutter_wrap_padding.main();
     flutter_wrap_row.main();
+    flutter_wrap_sized_box.main();
     flutter_wrap_stream_builder.main();
     import_add_show.main();
     inline_invocation.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
index 41407c0..09f61ed 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -20,17 +21,21 @@
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_ENUM_CASE_CLAUSES;
 
-  Future<void> assertHasFixWithFilter(String expected) async {
-    var noError = true;
-    await assertHasFix(expected, errorFilter: (error) {
-      if (noError &&
+  bool Function(AnalysisError) get _filter {
+    var hasError = false;
+    return (error) {
+      if (!hasError &&
           error.errorCode ==
               StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH) {
-        noError = false;
+        hasError = true;
         return true;
       }
       return false;
-    });
+    };
+  }
+
+  Future<void> assertHasFixWithFilter(String expected) async {
+    await assertHasFix(expected, errorFilter: _filter);
   }
 
   Future<void> test_empty() async {
@@ -59,6 +64,17 @@
 ''');
   }
 
+  Future<void> test_incomplete_switchStatement() async {
+    await resolveTestUnit(r'''
+enum E {a, b, c}
+
+void f(E e) {
+  switch(e
+}
+''');
+    await assertNoFix(errorFilter: _filter);
+  }
+
   Future<void> test_nonEmpty() async {
     await resolveTestUnit('''
 enum E {a, b, c}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart
new file mode 100644
index 0000000..6389eaf
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2020, 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/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveMethodDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class RemoveMethodDeclarationTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.unnecessary_overrides;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+class A {
+  int foo;
+  int bar() => 0;
+}
+
+class B extends A {
+  @override
+  int get foo => super.foo;
+  @override
+  int bar() => super.bar();
+}
+''');
+    await assertHasFix('''
+class A {
+  int foo;
+  int bar() => 0;
+}
+
+class B extends A {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart
new file mode 100644
index 0000000..06f6938
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2020, 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/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveThisExpressionTest);
+  });
+}
+
+@reflectiveTest
+class RemoveThisExpressionTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.unnecessary_this;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+class A {
+  int x;
+  A(int x) : this.x = x;
+  void foo() {
+    this.foo();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int x;
+  A(int x) : x = x;
+  void foo() {
+    foo();
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
index 55d013f..f164e06 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
@@ -12,6 +12,7 @@
     defineReflectiveTests(RemoveDynamicTypeAnnotationTest);
     defineReflectiveTests(RemoveSetterReturnTypeAnnotationTest);
     defineReflectiveTests(RemoveTypeAnnotationOnClosureParamsTest);
+    defineReflectiveTests(TypeInitFormalsTest);
   });
 }
 
@@ -75,3 +76,34 @@
 ''');
   }
 }
+
+@reflectiveTest
+class TypeInitFormalsTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.type_init_formals;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+class C {
+  int f;
+  C(int this.f);
+}
+
+class Point {
+  int x, y;
+  Point(int this.x, int this.y);
+}
+''');
+    await assertHasFix('''
+class C {
+  int f;
+  C(this.f);
+}
+
+class Point {
+  int x, y;
+  Point(this.x, this.y);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart
new file mode 100644
index 0000000..5be6f3f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2020, 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/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithTearOffTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithTearOffTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.unnecessary_lambdas;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+Function f() => (name) {
+  print(name);
+};
+
+void foo(){}
+Function f2() {
+  return () {
+    foo();
+  };
+}
+''');
+    await assertHasFix('''
+Function f() => print;
+
+void foo(){}
+Function f2() {
+  return foo;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index edac3a0..25bddfa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -22,7 +22,9 @@
 import 'remove_empty_else_test.dart' as remove_empty_else;
 import 'remove_empty_statement_test.dart' as remove_empty_statement;
 import 'remove_initializer_test.dart' as remove_initializer;
+import 'remove_method_declaration_test.dart' as remove_method_declaration;
 import 'remove_operator_test.dart' as remove_operator;
+import 'remove_this_expression_test.dart' as remove_this_expression;
 import 'remove_type_annotation_test.dart' as remove_type_annotation;
 import 'remove_unnecessary_const_test.dart' as remove_unnecessary_const;
 import 'remove_unnecessary_new_test.dart' as remove_unnecessary_new;
@@ -31,6 +33,7 @@
 import 'replace_with_conditional_assignment_test.dart'
     as replace_with_conditional_assignment;
 import 'replace_with_is_empty_test.dart' as replace_with_is_empty;
+import 'replace_with_tear_off_test.dart' as replace_with_tear_off;
 import 'replace_with_var_test.dart' as replace_with_var;
 import 'use_curly_braces_test.dart' as use_curly_braces;
 import 'use_is_not_empty_test.dart' as use_is_not_empty;
@@ -52,7 +55,9 @@
     remove_empty_constructor_body.main();
     remove_empty_else.main();
     remove_empty_statement.main();
+    remove_method_declaration.main();
     remove_operator.main();
+    remove_this_expression.main();
     remove_type_annotation.main();
     remove_unnecessary_const.main();
     remove_unnecessary_new.main();
@@ -60,6 +65,7 @@
     replace_colon_with_equals.main();
     replace_null_with_closure.main();
     replace_with_is_empty.main();
+    replace_with_tear_off.main();
     replace_with_var.main();
     use_curly_braces.main();
     use_is_not_empty.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
new file mode 100644
index 0000000..6181ed4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
@@ -0,0 +1,150 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MakeReturnTypeNullableTest);
+  });
+}
+
+@reflectiveTest
+class MakeReturnTypeNullableTest extends FixProcessorTest {
+  @override
+  List<String> get experiments => [EnableString.non_nullable];
+
+  @override
+  FixKind get kind => DartFixKind.MAKE_RETURN_TYPE_NULLABLE;
+
+  Future<void> test_function_async() async {
+    await resolveTestUnit('''
+Future<String> f(String? s) async {
+  return s;
+}
+''');
+    await assertHasFix('''
+Future<String?> f(String? s) async {
+  return s;
+}
+''');
+  }
+
+  Future<void> test_function_asyncStar() async {
+    await resolveTestUnit('''
+Stream<String> f(String? s) async* {
+  yield s;
+}
+''');
+    await assertHasFix('''
+Stream<String?> f(String? s) async* {
+  yield s;
+}
+''');
+  }
+
+  Future<void> test_function_sync() async {
+    await resolveTestUnit('''
+String f(String? s) {
+  return s;
+}
+''');
+    await assertHasFix('''
+String? f(String? s) {
+  return s;
+}
+''');
+  }
+
+  Future<void> test_function_syncStar() async {
+    await resolveTestUnit('''
+Iterable<String> f(String? s) sync* {
+  yield s;
+}
+''');
+    await assertHasFix('''
+Iterable<String?> f(String? s) sync* {
+  yield s;
+}
+''');
+  }
+
+  Future<void> test_getter_sync() async {
+    await resolveTestUnit('''
+class C {
+  String? f;
+  String get g => f;
+}
+''');
+    await assertHasFix('''
+class C {
+  String? f;
+  String? get g => f;
+}
+''');
+  }
+
+  Future<void> test_incompatibilityIsNotLimitedToNullability() async {
+    await resolveTestUnit('''
+int f() {
+  return '';
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_localFunction_sync() async {
+    await resolveTestUnit('''
+void f() {
+  String g(String? s) {
+    return s;
+  }
+  g(null);
+}
+''');
+    await assertHasFix('''
+void f() {
+  String? g(String? s) {
+    return s;
+  }
+  g(null);
+}
+''');
+  }
+
+  Future<void> test_method_sync() async {
+    await resolveTestUnit('''
+class C {
+  String m(String? s) {
+    return s;
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  String? m(String? s) {
+    return s;
+  }
+}
+''');
+  }
+
+  Future<void> test_returnTypeHasTypeArguments() async {
+    await resolveTestUnit('''
+List<String> f() {
+  return null;
+}
+''');
+    await assertHasFix('''
+List<String>? f() {
+  return null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
index a9e07f1..8949517 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
@@ -55,23 +55,6 @@
 ''');
   }
 
-  Future<void> test_methodInvocation_twoCharactersOperator() async {
-    await resolveTestUnit('''
-class A {
-  void foo() {
-    this?.foo();
-  }
-}
-''');
-    await assertHasFix('''
-class A {
-  void foo() {
-    foo();
-  }
-}
-''');
-  }
-
   Future<void> test_propertyAccess_oneCharacterOperator() async {
     await resolveTestUnit('''
 class A {
@@ -90,23 +73,4 @@
 }
 ''');
   }
-
-  Future<void> test_propertyAccess_twoCharactersOperator() async {
-    await resolveTestUnit('''
-class A {
-  int x;
-  void foo() {
-    this?.x = 2;
-  }
-}
-''');
-    await assertHasFix('''
-class A {
-  int x;
-  void foo() {
-    x = 2;
-  }
-}
-''');
-  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
new file mode 100644
index 0000000..64b71ef
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2020, 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/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithNotNullAwareTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithNotNullAwareTest extends FixProcessorTest {
+  @override
+  List<String> get experiments => ['non-nullable'];
+
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE;
+
+  Future<void> test_getter_cascade() async {
+    await resolveTestUnit('''
+void f(String s) {
+  s?..length;
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  s..length;
+}
+''');
+  }
+
+  Future<void> test_getter_simple() async {
+    await resolveTestUnit('''
+void f(String s) {
+  s?.length;
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  s.length;
+}
+''');
+  }
+
+  Future<void> test_index_cascade() async {
+    await resolveTestUnit('''
+void f(List<int> x) {
+  x?..[0];
+}
+''');
+    await assertHasFix('''
+void f(List<int> x) {
+  x..[0];
+}
+''');
+  }
+
+  Future<void> test_index_simple() async {
+    await resolveTestUnit('''
+void f(List<int> x) {
+  x?[0];
+}
+''');
+    await assertHasFix('''
+void f(List<int> x) {
+  x[0];
+}
+''');
+  }
+
+  Future<void> test_method_cascade() async {
+    await resolveTestUnit('''
+void f(String s) {
+  s?..indexOf('a');
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  s..indexOf('a');
+}
+''');
+  }
+
+  Future<void> test_method_simple() async {
+    await resolveTestUnit('''
+void f(String s) {
+  s?.indexOf('a');
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  s.indexOf('a');
+}
+''');
+  }
+
+  Future<void> test_setter_cascade() async {
+    await resolveTestUnit('''
+void f(C c) {
+  c?..s = 0;
+}
+class C {
+  set s(int x) {}
+}
+''');
+    await assertHasFix('''
+void f(C c) {
+  c..s = 0;
+}
+class C {
+  set s(int x) {}
+}
+''');
+  }
+
+  Future<void> test_setter_simple() async {
+    await resolveTestUnit('''
+void f(C c) {
+  c?.s = 0;
+}
+class C {
+  set s(int x) {}
+}
+''');
+    await assertHasFix('''
+void f(C c) {
+  c.s = 0;
+}
+class C {
+  set s(int x) {}
+}
+''');
+  }
+
+  Future<void> test_spread() async {
+    await resolveTestUnit('''
+void f(List<int> x) {
+  [...?x];
+}
+''');
+    await assertHasFix('''
+void f(List<int> x) {
+  [...x];
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index a65ca4c..64dde02 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -92,6 +92,7 @@
 import 'make_class_abstract_test.dart' as make_class_abstract;
 import 'make_field_not_final_test.dart' as make_field_not_final;
 import 'make_final_test.dart' as make_final;
+import 'make_return_type_nullable_test.dart' as make_return_type_nullable;
 import 'make_variable_not_final_test.dart' as make_variable_not_final;
 import 'move_type_arguments_to_class_test.dart' as move_type_arguments_to_class;
 import 'organize_imports_test.dart' as organize_imports;
@@ -151,6 +152,7 @@
 import 'replace_with_interpolation_test.dart' as replace_with_interpolation;
 import 'replace_with_is_empty_test.dart' as replace_with_is_empty;
 import 'replace_with_is_not_empty_test.dart' as replace_with_is_not_empty;
+import 'replace_with_not_null_aware_test.dart' as replace_with_not_null_aware;
 import 'replace_with_null_aware_test.dart' as replace_with_null_aware;
 import 'replace_with_tear_off_test.dart' as replace_with_tear_off;
 import 'replace_with_var_test.dart' as replace_with_var;
@@ -245,6 +247,7 @@
     make_class_abstract.main();
     make_field_not_final.main();
     make_final.main();
+    make_return_type_nullable.main();
     make_variable_not_final.main();
     move_type_arguments_to_class.main();
     organize_imports.main();
@@ -300,6 +303,7 @@
     replace_with_interpolation.main();
     replace_with_is_empty.main();
     replace_with_is_not_empty.main();
+    replace_with_not_null_aware.main();
     replace_with_null_aware.main();
     replace_with_tear_off.main();
     replace_with_var.main();
diff --git a/pkg/analysis_server/tool/completion_metrics/code_metrics.dart b/pkg/analysis_server/tool/completion_metrics/code_metrics.dart
index cd29795..d0baded 100644
--- a/pkg/analysis_server/tool/completion_metrics/code_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/code_metrics.dart
@@ -563,6 +563,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
+      'abstractKeyword': node.abstractKeyword,
       'covariantKeyword': node.covariantKeyword,
       'staticKeyword': node.staticKeyword,
       'fields': node.fields,
diff --git a/pkg/analysis_server/tool/completion_metrics/visitors.dart b/pkg/analysis_server/tool/completion_metrics/visitors.dart
index f154a6d..cc8d5ff 100644
--- a/pkg/analysis_server/tool/completion_metrics/visitors.dart
+++ b/pkg/analysis_server/tool/completion_metrics/visitors.dart
@@ -347,6 +347,7 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
+    safelyRecordKeywordCompletion(node.abstractKeyword);
     safelyRecordKeywordCompletion(node.covariantKeyword);
     safelyRecordKeywordCompletion(node.staticKeyword);
     return super.visitFieldDeclaration(node);
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
index bba94d6..41df728 100644
--- a/pkg/analysis_server/tool/lsp_spec/README.md
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -111,6 +111,14 @@
 
 Starts the analzyer diagnostics server (if not already running) and returns the port number it's listening on.
 
+### dart/reanalyze Method
+
+Direction: Client -> Server
+Params: None
+Returns: None
+
+Forces re-reading of all potentially changed files, re-resolving of all referenced URIs, and corresponding re-analysis of everything affected in the current analysis roots. Clients should not usually need to call this method - needing to do so may indicate a bug in the server.
+
 ### dart/textDocument/super Method
 
 Direction: Client -> Server
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index fb1492f..0ecf87a 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2131,7 +2131,19 @@
 /// The declaration of one or more fields of the same type.
 ///
 ///    fieldDeclaration ::=
-///        'static'? [VariableDeclarationList] ';'
+///        'static' 'const' <type>? <staticFinalDeclarationList>
+///      | 'static' 'final' <type>? <staticFinalDeclarationList>
+///      | 'static' 'late' 'final' <type>? <initializedIdentifierList>
+///      | 'static' 'late'? <varOrType> <initializedIdentifierList>
+///      | 'covariant' 'late'? <varOrType> <initializedIdentifierList>
+///      | 'late'? 'final' <type>? <initializedIdentifierList>
+///      | 'late'? <varOrType> <initializedIdentifierList>
+///      | 'abstract' (<finalVarOrType> | 'covariant' <varOrType>)
+///            <identifierList>
+///
+/// (Note: there is no <fieldDeclaration> production in the grammar; this is a
+/// subset of the grammar production <declaration>, which encompasses everything
+/// that can appear inside a class declaration except methods).
 ///
 /// Prior to the 'extension-methods' experiment, these nodes were always
 /// children of a class declaration. When the experiment is enabled, these nodes
@@ -2139,6 +2151,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FieldDeclaration implements ClassMember {
+  /// The `abstract` keyword, or `null` if the keyword was not used.
+  Token get abstractKeyword;
+
   /// The 'covariant' keyword, or `null` if the keyword was not used.
   Token get covariantKeyword;
 
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index d324d7a..231ad4c 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -363,6 +363,7 @@
   FieldDeclaration fieldDeclaration2(
       {Comment comment,
       List<Annotation> metadata,
+      Token abstractKeyword,
       Token covariantKeyword,
       Token staticKeyword,
       @required VariableDeclarationList fieldList,
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 12f85cc..34e6cd6 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1110,6 +1110,10 @@
   @override
   FieldElement get declaration;
 
+  /// Return `true` if this field is abstract. Executable fields are abstract if
+  /// they are declared with the `abstract` keyword.
+  bool get isAbstract;
+
   /// Return `true` if this field was explicitly marked as being covariant.
   bool get isCovariant;
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index e5f3230..a0780e0 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -60,6 +60,8 @@
   AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES,
   AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES,
   AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
+  CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER,
+  CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
   CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
   CompileTimeErrorCode.AMBIGUOUS_EXPORT,
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index d2ae5c0..6fea185 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
@@ -21,13 +22,14 @@
   final List<AnalysisContext> contexts = [];
 
   /// Initialize a newly created analysis context manager.
-  AnalysisContextCollectionImpl(
-      {bool enableIndex = false,
-      @required List<String> includedPaths,
-      List<String> excludedPaths,
-      ResourceProvider resourceProvider,
-      String sdkPath})
-      : resourceProvider =
+  AnalysisContextCollectionImpl({
+    Map<String, String> declaredVariables,
+    bool enableIndex = false,
+    @required List<String> includedPaths,
+    List<String> excludedPaths,
+    ResourceProvider resourceProvider,
+    String sdkPath,
+  }) : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE {
     sdkPath ??= getSdkPath();
 
@@ -49,6 +51,7 @@
       );
       var context = contextBuilder.createContext(
         contextRoot: root,
+        declaredVariables: DeclaredVariables.fromMap(declaredVariables ?? {}),
         enableIndex: enableIndex,
         sdkPath: sdkPath,
       );
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 9faa830..d288490 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -852,7 +852,9 @@
       // Create a new file.
       FileSource uriSource = FileSource(resource, uri);
       WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = featureSetProvider.getFeatureSet(path, uri);
+      FeatureSet workspacePackageFeatureSet = workspacePackage?.featureSet;
+      FeatureSet featureSet = workspacePackageFeatureSet ??
+          featureSetProvider.getFeatureSet(path, uri);
       Version packageLanguageVersion =
           featureSetProvider.getLanguageVersion(path, uri);
       file = FileState._(this, path, uri, uriSource, workspacePackage,
@@ -896,7 +898,9 @@
       File resource = _resourceProvider.getFile(path);
       FileSource source = FileSource(resource, uri);
       WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = featureSetProvider.getFeatureSet(path, uri);
+      FeatureSet workspacePackageFeatureSet = workspacePackage?.featureSet;
+      FeatureSet featureSet = workspacePackageFeatureSet ??
+          featureSetProvider.getFeatureSet(path, uri);
       Version packageLanguageVersion =
           featureSetProvider.getLanguageVersion(path, uri);
       file = FileState._(this, path, uri, source, workspacePackage, featureSet,
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 4fbd468..bfbf152 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3920,6 +3920,9 @@
 ///    fieldDeclaration ::=
 ///        'static'? [VariableDeclarationList] ';'
 class FieldDeclarationImpl extends ClassMemberImpl implements FieldDeclaration {
+  @override
+  Token abstractKeyword;
+
   /// The 'covariant' keyword, or `null` if the keyword was not used.
   @override
   Token covariantKeyword;
@@ -3943,6 +3946,7 @@
   FieldDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
+      this.abstractKeyword,
       this.covariantKeyword,
       this.staticKeyword,
       VariableDeclarationListImpl fieldList,
@@ -3971,7 +3975,9 @@
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
-    if (covariantKeyword != null) {
+    if (abstractKeyword != null) {
+      return abstractKeyword;
+    } else if (covariantKeyword != null) {
       return covariantKeyword;
     } else if (staticKeyword != null) {
       return staticKeyword;
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index f60676c..ad2b6d8 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -394,18 +394,19 @@
           VariableDeclarationList fieldList,
           Token semicolon) =>
       FieldDeclarationImpl(
-          comment, metadata, null, staticKeyword, fieldList, semicolon);
+          comment, metadata, null, null, staticKeyword, fieldList, semicolon);
 
   @override
   FieldDeclaration fieldDeclaration2(
           {Comment comment,
           List<Annotation> metadata,
+          Token abstractKeyword,
           Token covariantKeyword,
           Token staticKeyword,
           @required VariableDeclarationList fieldList,
           @required Token semicolon}) =>
-      FieldDeclarationImpl(comment, metadata, covariantKeyword, staticKeyword,
-          fieldList, semicolon);
+      FieldDeclarationImpl(comment, metadata, abstractKeyword, covariantKeyword,
+          staticKeyword, fieldList, semicolon);
 
   @override
   FieldFormalParameter fieldFormalParameter(
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index adf8d2b..eba0b8c 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -495,6 +495,7 @@
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    safelyVisitTokenWithSuffix(node.abstractKeyword, " ");
     safelyVisitTokenWithSuffix(node.staticKeyword, " ");
     safelyVisitNode(node.fields);
     sink.write(";");
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 3867938..7d27356 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -447,6 +447,7 @@
       astFactory.fieldDeclaration2(
           comment: cloneNode(node.documentationComment),
           metadata: cloneNodeList(node.metadata),
+          abstractKeyword: cloneToken(node.abstractKeyword),
           covariantKeyword: cloneToken(node.covariantKeyword),
           staticKeyword: cloneToken(node.staticKeyword),
           fieldList: cloneNode(node.fields),
@@ -1573,8 +1574,9 @@
   @override
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration other = _other as FieldDeclaration;
-    return isEqualNodes(
-            node.documentationComment, other.documentationComment) &&
+    return isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
+        isEqualTokens(node.covariantKeyword, other.covariantKeyword) &&
+        isEqualNodes(node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.staticKeyword, other.staticKeyword) &&
         isEqualNodes(node.fields, other.fields) &&
@@ -4462,6 +4464,7 @@
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration toNode = _toNode as FieldDeclaration;
     return _and(
+        _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
         _isEqualNodes(node.documentationComment, toNode.documentationComment),
         _isEqualNodeLists(node.metadata, toNode.metadata),
         _isEqualTokens(node.staticKeyword, toNode.staticKeyword),
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 8cc2292..a102215 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4269,6 +4269,14 @@
   FieldElement get declaration => this;
 
   @override
+  bool get isAbstract {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.isAbstract(linkedNode);
+    }
+    return hasModifier(Modifier.ABSTRACT);
+  }
+
+  @override
   bool get isCovariant {
     if (linkedNode != null) {
       return linkedContext.isExplicitlyCovariant(linkedNode);
@@ -7020,6 +7028,7 @@
       {Reference reference})
       : super(variable.name, variable.nameOffset, reference: reference) {
     this.variable = variable;
+    isAbstract = variable is FieldElementImpl && variable.isAbstract;
     isStatic = variable.isStatic;
     isSynthetic = true;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index d97532c..8385169 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -334,6 +334,9 @@
   }
 
   @override
+  bool get isAbstract => declaration.isAbstract;
+
+  @override
   bool get isCovariant => declaration.isCovariant;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index bd7cb0b..a029dc9 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -125,7 +125,7 @@
     });
 
     // Resolve URIs in directives to corresponding sources.
-    FeatureSet featureSet = units[_library].featureSet;
+    FeatureSet featureSet = units.values.first.featureSet;
 
     performance.run('resolveUriDirectives', (performance) {
       units.forEach((file, unit) {
@@ -139,7 +139,7 @@
     });
 
     performance.run('resolveDirectives', (performance) {
-      _resolveDirectives(units, forCompletion);
+      _resolveDirectives(units, completionPath);
     });
 
     performance.run('resolveFiles', (performance) {
@@ -529,15 +529,17 @@
 
   void _resolveDirectives(
     Map<FileState, CompilationUnit> units,
-    bool forCompletion,
+    String completionPath,
   ) {
-    CompilationUnit definingCompilationUnit = units[_library];
-    definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
-
-    if (forCompletion) {
+    if (completionPath != null) {
+      var completionUnit = units.values.first;
+      completionUnit.element = _unitElementWithPath(completionPath);
       return;
     }
 
+    CompilationUnit definingCompilationUnit = units[_library];
+    definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
+
     bool matchNodeElement(Directive node, Element element) {
       return node.keyword.offset == element.nameOffset;
     }
@@ -757,6 +759,15 @@
     }
   }
 
+  CompilationUnitElement _unitElementWithPath(String path) {
+    for (var unitElement in _libraryElement.units) {
+      if (unitElement.source.fullName == path) {
+        return unitElement;
+      }
+    }
+    return null;
+  }
+
   /// Validate that the feature set associated with the compilation [unit] is
   /// the same as the [expectedSet] of features supported by the library.
   void _validateFeatureSet(CompilationUnit unit, FeatureSet expectedSet) {
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 29956ee..28a8cd2 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -219,7 +219,7 @@
     Version languageVersion,
   }) {
     this.resourceProvider = resourceProvider;
-    this._languageVersion =
+    _languageVersion =
         languageVersion ?? languageVersionFromSdkVersion(io.Platform.version);
     embedderYamls?.forEach(_processEmbedderYaml);
   }
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index d612589..b4f23ee 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -22,6 +22,19 @@
  * when appropriate, how the problem can be corrected.
  */
 class CompileTimeErrorCode extends AnalyzerErrorCode {
+  static const CompileTimeErrorCode ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER =
+      CompileTimeErrorCode('ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER',
+          'Abstract fields cannot have initializers.',
+          correction:
+              "Try removing the field initializer or the 'abstract' keyword "
+              "from the field declaration.");
+
+  static const CompileTimeErrorCode ABSTRACT_FIELD_INITIALIZER =
+      CompileTimeErrorCode('ABSTRACT_FIELD_INITIALIZER',
+          'Abstract fields cannot have initializers.',
+          correction:
+              "Try removing the initializer or the 'abstract' keyword.");
+
   /**
    * Parameters:
    * 0: the display name for the kind of the found abstract member
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index d500cff..f28b925 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -80,6 +80,7 @@
     _fieldMap.forEach((FieldElement field, _InitState state) {
       if (state != _InitState.notInit) return;
       if (field.isLate) return;
+      if (field.isAbstract) return;
 
       if (field.isFinal) {
         notInitFinalFields.add(field);
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 4adca2d..cac6440 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -581,18 +581,33 @@
   /// because the class itself defines an abstract method with this [name],
   /// report the more specific error, and return `true`.
   bool _reportConcreteClassWithAbstractMember(String name) {
+    bool checkMemberNameCombo(ClassMember member, String memberName) {
+      if (memberName == name) {
+        reporter.reportErrorForNode(
+            CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+            member,
+            [name, classElement.name]);
+        return true;
+      } else {
+        return false;
+      }
+    }
+
     for (var member in members) {
       if (member is MethodDeclaration) {
         var name2 = member.name.name;
         if (member.isSetter) {
           name2 += '=';
         }
-        if (name2 == name) {
-          reporter.reportErrorForNode(
-              CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
-              member,
-              [name, classElement.name]);
-          return true;
+        if (checkMemberNameCombo(member, name2)) return true;
+      } else if (member is FieldDeclaration) {
+        for (var variableDeclaration in member.fields.variables) {
+          var name2 = variableDeclaration.name.name;
+          if (checkMemberNameCombo(member, name2)) return true;
+          if (!variableDeclaration.isFinal) {
+            name2 += '=';
+            if (checkMemberNameCombo(member, name2)) return true;
+          }
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 2cf4091..42141c5 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -872,6 +872,7 @@
     currentDeclarationMembers.add(ast.fieldDeclaration2(
         comment: comment,
         metadata: metadata,
+        abstractKeyword: abstractToken,
         covariantKeyword: covariantKeyword,
         staticKeyword: staticToken,
         fieldList: variableList,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 98df2ee..4eb6d7d 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -491,6 +491,8 @@
       _checkForInvalidField(node, fieldName, staticElement);
       if (staticElement is FieldElement) {
         _checkForFieldInitializerNotAssignable(node, staticElement);
+        _checkForAbstractFieldConstructorInitializer(
+            node.fieldName, staticElement);
       }
       super.visitConstructorFieldInitializer(node);
     } finally {
@@ -599,6 +601,14 @@
     _checkForPrivateOptionalParameter(node);
     _checkForFieldInitializingFormalRedirectingConstructor(node);
     _checkForTypeAnnotationDeferredClass(node.type);
+    ParameterElement element = node.declaredElement;
+    if (element is FieldFormalParameterElement) {
+      FieldElement fieldElement = element.field;
+      if (fieldElement != null) {
+        _checkForAbstractFieldConstructorInitializer(
+            node.identifier, fieldElement);
+      }
+    }
     super.visitFieldFormalParameter(node);
   }
 
@@ -1190,6 +1200,7 @@
     // do checks
     _checkForInvalidAssignment(nameNode, initializerNode);
     _checkForImplicitDynamicIdentifier(node, nameNode);
+    _checkForAbstractFieldInitializer(node);
     // visit name
     nameNode.accept(this);
     // visit initializer
@@ -1283,6 +1294,24 @@
     }
   }
 
+  void _checkForAbstractFieldConstructorInitializer(
+      AstNode node, FieldElement fieldElement) {
+    if (fieldElement.isAbstract) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, node);
+    }
+  }
+
+  void _checkForAbstractFieldInitializer(VariableDeclaration node) {
+    var declaredElement = node.declaredElement;
+    if (declaredElement is FieldElement &&
+        declaredElement.isAbstract &&
+        node.initializer != null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER, node.name);
+    }
+  }
+
   /// Verify that all classes of the given [withClause] are valid.
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
@@ -2553,11 +2582,16 @@
               CompileTimeErrorCode.CONST_NOT_INITIALIZED,
               variable.name,
               [variable.name.name]);
-        } else if (!_isNonNullableByDefault || !variable.isLate) {
-          _errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.FINAL_NOT_INITIALIZED,
-              variable.name,
-              [variable.name.name]);
+        } else {
+          var variableElement = variable.declaredElement;
+          if (variableElement is FieldElement && variableElement.isAbstract) {
+            // Abstract fields can't be initialized, so no error.
+          } else if (!_isNonNullableByDefault || !variable.isLate) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.FINAL_NOT_INITIALIZED,
+                variable.name,
+                [variable.name.name]);
+          }
         }
       }
     }
@@ -3531,9 +3565,11 @@
     if (_isEnclosingClassFfiStruct) return;
 
     for (var field in fields.variables) {
+      var fieldElement = field.declaredElement as FieldElement;
+      if (fieldElement.isAbstract) continue;
       if (field.initializer != null) continue;
 
-      var type = field.declaredElement.type;
+      var type = fieldElement.type;
       if (!_typeSystem.isPotentiallyNonNullable(type)) continue;
 
       _errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0d0f8b1..d919f68 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2910,7 +2910,7 @@
       return;
     }
     // Prepare VariableElement.
-    Element element = nameScope.lookupIdentifier(node);
+    Element element = nameScope.lookup2(node.name).getter;
     if (element is! VariableElement) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index b2e8b8a..662d1d3 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -516,8 +516,12 @@
           argumentList: argumentList);
 
   static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword,
-          TypeAnnotation type, List<VariableDeclaration> variables) =>
+          TypeAnnotation type, List<VariableDeclaration> variables,
+          {bool isAbstract = false}) =>
       astFactory.fieldDeclaration2(
+          abstractKeyword: isAbstract
+              ? TokenFactory.tokenFromKeyword(Keyword.ABSTRACT)
+              : null,
           staticKeyword:
               isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
           fieldList: variableDeclarationList(keyword, type, variables),
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index b029847..8a64bc2 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -649,6 +649,8 @@
   FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
     var node = astFactory.fieldDeclaration2(
       comment: _readDocumentationComment(data),
+      abstractKeyword:
+          AstBinaryFlags.isAbstract(data.flags) ? _Tokens.ABSTRACT : null,
       covariantKeyword:
           AstBinaryFlags.isCovariant(data.flags) ? _Tokens.COVARIANT : null,
       fieldList: _readNode(data.fieldDeclaration_fields),
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index f8bdeee..1e8276a 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -554,6 +554,7 @@
       informativeId: getInformativeId(node),
     );
     builder.flags = AstBinaryFlags.encode(
+      isAbstract: node.abstractKeyword != null,
       isCovariant: node.covariantKeyword != null,
       isStatic: node.staticKeyword != null,
     );
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 0cd8fa6..9276295 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -357,6 +357,7 @@
   void visitFieldDeclaration(FieldDeclaration node) {
     _classMember(node);
     _token(node.staticKeyword);
+    _token(node.abstractKeyword);
     _token(node.covariantKeyword);
     node.fields.accept(this);
     _token(node.semicolon);
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 0a34140..b7bae75 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -769,6 +769,20 @@
       return false;
     } else if (node is MethodDeclaration) {
       return LazyMethodDeclaration.isAbstract(node);
+    } else if (node is VariableDeclaration) {
+      var parent = node.parent;
+      if (parent is VariableDeclarationList) {
+        var grandParent = parent.parent;
+        if (grandParent is FieldDeclaration) {
+          return grandParent.abstractKeyword != null;
+        } else {
+          throw UnimplementedError('${grandParent.runtimeType}');
+        }
+      } else {
+        throw UnimplementedError('${parent.runtimeType}');
+      }
+    } else if (node is EnumConstantDeclaration) {
+      return false;
     }
     throw UnimplementedError('${node.runtimeType}');
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index b02dfaf..13aee9b 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -55,11 +55,6 @@
     return resourceProvider.newFile(convertedPath, content);
   }
 
-  File newFileWithBytes(String path, List<int> bytes) {
-    String convertedPath = convertPath(path);
-    return resourceProvider.newFileWithBytes(convertedPath, bytes);
-  }
-
   Folder newFolder(String path) {
     String convertedPath = convertPath(path);
     return resourceProvider.newFolder(convertedPath);
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index 18b35fdd8..47f1790 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -5,7 +5,9 @@
 import 'dart:collection';
 import 'dart:core';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -483,10 +485,44 @@
   @override
   final BazelWorkspace workspace;
 
+  bool _featureSetReady = false;
+  FeatureSet _featureSet;
+
   BazelWorkspacePackage(String packageName, this.root, this.workspace)
       : _uriPrefix = 'package:$packageName/';
 
   @override
+  FeatureSet get featureSet {
+    if (_featureSetReady) {
+      return _featureSet;
+    }
+
+    try {
+      _featureSetReady = true;
+      var buildContent = workspace.provider
+          .getFolder(root)
+          .getChildAssumingFile('BUILD')
+          .readAsStringSync();
+      var hasNonNullableFlag = buildContent
+          .split('\n')
+          .map((e) => e.trim())
+          .where((e) => !e.startsWith('#'))
+          .map((e) => e.replaceAll(' ', ''))
+          .join()
+          .contains('dart_package(null_safety=True');
+      if (hasNonNullableFlag) {
+        _featureSet = FeatureSet.fromEnableFlags(
+          [EnableString.non_nullable],
+        );
+      }
+    } on FileSystemException {
+      // ignored
+    }
+
+    return _featureSet;
+  }
+
+  @override
   bool contains(Source source) {
     if (source.uri.isScheme('package')) {
       return source.uri.toString().startsWith(_uriPrefix);
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index d274ccb..39fdaaf 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -152,13 +152,25 @@
   /// matches the behavior of package:build.
   final String projectPackageName;
 
+  /// `.dart_tool/build/generated` in [root].
+  final String generatedRootPath;
+
+  /// [projectPackageName] in [generatedRootPath].
+  final String generatedThisPath;
+
   /// The singular package in this workspace.
   ///
   /// Each "package:build" workspace is itself one package.
   PackageBuildWorkspacePackage _theOnlyPackage;
 
   PackageBuildWorkspace._(
-      this.provider, this._packageMap, this.root, this.projectPackageName);
+    this.provider,
+    this._packageMap,
+    this.root,
+    this.projectPackageName,
+    this.generatedRootPath,
+    this.generatedThisPath,
+  );
 
   @override
   UriResolver get packageUriResolver => PackageBuildPackageUriResolver(
@@ -231,15 +243,22 @@
   }
 
   @override
-  WorkspacePackage findPackageFor(String filePath) {
-    path.Context context = provider.pathContext;
-    final folder = provider.getFolder(context.dirname(filePath));
-    if (context.isWithin(root, folder.path)) {
-      _theOnlyPackage ??= PackageBuildWorkspacePackage(root, this);
-      return _theOnlyPackage;
-    } else {
+  WorkspacePackage findPackageFor(String path) {
+    var pathContext = provider.pathContext;
+
+    // Must be in this workspace.
+    if (!pathContext.isWithin(root, path)) {
       return null;
     }
+
+    // If generated, must be for this package.
+    if (pathContext.isWithin(generatedRootPath, path)) {
+      if (!pathContext.isWithin(generatedThisPath, path)) {
+        return null;
+      }
+    }
+
+    return _theOnlyPackage ??= PackageBuildWorkspacePackage(root, this);
   }
 
   /// Find the package:build workspace that contains the given [filePath].
@@ -265,8 +284,13 @@
       if (dartToolBuildDir.exists && pubspec.exists) {
         try {
           final yaml = loadYaml(pubspec.readAsStringSync());
-          return PackageBuildWorkspace._(
-              provider, packageMap, folder.path, yaml['name']);
+          final packageName = yaml['name'] as String;
+          final generatedRootPath = provider.pathContext
+              .join(folder.path, '.dart_tool', 'build', 'generated');
+          final generatedThisPath =
+              provider.pathContext.join(generatedRootPath, packageName);
+          return PackageBuildWorkspace._(provider, packageMap, folder.path,
+              packageName, generatedRootPath, generatedThisPath);
         } catch (_) {}
       }
 
@@ -292,12 +316,18 @@
 
   @override
   bool contains(Source source) {
-    String filePath = filePathFromSource(source);
-    if (filePath == null) return false;
-    // There is a 1-1 relationship between PackageBuildWorkspaces and
-    // PackageBuildWorkspacePackages. If a file is in a package's workspace,
-    // then it is in the package as well.
-    return workspace.provider.pathContext.isWithin(workspace.root, filePath) &&
-        workspace.findFile(filePath) != null;
+    var uri = source.uri;
+
+    if (uri.isScheme('package')) {
+      var packageName = uri.pathSegments[0];
+      return packageName == workspace.projectPackageName;
+    }
+
+    if (uri.isScheme('file')) {
+      var path = source.fullName;
+      return workspace.findPackageFor(path) != null;
+    }
+
+    return false;
   }
 }
diff --git a/pkg/analyzer/lib/src/workspace/workspace.dart b/pkg/analyzer/lib/src/workspace/workspace.dart
index 5b64e10..f5f037f 100644
--- a/pkg/analyzer/lib/src/workspace/workspace.dart
+++ b/pkg/analyzer/lib/src/workspace/workspace.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/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
@@ -38,6 +39,11 @@
 /// understand whether arbitrary file paths represent libraries declared within
 /// a given package in a Workspace.
 abstract class WorkspacePackage {
+  /// Return the [FeatureSet] for all files in the package.
+  ///
+  /// Return `null` if this package does not have a feature set override.
+  FeatureSet get featureSet => null;
+
   String get root;
 
   Workspace get workspace;
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 44445f6..becd0e8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -10,7 +10,7 @@
   _fe_analyzer_shared: ^6.0.0
   args: ^1.0.0
   charcode: ^1.1.0
-  cli_util: ^0.1.4
+  cli_util: '>=0.1.4 <0.3.0'
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: ^2.0.0
diff --git a/pkg/analyzer/test/error/error_reporter_test.dart b/pkg/analyzer/test/error/error_reporter_test.dart
index 9eaa852..4abbae8 100644
--- a/pkg/analyzer/test/error/error_reporter_test.dart
+++ b/pkg/analyzer/test/error/error_reporter_test.dart
@@ -10,7 +10,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../generated/test_support.dart';
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -19,7 +19,7 @@
 }
 
 @reflectiveTest
-class ErrorReporterTest extends DriverResolutionTest {
+class ErrorReporterTest extends PubPackageResolutionTest {
   var listener = GatheringErrorListener();
 
   test_creation() async {
@@ -73,8 +73,8 @@
   }
 
   test_reportErrorForNode_types_differentNames() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/b.dart', content: 'class B {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/b.dart', content: 'class B {}');
     await resolveTestCode(r'''
 import 'package:test/a.dart';
 import 'package:test/b.dart';
@@ -112,8 +112,8 @@
   }
 
   test_reportErrorForNode_types_sameName() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/b.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/b.dart', content: 'class A {}');
     await resolveTestCode(r'''
 import 'package:test/a.dart';
 import 'package:test/b.dart';
@@ -150,8 +150,8 @@
   }
 
   test_reportErrorForNode_types_sameName_functionType() async {
-    newFile('/test/lib/a.dart', content: 'class A{}');
-    newFile('/test/lib/b.dart', content: 'class A{}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A{}');
+    newFile('$testPackageLibPath/b.dart', content: 'class A{}');
     await resolveTestCode(r'''
 import 'a.dart' as a;
 import 'b.dart' as b;
@@ -184,8 +184,8 @@
   }
 
   test_reportErrorForNode_types_sameName_nested() async {
-    newFile('/test/lib/a.dart', content: 'class A{}');
-    newFile('/test/lib/b.dart', content: 'class A{}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A{}');
+    newFile('$testPackageLibPath/b.dart', content: 'class A{}');
     await resolveTestCode(r'''
 import 'a.dart' as a;
 import 'b.dart' as b;
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index ddf6aab..097479c 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -9,7 +9,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -18,7 +18,7 @@
 }
 
 @reflectiveTest
-class ConstantEvaluatorTest extends DriverResolutionTest {
+class ConstantEvaluatorTest extends PubPackageResolutionTest {
   test_bitAnd_int_int() async {
     await _assertValueInt(74 & 42, "74 & 42");
   }
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 52d7501..a88deb2 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -26,7 +26,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import '../util/element_type_matchers.dart';
 import 'elements_types_mixin.dart';
 import 'test_analysis_context.dart';
@@ -49,9 +49,9 @@
 }
 
 @reflectiveTest
-class AnnotationElementResolverTest extends DriverResolutionTest {
+class AnnotationElementResolverTest extends PubPackageResolutionTest {
   test_class_namedConstructor() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A.named();
 }
@@ -80,7 +80,7 @@
   }
 
   test_class_prefixed_namedConstructor() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A.named();
 }
@@ -111,7 +111,7 @@
   }
 
   test_class_prefixed_staticConstField() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static const V = 0;
 }
@@ -141,7 +141,7 @@
   }
 
   test_class_prefixed_unnamedConstructor() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A();
 }
@@ -169,7 +169,7 @@
   }
 
   test_class_staticConstField() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static const V = 0;
 }
@@ -197,7 +197,7 @@
   }
 
   test_class_unnamedConstructor() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A();
 }
@@ -223,7 +223,7 @@
   }
 
   test_topLevelVariable() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const V = 0;
 ''');
     await _validateAnnotation('', '@V', (SimpleIdentifier name1,
@@ -247,7 +247,7 @@
   }
 
   test_topLevelVariable_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const V = 0;
 ''');
     await _validateAnnotation('as p', '@p.V', (SimpleIdentifier name1,
diff --git a/pkg/analyzer/test/generated/error_suppression_test.dart b/pkg/analyzer/test/generated/error_suppression_test.dart
index 2335951..7c6e3d9 100644
--- a/pkg/analyzer/test/generated/error_suppression_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_test.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,7 +14,7 @@
 }
 
 @reflectiveTest
-class ErrorSuppressionTest extends DriverResolutionTest with PackageMixin {
+class ErrorSuppressionTest extends PubPackageResolutionTest {
   String get ignoredCode => 'unused_element';
 
   test_does_not_ignore_errors() async {
@@ -116,7 +115,7 @@
   }
 
   test_ignore_uniqueName() async {
-    addMetaPackage();
+    writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode('''
 import 'package:meta/meta.dart';
 
@@ -245,7 +244,7 @@
 
   test_undefined_function_within_flutter_can_be_ignored() async {
     await assertErrorsInFile(
-      '/workspace/flutterlib/flutter.dart',
+      '$workspaceRootPath/flutterlib/flutter.dart',
       '''
 // ignore: undefined_function
 f() => g();
@@ -256,7 +255,7 @@
 
   test_undefined_function_within_flutter_without_ignore() async {
     await assertErrorsInFile(
-      '/workspace/flutterlib/flutter.dart',
+      '$workspaceRootPath/flutterlib/flutter.dart',
       '''
 f() => g();
 ''',
@@ -266,7 +265,7 @@
 
   test_undefined_prefixed_name_within_flutter_can_be_ignored() async {
     await assertErrorsInFile(
-      '/workspace/flutterlib/flutter.dart',
+      '$workspaceRootPath/flutterlib/flutter.dart',
       '''
 import 'dart:collection' as c;
 // ignore: undefined_prefixed_name
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 7b2fb4a..dc3b656 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -7,8 +7,7 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
-import '../src/dart/resolution/with_null_safety_mixin.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -22,7 +21,7 @@
 /// errors generated, but we want to make sure that there is at least one,
 /// and analysis finishes without exceptions.
 @reflectiveTest
-class InvalidCodeTest extends DriverResolutionTest {
+class InvalidCodeTest extends PubPackageResolutionTest {
   /// This code results in a method with the empty name, and the default
   /// constructor, which also has the empty name. The `Map` in `f` initializer
   /// references the empty name.
@@ -347,7 +346,7 @@
 }
 
 @reflectiveTest
-class InvalidCodeWithNullSafetyTest extends DriverResolutionTest
+class InvalidCodeWithNullSafetyTest extends PubPackageResolutionTest
     with WithNullSafetyMixin {
   test_issue_40837() async {
     await _assertCanBeAnalyzed('''
diff --git a/pkg/analyzer/test/generated/issues_test.dart b/pkg/analyzer/test/generated/issues_test.dart
index 7c6fdbf9..85286a5 100644
--- a/pkg/analyzer/test/generated/issues_test.dart
+++ b/pkg/analyzer/test/generated/issues_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,7 +15,7 @@
 /// Tests for various end-to-end cases reported as user issues, where it is
 /// not obvious where to put the test otherwise.
 @reflectiveTest
-class IssuesTest extends DriverResolutionTest {
+class IssuesTest extends PubPackageResolutionTest {
   /// https://github.com/dart-lang/sdk/issues/38565
   ///
   /// The issue was that type inference for annotation instantiation
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 286187a..ac6d07b 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -4,16 +4,14 @@
 
 import 'dart:async';
 
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -23,13 +21,7 @@
 }
 
 @reflectiveTest
-class NonConstantValueInInitializer extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.forTesting(
-        sdkVersion: '2.3.0',
-        additionalFeatures: [Feature.constant_update_2018]);
-
+class NonConstantValueInInitializer extends PubPackageResolutionTest {
   test_intLiteralInDoubleContext_const_exact() async {
     await assertNoErrorsInCode(r'''
 const double x = 0;
@@ -63,13 +55,13 @@
 }
 
 @reflectiveTest
-class NonErrorResolverTest extends DriverResolutionTest {
+class NonErrorResolverTest extends PubPackageResolutionTest {
   test_ambiguousExport() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 class M {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library lib2;
 class N {}
 ''');
@@ -81,12 +73,12 @@
   }
 
   test_ambiguousExport_combinators_hide() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library L1;
 class A {}
 class B {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library L2;
 class B {}
 class C {}
@@ -99,12 +91,12 @@
   }
 
   test_ambiguousExport_combinators_show() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library L1;
 class A {}
 class B {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library L2;
 class B {}
 class C {}
@@ -117,7 +109,7 @@
   }
 
   test_ambiguousExport_sameDeclaration() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 class N {}
 ''');
@@ -129,7 +121,7 @@
   }
 
   test_ambiguousImport_dart_implicitHide() async {
-    newFile('/test/lib/lib.dart', content: r'''
+    newFile('$testPackageLibPath/lib.dart', content: r'''
 class Future {
   static const zero = 0;
 }
@@ -144,17 +136,17 @@
   }
 
   test_ambiguousImport_hideCombinator() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 class N {}
 class N1 {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library lib2;
 class N {}
 class N2 {}
 ''');
-    newFile("/test/lib/lib3.dart", content: r'''
+    newFile("$testPackageLibPath/lib3.dart", content: r'''
 library lib3;
 class N {}
 class N3 {}
@@ -172,12 +164,12 @@
   }
 
   test_ambiguousImport_showCombinator() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 class N {}
 class N1 {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library lib2;
 class N {}
 class N2 {}
@@ -195,7 +187,7 @@
   }
 
   test_annotated_partOfDeclaration() async {
-    newFile('/test/lib/part.dart', content: '''
+    newFile('$testPackageLibPath/part.dart', content: '''
 @deprecated part of L;
 ''');
     await assertNoErrorsInCode('''
@@ -421,7 +413,7 @@
   }
 
   test_assignmentToFinals_importWithPrefix() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 bool x = false;''');
     await assertNoErrorsInCode(r'''
@@ -716,7 +708,7 @@
   }
 
   test_closure_in_type_inferred_variable_in_other_lib() async {
-    newFile('/test/lib/other.dart', content: '''
+    newFile('$testPackageLibPath/other.dart', content: '''
 var y = (Object x) => x is int && x.isEven;
 ''');
     await assertNoErrorsInCode('''
@@ -778,13 +770,13 @@
   }
 
   test_const_imported_defaultParameterValue_withImportPrefix() async {
-    newFile('/test/lib/b.dart', content: r'''
+    newFile('$testPackageLibPath/b.dart', content: r'''
 import 'c.dart' as ccc;
 class B {
   const B([p = ccc.value]);
 }
 ''');
-    newFile('/test/lib/c.dart', content: r'''
+    newFile('$testPackageLibPath/c.dart', content: r'''
 const int value = 12345;
 ''');
     await assertNoErrorsInCode(r'''
@@ -861,7 +853,7 @@
   }
 
   test_constDeferredClass_new() async {
-    newFile('/test/lib/lib.dart', content: r'''
+    newFile('$testPackageLibPath/lib.dart', content: r'''
 class A {
   const A.b();
 }
@@ -882,7 +874,7 @@
   }
 
   test_constEval_propertyExtraction_fieldStatic_targetType() async {
-    newFile("/test/lib/math.dart", content: r'''
+    newFile("$testPackageLibPath/math.dart", content: r'''
 library math;
 const PI = 3.14;
 ''');
@@ -903,7 +895,7 @@
   }
 
   test_constEval_symbol() async {
-    newFile("/test/lib/math.dart", content: r'''
+    newFile("$testPackageLibPath/math.dart", content: r'''
 library math;
 const PI = 3.14;
 ''');
@@ -1086,7 +1078,7 @@
   }
 
   test_deprecatedMemberUse_hide() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 class A {}
 @deprecated
@@ -1532,7 +1524,7 @@
   }
 
   test_importDuplicatedLibraryName() async {
-    newFile("/test/lib/lib.dart", content: "library lib;");
+    newFile("$testPackageLibPath/lib.dart", content: "library lib;");
     await assertErrorsInCode(r'''
 library test;
 import 'lib.dart';
@@ -1545,8 +1537,8 @@
   }
 
   test_importDuplicatedLibraryUnnamed() async {
-    newFile("/test/lib/lib1.dart");
-    newFile("/test/lib/lib2.dart");
+    newFile("$testPackageLibPath/lib1.dart");
+    newFile("$testPackageLibPath/lib2.dart");
     // No warning on duplicate import (https://github.com/dart-lang/sdk/issues/24156)
     await assertErrorsInCode(r'''
 library test;
@@ -1559,7 +1551,7 @@
   }
 
   test_importOfNonLibrary_libraryDeclared() async {
-    newFile("/test/lib/part.dart", content: r'''
+    newFile("$testPackageLibPath/part.dart", content: r'''
 library lib1;
 class A {}
 ''');
@@ -1571,7 +1563,7 @@
   }
 
   test_importOfNonLibrary_libraryNotDeclared() async {
-    newFile("/test/lib/part.dart", content: '''
+    newFile("$testPackageLibPath/part.dart", content: '''
 class A {}
 ''');
     await assertNoErrorsInCode(r'''
@@ -1582,11 +1574,11 @@
   }
 
   test_importPrefixes_withFirstLetterDifference() async {
-    newFile("/test/lib/lib1.dart", content: r'''
+    newFile("$testPackageLibPath/lib1.dart", content: r'''
 library lib1;
 test1() {}
 ''');
-    newFile("/test/lib/lib2.dart", content: r'''
+    newFile("$testPackageLibPath/lib2.dart", content: r'''
 library lib2;
 test2() {}
 ''');
@@ -1795,7 +1787,7 @@
   }
 
   test_instanceMethodNameCollidesWithSuperclassStatic_field() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library L;
 class A {
   static var _m;
@@ -1812,7 +1804,7 @@
   }
 
   test_instanceMethodNameCollidesWithSuperclassStatic_method() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library L;
 class A {
   static _m() {}
@@ -1906,7 +1898,7 @@
   }
 
   test_invalidAnnotation_constantVariable_field_importWithPrefix() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 class A {
   static const C = 0;
@@ -1930,7 +1922,7 @@
   }
 
   test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 const C = 0;
 ''');
@@ -1943,7 +1935,7 @@
   }
 
   test_invalidAnnotation_constConstructor_importWithPrefix() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 class A {
   const A(int p);
@@ -1958,7 +1950,7 @@
   }
 
   test_invalidAnnotation_constConstructor_named_importWithPrefix() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 class A {
   const A.named(int p);
@@ -2135,12 +2127,12 @@
   }
 
   Future test_issue32114() async {
-    newFile('/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class O {}
 
 typedef T Func<T extends O>(T e);
 ''');
-    newFile('/test/lib/b.dart', content: '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 import 'a.dart';
 export 'a.dart' show Func;
 
@@ -2190,7 +2182,7 @@
   }
 
   test_issue_35320_lists() async {
-    newFile('/test/lib/lib.dart', content: '''
+    newFile('$testPackageLibPath/lib.dart', content: '''
 const x = const <String>['a'];
 ''');
     await assertNoErrorsInCode('''
@@ -2210,7 +2202,7 @@
   }
 
   test_issue_35320_maps() async {
-    newFile('/test/lib/lib.dart', content: '''
+    newFile('$testPackageLibPath/lib.dart', content: '''
 const x = const <String, String>{'a': 'b'};
 ''');
     await assertNoErrorsInCode('''
@@ -2230,7 +2222,7 @@
   }
 
   test_loadLibraryDefined() async {
-    newFile('/test/lib/lib.dart', content: r'''
+    newFile('$testPackageLibPath/lib.dart', content: r'''
 library lib;
 foo() => 22;''');
     await assertNoErrorsInCode(r'''
@@ -2802,13 +2794,13 @@
   }
 
   test_optionalNew_rewrite() async {
-    newFile("/test/lib/a.dart", content: r'''
+    newFile("$testPackageLibPath/a.dart", content: r'''
 class A {
   const A();
   const A.named();
 }
 ''');
-    newFile("/test/lib/b.dart", content: r'''
+    newFile("$testPackageLibPath/b.dart", content: r'''
 import 'a.dart';
 import 'a.dart' as p;
 
@@ -2838,7 +2830,7 @@
   }
 
   test_optionalNew_rewrite_instantiatesToBounds() async {
-    newFile("/test/lib/a.dart", content: r'''
+    newFile("$testPackageLibPath/a.dart", content: r'''
 class Unbounded<T> {
   const Unbounded();
   const Unbounded.named();
@@ -2848,7 +2840,7 @@
   const Bounded.named();
 }
 ''');
-    newFile("/test/lib/b.dart", content: r'''
+    newFile("$testPackageLibPath/b.dart", content: r'''
 import 'a.dart';
 import 'a.dart' as p;
 
@@ -3043,13 +3035,13 @@
   }
 
   test_sharedDeferredPrefix() async {
-    newFile('/test/lib/lib1.dart', content: r'''
+    newFile('$testPackageLibPath/lib1.dart', content: r'''
 f1() {}
 ''');
-    newFile('/test/lib/lib2.dart', content: r'''
+    newFile('$testPackageLibPath/lib2.dart', content: r'''
 f2() {}
 ''');
-    newFile('/test/lib/lib3.dart', content: r'''
+    newFile('$testPackageLibPath/lib3.dart', content: r'''
 f3() {}
 ''');
     await assertNoErrorsInCode(r'''
@@ -3067,7 +3059,7 @@
   }
 
   test_typedef_not_function() async {
-    newFile('/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 typedef F = int;
 ''');
     await assertNoErrorsInCode('''
@@ -3331,7 +3323,7 @@
   }
 
   test_typeType_class_prefixed() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 class C {}''');
     await assertNoErrorsInCode(r'''
@@ -3354,7 +3346,7 @@
   }
 
   test_typeType_functionTypeAlias_prefixed() async {
-    newFile("/test/lib/lib.dart", content: r'''
+    newFile("$testPackageLibPath/lib.dart", content: r'''
 library lib;
 typedef F();''');
     await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 29959b1..bd32129 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import 'test_support.dart';
 
 main() {
@@ -15,7 +15,7 @@
 }
 
 @reflectiveTest
-class NonHintCodeTest extends DriverResolutionTest {
+class NonHintCodeTest extends PubPackageResolutionTest {
   test_issue20904BuggyTypePromotionAtIfJoin_1() async {
     // https://code.google.com/p/dart/issues/detail?id=20904
     await assertErrorsInCode(r'''
@@ -204,7 +204,7 @@
   }
 }
 
-class PubSuggestionCodeTest extends DriverResolutionTest {
+class PubSuggestionCodeTest extends PubPackageResolutionTest {
   // TODO(brianwilkerson) The tests in this class are not being run, and all but
   //  the first would fail. We should implement these checks and enable the
   //  tests.
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index fd9767c..f124938 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -172,6 +172,16 @@
     expect(invocation.argumentList.arguments, hasLength(0));
   }
 
+  void test_parseField_abstract() {
+    createParser('abstract int i;', featureSet: nonNullable);
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, isFieldDeclaration);
+    FieldDeclaration field = member;
+    expect(field.abstractKeyword, isNotNull);
+  }
+
   void test_parseField_const_late() {
     createParser('const late T f = 0;', featureSet: nonNullable);
     ClassMember member = parser.parseClassMember('C');
@@ -321,6 +331,16 @@
     expect(variable.name, isNotNull);
   }
 
+  void test_parseField_non_abstract() {
+    createParser('int i;', featureSet: nonNullable);
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, isFieldDeclaration);
+    FieldDeclaration field = member;
+    expect(field.abstractKeyword, isNull);
+  }
+
   void test_parseField_var_late() {
     createParser('var late f;', featureSet: nonNullable);
     ClassMember member = parser.parseClassMember('C');
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index bc21731..1e9056d 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -15,7 +15,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import 'resolver_test_case.dart';
 
 main() {
@@ -28,7 +28,7 @@
 }
 
 @reflectiveTest
-class ErrorResolverTest extends DriverResolutionTest {
+class ErrorResolverTest extends PubPackageResolutionTest {
   test_breakLabelOnSwitchMember() async {
     await assertErrorsInCode(r'''
 class A {
@@ -107,7 +107,7 @@
 }
 
 @reflectiveTest
-class PrefixedNamespaceTest extends DriverResolutionTest {
+class PrefixedNamespaceTest extends PubPackageResolutionTest {
   void test_lookup_missing() {
     ClassElement element = ElementFactory.classElement2('A');
     PrefixedNamespace namespace = PrefixedNamespace('p', _toMap([element]));
@@ -307,7 +307,7 @@
 /// The class `StrictModeTest` contains tests to ensure that the correct errors
 /// and warnings are reported when the analysis engine is run in strict mode.
 @reflectiveTest
-class StrictModeTest extends DriverResolutionTest {
+class StrictModeTest extends PubPackageResolutionTest {
   test_assert_is() async {
     await assertErrorsInCode(r'''
 int f(num n) {
@@ -447,7 +447,7 @@
 }
 
 @reflectiveTest
-class TypePropagationTest extends DriverResolutionTest {
+class TypePropagationTest extends PubPackageResolutionTest {
   test_assignment_null() async {
     String code = r'''
 main() {
@@ -496,7 +496,7 @@
   }
 
   test_invocation_target_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int max(int x, int y) => 0;
 ''');
     await resolveTestCode('''
@@ -558,7 +558,7 @@
   }
 
   test_objectAccessInference_disabled_for_library_prefix() async {
-    newFile('/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 dynamic get hashCode => 42;
 ''');
     await assertNoErrorsInCode('''
@@ -579,7 +579,7 @@
   }
 
   test_objectMethodInference_disabled_for_library_prefix() async {
-    newFile('/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 dynamic toString = (int x) => x + 42;
 ''');
     await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 04d739a..dddd438 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -33,7 +33,7 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import 'test_analysis_context.dart';
 import 'test_support.dart';
 
@@ -638,7 +638,7 @@
 }
 
 /// Shared infrastructure for [StaticTypeAnalyzer2Test].
-class StaticTypeAnalyzer2TestShared extends DriverResolutionTest {
+class StaticTypeAnalyzer2TestShared extends PubPackageResolutionTest {
   /// Find the expression that starts at the offset of [search] and validate its
   /// that its static type matches the given [type].
   ///
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 09bb730..d6ce37b 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -8,7 +8,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import 'resolver_test_case.dart';
 
 main() {
@@ -18,7 +18,7 @@
 }
 
 @reflectiveTest
-class SimpleResolverTest extends DriverResolutionTest {
+class SimpleResolverTest extends PubPackageResolutionTest {
   test_argumentResolution_required_matching() async {
     await resolveTestCode(r'''
 class A {
@@ -422,7 +422,7 @@
   }
 
   test_entryPoint_exported() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 main() {}
 ''');
 
@@ -457,7 +457,7 @@
   }
 
   test_enum_externalLibrary() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 enum EEE {A, B, C}
 ''');
     await assertNoErrorsInCode(r'''
@@ -667,11 +667,11 @@
   }
 
   test_import_hide() async {
-    newFile('/test/lib/lib1.dart', content: r'''
+    newFile('$testPackageLibPath/lib1.dart', content: r'''
 set foo(value) {}
 class A {}''');
 
-    newFile('/test/lib/lib2.dart', content: r'''
+    newFile('$testPackageLibPath/lib2.dart', content: r'''
 set foo(value) {}''');
 
     await assertNoErrorsInCode(r'''
@@ -686,7 +686,7 @@
   }
 
   test_import_prefix() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 f(int x) {
   return x * x;
 }''');
@@ -755,7 +755,7 @@
   }
 
   test_import_spaceInUri() async {
-    newFile('/test/lib/sub folder/a.dart', content: r'''
+    newFile('$testPackageLibPath/sub folder/a.dart', content: r'''
 foo() {}''');
 
     await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 14674c4..0256b50 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,7 +15,7 @@
 }
 
 @reflectiveTest
-class StaticTypeWarningCodeTest extends DriverResolutionTest {
+class StaticTypeWarningCodeTest extends PubPackageResolutionTest {
   test_assert_message_suppresses_type_promotion() async {
     // If a variable is assigned to inside the expression for an assert
     // message, type promotion should be suppressed, just as it would be if the
@@ -597,7 +597,7 @@
 }
 
 @reflectiveTest
-class StrongModeStaticTypeWarningCodeTest extends DriverResolutionTest {
+class StrongModeStaticTypeWarningCodeTest extends PubPackageResolutionTest {
   test_legalAsyncGeneratorReturnType_function_supertypeOfStream() async {
     await assertNoErrorsInCode('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index beea4a3..de9b311 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,7 +14,7 @@
 }
 
 @reflectiveTest
-class StaticWarningCodeTest extends DriverResolutionTest {
+class StaticWarningCodeTest extends PubPackageResolutionTest {
   // TODO(brianwilkerson) Figure out what to do with the rest of these tests.
   //  The names do not correspond to diagnostic codes, so it isn't clear what
   //  they're testing.
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index efa2a44..4d01e88 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -16,7 +16,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/dart/resolution/driver_resolution.dart';
+import '../src/dart/resolution/context_collection_resolution.dart';
 import '../utils.dart';
 import 'resolver_test_case.dart';
 import 'test_support.dart';
@@ -3773,7 +3773,7 @@
 }
 
 @reflectiveTest
-class StrongModeTypePropagationTest extends DriverResolutionTest {
+class StrongModeTypePropagationTest extends PubPackageResolutionTest {
   test_foreachInference_dynamic_disabled() async {
     await resolveTestCode(r'''
 main() {
diff --git a/pkg/analyzer/test/src/clients/angular_analyzer_plugin/resolve_template_node_test.dart b/pkg/analyzer/test/src/clients/angular_analyzer_plugin/resolve_template_node_test.dart
index 0af2907..810e4e7 100644
--- a/pkg/analyzer/test/src/clients/angular_analyzer_plugin/resolve_template_node_test.dart
+++ b/pkg/analyzer/test/src/clients/angular_analyzer_plugin/resolve_template_node_test.dart
@@ -11,7 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../dart/resolution/driver_resolution.dart';
+import '../../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -20,7 +20,7 @@
 }
 
 @reflectiveTest
-class ResolveTemplateNodeTest extends DriverResolutionTest {
+class ResolveTemplateNodeTest extends PubPackageResolutionTest {
   test_asExpression() async {
     await assertNoErrorsInCode(r'''
 class MyComponent {}
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 14729ad..214bf41 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -402,7 +402,7 @@
   void test_createWorkspace_hasPackagesFile_hasDartToolAndPubspec() {
     newFile('/workspace/.packages');
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     Workspace workspace = ContextBuilder.createWorkspace(resourceProvider,
         convertPath('/workspace/project/lib/lib.dart'), builder);
     expect(workspace, TypeMatcher<PackageBuildWorkspace>());
@@ -410,7 +410,7 @@
 
   void test_createWorkspace_hasPackagesFile_hasPubspec() {
     newFile('/workspace/.packages');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     Workspace workspace = ContextBuilder.createWorkspace(resourceProvider,
         convertPath('/workspace/project/lib/lib.dart'), builder);
     expect(workspace, TypeMatcher<PubWorkspace>());
@@ -433,7 +433,7 @@
 
   void test_createWorkspace_noPackagesFile_hasDartToolAndPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     Workspace workspace = ContextBuilder.createWorkspace(resourceProvider,
         convertPath('/workspace/project/lib/lib.dart'), builder);
     expect(workspace, TypeMatcher<PackageBuildWorkspace>());
@@ -449,7 +449,7 @@
   }
 
   void test_createWorkspace_noPackagesFile_hasPubspec() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     Workspace workspace = ContextBuilder.createWorkspace(resourceProvider,
         convertPath('/workspace/project/lib/lib.dart'), builder);
     expect(workspace, TypeMatcher<PubWorkspace>());
@@ -552,7 +552,7 @@
     newFile(filePath, content: '''
 linter:
   rules:
-    - empty_constructor_bodies
+    - non_existent_lint_rule
 ''');
 
     AnalysisOptions options = builder.getAnalysisOptions(path);
@@ -648,7 +648,7 @@
     newFile(filePath, content: '''
 linter:
   rules:
-    - empty_constructor_bodies
+    - non_existent_lint_rule
 ''');
 
     AnalysisOptions options = builder.getAnalysisOptions(path);
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
index b217244..6c12cef 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
@@ -8,9 +8,9 @@
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
-import '../../resolution/driver_resolution.dart';
+import '../../resolution/context_collection_resolution.dart';
 
-class BaseDependencyTest extends DriverResolutionTest {
+class BaseDependencyTest extends PubPackageResolutionTest {
 //  DependencyTracker tracker;
   String a;
   String b;
@@ -62,7 +62,7 @@
 //    }
 
     newFile(path, content: content);
-    driver.changeFile(path);
+    driverFor(path).changeFile(path);
 
     var units = await _resolveLibrary(path);
     var uri = units.first.declaredElement.source.uri;
@@ -104,9 +104,9 @@
     super.setUp();
 //    var logger = PerformanceLog(null);
 //    tracker = DependencyTracker(logger);
-    a = convertPath('/test/lib/a.dart');
-    b = convertPath('/test/lib/b.dart');
-    c = convertPath('/test/lib/c.dart');
+    a = convertPath('$testPackageLibPath/a.dart');
+    b = convertPath('$testPackageLibPath/b.dart');
+    c = convertPath('$testPackageLibPath/c.dart');
     aUri = Uri.parse('package:test/a.dart');
     bUri = Uri.parse('package:test/b.dart');
     cUri = Uri.parse('package:test/c.dart');
@@ -138,7 +138,8 @@
   }
 
   Future<List<CompilationUnit>> _resolveLibrary(String libraryPath) async {
-    var resolvedLibrary = await driver.getResolvedLibrary(libraryPath);
+    var session = contextFor(libraryPath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
     return resolvedLibrary.units.map((ru) => ru.unit).toList();
   }
 }
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 90c11509..e6cd991 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -20,7 +20,7 @@
 
 import '../../../generated/elements_types_mixin.dart';
 import '../../../utils.dart';
-import '../resolution/driver_resolution.dart';
+import '../resolution/context_collection_resolution.dart';
 import 'base.dart';
 
 main() {
@@ -38,7 +38,7 @@
 
 /// Integration tests for resolution.
 @reflectiveTest
-class AnalysisDriverResolutionTest extends DriverResolutionTest
+class AnalysisDriverResolutionTest extends PubPackageResolutionTest
     with ElementsTypesMixin {
   void assertDeclaredVariableType(SimpleIdentifier node, String expected) {
     VariableElement element = node.staticElement;
@@ -250,7 +250,7 @@
   }
 
   test_annotation_onDirective_part() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 part of 'test.dart';
 ''');
     addTestFile(r'''
@@ -273,7 +273,7 @@
   }
 
   test_annotation_onDirective_partOf() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 part 'test.dart';
 ''');
     addTestFile(r'''
@@ -394,7 +394,7 @@
   }
 
   test_annotation_prefixed_classField() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static const a = 1;
 }
@@ -433,7 +433,7 @@
   }
 
   test_annotation_prefixed_constructor() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A(int a, {int b});
 }
@@ -474,7 +474,7 @@
   }
 
   test_annotation_prefixed_constructor_named() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   const A.named(int a, {int b});
 }
@@ -517,7 +517,7 @@
   }
 
   test_annotation_prefixed_topLevelVariable() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const topAnnotation = 1;
 ''');
     addTestFile(r'''
@@ -1395,7 +1395,7 @@
   }
 
   test_deferredImport_loadLibrary_invocation() async {
-    newFile('/test/lib/a.dart');
+    newFile('$testPackageLibPath/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() {
@@ -1419,7 +1419,7 @@
   }
 
   test_deferredImport_loadLibrary_invocation_argument() async {
-    newFile('/test/lib/a.dart');
+    newFile('$testPackageLibPath/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 var b = 1;
@@ -1453,7 +1453,7 @@
   }
 
   test_deferredImport_loadLibrary_tearOff() async {
-    newFile('/test/lib/a.dart');
+    newFile('$testPackageLibPath/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() {
@@ -1476,7 +1476,7 @@
   }
 
   test_deferredImport_variable() async {
-    newFile('/test/lib/a.dart', content: 'var v = 0;');
+    newFile('$testPackageLibPath/a.dart', content: 'var v = 0;');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() async {
@@ -1516,7 +1516,7 @@
   }
 
   test_directive_export() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -1564,7 +1564,7 @@
   }
 
   test_directive_import_hide() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -1612,7 +1612,7 @@
   }
 
   test_directive_import_show() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -2172,7 +2172,7 @@
   }
 
   test_instanceCreation_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class C<T> {
   C(T p);
   C.named(T p);
@@ -3580,7 +3580,7 @@
 
   @failingTest
   test_invalid_nonTypeAsType_topLevelFunction_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int T() => 0;
 ''');
     addTestFile(r'''
@@ -3648,7 +3648,7 @@
 
   @failingTest
   test_invalid_nonTypeAsType_topLevelVariable_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int T;
 ''');
     addTestFile(r'''
@@ -5630,7 +5630,7 @@
   }
 
   test_optionalConst_prefixed() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class C {
   const C();
   const C.named();
@@ -6154,7 +6154,7 @@
   }
 
   test_prefixedIdentifier_importPrefix_className() async {
-    newFile('/test/lib/lib.dart', content: '''
+    newFile('$testPackageLibPath/lib.dart', content: '''
 class MyClass {}
 typedef void MyFunctionTypeAlias();
 int myTopVariable;
@@ -7751,9 +7751,9 @@
   }
 
   test_typeAnnotation_prefixed() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/b.dart', content: "export 'a.dart';");
-    newFile('/test/lib/c.dart', content: "export 'a.dart';");
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/b.dart', content: "export 'a.dart';");
+    newFile('$testPackageLibPath/c.dart', content: "export 'a.dart';");
     addTestFile(r'''
 import 'b.dart' as b;
 import 'c.dart' as c;
diff --git a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
index 7edf053..69e058e 100644
--- a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
@@ -9,7 +9,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../resolution/driver_resolution.dart';
+import '../../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -18,7 +18,7 @@
   });
 }
 
-mixin GetElementDeclarationMixin implements DriverResolutionTest {
+mixin GetElementDeclarationMixin implements PubPackageResolutionTest {
   Future<ElementDeclarationResult> getElementDeclaration(Element element);
 
   test_class() async {
@@ -60,7 +60,7 @@
   }
 
   test_class_inPart() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 part of 'test.dart';
 class A {}
 ''');
@@ -403,7 +403,7 @@
 }
 
 @reflectiveTest
-class GetElementDeclarationParsedTest extends DriverResolutionTest
+class GetElementDeclarationParsedTest extends PubPackageResolutionTest
     with GetElementDeclarationMixin {
   @override
   Future<ElementDeclarationResult> getElementDeclaration(
@@ -414,12 +414,13 @@
   }
 
   ParsedLibraryResultImpl _getParsedLibrary(String path) {
-    return driver.getParsedLibrary(path);
+    var session = contextFor(path).currentSession;
+    return session.getParsedLibrary(path);
   }
 }
 
 @reflectiveTest
-class GetElementDeclarationResolvedTest extends DriverResolutionTest
+class GetElementDeclarationResolvedTest extends PubPackageResolutionTest
     with GetElementDeclarationMixin {
   @override
   Future<ElementDeclarationResult> getElementDeclaration(
@@ -430,6 +431,7 @@
   }
 
   Future<ResolvedLibraryResult> _getResolvedLibrary(String path) {
-    return driver.getResolvedLibrary(path);
+    var session = contextFor(path).currentSession;
+    return session.getResolvedLibrary(path);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index 1a390a1..c9d188a 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -8,7 +8,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../resolution/driver_resolution.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -17,17 +17,18 @@
 }
 
 @reflectiveTest
-class AnalysisSessionHelperTest extends DriverResolutionTest {
+class AnalysisSessionHelperTest extends PubPackageResolutionTest {
   AnalysisSessionHelper helper;
 
   @override
   void setUp() {
     super.setUp();
-    helper = AnalysisSessionHelper(driver.currentSession);
+    var session = contextFor(testFilePath).currentSession;
+    helper = AnalysisSessionHelper(session);
   }
 
   test_getClass_defined() async {
-    var file = newFile('/test/lib/c.dart', content: r'''
+    var file = newFile('$testPackageLibPath/c.dart', content: r'''
 class C {}
 int v = 0;
 ''');
@@ -39,7 +40,7 @@
   }
 
   test_getClass_defined_notClass() async {
-    var file = newFile('/test/lib/c.dart', content: r'''
+    var file = newFile('$testPackageLibPath/c.dart', content: r'''
 int v = 0;
 ''');
     String uri = file.toUri().toString();
@@ -49,10 +50,10 @@
   }
 
   test_getClass_exported() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
-    var bFile = newFile('/test/lib/b.dart', content: r'''
+    var bFile = newFile('$testPackageLibPath/b.dart', content: r'''
 export 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
@@ -63,10 +64,10 @@
   }
 
   test_getClass_imported() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
-    var bFile = newFile('/test/lib/b.dart', content: r'''
+    var bFile = newFile('$testPackageLibPath/b.dart', content: r'''
 import 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
@@ -96,7 +97,7 @@
   }
 
   test_getTopLevelPropertyAccessor_defined_getter() async {
-    var file = newFile('/test/lib/test.dart', content: r'''
+    var file = newFile('$testPackageLibPath/test.dart', content: r'''
 int get a => 0;
 ''');
     String uri = file.toUri().toString();
@@ -108,7 +109,7 @@
   }
 
   test_getTopLevelPropertyAccessor_defined_setter() async {
-    var file = newFile('/test/lib/test.dart', content: r'''
+    var file = newFile('$testPackageLibPath/test.dart', content: r'''
 set a(_) {}
 ''');
     String uri = file.toUri().toString();
@@ -120,7 +121,7 @@
   }
 
   test_getTopLevelPropertyAccessor_defined_variable() async {
-    var file = newFile('/test/lib/test.dart', content: r'''
+    var file = newFile('$testPackageLibPath/test.dart', content: r'''
 int a;
 ''');
     String uri = file.toUri().toString();
@@ -132,10 +133,10 @@
   }
 
   test_getTopLevelPropertyAccessor_exported() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int a;
 ''');
-    var bFile = newFile('/test/lib/b.dart', content: r'''
+    var bFile = newFile('$testPackageLibPath/b.dart', content: r'''
 export 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
@@ -147,10 +148,10 @@
   }
 
   test_getTopLevelPropertyAccessor_imported() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int a;
 ''');
-    var bFile = newFile('/test/lib/b.dart', content: r'''
+    var bFile = newFile('$testPackageLibPath/b.dart', content: r'''
 import 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
@@ -160,7 +161,7 @@
   }
 
   test_getTopLevelPropertyAccessor_notDefined() async {
-    var file = newFile('/test/lib/test.dart', content: r'''
+    var file = newFile('$testPackageLibPath/test.dart', content: r'''
 int a;
 ''');
     String uri = file.toUri().toString();
@@ -170,7 +171,7 @@
   }
 
   test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
-    var file = newFile('/test/lib/test.dart', content: r'''
+    var file = newFile('$testPackageLibPath/test.dart', content: r'''
 int a() {}
 ''');
     String uri = file.toUri().toString();
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index f63cc86..46d0ab5 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -8,7 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../util/element_type_matchers.dart';
-import '../resolution/driver_resolution.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -17,7 +17,7 @@
 }
 
 @reflectiveTest
-class ElementLocatorTest extends DriverResolutionTest {
+class ElementLocatorTest extends PubPackageResolutionTest {
   @override
   AnalysisOptionsImpl get analysisOptions {
     return AnalysisOptionsImpl()..hint = false;
@@ -199,7 +199,7 @@
   }
 
   test_locate_InstanceCreationExpression_type_prefixedIdentifier() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
     await resolveTestCode(r'''
@@ -215,7 +215,7 @@
   }
 
   test_locate_InstanceCreationExpression_type_simpleIdentifier() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 ''');
     await resolveTestCode(r'''
 class A {}
@@ -275,19 +275,22 @@
     expect(element, isFunctionElement);
   }
 
-  test_locate_PartOfDirective() async {
-    var libPath = convertPath('/test/lib/lib.dart');
-    var partPath = convertPath('/test/lib/test.dart');
+  test_locate_PartOfDirective_withName() async {
+    var libPath = convertPath('$testPackageLibPath/lib.dart');
+    var partPath = convertPath('$testPackageLibPath/test.dart');
 
     newFile(libPath, content: r'''
 library my.lib;
 part 'test.dart';
 ''');
 
-    driver.addFile(libPath);
-    driver.addFile(partPath);
+    newFile(partPath, content: r'''
+part of my.lib;
+''');
 
-    await resolveTestCode('part of my.lib;');
+    await resolveFile(libPath);
+
+    await resolveFile2(partPath);
     var node = findNode.partOf('part of');
     var element = ElementLocator.locate(node);
     expect(element, isLibraryElement);
@@ -318,7 +321,7 @@
   }
 
   test_locate_StringLiteral_exportUri() async {
-    newFile("/test/lib/foo.dart", content: '');
+    newFile("$testPackageLibPath/foo.dart", content: '');
     await resolveTestCode("export 'foo.dart';");
     var node = findNode.stringLiteral('foo.dart');
     var element = ElementLocator.locate(node);
@@ -333,7 +336,7 @@
   }
 
   test_locate_StringLiteral_importUri() async {
-    newFile("/test/lib/foo.dart", content: '');
+    newFile("$testPackageLibPath/foo.dart", content: '');
     await resolveTestCode("import 'foo.dart';");
     var node = findNode.stringLiteral('foo.dart');
     var element = ElementLocator.locate(node);
@@ -341,7 +344,7 @@
   }
 
   test_locate_StringLiteral_partUri() async {
-    newFile("/test/lib/foo.dart", content: 'part of lib;');
+    newFile("$testPackageLibPath/foo.dart", content: 'part of lib;');
     await resolveTestCode('''
 library lib;
 
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index df8306d..f93f0ce 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -898,6 +898,14 @@
                 [AstTestFactory.identifier3('o')])));
   }
 
+  void test_visitFieldDeclaration_abstract() {
+    _assertSource(
+        "abstract var a;",
+        AstTestFactory.fieldDeclaration(
+            false, Keyword.VAR, null, [AstTestFactory.variableDeclaration("a")],
+            isAbstract: true));
+  }
+
   void test_visitFieldDeclaration_instance() {
     _assertSource(
         "var a;",
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index be73747..06798f1 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -300,6 +300,26 @@
     expect(toNode.element, same(element));
   }
 
+  void test_visitFieldDeclaration_abstract() {
+    FieldDeclaration fromNode = AstTestFactory.fieldDeclaration(
+        false, Keyword.VAR, null, [AstTestFactory.variableDeclaration('x')],
+        isAbstract: false);
+    FieldElement element = FieldElementImpl('x', -1);
+    fromNode.fields.variables[0].name.staticElement = element;
+    FieldDeclaration toNode1 = AstTestFactory.fieldDeclaration(
+        false, Keyword.VAR, null, [AstTestFactory.variableDeclaration('x')],
+        isAbstract: false);
+    ResolutionCopier.copyResolutionData(fromNode, toNode1);
+    // Nodes matched so resolution data should have been copied.
+    expect(toNode1.fields.variables[0].declaredElement, same(element));
+    FieldDeclaration toNode2 = AstTestFactory.fieldDeclaration(
+        false, Keyword.VAR, null, [AstTestFactory.variableDeclaration('x')],
+        isAbstract: true);
+    ResolutionCopier.copyResolutionData(fromNode, toNode1);
+    // Nodes didn't match so resolution data should not have been copied.
+    expect(toNode2.fields.variables[0].declaredElement, isNull);
+  }
+
   void test_visitForEachPartsWithDeclaration() {
     ForEachPartsWithDeclaration createNode() =>
         astFactory.forEachPartsWithDeclaration(
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 78c6212..6cd1ae9 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
@@ -14,8 +13,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../generated/test_support.dart';
-import '../resolution/driver_resolution.dart';
-import '../resolution/with_null_safety_mixin.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -301,14 +299,15 @@
   }
 }
 
-class ConstantVisitorTestSupport extends DriverResolutionTest {
+class ConstantVisitorTestSupport extends PubPackageResolutionTest {
   DartObjectImpl _evaluateConstant(
     String name, {
     List<ErrorCode> errorCodes,
     Map<String, String> declaredVariables = const {},
     Map<String, DartObjectImpl> lexicalEnvironment,
   }) {
-    var options = driver.analysisOptions as AnalysisOptionsImpl;
+    var analysisContext = contextFor(this.result.path);
+    var options = analysisContext.analysisOptions as AnalysisOptionsImpl;
     var expression = findNode.topVariableDeclarationByName(name).initializer;
 
     var source = this.result.unit.declaredElement.source;
@@ -344,10 +343,14 @@
 class ConstantVisitorWithConstantUpdate2018Test
     extends ConstantVisitorTestSupport {
   @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018, EnableString.triple_shift],
+  void setUp() {
+    super.setUp();
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        experiments: [EnableString.triple_shift],
+      ),
     );
+  }
 
   test_visitAsExpression_instanceOfSameClass() async {
     await resolveTestCode('''
diff --git a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
index 225f997..4ba18ab 100644
--- a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
@@ -7,8 +7,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../resolution/driver_resolution.dart';
-import '../resolution/with_null_safety_mixin.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -20,7 +19,7 @@
 }
 
 @reflectiveTest
-class IsConstantTypeExpressionTest extends DriverResolutionTest {
+class IsConstantTypeExpressionTest extends PubPackageResolutionTest {
   test_class() async {
     await _assertConst(r'''
 int x;
@@ -28,7 +27,7 @@
   }
 
   test_class_prefix() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
     await _assertConst(r'''
@@ -38,7 +37,7 @@
   }
 
   test_class_prefix_deferred() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
     await _assertNeverConst(r'''
@@ -180,7 +179,7 @@
 }
 
 @reflectiveTest
-class PotentiallyConstantTest extends DriverResolutionTest {
+class PotentiallyConstantTest extends PubPackageResolutionTest {
   test_adjacentStrings() async {
     await _assertConst(r'''
 var x = 'a' 'b';
@@ -489,7 +488,7 @@
   }
 
   test_prefixedIdentifier_importPrefix_deferred() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const a = 0;
 ''');
     await _assertNotConst(r'''
@@ -499,7 +498,7 @@
   }
 
   test_prefixedIdentifier_importPrefix_function() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 void f() {}
 ''');
     await _assertConst(r'''
@@ -509,7 +508,7 @@
   }
 
   test_prefixedIdentifier_importPrefix_topVar() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const a = 0;
 ''');
     await _assertConst(r'''
@@ -652,7 +651,7 @@
   }
 
   test_propertyAccess_staticField_withPrefix_const() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static const a = 0;
 }
@@ -664,7 +663,7 @@
   }
 
   test_propertyAccess_staticField_withPrefix_deferred() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static const a = 0;
 }
@@ -676,7 +675,7 @@
   }
 
   test_propertyAccess_staticField_withPrefix_final() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   static final a = 0;
 }
@@ -698,7 +697,7 @@
   }
 
   test_propertyAccess_target_variable() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   final a = 0;
   const A();
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 8e625ec..3b0915a 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -19,7 +19,7 @@
 
 import '../../../generated/elements_types_mixin.dart';
 import '../../../generated/test_analysis_context.dart';
-import '../resolution/driver_resolution.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -838,9 +838,9 @@
 }
 
 @reflectiveTest
-class ElementAnnotationImplTest extends DriverResolutionTest {
+class ElementAnnotationImplTest extends PubPackageResolutionTest {
   test_computeConstantValue() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   final String f;
   const A(this.f);
@@ -1039,7 +1039,7 @@
 }
 
 @reflectiveTest
-class FieldElementImplTest extends DriverResolutionTest {
+class FieldElementImplTest extends PubPackageResolutionTest {
   test_isEnumConstant() async {
     await resolveTestCode(r'''
 enum B {B1, B2, B3}
@@ -2213,9 +2213,9 @@
 }
 
 @reflectiveTest
-class TopLevelVariableElementImplTest extends DriverResolutionTest {
+class TopLevelVariableElementImplTest extends PubPackageResolutionTest {
   test_computeConstantValue() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const int C = 42;
 ''');
     await resolveTestCode(r'''
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index 4b3d2b9..562224c 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -9,8 +9,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../resolution/driver_resolution.dart';
-import '../resolution/with_null_safety_mixin.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -1045,7 +1044,7 @@
 class InheritanceManager3WithNullSafetyTest extends _InheritanceManager3Base
     with WithNullSafetyMixin {
   test_getInheritedMap_topMerge_method() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.6
 class A {
   void foo({int a}) {}
@@ -1095,7 +1094,7 @@
   }
 
   test_getMember_optIn_inheritsOptIn() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo(int a, int? b) => 0;
 }
@@ -1119,7 +1118,7 @@
   }
 
   test_getMember_optIn_inheritsOptOut() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.6
 class A {
   int foo(int a, int b) => 0;
@@ -1204,7 +1203,7 @@
   }
 
   test_getMember_optOut_inheritsOptIn() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo(int a, int? b) => 0;
 }
@@ -1230,7 +1229,7 @@
   }
 
   test_getMember_optOut_mixesOptIn() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo(int a, int? b) => 0;
 }
@@ -1255,12 +1254,12 @@
   }
 
   test_getMember_optOut_passOptIn() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo(int a, int? b) => 0;
 }
 ''');
-    newFile('/test/lib/b.dart', content: r'''
+    newFile('$testPackageLibPath/b.dart', content: r'''
 // @dart = 2.6
 import 'a.dart';
 class B extends A {
@@ -1284,7 +1283,7 @@
   }
 }
 
-class _InheritanceManager3Base extends DriverResolutionTest {
+class _InheritanceManager3Base extends PubPackageResolutionTest {
   InheritanceManager3 manager;
 
   @override
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 6774589..c5ac808 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -9,6 +9,8 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -76,25 +78,62 @@
   }
 }
 
+class BazelWorkspaceResolutionTest extends ContextResolutionTest {
+  @override
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
+
+  String get myPackageLibPath => '$myPackageRootPath/lib';
+
+  String get myPackageRootPath => '$workspaceRootPath/dart/my';
+
+  @override
+  String get testFilePath => '$myPackageLibPath/my.dart';
+
+  String get workspaceRootPath => '/workspace';
+
+  @override
+  void setUp() {
+    super.setUp();
+    newFile('$workspaceRootPath/WORKSPACE', content: '');
+  }
+}
+
 /// [AnalysisContextCollection] based implementation of [ResolutionTest].
 abstract class ContextResolutionTest
     with ResourceProviderMixin, ResolutionTest {
   static bool _lintRulesAreRegistered = false;
 
+  Map<String, String> _declaredVariables = {};
   AnalysisContextCollection _analysisContextCollection;
 
   List<MockSdkLibrary> get additionalMockSdkLibraries => [];
 
   List<String> get collectionIncludedPaths;
 
+  set declaredVariables(Map<String, String> map) {
+    if (_analysisContextCollection != null) {
+      throw StateError('Declared variables cannot be changed after analysis.');
+    }
+
+    _declaredVariables = map;
+  }
+
   AnalysisContext contextFor(String path) {
     if (_analysisContextCollection == null) {
       _createAnalysisContexts();
     }
 
+    path = convertPath(path);
     return _analysisContextCollection.contextFor(path);
   }
 
+  /// TODO(scheglov) Replace this with a method that changes a file in
+  /// [AnalysisContextCollectionImpl].
+  AnalysisDriver driverFor(String path) {
+    var context = contextFor(path) as DriverBasedAnalysisContext;
+    return context.driver;
+  }
+
   @override
   File newFile(String path, {String content = ''}) {
     if (_analysisContextCollection != null && !path.endsWith('.dart')) {
@@ -127,8 +166,9 @@
   /// Create all analysis contexts in [collectionIncludedPaths].
   void _createAnalysisContexts() {
     _analysisContextCollection = AnalysisContextCollectionImpl(
-      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
+      declaredVariables: _declaredVariables,
       enableIndex: true,
+      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
       sdkPath: convertPath('/sdk'),
     );
@@ -184,12 +224,23 @@
     );
   }
 
-  void writeTestPackageConfigWithMeta() {
-    var path = '/packages/meta';
+  void writeTestPackageConfigWith(
+    Map<String, String> nameToRootPath, {
+    bool meta = false,
+  }) {
+    var metaPath = '/packages/meta';
     PackagesContent.addMetaPackageFiles(
-      getFolder(path),
+      getFolder(metaPath),
     );
-    writeTestPackageConfig({'meta': path});
+
+    writeTestPackageConfig({
+      if (meta) 'meta': metaPath,
+      ...nameToRootPath,
+    });
+  }
+
+  void writeTestPackageConfigWithMeta() {
+    writeTestPackageConfigWith({}, meta: true);
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/export_test.dart b/pkg/analyzer/test/src/dart/resolution/export_test.dart
index 8fcf08b..fe41eaf 100644
--- a/pkg/analyzer/test/src/dart/resolution/export_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/export_test.dart
@@ -2,11 +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/declared_variables.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'driver_resolution.dart';
+import 'context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,16 +14,16 @@
 }
 
 @reflectiveTest
-class ExportResolutionTest extends DriverResolutionTest {
+class ExportResolutionTest extends PubPackageResolutionTest {
   test_configurations_default() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'false',
       'dart.library.io': 'false',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 export 'a.dart'
@@ -45,14 +44,14 @@
   }
 
   test_configurations_first() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'true',
       'dart.library.io': 'false',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 export 'a.dart'
@@ -73,14 +72,14 @@
   }
 
   test_configurations_second() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'false',
       'dart.library.io': 'true',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 export 'a.dart'
@@ -102,7 +101,7 @@
 
   /// Test that both getter and setter are in the export namespace.
   test_namespace_getter_setter() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 get f => null;
 set f(_) {}
 ''');
@@ -113,9 +112,4 @@
     expect(exportNamespace.get('f'), isNotNull);
     expect(exportNamespace.get('f='), isNotNull);
   }
-
-  void _setDeclaredVariables(Map<String, String> map) {
-    driver.declaredVariables = DeclaredVariables.fromMap(map);
-    driver.configure();
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/import_test.dart b/pkg/analyzer/test/src/dart/resolution/import_test.dart
index 78a4392..145bae8 100644
--- a/pkg/analyzer/test/src/dart/resolution/import_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/import_test.dart
@@ -2,10 +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/declared_variables.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'driver_resolution.dart';
+import 'context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,16 +13,16 @@
 }
 
 @reflectiveTest
-class ImportDirectiveResolutionTest extends DriverResolutionTest {
+class ImportDirectiveResolutionTest extends PubPackageResolutionTest {
   test_configurations_default() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'false',
       'dart.library.io': 'false',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 import 'a.dart'
@@ -44,14 +43,14 @@
   }
 
   test_configurations_first() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'true',
       'dart.library.io': 'false',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 import 'a.dart'
@@ -72,14 +71,14 @@
   }
 
   test_configurations_second() async {
-    newFile('/test/lib/a.dart', content: 'class A {}');
-    newFile('/test/lib/a_html.dart', content: 'class A {}');
-    newFile('/test/lib/a_io.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_html.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a_io.dart', content: 'class A {}');
 
-    _setDeclaredVariables({
+    declaredVariables = {
       'dart.library.html': 'false',
       'dart.library.io': 'true',
-    });
+    };
 
     await assertNoErrorsInCode(r'''
 import 'a.dart'
@@ -98,9 +97,4 @@
     var a = findElement.topVar('a');
     assertElementLibraryUri(a.type.element, 'package:test/a_io.dart');
   }
-
-  void _setDeclaredVariables(Map<String, String> map) {
-    driver.declaredVariables = DeclaredVariables.fromMap(map);
-    driver.configure();
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
index 0a5c22b..3df95f6 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
@@ -2,14 +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:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'driver_resolution.dart';
+import 'context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -18,9 +17,9 @@
 }
 
 @reflectiveTest
-class LibraryElementTest extends DriverResolutionTest {
+class LibraryElementTest extends PubPackageResolutionTest {
   test_languageVersion() async {
-    newFile('/test/.dart_tool/package_config.json', content: '''
+    newFile('$testPackageRootPath/.dart_tool/package_config.json', content: '''
 {
   "configVersion": 2,
   "packages": [
@@ -38,89 +37,83 @@
   ]
 }
 ''');
-    driver.configure(
-      packages: findPackagesFrom(
-        resourceProvider,
-        getFolder('/test'),
-      ),
-    );
 
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 ''');
 
-    newFile('/test/lib/b.dart', content: r'''
+    newFile('$testPackageLibPath/b.dart', content: r'''
 // @dart = 2.6
 class A {}
 ''');
 
-    newFile('/test/lib/c.dart', content: r'''
+    newFile('$testPackageLibPath/c.dart', content: r'''
 // @dart = 2.9
 class A {}
 ''');
 
-    newFile('/test/lib/d.dart', content: r'''
+    newFile('$testPackageLibPath/d.dart', content: r'''
 // @dart = 2.99
 class A {}
 ''');
 
-    newFile('/test/lib/e.dart', content: r'''
+    newFile('$testPackageLibPath/e.dart', content: r'''
 // @dart = 3.0
 class A {}
 ''');
 
-    newFile('/aaa/lib/a.dart', content: r'''
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 class A {}
 ''');
 
-    newFile('/aaa/lib/b.dart', content: r'''
+    newFile('$workspaceRootPath/aaa/lib/b.dart', content: r'''
 // @dart = 2.99
 class A {}
 ''');
 
-    newFile('/aaa/lib/c.dart', content: r'''
+    newFile('$workspaceRootPath/aaa/lib/c.dart', content: r'''
 // @dart = 3.0
 class A {}
 ''');
 
     // No override.
     await _assertLanguageVersion(
-      uriStr: 'package:test/a.dart',
+      path: '$testPackageLibPath/a.dart',
       package: Version.parse('2.7.0'),
       override: null,
     );
 
     // Valid override, less than the latest supported language version.
     await _assertLanguageVersion(
-      uriStr: 'package:test/b.dart',
+      path: '$testPackageLibPath/b.dart',
       package: Version.parse('2.7.0'),
       override: Version.parse('2.6.0'),
     );
 
     // Valid override, even if greater than the package language version.
     await _assertLanguageVersion(
-      uriStr: 'package:test/c.dart',
+      path: '$testPackageLibPath/c.dart',
       package: Version.parse('2.7.0'),
       override: Version.parse('2.9.0'),
     );
 
     // Invalid override: minor is greater than the latest minor.
     await _assertLanguageVersion(
-      uriStr: 'package:test/d.dart',
+      path: '$testPackageLibPath/d.dart',
       package: Version.parse('2.7.0'),
       override: null,
     );
 
     // Invalid override: major is greater than the latest major.
     await _assertLanguageVersion(
-      uriStr: 'package:test/e.dart',
+      path: '$testPackageLibPath/e.dart',
       package: Version.parse('2.7.0'),
       override: null,
     );
 
-    await _assertLanguageVersionCurrent('package:aaa/a.dart');
-    await _assertLanguageVersionCurrent('package:aaa/b.dart');
-    await _assertLanguageVersionCurrent('package:aaa/c.dart');
+    await _assertLanguageVersionCurrent('$workspaceRootPath/aaa/lib/a.dart');
+    await _assertLanguageVersionCurrent('$workspaceRootPath/aaa/lib/b.dart');
+    await _assertLanguageVersionCurrent('$workspaceRootPath/aaa/lib/c.dart');
   }
 
   test_scope_lookup2() async {
@@ -373,18 +366,21 @@
   }
 
   Future<void> _assertLanguageVersion({
-    @required String uriStr,
+    @required String path,
     @required Version package,
     @required Version override,
   }) async {
-    var element = await driver.getLibraryByUri(uriStr);
+    path = convertPath(path);
+    var session = contextFor(path).currentSession;
+    var file = session.getFile(path);
+    var element = await session.getLibraryByUri('${file.uri}');
     expect(element.languageVersion.package, package);
     expect(element.languageVersion.override, override);
   }
 
-  Future<void> _assertLanguageVersionCurrent(String uriStr) async {
+  Future<void> _assertLanguageVersionCurrent(String path) async {
     await _assertLanguageVersion(
-      uriStr: uriStr,
+      path: path,
       package: ExperimentStatus.currentVersion,
       override: null,
     );
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
new file mode 100644
index 0000000..517ad52
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2020, 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_reflective_loader/test_reflective_loader.dart';
+
+import 'context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonNullableBazelWorkspaceTest);
+  });
+}
+
+@reflectiveTest
+class NonNullableBazelWorkspaceTest extends BazelWorkspaceResolutionTest {
+  @override
+  bool get typeToStringWithNullability => true;
+
+  test_buildFile_legacy_commentedOut() async {
+    newFile('$myPackageRootPath/BUILD', content: r'''
+dart_package(
+#  null_safety = True,
+''');
+
+    await resolveFileCode(
+      '$myPackageRootPath/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int*');
+  }
+
+  test_buildFile_nonNullable() async {
+    newFile('$myPackageRootPath/BUILD', content: r'''
+dart_package(
+  null_safety = True,
+)
+''');
+
+    // Non-nullable in lib/.
+    await resolveFileCode(
+      '$myPackageRootPath/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int');
+
+    // Non-nullable in test/.
+    await resolveFileCode(
+      '$myPackageRootPath/test/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int');
+
+    // Non-nullable in bin/.
+    await resolveFileCode(
+      '$myPackageRootPath/bin/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int');
+
+    // Legacy in other package.
+    await resolveFileCode(
+      '$workspaceRootPath/dart/aaa/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int*');
+  }
+
+  test_buildFile_nonNullable_oneLine_noComma() async {
+    newFile('$myPackageRootPath/BUILD', content: r'''
+dart_package(null_safety = True)
+''');
+
+    await resolveFileCode(
+      '$myPackageRootPath/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int');
+  }
+
+  test_buildFile_nonNullable_withComments() async {
+    newFile('$myPackageRootPath/BUILD', content: r'''
+dart_package(
+  # Preceding comment.
+  null_safety = True,  # Trailing comment.
+)  # Last comment.
+''');
+
+    await resolveFileCode(
+      '$myPackageRootPath/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.typeName('int v'), 'int');
+  }
+
+  test_noBuildFile_legacy() async {
+    await assertNoErrorsInCode('''
+int v = 0;
+''');
+
+    assertType(findNode.typeName('int v'), 'int*');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index a592c91..5aa6ff0 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -291,6 +291,10 @@
     assertErrorsInList(result.errors, expectedErrors);
   }
 
+  void assertErrorsInResult(List<ExpectedError> expectedErrors) {
+    assertErrorsInResolvedUnit(result, expectedErrors);
+  }
+
   void assertFunctionExpressionInvocation(
     FunctionExpressionInvocation node, {
     @required ExecutableElement element,
@@ -516,6 +520,10 @@
     assertErrorsInResolvedUnit(result, const []);
   }
 
+  void assertNoErrorsInResult() {
+    assertErrorsInResult(const []);
+  }
+
   void assertParameterElement(
     Expression expression,
     ParameterElement expected,
@@ -767,19 +775,33 @@
 
   Future<ResolvedUnitResult> resolveFile(String path);
 
-  /// Put the [code] into the test file, and resolve it.
-  Future<void> resolveTestCode(String code) async {
-    addTestFile(code);
-    await resolveTestFile();
-  }
+  /// Resolve the file with the [path] into [result].
+  Future<void> resolveFile2(String path) async {
+    path = convertPath(path);
 
-  Future<void> resolveTestFile() async {
-    var path = convertPath(testFilePath);
     result = await resolveFile(path);
+    expect(result.state, ResultState.VALID);
+
     findNode = FindNode(result.content, result.unit);
     findElement = FindElement(result.unit);
   }
 
+  /// Create a new file with the [path] and [content], resolve it into [result].
+  Future<void> resolveFileCode(String path, String content) {
+    newFile(path, content: content);
+    return resolveFile2(path);
+  }
+
+  /// Put the [code] into the test file, and resolve it.
+  Future<void> resolveTestCode(String code) {
+    addTestFile(code);
+    return resolveTestFile();
+  }
+
+  Future<void> resolveTestFile() {
+    return resolveFile2(testFilePath);
+  }
+
   /// Choose the type display string, depending on whether the [result] is
   /// non-nullable or legacy.
   String typeStr(String nonNullable, String legacy) {
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 1b33b1b..7c87fe5 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -46,6 +46,7 @@
 import 'method_invocation_test.dart' as method_invocation;
 import 'mixin_test.dart' as mixin_resolution;
 import 'namespace_test.dart' as namespace;
+import 'non_nullable_bazel_workspace_test.dart' as non_nullable_bazel_workspace;
 import 'non_nullable_test.dart' as non_nullable;
 import 'optional_const_test.dart' as optional_const;
 import 'postfix_expression_test.dart' as postfix_expression;
@@ -102,6 +103,7 @@
     method_invocation.main();
     mixin_resolution.main();
     namespace.main();
+    non_nullable_bazel_workspace.main();
     non_nullable.main();
     optional_const.main();
     postfix_expression.main();
diff --git a/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart b/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
index d9b7c1b..e60d05c 100644
--- a/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/exit_detector_test.dart
@@ -9,7 +9,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../ast/parse_base.dart';
-import '../resolution/driver_resolution.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -920,7 +920,7 @@
 /// TODO(paulberry): migrate this test away from the task model.
 /// See dartbug.com/35734.
 @reflectiveTest
-class ExitDetectorResolvedStatementTest extends DriverResolutionTest {
+class ExitDetectorResolvedStatementTest extends PubPackageResolutionTest {
   test_forStatement_implicitTrue_breakWithLabel() async {
     await _assertNthStatementDoesNotExit(r'''
 void f() {
@@ -1081,15 +1081,9 @@
   }
 
   Future<void> _assertHasReturn(String code, int n, bool expected) async {
-    var path = convertPath('/test/lib/test.dart');
+    await resolveTestCode(code);
 
-    newFile(path, content: code);
-
-    var session = driver.currentSession;
-    var resolvedResult = await session.getResolvedUnit(path);
-
-    var unit = resolvedResult.unit;
-    FunctionDeclaration function = unit.declarations.last;
+    FunctionDeclaration function = result.unit.declarations.last;
     BlockFunctionBody body = function.functionExpression.body;
     Statement statement = body.block.statements[n];
     expect(ExitDetector.exits(statement), expected);
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart
new file mode 100644
index 0000000..b874331
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2020, 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/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AbstractFieldConstructorInitializerTest);
+  });
+}
+
+@reflectiveTest
+class AbstractFieldConstructorInitializerTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin {
+  test_abstract_field_constructor_initializer() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+  A() : x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, 45, 1),
+    ]);
+  }
+
+  test_abstract_field_final_constructor_initializer() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x;
+  A() : x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, 51, 1),
+    ]);
+  }
+
+  test_abstract_field_final_initializing_formal() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x;
+  A(this.x);
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, 52, 1),
+    ]);
+  }
+
+  test_abstract_field_final_no_initialization() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+  A();
+}
+''');
+  }
+
+  test_abstract_field_initializing_formal() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+  A(this.x);
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, 46, 1),
+    ]);
+  }
+
+  test_abstract_field_no_initialization() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+  A();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart
new file mode 100644
index 0000000..417c2d6
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2020, 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/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AbstractFieldInitializerTest);
+  });
+}
+
+@reflectiveTest
+class AbstractFieldInitializerTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin {
+  test_abstract_field_final_initializer() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER, 40, 1),
+    ]);
+  }
+
+  test_abstract_field_final_no_initializer() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+''');
+  }
+
+  test_abstract_field_initializer() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER, 34, 1),
+    ]);
+  }
+
+  test_abstract_field_no_initializer() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
index bbe22a6..b93d824 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
@@ -71,4 +71,31 @@
 }
 ''');
   }
+
+  test_set_abstract_field_final_invalid() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+void f(A a, int x) {
+  a.x = x;
+}
+''', [
+      error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL, 70, 1),
+    ]);
+  }
+
+  test_set_abstract_field_final_overridden_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+abstract class B extends A {
+  void set x(int value);
+}
+void f(B b, int x) {
+  b.x = x; // ok because setter provided in derived class
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
index 77805ab..c85acdb 100644
--- a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
@@ -10,11 +10,15 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConcreteClassWithAbstractMemberTest);
+    defineReflectiveTests(ConcreteClassWithAbstractMemberWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
-class ConcreteClassWithAbstractMemberTest extends PubPackageResolutionTest {
+class ConcreteClassWithAbstractMemberTest extends PubPackageResolutionTest
+    with ConcreteClassWithAbstractMemberTestCases {}
+
+mixin ConcreteClassWithAbstractMemberTestCases on PubPackageResolutionTest {
   test_direct() async {
     await assertErrorsInCode('''
 class A {
@@ -36,3 +40,32 @@
     ]);
   }
 }
+
+@reflectiveTest
+class ConcreteClassWithAbstractMemberWithNullSafetyTest
+    extends PubPackageResolutionTest
+    with WithNullSafetyMixin, ConcreteClassWithAbstractMemberTestCases {
+  test_abstract_field() async {
+    await assertErrorsInCode('''
+class A {
+  abstract int? x;
+}
+''', [
+      error(CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 12, 16,
+          text: "'x' must have a method body because 'A' isn't abstract."),
+      error(CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 12, 16,
+          text: "'x=' must have a method body because 'A' isn't abstract."),
+    ]);
+  }
+
+  test_abstract_field_final() async {
+    await assertErrorsInCode('''
+class A {
+  abstract final int? x;
+}
+''', [
+      error(CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 12, 22,
+          text: "'x' must have a method body because 'A' isn't abstract."),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index b7517ec..54cccca 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -2,7 +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/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -10,8 +9,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../dart/resolution/driver_resolution.dart';
-import '../dart/resolution/with_null_safety_mixin.dart';
+import '../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -22,7 +20,7 @@
 }
 
 @reflectiveTest
-class ConstEvalThrowsExceptionTest extends DriverResolutionTest {
+class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest {
   test_assertInitializerThrows() async {
     await assertErrorsInCode(r'''
 class A {
@@ -36,7 +34,7 @@
 
   test_CastError_intToDouble_constructor_importAnalyzedAfter() async {
     // See dartbug.com/35993
-    newFile('/test/lib/other.dart', content: '''
+    newFile('$testPackageLibPath/other.dart', content: '''
 class Foo {
   final double value;
 
@@ -60,13 +58,13 @@
 }
 ''');
     var otherFileResult =
-        await resolveFile(convertPath('/test/lib/other.dart'));
+        await resolveFile(convertPath('$testPackageLibPath/other.dart'));
     expect(otherFileResult.errors, isEmpty);
   }
 
   test_CastError_intToDouble_constructor_importAnalyzedBefore() async {
     // See dartbug.com/35993
-    newFile('/test/lib/other.dart', content: '''
+    newFile('$testPackageLibPath/other.dart', content: '''
 class Foo {
   final double value;
 
@@ -90,12 +88,12 @@
 }
 ''');
     var otherFileResult =
-        await resolveFile(convertPath('/test/lib/other.dart'));
+        await resolveFile(convertPath('$testPackageLibPath/other.dart'));
     expect(otherFileResult.errors, isEmpty);
   }
 
   test_default_constructor_arg_empty_map_import() async {
-    newFile('/test/lib/other.dart', content: '''
+    newFile('$testPackageLibPath/other.dart', content: '''
 class C {
   final Map<String, int> m;
   const C({this.m = const <String, int>{}})
@@ -112,7 +110,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 37, 1),
     ]);
     var otherFileResult =
-        await resolveFile(convertPath('/test/lib/other.dart'));
+        await resolveFile(convertPath('$testPackageLibPath/other.dart'));
     assertErrorsInList(
       otherFileResult.errors,
       expectedErrorsByNullability(
@@ -193,7 +191,7 @@
   test_fromEnvironment_bool_badDefault_whenDefined() async {
     // The type of the defaultValue needs to be correct even when the default
     // value isn't used (because the variable is defined in the environment).
-    driver.declaredVariables = DeclaredVariables.fromMap({'x': 'true'});
+    declaredVariables = {'x': 'true'};
     await assertErrorsInCode('''
 var b = const bool.fromEnvironment('x', defaultValue: 1);
 ''', [
@@ -277,7 +275,7 @@
   }
 
   test_invalid_constructorFieldInitializer_fromSeparateLibrary() async {
-    newFile('/test/lib/lib.dart', content: r'''
+    newFile('$testPackageLibPath/lib.dart', content: r'''
 class A<T> {
   final int f;
   const A() : f = T.foo;
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 8a43e70..c273957 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -362,8 +362,8 @@
     configureWorkspace(root: '/workspace');
 
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    newFileWithBytes('/workspace/.packages', 'project:lib/'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
+    newFile('/workspace/.packages', content: 'project:lib/');
 
     newFile('/workspace/lib/deprecated_library.dart', content: r'''
 @deprecated
@@ -707,7 +707,7 @@
 ''');
 
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
 
     await assertErrorsInFile('/workspace/package/lib/lib1.dart', r'''
 import 'package:aaa/a.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 7e55627..8772ebf 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FinalNotInitializedTest);
+    defineReflectiveTests(FinalNotInitializedWithNullSafetyTest);
   });
 }
 
@@ -84,6 +85,23 @@
 @reflectiveTest
 class FinalNotInitializedWithNullSafetyTest extends PubPackageResolutionTest
     with WithNullSafetyMixin {
+  test_field_abstract() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+''');
+  }
+
+  test_field_abstract_with_constructor() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+  A();
+}
+''');
+  }
+
   test_field_noConstructor_initializer() async {
     await assertNoErrorsInCode('''
 class C {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
index 53609b5..03e35bc 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_language_override_greater_test.dart
@@ -2,7 +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/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
@@ -11,8 +10,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../dart/resolution/driver_resolution.dart';
-import '../dart/resolution/with_null_safety_mixin.dart';
+import '../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -21,7 +19,7 @@
 }
 
 @reflectiveTest
-class InvalidLanguageOverrideGreaterTest extends DriverResolutionTest
+class InvalidLanguageOverrideGreaterTest extends PubPackageResolutionTest
     with WithNullSafetyMixin {
   test_greaterThanLatest() async {
     var latestVersion = ExperimentStatus.currentVersion;
@@ -72,15 +70,18 @@
   }
 
   void _configureTestPackageLanguageVersion(String versionStr) {
-    driver.configure(
-      packages: Packages({
-        'test': Package(
-          name: 'test',
-          rootFolder: getFolder('/test'),
-          libFolder: getFolder('/test/lib'),
-          languageVersion: Version.parse(versionStr + '.0'),
-        ),
-      }),
-    );
+    newFile('$testPackageRootPath/.dart_tool/package_config.json', content: '''
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "test",
+      "rootUri": "../",
+      "packageUri": "lib/",
+      "languageVersion": "$versionStr"
+    }
+  ]
+}
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
index 6809dfa..fc35f34 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
@@ -562,6 +562,96 @@
 @reflectiveTest
 class InvalidOverrideWithNullSafetyTest extends PubPackageResolutionTest
     with WithNullSafetyMixin {
+  test_abstract_field_covariant_inheritance() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract covariant num x;
+}
+abstract class B implements A {
+  void set x(Object value); // Implicitly covariant
+}
+abstract class C implements B {
+  int get x;
+  void set x(int value); // Ok because covariant
+}
+''');
+  }
+
+  test_getter_overrides_abstract_field_covariant_invalid() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract covariant int x;
+}
+abstract class B implements A {
+  num get x;
+  void set x(num value);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 91, 1),
+    ]);
+  }
+
+  test_getter_overrides_abstract_field_covariant_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract covariant num x;
+}
+abstract class B implements A {
+  int get x;
+}
+''');
+  }
+
+  test_getter_overrides_abstract_field_final_invalid() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+abstract class B implements A {
+  num get x;
+  void set x(num value);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 87, 1),
+    ]);
+  }
+
+  test_getter_overrides_abstract_field_final_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final num x;
+}
+abstract class B implements A {
+  int get x;
+}
+''');
+  }
+
+  test_getter_overrides_abstract_field_invalid() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+abstract class B implements A {
+  num get x;
+  void set x(num value);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 81, 1),
+    ]);
+  }
+
+  test_getter_overrides_abstract_field_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract num x;
+}
+abstract class B implements A {
+  int get x;
+}
+''');
+  }
+
   test_method_parameter_functionTyped_optOut_extends_optIn() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 abstract class A {
@@ -659,6 +749,55 @@
 ''');
   }
 
+  test_setter_overrides_abstract_field_covariant_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract covariant num x;
+}
+abstract class B implements A {
+  int get x;
+  void set x(int value);
+}
+''');
+  }
+
+  test_setter_overrides_abstract_field_final_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final num x;
+}
+abstract class B implements A {
+  int get x;
+  void set x(int value);
+}
+''');
+  }
+
+  test_setter_overrides_abstract_field_invalid() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract num x;
+}
+abstract class B implements A {
+  int get x;
+  void set x(int value);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 95, 1),
+    ]);
+  }
+
+  test_setter_overrides_abstract_field_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+abstract class B implements A {
+  void set x(num value);
+}
+''');
+  }
+
   test_viaLegacy_class() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A1 {
diff --git a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
index 1394130..c2faa10 100644
--- a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
@@ -10,12 +10,18 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonAbstractClassInheritsAbstractMemberTest);
+    defineReflectiveTests(
+        NonAbstractClassInheritsAbstractMemberWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
 class NonAbstractClassInheritsAbstractMemberTest
-    extends PubPackageResolutionTest {
+    extends PubPackageResolutionTest
+    with NonAbstractClassInheritsAbstractMemberTestCases {}
+
+mixin NonAbstractClassInheritsAbstractMemberTestCases
+    on PubPackageResolutionTest {
   test_abstractsDontOverrideConcretes_getter() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -606,3 +612,91 @@
     ]);
   }
 }
+
+@reflectiveTest
+class NonAbstractClassInheritsAbstractMemberWithNullSafetyTest
+    extends PubPackageResolutionTest
+    with WithNullSafetyMixin, NonAbstractClassInheritsAbstractMemberTestCases {
+  test_abstract_field_final_implement_getter() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+class B implements A {
+  int get x => 0;
+}
+''');
+  }
+
+  test_abstract_field_final_implement_none() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+class B implements A {}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          51,
+          1),
+    ]);
+  }
+
+  test_abstract_field_implement_getter() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+class B implements A {
+  int get x => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          45,
+          1),
+    ]);
+  }
+
+  test_abstract_field_implement_getter_and_setter() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+class B implements A {
+  int get x => 0;
+  void set x(int value) {}
+}
+''');
+  }
+
+  test_abstract_field_implement_none() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+class B implements A {}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+          45,
+          1),
+    ]);
+  }
+
+  test_abstract_field_implement_setter() async {
+    await assertErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+class B implements A {
+  void set x(int value) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          45,
+          1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart
index 1b62195..08e6965 100644
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart
@@ -16,6 +16,23 @@
 @reflectiveTest
 class NotInitializedNonNullableInstanceFieldTest
     extends PubPackageResolutionTest with WithNullSafetyMixin {
+  test_abstract_field_non_nullable() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+''');
+  }
+
+  test_abstract_field_non_nullable_with_constructor() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+  A();
+}
+''');
+  }
+
   test_class_factoryConstructor() async {
     await assertNoErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 5346a05..c166314 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -5,6 +5,9 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'abstract_class_member_test.dart' as abstract_class_member;
+import 'abstract_field_constructor_initializer_test.dart'
+    as abstract_field_constructor_initializer;
+import 'abstract_field_initializer_test.dart' as abstract_field_initializer;
 import 'abstract_super_member_reference_test.dart'
     as abstract_super_member_reference;
 import 'access_private_enum_field_test.dart' as access_private_enum_field;
@@ -631,6 +634,8 @@
 main() {
   defineReflectiveSuite(() {
     abstract_class_member.main();
+    abstract_field_constructor_initializer.main();
+    abstract_field_initializer.main();
     abstract_super_member_reference.main();
     access_private_enum_field.main();
     ambiguous_export.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index a914c3c..65b9468 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -10,11 +10,15 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UndefinedGetterTest);
+    defineReflectiveTests(UndefinedGetterWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
-class UndefinedGetterTest extends PubPackageResolutionTest {
+class UndefinedGetterTest extends PubPackageResolutionTest
+    with UndefinedGetterTestCases {}
+
+mixin UndefinedGetterTestCases on PubPackageResolutionTest {
   test_compoundAssignment_hasSetter_instance() async {
     await assertErrorsInCode('''
 class C {
@@ -222,14 +226,19 @@
   }
 
   test_nullMember_undefined() async {
-    await assertErrorsInCode(r'''
+    await assertErrorsInCode(
+        r'''
 m() {
   Null _null;
   _null.foo;
 }
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 3),
-    ]);
+''',
+        expectedErrorsByNullability(nullable: [
+          error(CompileTimeErrorCode.INVALID_USE_OF_NULL_VALUE, 22, 5),
+          error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 3),
+        ], legacy: [
+          error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 3),
+        ]));
   }
 
   test_object_call() async {
@@ -332,8 +341,10 @@
     await assertNoErrorsInCode(r'''
 class A<E> {
   E element;
+  A(this.element);
 }
 class B extends A<List> {
+  B(List element) : super(element);
   m() {
     element.last;
   }
@@ -341,3 +352,31 @@
 ''');
   }
 }
+
+@reflectiveTest
+class UndefinedGetterWithNullSafetyTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin, UndefinedGetterTestCases {
+  test_get_from_abstract_field_final_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract final int x;
+}
+int f(A a) => a.x;
+''');
+  }
+
+  test_get_from_abstract_field_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+int f(A a) => a.x;
+''');
+  }
+
+  @override
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42957')
+  test_typeLiteral_conditionalAccess() {
+    return super.test_typeLiteral_conditionalAccess();
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index d0d2315..d5c09b8 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -10,11 +10,15 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UndefinedSetterTest);
+    defineReflectiveTests(UndefinedSetterWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
-class UndefinedSetterTest extends PubPackageResolutionTest {
+class UndefinedSetterTest extends PubPackageResolutionTest
+    with UndefinedSetterTestCases {}
+
+mixin UndefinedSetterTestCases on PubPackageResolutionTest {
   test_importWithPrefix_defined() async {
     newFile('$testPackageLibPath/lib.dart', content: r'''
 library lib;
@@ -135,3 +139,18 @@
     ]);
   }
 }
+
+@reflectiveTest
+class UndefinedSetterWithNullSafetyTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin, UndefinedSetterTestCases {
+  test_set_abstract_field_valid() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  abstract int x;
+}
+void f(A a, int x) {
+  a.x = x;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/uri_does_not_exist_test.dart b/pkg/analyzer/test/src/diagnostics/uri_does_not_exist_test.dart
index 8682a2d1..a9bdb9b 100644
--- a/pkg/analyzer/test/src/diagnostics/uri_does_not_exist_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/uri_does_not_exist_test.dart
@@ -5,8 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/test_support.dart';
-import '../dart/resolution/driver_resolution.dart';
+import '../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,7 +14,7 @@
 }
 
 @reflectiveTest
-class UriDoesNotExistTest extends DriverResolutionTest {
+class UriDoesNotExistTest extends PubPackageResolutionTest {
   test_deferredImportWithInvalidUri() async {
     await assertErrorsInCode(r'''
 import '[invalid uri]' deferred as p;
@@ -44,7 +43,7 @@
   }
 
   test_import_appears_after_deleting_target() async {
-    String filePath = newFile('/test/lib/target.dart').path;
+    String filePath = newFile('$testPackageLibPath/target.dart').path;
 
     await assertErrorsInCode('''
 import 'target.dart';
@@ -54,12 +53,10 @@
 
     // Remove the overlay in the same way as AnalysisServer.
     deleteFile(filePath);
-    driver.removeFile(filePath);
+    driverFor(testFilePath).removeFile(filePath);
 
     await resolveTestFile();
-    GatheringErrorListener errorListener = GatheringErrorListener();
-    errorListener.addAll(result.errors);
-    errorListener.assertErrors([
+    assertErrorsInResult([
       error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 13),
     ]);
   }
@@ -72,15 +69,13 @@
       error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 13),
     ]);
 
-    newFile('/test/lib/target.dart');
+    newFile('$testPackageLibPath/target.dart');
 
     // Make sure the error goes away.
     // TODO(brianwilkerson) The error does not go away, possibly because the
     //  file is not being reanalyzed.
     await resolveTestFile();
-    GatheringErrorListener errorListener = GatheringErrorListener();
-    errorListener.addAll(result.errors);
-    errorListener.assertErrors([
+    assertErrorsInResult([
       error(HintCode.UNUSED_IMPORT, 0, 0),
     ]);
   }
@@ -95,21 +90,21 @@
   }
 
   test_valid_dll() async {
-    newFile("/test/lib/lib.dll");
+    newFile("$testPackageLibPath/lib.dll");
     await assertNoErrorsInCode('''
 import 'dart-ext:lib';
 ''');
   }
 
   test_valid_dylib() async {
-    newFile("/test/lib/lib.dylib");
+    newFile("$testPackageLibPath/lib.dylib");
     await assertNoErrorsInCode('''
 import 'dart-ext:lib';
 ''');
   }
 
   test_valid_so() async {
-    newFile("/test/lib/lib.so");
+    newFile("$testPackageLibPath/lib.so");
     await assertNoErrorsInCode('''
 import 'dart-ext:lib';
 ''');
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 01364df..194fe57 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -11,7 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../dart/resolution/driver_resolution.dart';
+import '../../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -24,7 +24,7 @@
 }
 
 @reflectiveTest
-abstract class AbstractLinterContextTest extends DriverResolutionTest {
+abstract class AbstractLinterContextTest extends PubPackageResolutionTest {
   LinterContextImpl context;
 
   Future<void> resolve(String content) async {
@@ -246,7 +246,7 @@
   }
 
   void test_true_computeDependencies() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const a = 0;
 ''');
 
@@ -286,7 +286,7 @@
   }
 
   void test_true_importedClass_defaultValue() async {
-    var aPath = convertPath('/test/lib/a.dart');
+    var aPath = convertPath('$testPackageLibPath/a.dart');
     newFile(aPath, content: r'''
 class A {
   final int a;
@@ -329,7 +329,7 @@
   }
 
   void test_listLiteral_true_computeDependencies() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 const a = 0;
 ''');
 
@@ -463,7 +463,7 @@
 @reflectiveTest
 class PubDependencyTest extends AbstractLinterContextTest {
   test_dependencies() async {
-    newFile('/test/pubspec.yaml', content: '''
+    newFile('$testPackageRootPath/pubspec.yaml', content: '''
 name: test
 
 dependencies:
diff --git a/pkg/analyzer/test/src/lint/linter/resolve_name_in_scope_test.dart b/pkg/analyzer/test/src/lint/linter/resolve_name_in_scope_test.dart
index 3aa45e2..8ad3449 100644
--- a/pkg/analyzer/test/src/lint/linter/resolve_name_in_scope_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/resolve_name_in_scope_test.dart
@@ -48,7 +48,7 @@
   }
 
   test_class_getter_different_importScope() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 set foo(int _) {}
 ''');
     await resolve('''
@@ -86,7 +86,7 @@
   }
 
   test_class_getter_requested_importScope() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 int get foo => 0;
 ''');
     await resolve('''
@@ -246,7 +246,7 @@
   }
 
   test_class_method_requested_importScope() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 void foo() {}
 ''');
     await resolve('''
@@ -490,7 +490,7 @@
   }
 
   test_class_setter_requested_importScope() async {
-    newFile('/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 set foo(int _) {}
 ''');
     await resolve('''
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 951af04..b630645 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -965,6 +965,7 @@
 
       writeIf(e.isSynthetic, 'synthetic ');
       writeIf(e.isStatic, 'static ');
+      writeIf(e is FieldElementImpl && e.isAbstract, 'abstract ');
       writeIf(e is FieldElementImpl && e.isCovariant, 'covariant ');
     } else {
       writeDocumentation(e);
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 20384ca..70960ee 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -497,6 +497,7 @@
     _writeln('FieldDeclaration');
     _withIndent(() {
       var properties = _Properties();
+      properties.addToken('abstractKeyword', node.abstractKeyword);
       properties.addToken('covariantKeyword', node.covariantKeyword);
       properties.addNode('fields', node.fields);
       properties.addToken('semicolon', node.semicolon);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index ce8cd1c..5c26d58 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -6062,6 +6062,20 @@
 ''');
   }
 
+  test_field_abstract() async {
+    featureSet = enableNnbd;
+    var library = await checkLibrary('''
+abstract class C {
+  abstract int i;
+}
+''');
+    checkElementText(library, '''
+abstract class C {
+  abstract int i;
+}
+''');
+  }
+
   test_field_covariant() async {
     var library = await checkLibrary('''
 class C {
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 0139c85..1d3f695 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -12,7 +12,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/analysis/base.dart';
-import '../dart/resolution/driver_resolution.dart';
+import '../dart/resolution/context_collection_resolution.dart';
 import 'element_text.dart';
 
 main() {
@@ -32,7 +32,7 @@
 }
 
 @reflectiveTest
-class TopLevelInferenceErrorsTest extends DriverResolutionTest {
+class TopLevelInferenceErrorsTest extends PubPackageResolutionTest {
   test_initializer_additive() async {
     await _assertErrorOnlyLeft(['+', '-']);
   }
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
index cec16f8..c67500c 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -11,7 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../dart/resolution/driver_resolution.dart';
+import '../../dart/resolution/context_collection_resolution.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -23,7 +23,7 @@
 ///
 /// https://github.com/dart-lang/sdk/issues/31638
 @reflectiveTest
-class Dart2InferenceTest extends DriverResolutionTest {
+class Dart2InferenceTest extends PubPackageResolutionTest {
   test_bool_assert() async {
     var code = r'''
 T f<T>(int _) => null;
diff --git a/pkg/analyzer/test/src/workspace/package_build_test.dart b/pkg/analyzer/test/src/workspace/package_build_test.dart
index 630bf0c..42c46c4 100644
--- a/pkg/analyzer/test/src/workspace/package_build_test.dart
+++ b/pkg/analyzer/test/src/workspace/package_build_test.dart
@@ -4,14 +4,12 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/package_build.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/test_support.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(PackageBuildFileUriResolverTest);
@@ -49,7 +47,7 @@
 
   void setUp() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
 
     workspace = PackageBuildWorkspace.find(
       resourceProvider,
@@ -137,7 +135,7 @@
   }
 
   void setUp() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
   }
 
   void test_resolveAbsolute_generated() {
@@ -228,98 +226,168 @@
 
 @reflectiveTest
 class PackageBuildWorkspacePackageTest with ResourceProviderMixin {
-  MockUriResolver packageUriResolver;
+  PackageBuildWorkspace myWorkspace;
+  PackageBuildWorkspacePackage myPackage;
 
-  void test_contains_differentWorkspace() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace2/project2/lib/file.dart');
+  String get fooPackageLibPath => '$fooPackageRootPath/lib';
 
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
-    expect(
-        package.contains(
-            TestSource(convertPath('/workspace2/project2/lib/file.dart'))),
-        isFalse);
+  String get fooPackageRootPath => '$myWorkspacePath/foo';
+
+  String get myPackageGeneratedPath {
+    return '$myPackageRootPath/.dart_tool/build/generated';
   }
 
-  void test_contains_packageUris() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/lib/file2.dart');
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
-    var file2Source = InSummarySource(
-        Uri.parse('package:project/file2.dart'), '' /* summaryPath */);
-    expect(package.contains(file2Source), isTrue);
-  }
+  String get myPackageLibPath => '$myPackageRootPath/lib';
 
-  void test_contains_packageUris_unrelatedFile() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/lib/file2.dart');
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
-    var file2Source = InSummarySource(
-        Uri.parse('package:project2/file2.dart'), '' /* summaryPath */);
-    expect(package.contains(file2Source), isFalse);
-  }
+  String get myPackageRootPath => '$myWorkspacePath/my';
 
-  void test_contains_sameWorkspace() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/lib/file2.dart');
+  String get myWorkspacePath => '/workspace';
 
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
-    var file2Path = convertPath('/workspace/project/lib/file2.dart');
-    expect(package.contains(TestSource(file2Path)), isTrue);
-    var binPath = convertPath('/workspace/project/bin/bin.dart');
-    expect(package.contains(TestSource(binPath)), isTrue);
-    var testPath = convertPath('/workspace/project/test/test.dart');
-    expect(package.contains(TestSource(testPath)), isTrue);
-  }
+  void setUp() {
+    newFile('$myPackageRootPath/pubspec.yaml', content: 'name: my');
+    newFolder(myPackageGeneratedPath);
 
-  void test_findPackageFor_includedFile() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/lib/file.dart');
-
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/lib/file.dart'));
-    expect(package, isNotNull);
-    expect(package.root, convertPath('/workspace'));
-    expect(package.workspace, equals(workspace));
-  }
-
-  void test_findPackageFor_testFile() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/test/test.dart');
-
-    var package = workspace
-        .findPackageFor(convertPath('/workspace/project/test/test.dart'));
-    expect(package, isNotNull);
-    expect(package.root, convertPath('/workspace'));
-    expect(package.workspace, equals(workspace));
-  }
-
-  void test_findPackageFor_unrelatedFile() {
-    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
-    newFile('/workspace/project/lib/file.dart');
-
-    var package = workspace
-        .findPackageFor(convertPath('/workspace2/project2/lib/file.dart'));
-    expect(package, isNull);
-  }
-
-  PackageBuildWorkspace _createPackageBuildWorkspace() {
-    newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+    myWorkspace = PackageBuildWorkspace.find(
       resourceProvider,
       {
-        'project': [getFolder('/workspace')]
+        'my': [getFolder(myPackageLibPath)],
+        'foo': [getFolder(fooPackageLibPath)],
       },
-      convertPath('/workspace'),
+      convertPath(myPackageRootPath),
     );
-    packageUriResolver = MockUriResolver();
-    PackageBuildPackageUriResolver(workspace, packageUriResolver);
-    return workspace;
+
+    myPackage = myWorkspace.findPackageFor('$myPackageLibPath/fake.dart');
+  }
+
+  test_contains_fileUri() {
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri('$myPackageRootPath/test/a.dart'),
+      ),
+      isTrue,
+    );
+
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri('$fooPackageRootPath/test/a.dart'),
+      ),
+      isFalse,
+    );
+  }
+
+  test_contains_fileUri_generated() {
+    var myGeneratedPath = '$myPackageGeneratedPath/my/test/a.dart';
+    newFile(myGeneratedPath, content: '');
+
+    var fooGeneratedPath = '$myPackageGeneratedPath/foo/test/a.dart';
+    newFile(fooGeneratedPath, content: '');
+
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri(myGeneratedPath),
+      ),
+      isTrue,
+    );
+
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri(fooGeneratedPath),
+      ),
+      isFalse,
+    );
+  }
+
+  test_contains_packageUri() {
+    expect(
+      myPackage.contains(
+        _sourceWithPackageUriWithoutPath('package:my/a.dart'),
+      ),
+      isTrue,
+    );
+
+    expect(
+      myPackage.contains(
+        _sourceWithPackageUriWithoutPath('package:foo/a.dart'),
+      ),
+      isFalse,
+    );
+  }
+
+  test_findPackageFor_my_generated_libFile() {
+    var package = myWorkspace.findPackageFor(
+      convertPath('$myPackageGeneratedPath/my/lib/a.dart'),
+    );
+    expect(package, isNotNull);
+    expect(package.root, convertPath(myPackageRootPath));
+    expect(package.workspace, myWorkspace);
+  }
+
+  test_findPackageFor_my_generated_other() {
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$myPackageGeneratedPath/foo/lib/a.dart'),
+      ),
+      isNull,
+    );
+
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$myPackageGeneratedPath/foo/test/a.dart'),
+      ),
+      isNull,
+    );
+  }
+
+  test_findPackageFor_my_generated_testFile() {
+    var package = myWorkspace.findPackageFor(
+      convertPath('$myPackageGeneratedPath/my/test/a.dart'),
+    );
+    expect(package, isNotNull);
+    expect(package.root, convertPath(myPackageRootPath));
+    expect(package.workspace, myWorkspace);
+  }
+
+  test_findPackageFor_my_libFile() {
+    var package = myWorkspace.findPackageFor(
+      convertPath('$myPackageLibPath/a.dart'),
+    );
+    expect(package, isNotNull);
+    expect(package.root, convertPath(myPackageRootPath));
+    expect(package.workspace, myWorkspace);
+  }
+
+  test_findPackageFor_my_testFile() {
+    var package = myWorkspace.findPackageFor(
+      convertPath('$myPackageRootPath/test/a.dart'),
+    );
+    expect(package, isNotNull);
+    expect(package.root, convertPath(myPackageRootPath));
+    expect(package.workspace, myWorkspace);
+  }
+
+  test_findPackageFor_other() {
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$fooPackageRootPath/lib/a.dart'),
+      ),
+      isNull,
+    );
+
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$fooPackageRootPath/test/a.dart'),
+      ),
+      isNull,
+    );
+  }
+
+  Source _sourceWithFileUri(String path) {
+    return _MockSource(path: convertPath(path), uri: toUri(path));
+  }
+
+  Source _sourceWithPackageUriWithoutPath(String uriStr) {
+    var uri = Uri.parse(uriStr);
+    return _MockSource(path: null, uri: uri);
   }
 }
 
@@ -327,7 +395,7 @@
 class PackageBuildWorkspaceTest with ResourceProviderMixin {
   void test_builtFile_currentProject() {
     newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -339,7 +407,7 @@
 
   void test_builtFile_importedPackage() {
     newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project', 'foo']);
 
@@ -350,7 +418,7 @@
 
   void test_builtFile_notInPackagesGetsHidden() {
     newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
 
     // Ensure package:bar is not configured.
     PackageBuildWorkspace workspace =
@@ -378,7 +446,7 @@
 
   void test_find_hasDartToolAndPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -391,9 +459,9 @@
   void test_find_hasDartToolAndPubspec_inParentDirectory() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'name: subproject'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        content: 'name: subproject');
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -407,9 +475,9 @@
       test_find_hasDartToolAndPubspec_inParentDirectory_ignoresMalformedPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'not: yaml: here!!! 111'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        content: 'not: yaml: here!!! 111');
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -423,7 +491,7 @@
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFolder('/workspace/opened/up/a/child/dir');
     newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -436,9 +504,9 @@
   void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFolder('/workspace/opened/up/a/child/dir');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'name: subproject'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        content: 'name: subproject');
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -451,7 +519,7 @@
   void test_find_hasDartToolNoBuild() {
     // Edge case: an empty .dart_tool directory. Don't assume package:build.
     newFolder('/workspace/.dart_tool');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -473,7 +541,7 @@
   void test_find_hasDartToolPubButNotBuild() {
     // Dart projects will have this directory, that don't use package:build.
     newFolder('/workspace/.dart_tool/pub');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -484,8 +552,7 @@
 
   void test_find_hasMalformedPubspec() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes(
-        '/workspace/pubspec.yaml', 'not: yaml: here! 1111'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'not: yaml: here! 1111');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -495,7 +562,7 @@
   }
 
   void test_find_hasPubspecNoDartTool() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
       resourceProvider,
       {},
@@ -506,7 +573,7 @@
 
   void test_findFile_bin() {
     newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -517,7 +584,7 @@
 
   void test_findFile_binGenerated() {
     newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -529,7 +596,7 @@
 
   void test_findFile_libGenerated() {
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -541,7 +608,7 @@
 
   void test_findFile_test() {
     newFolder('/workspace/.dart_tool/build/generated/project/test');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -552,7 +619,7 @@
 
   void test_findFile_testGenerated() {
     newFolder('/workspace/.dart_tool/build/generated/project/test');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -564,7 +631,7 @@
 
   void test_findFile_web() {
     newFolder('/workspace/.dart_tool/build/generated/project/web');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -575,7 +642,7 @@
 
   void test_findFile_webGenerated() {
     newFolder('/workspace/.dart_tool/build/generated/project/web');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
@@ -599,3 +666,24 @@
     );
   }
 }
+
+class _MockSource implements Source {
+  final String path;
+
+  @override
+  final Uri uri;
+
+  _MockSource({@required this.path, @required this.uri});
+
+  @override
+  String get fullName {
+    if (path == null) {
+      throw StateError('This source has no path, '
+          'and we do not expect that it will be accessed.');
+    }
+    return path;
+  }
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/workspace/pub_test.dart b/pkg/analyzer/test/src/workspace/pub_test.dart
index c5d5c3c..a33908a 100644
--- a/pkg/analyzer/test/src/workspace/pub_test.dart
+++ b/pkg/analyzer/test/src/workspace/pub_test.dart
@@ -21,7 +21,7 @@
   PubWorkspace workspace;
 
   setUp() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     workspace =
         PubWorkspace.find(resourceProvider, {}, convertPath('/workspace'));
     expect(workspace.isBazel, isFalse);
@@ -79,7 +79,7 @@
 @reflectiveTest
 class PubWorkspaceTest with ResourceProviderMixin {
   void test_find_directory() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PubWorkspace workspace =
         PubWorkspace.find(resourceProvider, {}, convertPath('/workspace'));
     expect(workspace.isBazel, isFalse);
@@ -94,7 +94,7 @@
   }
 
   void test_find_file() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    newFile('/workspace/pubspec.yaml', content: 'name: project');
     PubWorkspace workspace = PubWorkspace.find(
         resourceProvider, {}, convertPath('/workspace/lib/lib1.dart'));
     expect(workspace.root, convertPath('/workspace'));
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 745e237..78e3e14 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -3,22 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:path/path.dart';
-import 'package:pub_semver/src/version_constraint.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../tool/diagnostics/generate.dart';
-import 'src/dart/resolution/driver_resolution.dart';
+import 'src/dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -399,51 +395,48 @@
 
 /// A test class that creates an environment suitable for analyzing the
 /// snippets.
-class _SnippetTest extends DriverResolutionTest with PackageMixin {
+class _SnippetTest extends PubPackageResolutionTest {
   /// The snippet being tested.
   final _SnippetData snippet;
 
-  @override
-  AnalysisOptionsImpl analysisOptions = AnalysisOptionsImpl();
-
   /// Initialize a newly created test to test the given [snippet].
   _SnippetTest(this.snippet) {
-    analysisOptions.contextFeatures =
-        FeatureSet.fromEnableFlags(snippet.experiments ?? []);
-    String pubspecContent = snippet.auxiliaryFiles['pubspec.yaml'];
-    if (pubspecContent != null) {
-      for (String line in pubspecContent.split('\n')) {
-        if (line.indexOf('sdk:') > 0) {
-          int start = line.indexOf("'") + 1;
-          String constraint = line.substring(start, line.indexOf("'", start));
-          analysisOptions.sdkVersionConstraint =
-              VersionConstraint.parse(constraint);
-        }
-      }
-    }
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        experiments: snippet.experiments,
+      ),
+    );
   }
 
   @override
   void setUp() {
     super.setUp();
-    addMetaPackage();
     _createAuxiliaryFiles(snippet.auxiliaryFiles);
     addTestFile(snippet.content);
   }
 
   void _createAuxiliaryFiles(Map<String, String> auxiliaryFiles) {
-    Map<String, String> packageMap = {};
-    for (String uri in auxiliaryFiles.keys) {
-      if (uri.startsWith('package:')) {
-        int slash = uri.indexOf('/');
-        String packageName = uri.substring(8, slash);
-        String libPath = packageMap.putIfAbsent(
-            packageName, () => addPubPackage(packageName).path);
-        String relativePath = uri.substring(slash + 1);
-        newFile('$libPath/$relativePath', content: auxiliaryFiles[uri]);
+    Map<String, String> packageNameToRootPath = {};
+    for (String uriStr in auxiliaryFiles.keys) {
+      if (uriStr.startsWith('package:')) {
+        Uri uri = Uri.parse(uriStr);
+
+        String packageName = uri.pathSegments[0];
+        String packageRootPath = '/packages/$packageName';
+        packageNameToRootPath[packageName] = convertPath(packageRootPath);
+
+        String pathInLib = uri.pathSegments.skip(1).join('/');
+        newFile(
+          '$packageRootPath/lib/$pathInLib',
+          content: auxiliaryFiles[uriStr],
+        );
       } else {
-        newFile('/test/$uri', content: auxiliaryFiles[uri]);
+        newFile(
+          '$testPackageRootPath/$uriStr',
+          content: auxiliaryFiles[uriStr],
+        );
       }
     }
+    writeTestPackageConfigWith(packageNameToRootPath, meta: true);
   }
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 9e116f8..aea3bac 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -29,6 +29,7 @@
   static const String experimentalAllocationsPath =
       '--experimental-allocations-path';
 
+  static const String experimentalWrapped = '--experimental-wrapped';
   static const String experimentalPowersets = '--experimental-powersets';
 
   // Temporary experiment for code generation of locals for frequently used
@@ -107,6 +108,8 @@
   static const String newDeferredSplit = '--new-deferred-split';
   static const String reportInvalidInferredDeferredTypes =
       '--report-invalid-deferred-types';
+  static const String deferClassTypes = '--defer-class-types';
+  static const String noDeferClassTypes = '--no-defer-class-types';
 
   /// Flag for a combination of flags for 'production' mode.
   static const String benchmarkingProduction = '--benchmarking-production';
@@ -155,6 +158,9 @@
       '${Flags.enableLanguageExperiments}|'
       '${Flags.enableLanguageExperiments}=.*';
 
+  static const String multiRoots = '--multi-root=.+';
+  static const String multiRootScheme = '--multi-root-scheme=.+';
+
   // Experimental options.
   static const String resolutionInput = '--resolution-input=.+';
   static const String bazelPaths = '--bazel-paths=.+';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index dfcea46..48db7fd 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -2283,6 +2283,15 @@
   /// Calls [f] for each supertype of [cls].
   void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype));
 
+  /// Calls [f] for each SuperClass of [cls].
+  void forEachSuperClass(ClassEntity cls, void f(ClassEntity superClass)) {
+    for (var superClass = getSuperClass(cls);
+        superClass != null;
+        superClass = getSuperClass(superClass)) {
+      f(superClass);
+    }
+  }
+
   /// Create the instantiation of [cls] with the given [typeArguments] and
   /// [nullability].
   InterfaceType createInterfaceType(
@@ -2336,6 +2345,23 @@
 
   /// Returns `true` if [cls] is a Dart enum class.
   bool isEnumClass(ClassEntity cls);
+
+  /// Returns the 'effective' mixin class if [cls] is a mixin application, and
+  /// `null` otherwise.
+  ///
+  /// The 'effective' mixin class is the class from which members are mixed in.
+  /// Normally this is the mixin class itself, but not if the mixin class itself
+  /// is a mixin application.
+  ///
+  /// Consider this hierarchy:
+  ///
+  ///     class A {}
+  ///     class B = Object with A {}
+  ///     class C = Object with B {}
+  ///
+  /// The mixin classes of `B` and `C` are `A` and `B`, respectively, but the
+  /// _effective_ mixin class of both is `A`.
+  ClassEntity getEffectiveMixinClass(ClassEntity cls);
 }
 
 abstract class KElementEnvironment extends ElementEnvironment {
@@ -2377,23 +2403,6 @@
   /// super calls.
   bool isSuperMixinApplication(ClassEntity cls);
 
-  /// Returns the 'effective' mixin class if [cls] is a mixin application, and
-  /// `null` otherwise.
-  ///
-  /// The 'effective' mixin class is the class from which members are mixed in.
-  /// Normally this is the mixin class itself, but not if the mixin class itself
-  /// is a mixin application.
-  ///
-  /// Consider this hierarchy:
-  ///
-  ///     class A {}
-  ///     class B = Object with A {}
-  ///     class C = Object with B {}
-  ///
-  /// The mixin classes of `B` and `C` are `A` and `B`, respectively, but the
-  /// _effective_ mixin class of both is `A`.
-  ClassEntity getEffectiveMixinClass(ClassEntity cls);
-
   /// The default type of the [typeVariable].
   ///
   /// This is the type used as the default type argument when no explicit type
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 54828f1..62d62d5 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -29,6 +29,7 @@
 import 'inferrer/abstract_value_domain.dart' show AbstractValueStrategy;
 import 'inferrer/trivial.dart' show TrivialAbstractValueStrategy;
 import 'inferrer/powersets/wrapped.dart' show WrappedAbstractValueStrategy;
+import 'inferrer/powersets/powersets.dart' show PowersetStrategy;
 import 'inferrer/typemasks/masks.dart' show TypeMaskStrategy;
 import 'inferrer/types.dart'
     show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
@@ -139,9 +140,11 @@
     abstractValueStrategy = options.useTrivialAbstractValueDomain
         ? const TrivialAbstractValueStrategy()
         : const TypeMaskStrategy();
-    if (options.experimentalPowersets) {
+    if (options.experimentalWrapped) {
       abstractValueStrategy =
           WrappedAbstractValueStrategy(abstractValueStrategy);
+    } else if (options.experimentalPowersets) {
+      abstractValueStrategy = PowersetStrategy(abstractValueStrategy);
     }
 
     CompilerTask kernelFrontEndTask;
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 32c3b63..4022219 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -112,6 +112,8 @@
   int codegenShard;
   int codegenShards;
   List<String> bazelPaths;
+  List<String> multiRoots;
+  String multiRootScheme = 'org-dartlang-app';
   Uri packageConfig = null;
   List<String> options = new List<String>();
   bool wantHelp = false;
@@ -196,6 +198,16 @@
     bazelPaths = <String>[]..addAll(paths.split(','));
   }
 
+  void setMultiRoots(String argument) {
+    String paths = extractParameter(argument);
+    multiRoots ??= <String>[];
+    multiRoots.addAll(paths.split(','));
+  }
+
+  void setMultiRootScheme(String argument) {
+    multiRootScheme = extractParameter(argument);
+  }
+
   String getDepsOutput(Iterable<Uri> sourceFiles) {
     var filenames = sourceFiles.map((uri) => '$uri').toList();
     filenames.sort();
@@ -438,6 +450,8 @@
     new OptionHandler(Flags.noSourceMaps, passThrough),
     new OptionHandler(Option.resolutionInput, ignoreOption),
     new OptionHandler(Option.bazelPaths, setBazelPaths),
+    new OptionHandler(Option.multiRoots, setMultiRoots),
+    new OptionHandler(Option.multiRootScheme, setMultiRootScheme),
     new OptionHandler(Flags.resolveOnly, ignoreOption),
     new OptionHandler(Flags.disableNativeLiveTypeAnalysis, passThrough),
     new OptionHandler('--categories=.*', setCategories),
@@ -446,12 +460,15 @@
     new OptionHandler(Flags.disableProgramSplit, passThrough),
     new OptionHandler(Flags.disableTypeInference, passThrough),
     new OptionHandler(Flags.useTrivialAbstractValueDomain, passThrough),
+    new OptionHandler(Flags.experimentalWrapped, passThrough),
     new OptionHandler(Flags.experimentalPowersets, passThrough),
     new OptionHandler(Flags.disableRtiOptimization, passThrough),
     new OptionHandler(Flags.terse, passThrough),
     new OptionHandler('--deferred-map=.+', passThrough),
     new OptionHandler(Flags.newDeferredSplit, passThrough),
     new OptionHandler(Flags.reportInvalidInferredDeferredTypes, passThrough),
+    new OptionHandler(Flags.deferClassTypes, passThrough),
+    new OptionHandler(Flags.noDeferClassTypes, passThrough),
     new OptionHandler('${Flags.dumpInfo}|${Flags.dumpInfo}=.+', setDumpInfo),
     new OptionHandler('--disallow-unsafe-eval', ignoreOption),
     new OptionHandler(Option.showPackageWarnings, passThrough),
@@ -515,7 +532,14 @@
   // TODO(johnniwinther): Measure time for reading files.
   SourceFileProvider inputProvider;
   if (bazelPaths != null) {
+    if (multiRoots != null) {
+      helpAndFail(
+          'The options --bazel-root and --multi-root cannot be supplied '
+          'together, please choose one or the other.');
+    }
     inputProvider = new BazelInputProvider(bazelPaths);
+  } else if (multiRoots != null) {
+    inputProvider = new MultiRootInputProvider(multiRootScheme, multiRoots);
   } else {
     inputProvider = new CompilerSourceFileProvider();
   }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 97c7256..1db440d 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -110,6 +110,9 @@
   /// A mapping from classes to their import set.
   Map<ClassEntity, ImportSet> _classToSet = {};
 
+  /// A mapping from interface types (keyed by classes) to their import set.
+  Map<ClassEntity, ImportSet> _classTypeToSet = {};
+
   /// A mapping from members to their import set.
   Map<MemberEntity, ImportSet> _memberToSet = {};
 
@@ -135,6 +138,7 @@
   bool get newDeferredSplit => compiler.options.newDeferredSplit;
   bool get reportInvalidInferredDeferredTypes =>
       compiler.options.reportInvalidInferredDeferredTypes;
+  bool get deferClassTypes => compiler.options.deferClassTypes;
 
   DeferredLoadTask(this.compiler) : super(compiler.measurer) {
     _mainOutputUnit = OutputUnit(true, 'main', <ImportEntity>{});
@@ -204,12 +208,24 @@
       _collectDirectMemberDependencies(closedWorld, member, dependencies);
     }
 
+    void addClassAndMaybeAddEffectiveMixinClass(ClassEntity cls) {
+      dependencies.addClass(cls);
+      if (elementEnvironment.isMixinApplication(cls)) {
+        dependencies.addClass(elementEnvironment.getEffectiveMixinClass(cls));
+      }
+    }
+
     ClassEntity cls = element;
     elementEnvironment.forEachLocalClassMember(cls, addLiveInstanceMember);
     elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
       _collectTypeDependencies(type, dependencies);
     });
-    dependencies.addClass(cls);
+    elementEnvironment.forEachSuperClass(cls, (superClass) {
+      addClassAndMaybeAddEffectiveMixinClass(superClass);
+      _collectTypeDependencies(
+          elementEnvironment.getThisType(superClass), dependencies);
+    });
+    addClassAndMaybeAddEffectiveMixinClass(cls);
   }
 
   /// Finds all elements and constants that [element] depends directly on.
@@ -254,14 +270,17 @@
   /// Recursively collects all the dependencies of [type].
   void _collectTypeDependencies(DartType type, Dependencies dependencies,
       [ImportEntity import]) {
-    TypeDependencyVisitor(dependencies, import, commonElements).visit(type);
+    TypeDependencyVisitor(dependencies, import, commonElements,
+            collectClassesAndTypes: !deferClassTypes)
+        .visit(type);
   }
 
   void _collectTypeArgumentDependencies(
       Iterable<DartType> typeArguments, Dependencies dependencies,
       [ImportEntity import]) {
     if (typeArguments == null) return;
-    TypeDependencyVisitor(dependencies, import, commonElements)
+    TypeDependencyVisitor(dependencies, import, commonElements,
+            collectClassesAndTypes: !deferClassTypes)
         .visitList(typeArguments);
   }
 
@@ -309,21 +328,29 @@
             default:
           }
         }, visitTypeUse: (MemberEntity member, TypeUse typeUse) {
+          void addClassIfInterfaceType(DartType t, [ImportEntity import]) {
+            var typeWithoutNullability = t.withoutNullability;
+            if (typeWithoutNullability is InterfaceType) {
+              dependencies.addClass(typeWithoutNullability.element, import);
+            }
+          }
+
           DartType type = typeUse.type;
           switch (typeUse.kind) {
             case TypeUseKind.TYPE_LITERAL:
-              var typeWithoutNullability = type.withoutNullability;
-              if (typeWithoutNullability is InterfaceType) {
-                dependencies.addClass(
-                    typeWithoutNullability.element, typeUse.deferredImport);
-              }
+              _collectTypeDependencies(
+                  type, dependencies, typeUse.deferredImport);
               break;
             case TypeUseKind.CONST_INSTANTIATION:
+              addClassIfInterfaceType(type, typeUse.deferredImport);
               _collectTypeDependencies(
                   type, dependencies, typeUse.deferredImport);
               break;
             case TypeUseKind.INSTANTIATION:
             case TypeUseKind.NATIVE_INSTANTIATION:
+              addClassIfInterfaceType(type);
+              _collectTypeDependencies(type, dependencies);
+              break;
             case TypeUseKind.IS_CHECK:
             case TypeUseKind.CATCH_TYPE:
               _collectTypeDependencies(type, dependencies);
@@ -447,6 +474,33 @@
     }
   }
 
+  void _updateClassTypeRecursive(KClosedWorld closedWorld, ClassEntity element,
+      ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
+    if (element == null) return;
+
+    ImportSet currentSet = _classTypeToSet[element];
+
+    // Already visited. We may visit some root nodes a second time with
+    // [isMirrorUsage] in order to mark static members used reflectively.
+    if (currentSet == newSet) return;
+
+    // Elements in the main output unit always remain there.
+    if (currentSet == importSets.mainSet) return;
+
+    if (currentSet == oldSet) {
+      // Continue recursively updating from [oldSet] to [newSet].
+      _classTypeToSet[element] = newSet;
+
+      Dependencies dependencies = Dependencies();
+      dependencies.addClassType(element);
+      LibraryEntity library = element.library;
+      _processDependencies(
+          closedWorld, library, dependencies, oldSet, newSet, queue, element);
+    } else {
+      queue.addClassType(element, newSet);
+    }
+  }
+
   void _updateMemberRecursive(KClosedWorld closedWorld, MemberEntity element,
       ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
     if (element == null) return;
@@ -579,6 +633,19 @@
       }
     });
 
+    dependencies.classType.forEach((ClassEntity cls, DependencyInfo info) {
+      _fixClassDependencyInfo(info, cls, library, context);
+      if (info.isDeferred) {
+        if (_shouldAddDeferredDependency(newSet)) {
+          for (ImportEntity deferredImport in info.imports) {
+            queue.addClassType(cls, importSets.singleton(deferredImport));
+          }
+        }
+      } else {
+        _updateClassTypeRecursive(closedWorld, cls, oldSet, newSet, queue);
+      }
+    });
+
     dependencies.members.forEach((MemberEntity member, DependencyInfo info) {
       _fixMemberDependencyInfo(info, member, library, context);
       if (info.isDeferred) {
@@ -626,6 +693,7 @@
     // Generate an output unit for all import sets that are associated with an
     // element or constant.
     _classToSet.values.forEach(addUnit);
+    _classTypeToSet.values.forEach(addUnit);
     _memberToSet.values.forEach(addUnit);
     _localFunctionToSet.values.forEach(addUnit);
     _constantToSet.values.forEach(addUnit);
@@ -814,16 +882,19 @@
     _createOutputUnits();
     Map<String, List<OutputUnit>> hunksToLoad = _setupHunksToLoad();
     Map<ClassEntity, OutputUnit> classMap = {};
+    Map<ClassEntity, OutputUnit> classTypeMap = {};
     Map<MemberEntity, OutputUnit> memberMap = {};
     Map<Local, OutputUnit> localFunctionMap = {};
     Map<ConstantValue, OutputUnit> constantMap = {};
     _classToSet.forEach((cls, s) => classMap[cls] = s.unit);
+    _classTypeToSet.forEach((cls, s) => classTypeMap[cls] = s.unit);
     _memberToSet.forEach((member, s) => memberMap[member] = s.unit);
     _localFunctionToSet.forEach(
         (localFunction, s) => localFunctionMap[localFunction] = s.unit);
     _constantToSet.forEach((constant, s) => constantMap[constant] = s.unit);
 
     _classToSet = null;
+    _classTypeToSet = null;
     _memberToSet = null;
     _localFunctionToSet = null;
     _constantToSet = null;
@@ -831,8 +902,10 @@
     cleanup();
     return OutputUnitData(
         this.isProgramSplit && !disableProgramSplit,
+        deferClassTypes,
         this._mainOutputUnit,
         classMap,
+        classTypeMap,
         memberMap,
         localFunctionMap,
         constantMap,
@@ -883,6 +956,13 @@
       id = '$id cls';
       elements.add(id);
     });
+    _classTypeToSet.forEach((ClassEntity element, ImportSet importSet) {
+      if (ignoreEntityInDump(element)) return;
+      var elements = elementMap.putIfAbsent(importSet.unit, () => <String>[]);
+      var id = element.name ?? '$element';
+      id = '$id type';
+      elements.add(id);
+    });
     _memberToSet.forEach((MemberEntity element, ImportSet importSet) {
       if (ignoreEntityInDump(element)) return;
       var elements = elementMap.putIfAbsent(importSet.unit, () => <String>[]);
@@ -1137,6 +1217,10 @@
   /// An index to find work items in the queue corresponding to a class.
   final Map<ClassEntity, WorkItem> pendingClasses = {};
 
+  /// An index to find work items in the queue corresponding to an
+  /// [InterfaceType] represented here by its [ClassEntitiy].
+  final Map<ClassEntity, WorkItem> pendingClassType = {};
+
   /// An index to find work items in the queue corresponding to a member.
   final Map<MemberEntity, WorkItem> pendingMembers = {};
 
@@ -1172,6 +1256,22 @@
     }
   }
 
+  /// Add to the queue that class type (represented by [element]) should be
+  /// updated to include all imports in [importSet]. If there is already a
+  /// work item in the queue for [element], this makes sure that the work
+  /// item now includes the union of [importSet] and the existing work
+  /// item's import set.
+  void addClassType(ClassEntity element, ImportSet importSet) {
+    var item = pendingClassType[element];
+    if (item == null) {
+      item = ClassTypeWorkItem(element, importSet);
+      pendingClassType[element] = item;
+      queue.add(item);
+    } else {
+      item.importsToAdd = _importSets.union(item.importsToAdd, importSet);
+    }
+  }
+
   /// Add to the queue that [element] should be updated to include all imports
   /// in [importSet]. If there is already a work item in the queue for
   /// [element], this makes sure that the work item now includes the union of
@@ -1235,6 +1335,23 @@
   }
 }
 
+/// Summary of the work that needs to be done on a class.
+class ClassTypeWorkItem extends WorkItem {
+  /// Class to be recursively updated.
+  final ClassEntity cls;
+
+  ClassTypeWorkItem(this.cls, ImportSet newSet) : super(newSet);
+
+  @override
+  void update(
+      DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
+    queue.pendingClassType.remove(cls);
+    ImportSet oldSet = task._classTypeToSet[cls];
+    ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
+    task._updateClassTypeRecursive(closedWorld, cls, oldSet, newSet, queue);
+  }
+}
+
 /// Summary of the work that needs to be done on a member.
 class MemberWorkItem extends WorkItem {
   /// Member to be recursively updated.
@@ -1298,8 +1415,10 @@
   static const String tag = 'output-unit-data';
 
   final bool isProgramSplit;
+  final bool deferClassTypes;
   final OutputUnit mainOutputUnit;
   final Map<ClassEntity, OutputUnit> _classToUnit;
+  final Map<ClassEntity, OutputUnit> _classTypeToUnit;
   final Map<MemberEntity, OutputUnit> _memberToUnit;
   final Map<Local, OutputUnit> _localFunctionToUnit;
   final Map<ConstantValue, OutputUnit> _constantToUnit;
@@ -1321,8 +1440,10 @@
 
   OutputUnitData(
       this.isProgramSplit,
+      this.deferClassTypes,
       this.mainOutputUnit,
       this._classToUnit,
+      this._classTypeToUnit,
       this._memberToUnit,
       this._localFunctionToUnit,
       this._constantToUnit,
@@ -1345,6 +1466,8 @@
           convertConstantMap) {
     Map<ClassEntity, OutputUnit> classToUnit =
         convertClassMap(other._classToUnit, other._localFunctionToUnit);
+    Map<ClassEntity, OutputUnit> classTypeToUnit =
+        convertClassMap(other._classTypeToUnit, other._localFunctionToUnit);
     Map<MemberEntity, OutputUnit> memberToUnit =
         convertMemberMap(other._memberToUnit, other._localFunctionToUnit);
     Map<ConstantValue, OutputUnit> constantToUnit =
@@ -1360,8 +1483,10 @@
 
     return OutputUnitData(
         other.isProgramSplit,
+        other.deferClassTypes,
         other.mainOutputUnit,
         classToUnit,
+        classTypeToUnit,
         memberToUnit,
         // Local functions only make sense in the K-world model.
         const <Local, OutputUnit>{},
@@ -1376,6 +1501,7 @@
   factory OutputUnitData.readFromDataSource(DataSource source) {
     source.begin(tag);
     bool isProgramSplit = source.readBool();
+    bool deferClassTypes = source.readBool();
     List<OutputUnit> outputUnits = source.readList(() {
       bool isMainOutput = source.readBool();
       String name = source.readString();
@@ -1387,6 +1513,9 @@
     Map<ClassEntity, OutputUnit> classToUnit = source.readClassMap(() {
       return outputUnits[source.readInt()];
     });
+    Map<ClassEntity, OutputUnit> classTypeToUnit = source.readClassMap(() {
+      return outputUnits[source.readInt()];
+    });
     Map<MemberEntity, OutputUnit> memberToUnit =
         source.readMemberMap((MemberEntity member) {
       return outputUnits[source.readInt()];
@@ -1411,8 +1540,10 @@
     source.end(tag);
     return OutputUnitData(
         isProgramSplit,
+        deferClassTypes,
         mainOutputUnit,
         classToUnit,
+        classTypeToUnit,
         memberToUnit,
         // Local functions only make sense in the K-world model.
         const <Local, OutputUnit>{},
@@ -1427,6 +1558,7 @@
   void writeToDataSink(DataSink sink) {
     sink.begin(tag);
     sink.writeBool(isProgramSplit);
+    sink.writeBool(deferClassTypes);
     Map<OutputUnit, int> outputUnitIndices = {};
     sink.writeList(outputUnits, (OutputUnit outputUnit) {
       outputUnitIndices[outputUnit] = outputUnitIndices.length;
@@ -1438,6 +1570,9 @@
     sink.writeClassMap(_classToUnit, (OutputUnit outputUnit) {
       sink.writeInt(outputUnitIndices[outputUnit]);
     });
+    sink.writeClassMap(_classTypeToUnit, (OutputUnit outputUnit) {
+      sink.writeInt(outputUnitIndices[outputUnit]);
+    });
     sink.writeMemberMap(_memberToUnit,
         (MemberEntity member, OutputUnit outputUnit) {
       sink.writeInt(outputUnitIndices[outputUnit]);
@@ -1473,6 +1608,23 @@
 
   OutputUnit outputUnitForClassForTesting(ClassEntity cls) => _classToUnit[cls];
 
+  /// Returns the [OutputUnit] where [cls]'s type belongs.
+  // TODO(joshualitt): see above TODO regarding allowNull.
+  OutputUnit outputUnitForClassType(ClassEntity cls, {bool allowNull: false}) {
+    if (!isProgramSplit) return mainOutputUnit;
+    OutputUnit unit;
+    if (deferClassTypes) {
+      unit = _classTypeToUnit[cls];
+    } else {
+      unit = _classToUnit[cls];
+    }
+    assert(allowNull || unit != null, 'No output unit for type $cls');
+    return unit ?? mainOutputUnit;
+  }
+
+  OutputUnit outputUnitForClassTypeForTesting(ClassEntity cls) =>
+      deferClassTypes ? _classTypeToUnit[cls] : _classToUnit[cls];
+
   /// Returns the [OutputUnit] where [member] belongs.
   OutputUnit outputUnitForMember(MemberEntity member) {
     if (!isProgramSplit) return mainOutputUnit;
@@ -1630,12 +1782,21 @@
 
 class Dependencies {
   final Map<ClassEntity, DependencyInfo> classes = {};
+  final Map<ClassEntity, DependencyInfo> classType = {};
   final Map<MemberEntity, DependencyInfo> members = {};
   final Set<Local> localFunctions = {};
   final Map<ConstantValue, DependencyInfo> constants = {};
 
   void addClass(ClassEntity cls, [ImportEntity import]) {
     (classes[cls] ??= DependencyInfo()).registerImport(import);
+
+    // Add a classType dependency as well just in case we optimize out
+    // the class later.
+    addClassType(cls, import);
+  }
+
+  void addClassType(ClassEntity cls, [ImportEntity import]) {
+    (classType[cls] ??= DependencyInfo()).registerImport(import);
   }
 
   void addMember(MemberEntity m, [ImportEntity import]) {
@@ -1664,11 +1825,16 @@
 }
 
 class TypeDependencyVisitor implements DartTypeVisitor<void, Null> {
+  // If true, collect classes and types, otherwise just collect types.
+  // Note: When collecting classes, types are added implicitly by the
+  // dependencies class.
+  final bool collectClassesAndTypes;
   final Dependencies _dependencies;
   final ImportEntity _import;
   final CommonElements _commonElements;
 
-  TypeDependencyVisitor(this._dependencies, this._import, this._commonElements);
+  TypeDependencyVisitor(this._dependencies, this._import, this._commonElements,
+      {this.collectClassesAndTypes});
 
   @override
   void visit(DartType type, [_]) {
@@ -1691,7 +1857,11 @@
 
   @override
   void visitFutureOrType(FutureOrType type, Null argument) {
-    _dependencies.addClass(_commonElements.futureClass);
+    if (collectClassesAndTypes) {
+      _dependencies.addClass(_commonElements.futureClass);
+    } else {
+      _dependencies.addClassType(_commonElements.futureClass);
+    }
     visit(type.typeArgument);
   }
 
@@ -1718,10 +1888,11 @@
   @override
   void visitInterfaceType(InterfaceType type, Null argument) {
     visitList(type.typeArguments);
-    // TODO(sigmund): when we are able to split classes from types in our
-    // runtime-type representation, this should track type.element as a type
-    // dependency instead.
-    _dependencies.addClass(type.element, _import);
+    if (collectClassesAndTypes) {
+      _dependencies.addClass(type.element, _import);
+    } else {
+      _dependencies.addClassType(type.element, _import);
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index e148654..4b78a07 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -77,7 +77,6 @@
   JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
   JS_INTEROP_FIELD_NOT_SUPPORTED,
   JS_INTEROP_NON_EXTERNAL_MEMBER,
-  JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS,
   JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
   JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
   JS_PLACEHOLDER_CAPTURE,
@@ -201,12 +200,6 @@
           MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER,
           "Js-interop members must be 'external'."),
 
-      MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS: const MessageTemplate(
-          MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS,
-          "Js-interop class members are only supported in js-interop classes.",
-          howToFix: "Try marking the enclosing class as js-interop or "
-              "remove the js-interop annotation from the member."),
-
       MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
           MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
           "Member '#{member}' in js-interop class '#{cls}' is not external.",
diff --git a/pkg/compiler/lib/src/inferrer/powersets/powersets.dart b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
new file mode 100644
index 0000000..60f9253
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
@@ -0,0 +1,722 @@
+// 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 '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
+import '../../elements/entities.dart';
+import '../../elements/names.dart';
+import '../../elements/types.dart' show DartType;
+import '../../ir/static_type.dart';
+import '../../serialization/serialization.dart';
+import '../../universe/selector.dart';
+import '../../universe/world_builder.dart';
+import '../../universe/use.dart';
+import '../../world.dart';
+import '../abstract_value_domain.dart';
+
+class PowersetValue implements AbstractValue {
+  final AbstractValue _abstractValue;
+  final int _powersetBits;
+  const PowersetValue(this._abstractValue, this._powersetBits);
+
+  @override
+  bool operator ==(var other) {
+    if (identical(this, other)) return true;
+    if (other is! PowersetValue) return false;
+    PowersetValue otherPowerset = other;
+    return other is PowersetValue &&
+        _abstractValue == otherPowerset._abstractValue &&
+        _powersetBits == otherPowerset._powersetBits;
+  }
+
+  @override
+  int get hashCode {
+    return _abstractValue.hashCode * _powersetBits.hashCode;
+  }
+
+  @override
+  String toString() =>
+      '[Powerset of ${_abstractValue.toString()} with bits ${_powersetBits}]';
+}
+
+AbstractValue unwrapOrNull(PowersetValue powerset) {
+  return powerset == null ? null : powerset._abstractValue;
+}
+
+PowersetValue wrapOrNull(AbstractValue abstractValue, int powersetBits) {
+  return abstractValue == null
+      ? null
+      : PowersetValue(abstractValue, powersetBits);
+}
+
+class PowersetDomain implements AbstractValueDomain {
+  final AbstractValueDomain _abstractValueDomain;
+  const PowersetDomain(this._abstractValueDomain);
+
+  @override
+  AbstractValue get dynamicType {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.dynamicType;
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  void writeAbstractValueToDataSink(
+      DataSink sink, covariant PowersetValue value) {
+    _abstractValueDomain.writeAbstractValueToDataSink(
+        sink, value._abstractValue);
+  }
+
+  @override
+  AbstractValue readAbstractValueFromDataSource(DataSource source) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.readAbstractValueFromDataSource(source);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  String getCompactText(covariant PowersetValue value) =>
+      _abstractValueDomain.getCompactText(value._abstractValue);
+
+  @override
+  AbstractBool isFixedLengthJsIndexable(covariant PowersetValue value) =>
+      _abstractValueDomain.isFixedLengthJsIndexable(value._abstractValue);
+
+  @override
+  AbstractBool isJsIndexableAndIterable(covariant PowersetValue value) =>
+      _abstractValueDomain.isJsIndexableAndIterable(unwrapOrNull(value));
+
+  @override
+  AbstractBool isJsIndexable(covariant PowersetValue value) =>
+      _abstractValueDomain.isJsIndexable(value._abstractValue);
+
+  @override
+  MemberEntity locateSingleMember(
+          covariant PowersetValue receiver, Selector selector) =>
+      _abstractValueDomain.locateSingleMember(
+          receiver._abstractValue, selector);
+
+  @override
+  AbstractBool isIn(
+          covariant PowersetValue subset, covariant PowersetValue superset) =>
+      _abstractValueDomain.isIn(subset._abstractValue, superset._abstractValue);
+
+  @override
+  AbstractBool needsNoSuchMethodHandling(
+          covariant PowersetValue receiver, Selector selector) =>
+      _abstractValueDomain.needsNoSuchMethodHandling(
+          receiver._abstractValue, selector);
+
+  @override
+  AbstractBool isTargetingMember(
+          covariant PowersetValue receiver, MemberEntity member, Name name) =>
+      _abstractValueDomain.isTargetingMember(
+          receiver._abstractValue, member, name);
+
+  @override
+  AbstractValue computeReceiver(Iterable<MemberEntity> members) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.computeReceiver(members);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  PrimitiveConstantValue getPrimitiveValue(covariant PowersetValue value) =>
+      _abstractValueDomain.getPrimitiveValue(value._abstractValue);
+
+  @override
+  AbstractValue createPrimitiveValue(
+      covariant PowersetValue originalValue, PrimitiveConstantValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createPrimitiveValue(
+        originalValue._abstractValue, value);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isPrimitiveValue(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveValue(value._abstractValue);
+
+  @override
+  MemberEntity getAllocationElement(covariant PowersetValue value) =>
+      _abstractValueDomain.getAllocationElement(value._abstractValue);
+
+  @override
+  Object getAllocationNode(covariant PowersetValue value) =>
+      _abstractValueDomain.getAllocationNode(value._abstractValue);
+
+  @override
+  AbstractValue getGeneralization(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getGeneralization(unwrapOrNull(value));
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isSpecializationOf(covariant PowersetValue specialization,
+          covariant PowersetValue generalization) =>
+      _abstractValueDomain.isSpecializationOf(
+          specialization._abstractValue, generalization._abstractValue);
+
+  @override
+  AbstractValue getDictionaryValueForKey(
+      covariant PowersetValue value, String key) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.getDictionaryValueForKey(
+        value._abstractValue, key);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool containsDictionaryKey(covariant PowersetValue value, String key) =>
+      _abstractValueDomain.containsDictionaryKey(value._abstractValue, key);
+
+  @override
+  AbstractValue createDictionaryValue(
+      covariant PowersetValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      covariant PowersetValue key,
+      covariant PowersetValue value,
+      covariant Map<String, AbstractValue> mappings) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createDictionaryValue(
+        originalValue._abstractValue,
+        allocationNode,
+        allocationElement,
+        key._abstractValue,
+        value._abstractValue, {
+      for (var entry in mappings.entries)
+        entry.key: (entry.value as PowersetValue)._abstractValue
+    });
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isDictionary(covariant PowersetValue value) =>
+      _abstractValueDomain.isDictionary(value._abstractValue);
+
+  @override
+  AbstractValue getMapValueType(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getMapValueType(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue getMapKeyType(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getMapKeyType(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createMapValue(
+      covariant PowersetValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      covariant PowersetValue key,
+      covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createMapValue(
+        originalValue._abstractValue,
+        allocationNode,
+        allocationElement,
+        key._abstractValue,
+        value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isMap(covariant PowersetValue value) =>
+      _abstractValueDomain.isMap(value._abstractValue);
+
+  @override
+  AbstractValue getSetElementType(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getSetElementType(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createSetValue(
+      covariant PowersetValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      covariant PowersetValue elementType) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createSetValue(
+        originalValue._abstractValue,
+        allocationNode,
+        allocationElement,
+        elementType._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isSet(covariant PowersetValue value) =>
+      _abstractValueDomain.isSet(value._abstractValue);
+
+  @override
+  int getContainerLength(covariant PowersetValue value) =>
+      _abstractValueDomain.getContainerLength(value._abstractValue);
+
+  @override
+  AbstractValue getContainerElementType(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getContainerElementType(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createContainerValue(
+      covariant PowersetValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      covariant PowersetValue elementType,
+      int length) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createContainerValue(
+        originalValue._abstractValue,
+        allocationNode,
+        allocationElement,
+        elementType._abstractValue,
+        length);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  bool isContainer(covariant PowersetValue value) =>
+      _abstractValueDomain.isContainer(value._abstractValue);
+
+  @override
+  AbstractValue computeAbstractValueForConstant(covariant ConstantValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.computeAbstractValueForConstant(value);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue getAbstractValueForNativeMethodParameterType(DartType type) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.getAbstractValueForNativeMethodParameterType(type);
+    return wrapOrNull(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractBool containsAll(covariant PowersetValue a) =>
+      _abstractValueDomain.containsAll(a._abstractValue);
+
+  @override
+  AbstractBool areDisjoint(
+          covariant PowersetValue a, covariant PowersetValue b) =>
+      _abstractValueDomain.areDisjoint(a._abstractValue, b._abstractValue);
+
+  @override
+  AbstractValue intersection(
+      covariant PowersetValue a, covariant PowersetValue b) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.intersection(a._abstractValue, b._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue unionOfMany(covariant Iterable<AbstractValue> values) {
+    List<AbstractValue> unwrapped_Values = values
+        .map((element) => (element as PowersetValue)._abstractValue)
+        .toList();
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.unionOfMany(unwrapped_Values);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue union(covariant PowersetValue a, covariant PowersetValue b) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.union(a._abstractValue, b._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractBool isPrimitiveOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isStringOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isStringOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isString(covariant PowersetValue value) =>
+      _abstractValueDomain.isString(value._abstractValue);
+
+  @override
+  AbstractBool isBooleanOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isBooleanOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isBoolean(covariant PowersetValue value) =>
+      _abstractValueDomain.isBoolean(value._abstractValue);
+
+  @override
+  AbstractBool isDoubleOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isDoubleOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isDouble(covariant PowersetValue value) =>
+      _abstractValueDomain.isDouble(value._abstractValue);
+
+  @override
+  AbstractBool isNumberOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isNumberOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isNumber(covariant PowersetValue value) =>
+      _abstractValueDomain.isNumber(value._abstractValue);
+
+  @override
+  AbstractBool isIntegerOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isIntegerOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isPositiveIntegerOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isPositiveIntegerOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isPositiveInteger(covariant PowersetValue value) =>
+      _abstractValueDomain.isPositiveInteger(value._abstractValue);
+
+  @override
+  AbstractBool isUInt31(covariant PowersetValue value) =>
+      _abstractValueDomain.isUInt31(value._abstractValue);
+
+  @override
+  AbstractBool isUInt32(covariant PowersetValue value) =>
+      _abstractValueDomain.isUInt32(value._abstractValue);
+
+  @override
+  AbstractBool isInteger(covariant PowersetValue value) =>
+      _abstractValueDomain.isInteger(value._abstractValue);
+
+  @override
+  AbstractBool isInterceptor(covariant PowersetValue value) =>
+      _abstractValueDomain.isInterceptor(value._abstractValue);
+
+  @override
+  AbstractBool isPrimitiveString(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveString(value._abstractValue);
+
+  @override
+  AbstractBool isArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isArray(value._abstractValue);
+
+  @override
+  AbstractBool isMutableIndexable(covariant PowersetValue value) =>
+      _abstractValueDomain.isMutableIndexable(value._abstractValue);
+
+  @override
+  AbstractBool isMutableArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isMutableArray(value._abstractValue);
+
+  @override
+  AbstractBool isExtendableArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isExtendableArray(value._abstractValue);
+
+  @override
+  AbstractBool isFixedArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isFixedArray(value._abstractValue);
+
+  @override
+  AbstractBool isIndexablePrimitive(covariant PowersetValue value) =>
+      _abstractValueDomain.isIndexablePrimitive(value._abstractValue);
+
+  @override
+  AbstractBool isPrimitiveArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveArray(value._abstractValue);
+
+  @override
+  AbstractBool isPrimitiveBoolean(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveBoolean(value._abstractValue);
+
+  @override
+  AbstractBool isPrimitiveNumber(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitiveNumber(value._abstractValue);
+
+  @override
+  AbstractBool isPrimitive(covariant PowersetValue value) =>
+      _abstractValueDomain.isPrimitive(value._abstractValue);
+
+  @override
+  AbstractBool isNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isNull(value._abstractValue);
+
+  @override
+  ClassEntity getExactClass(covariant PowersetValue value) =>
+      _abstractValueDomain.getExactClass(value._abstractValue);
+
+  @override
+  AbstractBool isExactOrNull(covariant PowersetValue value) =>
+      _abstractValueDomain.isExactOrNull(value._abstractValue);
+
+  @override
+  AbstractBool isExact(covariant PowersetValue value) =>
+      _abstractValueDomain.isExact(value._abstractValue);
+
+  @override
+  AbstractBool isEmpty(covariant PowersetValue value) =>
+      _abstractValueDomain.isEmpty(value._abstractValue);
+
+  @override
+  AbstractBool isInstanceOf(covariant PowersetValue value, ClassEntity cls) =>
+      _abstractValueDomain.isInstanceOf(value._abstractValue, cls);
+
+  @override
+  AbstractBool isInstanceOfOrNull(
+          covariant PowersetValue value, ClassEntity cls) =>
+      _abstractValueDomain.isInstanceOfOrNull(value._abstractValue, cls);
+
+  @override
+  AbstractBool containsOnlyType(
+          covariant PowersetValue value, ClassEntity cls) =>
+      _abstractValueDomain.containsOnlyType(value._abstractValue, cls);
+
+  @override
+  AbstractBool containsType(covariant PowersetValue value, ClassEntity cls) =>
+      _abstractValueDomain.containsType(value._abstractValue, cls);
+
+  @override
+  AbstractValue includeNull(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.includeNull(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue excludeNull(covariant PowersetValue value) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.excludeNull(value._abstractValue);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractBool couldBeTypedArray(covariant PowersetValue value) =>
+      _abstractValueDomain.couldBeTypedArray(value._abstractValue);
+
+  @override
+  AbstractBool isTypedArray(covariant PowersetValue value) =>
+      _abstractValueDomain.isTypedArray(value._abstractValue);
+
+  @override
+  AbstractValue createNullableSubtype(ClassEntity cls) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.createNullableSubtype(cls);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createNonNullSubtype(ClassEntity cls) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.createNonNullSubtype(cls);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createNonNullSubclass(ClassEntity cls) {
+    int powersetBits = 0;
+    AbstractValue abstractValue =
+        _abstractValueDomain.createNonNullSubclass(cls);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createNullableExact(ClassEntity cls) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createNullableExact(cls);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValue createNonNullExact(ClassEntity cls) {
+    int powersetBits = 0;
+    AbstractValue abstractValue = _abstractValueDomain.createNonNullExact(cls);
+    return PowersetValue(abstractValue, powersetBits);
+  }
+
+  @override
+  AbstractValueWithPrecision createFromStaticType(DartType type,
+      {ClassRelation classRelation = ClassRelation.subtype, bool nullable}) {
+    int powersetBits = 0;
+    var unwrapped = _abstractValueDomain.createFromStaticType(type,
+        classRelation: classRelation, nullable: nullable);
+    return AbstractValueWithPrecision(
+        PowersetValue(unwrapped.abstractValue, powersetBits),
+        unwrapped.isPrecise);
+  }
+
+  @override
+  AbstractValue get asyncStarStreamType =>
+      PowersetValue(_abstractValueDomain.asyncStarStreamType, 0);
+
+  @override
+  AbstractValue get asyncFutureType =>
+      PowersetValue(_abstractValueDomain.asyncFutureType, 0);
+
+  @override
+  AbstractValue get syncStarIterableType =>
+      PowersetValue(_abstractValueDomain.syncStarIterableType, 0);
+
+  @override
+  AbstractValue get emptyType =>
+      PowersetValue(_abstractValueDomain.emptyType, 0);
+
+  @override
+  AbstractValue get constMapType =>
+      PowersetValue(_abstractValueDomain.constMapType, 0);
+
+  @override
+  AbstractValue get constSetType =>
+      PowersetValue(_abstractValueDomain.constSetType, 0);
+
+  @override
+  AbstractValue get constListType =>
+      PowersetValue(_abstractValueDomain.constListType, 0);
+
+  @override
+  AbstractValue get positiveIntType =>
+      PowersetValue(_abstractValueDomain.positiveIntType, 0);
+
+  @override
+  AbstractValue get uint32Type =>
+      PowersetValue(_abstractValueDomain.uint32Type, 0);
+
+  @override
+  AbstractValue get uint31Type =>
+      PowersetValue(_abstractValueDomain.uint31Type, 0);
+
+  @override
+  AbstractValue get fixedListType =>
+      PowersetValue(_abstractValueDomain.fixedListType, 0);
+
+  @override
+  AbstractValue get growableListType =>
+      PowersetValue(_abstractValueDomain.growableListType, 0);
+
+  @override
+  AbstractValue get nullType => PowersetValue(_abstractValueDomain.nullType, 0);
+
+  @override
+  AbstractValue get nonNullType =>
+      PowersetValue(_abstractValueDomain.nonNullType, 0);
+
+  @override
+  AbstractValue get mapType => PowersetValue(_abstractValueDomain.mapType, 0);
+
+  @override
+  AbstractValue get setType => PowersetValue(_abstractValueDomain.setType, 0);
+
+  @override
+  AbstractValue get listType => PowersetValue(_abstractValueDomain.listType, 0);
+
+  @override
+  AbstractValue get stringType =>
+      PowersetValue(_abstractValueDomain.stringType, 0);
+
+  @override
+  AbstractValue get numType => PowersetValue(_abstractValueDomain.numType, 0);
+
+  @override
+  AbstractValue get doubleType =>
+      PowersetValue(_abstractValueDomain.doubleType, 0);
+
+  @override
+  AbstractValue get intType => PowersetValue(_abstractValueDomain.intType, 0);
+
+  @override
+  AbstractValue get boolType => PowersetValue(_abstractValueDomain.boolType, 0);
+
+  @override
+  AbstractValue get functionType =>
+      PowersetValue(_abstractValueDomain.functionType, 0);
+
+  @override
+  AbstractValue get typeType => PowersetValue(_abstractValueDomain.typeType, 0);
+}
+
+class PowersetStrategy implements AbstractValueStrategy {
+  final AbstractValueStrategy _abstractValueStrategy;
+  const PowersetStrategy(this._abstractValueStrategy);
+
+  @override
+  AbstractValueDomain createDomain(JClosedWorld closedWorld) {
+    return PowersetDomain(_abstractValueStrategy.createDomain(closedWorld));
+  }
+
+  @override
+  SelectorConstraintsStrategy createSelectorStrategy() {
+    return PowersetsSelectorStrategy(
+        _abstractValueStrategy.createSelectorStrategy());
+  }
+}
+
+class PowersetsSelectorStrategy implements SelectorConstraintsStrategy {
+  final SelectorConstraintsStrategy _selectorConstraintsStrategy;
+  const PowersetsSelectorStrategy(this._selectorConstraintsStrategy);
+
+  @override
+  UniverseSelectorConstraints createSelectorConstraints(
+      Selector selector, Object initialConstraint) {
+    return PowersetsUniverseSelectorConstraints(
+        _selectorConstraintsStrategy.createSelectorConstraints(
+            selector,
+            initialConstraint == null
+                ? null
+                : (initialConstraint as PowersetValue)._abstractValue));
+  }
+
+  @override
+  bool appliedUnnamed(DynamicUse dynamicUse, MemberEntity member,
+      covariant JClosedWorld world) {
+    return _selectorConstraintsStrategy.appliedUnnamed(
+        dynamicUse.withReceiverConstraint(
+            unwrapOrNull(dynamicUse.receiverConstraint)),
+        member,
+        world);
+  }
+}
+
+class PowersetsUniverseSelectorConstraints
+    implements UniverseSelectorConstraints {
+  final UniverseSelectorConstraints _universeSelectorConstraints;
+  const PowersetsUniverseSelectorConstraints(this._universeSelectorConstraints);
+
+  @override
+  bool addReceiverConstraint(Object constraint) =>
+      _universeSelectorConstraints.addReceiverConstraint(constraint == null
+          ? null
+          : (constraint as PowersetValue)._abstractValue);
+
+  @override
+  bool needsNoSuchMethodHandling(Selector selector, World world) =>
+      _universeSelectorConstraints.needsNoSuchMethodHandling(selector, world);
+
+  @override
+  bool canHit(MemberEntity element, Name name, World world) =>
+      _universeSelectorConstraints.canHit(element, name, world);
+
+  @override
+  String toString() => 'PowersetsUniverseSelectorConstraints:$hashCode';
+}
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 7abd26f..7479339 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -198,12 +198,13 @@
   final String uri;
   final List<StaticMethod> statics;
   final List<Class> classes;
+  final List<ClassTypeData> classTypeData;
 
   @override
   final List<Field> staticFieldsForReflection;
 
   Library(this.element, this.uri, this.statics, this.classes,
-      this.staticFieldsForReflection);
+      this.classTypeData, this.staticFieldsForReflection);
 
   @override
   String toString() {
@@ -239,12 +240,28 @@
   }
 }
 
-// TODO(fishythefish, sra): Split type information into separate model object.
+class ClassTypeData {
+  /// The element should only be used during the transition to the new model.
+  /// Uses indicate missing information in the model.
+  final ClassEntity element;
+
+  final ClassChecks classChecks;
+  final Set<TypeVariableType> namedTypeVariables = {};
+
+  ClassTypeData(this.element, this.classChecks);
+
+  bool isTriviallyChecked(CommonElements commonElements) =>
+      classChecks.checks.every((TypeCheck check) =>
+          check.cls == commonElements.objectClass || check.cls == element);
+}
+
 class Class implements FieldContainer {
   /// The element should only be used during the transition to the new model.
   /// Uses indicate missing information in the model.
   final ClassEntity element;
 
+  final ClassTypeData typeData;
+
   final js.Name name;
   final Holder holder;
   Class _superclass;
@@ -252,8 +269,6 @@
   final List<Method> methods;
   final List<Field> fields;
   final List<StubMethod> isChecks;
-  final ClassChecks classChecksNewRti;
-  final Set<TypeVariableType> namedTypeVariablesNewRti = {};
   final List<StubMethod> checkedSetters;
 
   /// Stub methods for this class that are call stubs for getters.
@@ -295,6 +310,7 @@
 
   Class(
       this.element,
+      this.typeData,
       this.name,
       this.holder,
       this.methods,
@@ -304,7 +320,6 @@
       this.noSuchMethodStubs,
       this.checkedSetters,
       this.isChecks,
-      this.classChecksNewRti,
       this.functionTypeIndex,
       {this.hasRtiField,
       this.onlyForRti,
@@ -323,10 +338,6 @@
 
   bool get isSimpleMixinApplication => false;
 
-  bool isTriviallyChecked(CommonElements commonElements) =>
-      classChecksNewRti.checks.every((TypeCheck check) =>
-          check.cls == commonElements.objectClass || check.cls == element);
-
   Class get superclass => _superclass;
 
   void setSuperclass(Class superclass) {
@@ -351,6 +362,7 @@
 class MixinApplication extends Class {
   MixinApplication(
       ClassEntity element,
+      ClassTypeData typeData,
       js.Name name,
       Holder holder,
       List<Field> instanceFields,
@@ -358,7 +370,6 @@
       List<StubMethod> callStubs,
       List<StubMethod> checkedSetters,
       List<StubMethod> isChecks,
-      ClassChecks classChecksNewRti,
       js.Expression functionTypeIndex,
       {bool hasRtiField,
       bool onlyForRti,
@@ -366,6 +377,7 @@
       bool isDirectlyInstantiated})
       : super(
             element,
+            typeData,
             name,
             holder,
             const <Method>[],
@@ -375,7 +387,6 @@
             const <StubMethod>[],
             checkedSetters,
             isChecks,
-            classChecksNewRti,
             functionTypeIndex,
             hasRtiField: hasRtiField,
             onlyForRti: onlyForRti,
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index 84ff8fe..9223c96 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -37,9 +37,10 @@
   // Caches the methods that have a native body.
   Set<FunctionEntity> nativeMethods = new Set<FunctionEntity>();
 
-  // Type metadata redirections, where the key is the class being redirected to
-  // and the value is the list of classes being redirected.
-  final Map<Class, List<Class>> typeRedirections = {};
+  // Type metadata redirections, where the key is the class type data being
+  // redirected to and the value is the list of class type data being
+  // redirected.
+  final Map<ClassTypeData, List<ClassTypeData>> typeRedirections = {};
 
   NativeEmitter(
       this._emitterTask, this._closedWorld, this._nativeCodegenEnqueuer);
@@ -157,19 +158,20 @@
         neededClasses.add(cls);
         neededClasses.add(cls.superclass);
         nonLeafClasses.add(cls.superclass);
-      } else if (!cls.isTriviallyChecked(_commonElements) ||
-          cls.namedTypeVariablesNewRti.isNotEmpty) {
+      } else if (!cls.typeData.isTriviallyChecked(_commonElements) ||
+          cls.typeData.namedTypeVariables.isNotEmpty) {
         // The class is not marked 'needed', but we still need it in the type
         // metadata.
 
-        // Redirect this class (and all classes which would have redirected to
-        // this class) to its superclass. Because we have a post-order visit,
-        // this eventually causes all such native classes to redirect to their
-        // leaf interceptors.
-        List<Class> redirectedClasses = typeRedirections[cls] ?? [];
-        redirectedClasses.add(cls);
-        typeRedirections[cls.superclass] = redirectedClasses;
-        typeRedirections.remove(cls);
+        // Redirect this class type data (and all class type data which would
+        // have redirected to this class type data) to its superclass. Because
+        // we have a post-order visit, this eventually causes all such native
+        // classes to redirect to their leaf interceptors.
+        List<ClassTypeData> redirectedClasses =
+            typeRedirections[cls.typeData] ?? [];
+        redirectedClasses.add(cls.typeData);
+        typeRedirections[cls.superclass.typeData] = redirectedClasses;
+        typeRedirections.remove(cls.typeData);
       }
     }
 
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 49a1d63..b1aaa3b 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -9,6 +9,7 @@
 ///
 /// The code for the containing (used) methods must exist in the `universe`.
 class Collector {
+  final CompilerOptions _options;
   final JCommonElements _commonElements;
   final JElementEnvironment _elementEnvironment;
   final OutputUnitData _outputUnitData;
@@ -27,6 +28,7 @@
   // This field is set in [computeNeededDeclarations].
   Set<ClassEntity> classesOnlyNeededForConstructor;
   final Map<OutputUnit, List<ClassEntity>> outputClassLists = {};
+  final Map<OutputUnit, List<ClassEntity>> outputClassTypeLists = {};
   final Map<OutputUnit, List<ConstantValue>> outputConstantLists = {};
   final Map<OutputUnit, List<MemberEntity>> outputStaticLists = {};
   final Map<OutputUnit, List<FieldEntity>> outputStaticNonFinalFieldLists = {};
@@ -41,6 +43,7 @@
   final List<ClassEntity> nativeClassesAndSubclasses = [];
 
   Collector(
+      this._options,
       this._commonElements,
       this._elementEnvironment,
       this._outputUnitData,
@@ -134,6 +137,14 @@
     }
   }
 
+  Map<OutputUnit, List<ClassEntity>> get _outputListsForClassType {
+    if (_options.deferClassTypes) {
+      return outputClassTypeLists;
+    } else {
+      return outputClassLists;
+    }
+  }
+
   /// Compute all the classes and typedefs that must be emitted.
   void computeNeededDeclarations() {
     Set<ClassEntity> backendTypeHelpers =
@@ -147,18 +158,11 @@
             .where(computeClassFilter(backendTypeHelpers))
             .toSet();
 
-    void addClassWithSuperclasses(ClassEntity cls) {
-      neededClasses.add(cls);
-      for (ClassEntity superclass = _elementEnvironment.getSuperClass(cls);
-          superclass != null;
-          superclass = _elementEnvironment.getSuperClass(superclass)) {
-        neededClasses.add(superclass);
-      }
-    }
-
     void addClassesWithSuperclasses(Iterable<ClassEntity> classes) {
       for (ClassEntity cls in classes) {
-        addClassWithSuperclasses(cls);
+        neededClasses.add(cls);
+        _elementEnvironment.forEachSuperClass(
+            cls, (superClass) => neededClasses.add(superClass));
       }
     }
 
@@ -199,8 +203,11 @@
     List<ClassEntity> sortedClasses = _sorter.sortClasses(neededClasses);
 
     for (ClassEntity cls in sortedClasses) {
-      if (_nativeData.isNativeOrExtendsNative(cls) &&
-          !classesOnlyNeededForRti.contains(cls) &&
+      if (classesOnlyNeededForRti.contains(cls)) {
+        _outputListsForClassType
+            .putIfAbsent(_outputUnitData.outputUnitForClassType(cls), () => [])
+            .add(cls);
+      } else if (_nativeData.isNativeOrExtendsNative(cls) &&
           !classesOnlyNeededForConstructor.contains(cls)) {
         // For now, native classes and related classes cannot be deferred.
         nativeClassesAndSubclasses.add(cls);
@@ -285,7 +292,9 @@
       outputLibraryLists.putIfAbsent(unit, () => {}).add(library);
     });
     neededClasses.forEach((ClassEntity element) {
-      OutputUnit unit = _outputUnitData.outputUnitForClass(element);
+      OutputUnit unit = classesOnlyNeededForRti.contains(element)
+          ? _outputUnitData.outputUnitForClassType(element)
+          : _outputUnitData.outputUnitForClass(element);
       LibraryEntity library = element.library;
       outputLibraryLists.putIfAbsent(unit, () => {}).add(library);
     });
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index e2ad389..5351885 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -135,6 +135,7 @@
       this._rtiNeededClasses,
       this._mainFunction)
       : this.collector = new Collector(
+            _options,
             _commonElements,
             _elementEnvironment,
             _outputUnitData,
@@ -153,6 +154,10 @@
   /// update the superclass in the [Class].
   final Map<ClassEntity, Class> _classes = <ClassEntity, Class>{};
 
+  /// Mapping from [ClassEntity] to constructed [ClassTypeData] object. Used to build
+  /// libraries.
+  final Map<ClassEntity, ClassTypeData> _classTypeData = {};
+
   /// Mapping from [OutputUnit] to constructed [Fragment]. We need this to
   /// generate the deferredLoadingMap (to know which hunks to load).
   final Map<OutputUnit, Fragment> _outputs = <OutputUnit, Fragment>{};
@@ -184,6 +189,7 @@
     _closedWorld.outputUnitData.outputUnits
         .forEach(_registry.registerOutputUnit);
     collector.outputClassLists.forEach(_registry.registerClasses);
+    collector.outputClassTypeLists.forEach(_registry.registerClassTypes);
     collector.outputStaticLists.forEach(_registry.registerMembers);
     collector.outputConstantLists.forEach(_registerConstants);
     collector.outputStaticNonFinalFieldLists.forEach(_registry.registerMembers);
@@ -199,6 +205,11 @@
       classes.forEach(_buildClass);
     });
 
+    collector.outputClassTypeLists
+        .forEach((OutputUnit _, List<ClassEntity> types) {
+      types.forEach(_buildClassTypeData);
+    });
+
     // Resolve the superclass references after we've processed all the classes.
     _classes.forEach((ClassEntity cls, Class c) {
       ClassEntity superclass = _elementEnvironment.getSuperClass(cls);
@@ -473,8 +484,9 @@
     List<Library> libraries = new List<Library>(librariesMap.length);
     int count = 0;
     librariesMap.forEach((LibraryEntity library, List<ClassEntity> classes,
-        List<MemberEntity> members) {
-      libraries[count++] = _buildLibrary(library, classes, members);
+        List<MemberEntity> members, List<ClassEntity> classTypeElements) {
+      libraries[count++] =
+          _buildLibrary(library, classes, members, classTypeElements);
     });
     return libraries;
   }
@@ -500,8 +512,8 @@
 
     interceptorClass?.isChecks?.addAll(_jsInteropIsChecks);
     Set<String> stubNames = {};
-    librariesMap
-        .forEach((LibraryEntity library, List<ClassEntity> classElements, _) {
+    librariesMap.forEach((LibraryEntity library,
+        List<ClassEntity> classElements, _memberElement, _typeElement) {
       for (ClassEntity cls in classElements) {
         if (_nativeData.isJsInteropClass(cls)) {
           _elementEnvironment.forEachLocalClassMember(cls,
@@ -601,7 +613,7 @@
   // Note that a library-element may have multiple [Library]s, if it is split
   // into multiple output units.
   Library _buildLibrary(LibraryEntity library, List<ClassEntity> classElements,
-      List<MemberEntity> memberElements) {
+      List<MemberEntity> memberElements, List<ClassEntity> classTypeElements) {
     String uri = library.canonicalUri.toString();
 
     List<StaticMethod> statics = memberElements
@@ -621,12 +633,17 @@
             !cls.isNative || !_unneededNativeClasses.contains(cls))
         .toList(growable: false);
 
+    List<ClassTypeData> classTypeData = classTypeElements
+        .map((ClassEntity classTypeElement) => _classTypeData[classTypeElement])
+        .toList();
+    classTypeData.addAll(classes.map((Class cls) => cls.typeData).toList());
+
     bool visitStatics = true;
     List<Field> staticFieldsForReflection =
         _buildFields(library: library, visitStatics: visitStatics);
 
-    return new Library(
-        library, uri, statics, classes, staticFieldsForReflection);
+    return new Library(library, uri, statics, classes, classTypeData,
+        staticFieldsForReflection);
   }
 
   bool _isSoftDeferred(ClassEntity element) {
@@ -636,9 +653,12 @@
   Class _buildClass(ClassEntity cls) {
     bool onlyForConstructor =
         collector.classesOnlyNeededForConstructor.contains(cls);
-    bool onlyForRti = collector.classesOnlyNeededForRti.contains(cls);
+    bool onlyForRti = _options.deferClassTypes
+        ? false
+        : collector.classesOnlyNeededForRti.contains(cls);
     bool hasRtiField = _rtiNeed.classNeedsTypeArguments(cls);
     if (_nativeData.isJsInteropClass(cls)) {
+      // TODO(joshualitt): Can we just emit JSInteropClasses as types?
       // TODO(jacobr): check whether the class has any active static fields
       // if it does not we can suppress it completely.
       onlyForRti = true;
@@ -793,6 +813,7 @@
     bool isInstantiated = !_nativeData.isJsInteropClass(cls) &&
         _codegenWorld.directlyInstantiatedClasses.contains(cls);
 
+    ClassTypeData typeData = ClassTypeData(cls, _rtiChecks.requiredChecks[cls]);
     Class result;
     if (_elementEnvironment.isMixinApplication(cls) &&
         !onlyForConstructorOrRti &&
@@ -803,6 +824,7 @@
 
       result = new MixinApplication(
           cls,
+          typeData,
           name,
           holder,
           instanceFields,
@@ -810,7 +832,6 @@
           callStubs,
           checkedSetters,
           isChecks,
-          _rtiChecks.requiredChecks[cls],
           typeTests.functionTypeIndex,
           isDirectlyInstantiated: isInstantiated,
           hasRtiField: hasRtiField,
@@ -819,6 +840,7 @@
     } else {
       result = new Class(
           cls,
+          typeData,
           name,
           holder,
           methods,
@@ -828,7 +850,6 @@
           noSuchMethodStubs,
           checkedSetters,
           isChecks,
-          _rtiChecks.requiredChecks[cls],
           typeTests.functionTypeIndex,
           isDirectlyInstantiated: isInstantiated,
           hasRtiField: hasRtiField,
@@ -843,6 +864,10 @@
     return result;
   }
 
+  void _buildClassTypeData(ClassEntity cls) {
+    _classTypeData[cls] = ClassTypeData(cls, _rtiChecks.requiredChecks[cls]);
+  }
+
   void associateNamedTypeVariablesNewRti() {
     for (TypeVariableType typeVariable in _codegenWorld.namedTypeVariablesNewRti
         .union(_lateNamedTypeVariablesNewRti)) {
@@ -853,8 +878,13 @@
               : _classHierarchy.subclassesOf(declaration);
       for (ClassEntity entity in subtypes) {
         Class cls = _classes[entity];
-        if (cls == null) continue;
-        cls.namedTypeVariablesNewRti.add(typeVariable);
+        if (cls != null) {
+          cls.typeData.namedTypeVariables.add(typeVariable);
+        }
+        ClassTypeData classTypeData = _classTypeData[entity];
+        if (classTypeData != null) {
+          classTypeData.namedTypeVariables.add(typeVariable);
+        }
       }
     }
   }
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
index 13bc633..c738517 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
@@ -5,14 +5,18 @@
 part of dart2js.js_emitter.program_builder;
 
 class LibraryContents {
-  final List<ClassEntity> classes = <ClassEntity>[];
-  final List<MemberEntity> members = <MemberEntity>[];
+  final List<ClassEntity> classes = [];
+  final List<MemberEntity> members = [];
+  final List<ClassEntity> classTypes = [];
 }
 
-/// Maps [LibraryEntity]s to their [ClassEntity]s and [MemberEntity]s.
+/// Maps [LibraryEntity]s to their classes, members, and class types.
 ///
 /// Fundamentally, this class nicely encapsulates a
-/// `Map<LibraryEntity, Pair<List<ClassEntity>, List<MemberEntity>>>`.
+/// `Map<LibraryEntity, Tuple<classes, members, class types>>`.
+///
+/// where both classes and class types are lists of [ClassEntity] and
+/// members is a list of [MemberEntity].
 ///
 /// There exists exactly one instance per [OutputUnit].
 class LibrariesMap {
@@ -46,6 +50,10 @@
     _getMapping(library).classes.add(element);
   }
 
+  void addClassType(LibraryEntity library, ClassEntity element) {
+    _getMapping(library).classTypes.add(element);
+  }
+
   void addMember(LibraryEntity library, MemberEntity element) {
     _getMapping(library).members.add(element);
   }
@@ -54,9 +62,9 @@
 
   void forEach(
       void f(LibraryEntity library, List<ClassEntity> classes,
-          List<MemberEntity> members)) {
+          List<MemberEntity> members, List<ClassEntity> classTypeData)) {
     _mapping.forEach((LibraryEntity library, LibraryContents mapping) {
-      f(library, mapping.classes, mapping.members);
+      f(library, mapping.classes, mapping.members, mapping.classTypes);
     });
   }
 }
@@ -125,6 +133,16 @@
 
   /// Adds all elements to their respective libraries in the correct
   /// libraries map.
+  void registerClassTypes(
+      OutputUnit outputUnit, Iterable<ClassEntity> elements) {
+    LibrariesMap targetLibrariesMap = _mapUnitToLibrariesMap(outputUnit);
+    for (ClassEntity element in _sorter.sortClasses(elements)) {
+      targetLibrariesMap.addClassType(element.library, element);
+    }
+  }
+
+  /// Adds all elements to their respective libraries in the correct
+  /// libraries map.
   void registerMembers(OutputUnit outputUnit, Iterable<MemberEntity> elements) {
     LibrariesMap targetLibrariesMap = _mapUnitToLibrariesMap(outputUnit);
     for (MemberEntity element in _sorter.sortMembers(elements)) {
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index 1da9bec..d9bfaab 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -263,7 +263,7 @@
 
   @override
   bool visitInterfaceType(InterfaceType type, OutputUnit argument) {
-    if (_outputUnitData.outputUnitForClass(type.element) != argument) {
+    if (_outputUnitData.outputUnitForClassType(type.element) != argument) {
       return false;
     }
     return visitList(type.typeArguments, argument);
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 0bd06bf..41ddad7 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1998,15 +1998,15 @@
     ClassEntity jsObjectClass = _commonElements.jsJavaScriptObjectClass;
     InterfaceType jsObjectType = _elementEnvironment.getThisType(jsObjectClass);
 
-    Map<Class, List<Class>> nativeRedirections =
+    Map<ClassTypeData, List<ClassTypeData>> nativeRedirections =
         _nativeEmitter.typeRedirections;
 
     Ruleset ruleset = Ruleset.empty();
     Map<ClassEntity, int> erasedTypes = {};
-    Iterable<Class> classes =
-        fragment.libraries.expand((Library library) => library.classes);
-    classes.forEach((Class cls) {
-      ClassEntity element = cls.element;
+    Iterable<ClassTypeData> classTypeData =
+        fragment.libraries.expand((Library library) => library.classTypeData);
+    classTypeData.forEach((ClassTypeData typeData) {
+      ClassEntity element = typeData.element;
       InterfaceType targetType = _elementEnvironment.getThisType(element);
 
       // TODO(fishythefish): Prune uninstantiated classes.
@@ -2016,7 +2016,7 @@
 
       bool isInterop = _classHierarchy.isSubclassOf(element, jsObjectClass);
 
-      Iterable<TypeCheck> checks = cls.classChecksNewRti?.checks ?? [];
+      Iterable<TypeCheck> checks = typeData.classChecks?.checks ?? [];
       Iterable<InterfaceType> supertypes = isInterop
           ? checks
               .map((check) => _elementEnvironment.getJsInteropType(check.cls))
@@ -2024,11 +2024,11 @@
               .map((check) => _dartTypes.asInstanceOf(targetType, check.cls));
 
       Map<TypeVariableType, DartType> typeVariables = {};
-      Set<TypeVariableType> namedTypeVariables = cls.namedTypeVariablesNewRti;
-      nativeRedirections[cls]?.forEach((Class redirectee) {
-        namedTypeVariables.addAll(redirectee.namedTypeVariablesNewRti);
+      Set<TypeVariableType> namedTypeVariables = typeData.namedTypeVariables;
+      nativeRedirections[typeData]?.forEach((ClassTypeData redirectee) {
+        namedTypeVariables.addAll(redirectee.namedTypeVariables);
       });
-      for (TypeVariableType typeVariable in cls.namedTypeVariablesNewRti) {
+      for (TypeVariableType typeVariable in typeData.namedTypeVariables) {
         TypeVariableEntity element = typeVariable.element;
         InterfaceType supertype = isInterop
             ? _elementEnvironment.getJsInteropType(element.typeDeclaration)
@@ -2053,8 +2053,9 @@
       });
     }
 
-    nativeRedirections.forEach((Class target, List<Class> redirectees) {
-      for (Class redirectee in redirectees) {
+    nativeRedirections
+        .forEach((ClassTypeData target, List<ClassTypeData> redirectees) {
+      for (ClassTypeData redirectee in redirectees) {
         ruleset.addRedirection(redirectee.element, target.element);
       }
     });
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 5977113..76e5139 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1913,6 +1913,15 @@
     KClassData classData = elementMap.classes.getData(cls);
     return classData.isEnumClass;
   }
+
+  @override
+  ClassEntity getEffectiveMixinClass(ClassEntity cls) {
+    if (!isMixinApplication(cls)) return null;
+    do {
+      cls = elementMap.getAppliedMixin(cls);
+    } while (isMixinApplication(cls));
+    return cls;
+  }
 }
 
 /// [BehaviorBuilder] for kernel based elements.
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 3d43255..9ebb17d 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -156,10 +156,7 @@
         elementEnvironment.forEachLocalClassMember(cls, (MemberEntity member) {
           String memberName = getJsInteropName(
               library, elementEnvironment.getMemberMetadata(member));
-          if (memberName != null) {
-            reporter.reportErrorMessage(
-                member, MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS);
-          } else if (member is FunctionEntity) {
+          if (memberName == null && member is FunctionEntity) {
             if (member.isExternal &&
                 !commonElements.isExternalAllowed(member)) {
               reporter.reportErrorMessage(
@@ -171,10 +168,7 @@
             (ConstructorEntity constructor) {
           String memberName = getJsInteropName(
               library, elementEnvironment.getMemberMetadata(constructor));
-          if (memberName != null) {
-            reporter.reportErrorMessage(constructor,
-                MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS);
-          } else {
+          if (memberName == null) {
             if (constructor.isExternal &&
                 !commonElements.isExternalAllowed(constructor)) {
               reporter.reportErrorMessage(
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index a2f9c2c..3e9ab67 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -157,6 +157,11 @@
   /// This flag is presented to help developers find and fix the affected code.
   bool reportInvalidInferredDeferredTypes = false;
 
+  /// Whether to defer load class types.
+  bool deferClassTypes = false; // default value.
+  bool _deferClassTypes = false;
+  bool _noDeferClassTypes = false;
+
   /// Whether to disable inlining during the backend optimizations.
   // TODO(sigmund): negate, so all flags are positive
   bool disableInlining = false;
@@ -193,7 +198,10 @@
   /// Whether to use the trivial abstract value domain.
   bool useTrivialAbstractValueDomain = false;
 
-  /// Whether to use the powerset abstract value domain (experimental).
+  /// Whether to use the wrapped abstract value domain (experimental).
+  bool experimentalWrapped = false;
+
+  /// Whether to use the powersets abstract value domain (experimental).
   bool experimentalPowersets = false;
 
   /// Whether to disable optimization for need runtime type information.
@@ -426,6 +434,8 @@
       ..newDeferredSplit = _hasOption(options, Flags.newDeferredSplit)
       ..reportInvalidInferredDeferredTypes =
           _hasOption(options, Flags.reportInvalidInferredDeferredTypes)
+      .._deferClassTypes = _hasOption(options, Flags.deferClassTypes)
+      .._noDeferClassTypes = _hasOption(options, Flags.noDeferClassTypes)
       ..fatalWarnings = _hasOption(options, Flags.fatalWarnings)
       ..terseDiagnostics = _hasOption(options, Flags.terse)
       ..suppressWarnings = _hasOption(options, Flags.suppressWarnings)
@@ -438,6 +448,7 @@
       ..disableTypeInference = _hasOption(options, Flags.disableTypeInference)
       ..useTrivialAbstractValueDomain =
           _hasOption(options, Flags.useTrivialAbstractValueDomain)
+      ..experimentalWrapped = _hasOption(options, Flags.experimentalWrapped)
       ..experimentalPowersets = _hasOption(options, Flags.experimentalPowersets)
       ..disableRtiOptimization =
           _hasOption(options, Flags.disableRtiOptimization)
@@ -527,6 +538,10 @@
       throw ArgumentError("'${Flags.soundNullSafety}' requires the "
           "'non-nullable' experiment to be enabled");
     }
+    if (_deferClassTypes && _noDeferClassTypes) {
+      throw ArgumentError("'${Flags.deferClassTypes}' incompatible with "
+          "'${Flags.noDeferClassTypes}'");
+    }
   }
 
   void deriveOptions() {
@@ -588,6 +603,9 @@
     if (_disableMinification) {
       enableMinification = false;
     }
+
+    if (_deferClassTypes) deferClassTypes = true;
+    if (_noDeferClassTypes) deferClassTypes = false;
   }
 
   /// Returns `true` if warnings and hints are shown for all packages.
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 11272be..e227a7d 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -586,3 +586,64 @@
     return null;
   }
 }
+
+/// Adapter to support one or more synthetic uri schemes.
+///
+/// These custom uris map to one or more real directories on the file system,
+/// providing a merged view - or "overlay" file system.
+///
+/// This also allows for hermetic builds which do not encode machine specific
+/// absolute uris by creating a synthetic "root" of the file system.
+///
+/// TODO(sigmund): Remove the [BazelInputProvider] in favor of this.
+/// TODO(sigmund): Remove this and use the common `MultiRootFileSystem`
+/// implementation.
+class MultiRootInputProvider extends SourceFileProvider {
+  final List<Uri> roots;
+  final String markerScheme;
+
+  MultiRootInputProvider(this.markerScheme, List<String> searchPaths)
+      : roots = searchPaths.map(Uri.base.resolve).toList();
+
+  @override
+  Future<api.Input<List<int>>> readFromUri(Uri uri,
+      {InputKind inputKind: InputKind.UTF8}) async {
+    var resolvedUri = uri;
+    if (resolvedUri.scheme == markerScheme) {
+      var path = resolvedUri.path;
+      if (path.startsWith('/')) path = path.substring(1);
+      for (var dir in roots) {
+        var fileUri = dir.resolve(path);
+        if (await new File.fromUri(fileUri).exists()) {
+          resolvedUri = fileUri;
+          break;
+        }
+      }
+    }
+    api.Input<List<int>> result =
+        await readBytesFromUri(resolvedUri, inputKind);
+    switch (inputKind) {
+      case InputKind.UTF8:
+        utf8SourceFiles[uri] = utf8SourceFiles[resolvedUri];
+        break;
+      case InputKind.binary:
+        binarySourceFiles[uri] = binarySourceFiles[resolvedUri];
+        break;
+    }
+    return result;
+  }
+
+  @override
+  api.Input autoReadFromFile(Uri resourceUri) {
+    if (resourceUri.scheme == markerScheme) {
+      var path = resourceUri.path;
+      for (var dir in roots) {
+        var file = dir.resolve(path);
+        if (new File.fromUri(file).existsSync()) {
+          return super.autoReadFromFile(file);
+        }
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/lib.dart b/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/lib.dart
new file mode 100644
index 0000000..f920e6b
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/lib.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2020, 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.7
+
+/*member: a:OutputUnit(1, {lib})*/
+a() => print("123");
+
+/*member: b:OutputUnit(1, {lib})*/
+b() => print("123");
+
+/*member: c:OutputUnit(1, {lib})*/
+c() => print("123");
+
+/*member: d:OutputUnit(1, {lib})*/
+d() => print("123");
+
+/*class: B:OutputUnit(1, {lib})*/
+class B {
+  /*member: B.:OutputUnit(1, {lib})*/
+  B() {
+    b();
+  }
+}
+
+/*class: B2:OutputUnit(1, {lib})*/
+/*member: B2.:OutputUnit(1, {lib})*/
+class B2 extends B {
+  // No constructor creates a synthetic constructor that has an implicit
+  // super-call.
+}
+
+/*class: A:OutputUnit(1, {lib})*/
+class A {
+  /*member: A.:OutputUnit(1, {lib})*/
+  A() {
+    a();
+  }
+}
+
+/*class: A2:OutputUnit(1, {lib})*/
+class A2 extends A {
+  // Implicit super call.
+  /*member: A2.:OutputUnit(1, {lib})*/
+  A2();
+}
+
+/*class: C1:OutputUnit(1, {lib})*/
+class C1 {}
+
+/*class: C2:OutputUnit(1, {lib})*/
+class C2 {
+  /*member: C2.:OutputUnit(1, {lib})*/
+  C2() {
+    c();
+  }
+}
+
+/*class: C2p:null*/
+class C2p {
+  C2() {
+    c();
+  }
+}
+
+/*class: C3:OutputUnit(1, {lib})*/
+/*member: C3.:OutputUnit(1, {lib})*/
+class C3 extends C2 with C1 {
+  // Implicit redirecting "super" call via mixin.
+}
+
+/*class: E:OutputUnit(1, {lib})*/
+class E {}
+
+/*class: F:OutputUnit(1, {lib})*/
+class F {}
+
+/*class: G:OutputUnit(1, {lib})*/
+/*member: G.:OutputUnit(1, {lib})*/
+class G extends C3 with C1, E, F {}
+
+/*class: D1:OutputUnit(1, {lib})*/
+class D1 {}
+
+/*class: D2:OutputUnit(1, {lib})*/
+class D2 {
+  /*member: D2.:OutputUnit(1, {lib})*/
+  D2(x) {
+    d();
+  }
+}
+
+// Implicit redirecting "super" call with a parameter via mixin.
+/*class: D3:OutputUnit(1, {lib})*/
+class D3 = D2 with D1;
diff --git a/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/main.dart b/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/main.dart
new file mode 100644
index 0000000..fe41fa5
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/follow_implicit_super_regression_test/main.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2020, 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.7
+
+import "lib.dart" deferred as lib;
+
+/*member: main:OutputUnit(main, {})*/
+void main() {
+  lib.loadLibrary().then(/*OutputUnit(main, {})*/ (_) {
+    new lib.A2();
+    new lib.B2();
+    new lib.C3();
+    new lib.D3(10);
+    new lib.G();
+  });
+}
diff --git a/pkg/compiler/test/deferred_loading/data/inteface_type_variable/lib.dart b/pkg/compiler/test/deferred_loading/data/inteface_type_variable/lib.dart
new file mode 100644
index 0000000..97e8353
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/inteface_type_variable/lib.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2020, 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.7
+
+/*class: A:OutputUnit(1, {lib})*/
+/*member: A.:OutputUnit(1, {lib})*/
+class A {}
+
+/*class: I:OutputUnit(1, {lib})*/
+class I<T> {}
+
+/*class: J:OutputUnit(1, {lib})*/
+/*member: J.:OutputUnit(1, {lib})*/
+class J<T> {}
+
+// C needs to include "N", otherwise checking for `is I<A>` will likely cause
+// problems
+/*class: C:OutputUnit(1, {lib})*/
+/*member: C.:OutputUnit(1, {lib})*/
+class C extends A implements I<N> {}
+
+/*class: C1:OutputUnit(1, {lib})*/
+/*member: C1.:OutputUnit(1, {lib})*/
+class C1 extends J<M> implements A {}
+
+/*class: C2:OutputUnit(1, {lib})*/
+/*member: C2.:OutputUnit(1, {lib})*/
+class C2 extends J<M> implements I<N> {}
+
+/*class: N:OutputUnit(1, {lib})*/
+class N extends A {}
+
+/*class: M:OutputUnit(1, {lib})*/
+class M extends A {}
+
+/*member: doCheck1:OutputUnit(1, {lib})*/
+doCheck1(x) => x is I<A>;
+/*member: doCheck2:OutputUnit(1, {lib})*/
+doCheck2(x) => x is J<A>;
diff --git a/pkg/compiler/test/deferred_loading/data/inteface_type_variable/main.dart b/pkg/compiler/test/deferred_loading/data/inteface_type_variable/main.dart
new file mode 100644
index 0000000..d9075e9
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/inteface_type_variable/main.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2020, 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.7
+
+import 'lib.dart' deferred as lib;
+
+/// Regression test: if a type variable is used, but not instantiated, it still
+/// needs to be mapped to the deferred unit where it is used.
+///
+/// If not, we may include it in the main unit and may not see that the base
+/// class is not added to the main unit.
+/*member: main:OutputUnit(main, {})*/
+main() {
+  lib.loadLibrary().then(/*OutputUnit(main, {})*/ (_) {
+    lib.doCheck1(dontInline(new lib.C()));
+    lib.doCheck1(dontInline(new lib.C1()));
+    lib.doCheck1(dontInline(new lib.C2()));
+    lib.doCheck2(dontInline(new lib.C()));
+    lib.doCheck2(dontInline(new lib.C1()));
+    lib.doCheck2(dontInline(new lib.C2()));
+  });
+}
+
+@pragma('dart2js:noInline')
+/*member: dontInline:OutputUnit(main, {})*/
+dontInline(x) => x;
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/lib.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/lib.dart
new file mode 100644
index 0000000..f8a57c2
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/lib.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2020, 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.7
+
+/*class: Foo:OutputUnit(1, {libA, libB, libC})*/
+class Foo {
+  /*member: Foo.x:OutputUnit(1, {libA, libB, libC})*/
+  int x;
+  /*member: Foo.:OutputUnit(3, {libB})*/
+  Foo() {
+    x = DateTime.now().millisecond;
+  }
+  /*member: Foo.method:OutputUnit(1, {libA, libB, libC})*/
+  int method() => x;
+}
+
+/*member: isFoo:OutputUnit(1, {libA, libB, libC})*/
+bool isFoo(o) {
+  return o is Foo;
+}
+
+/*member: callFooMethod:OutputUnit(3, {libB})*/
+int callFooMethod() {
+  return Foo().method();
+}
+
+typedef int FunFoo(Foo a);
+typedef int FunFunFoo(FunFoo b, int c);
+
+/*member: isFunFunFoo:OutputUnit(1, {libA, libB, libC})*/
+bool isFunFunFoo(o) {
+  return o is FunFunFoo;
+}
+
+/*class: Aoo:OutputUnit(4, {libB, libC})*/
+class Aoo<T> {}
+
+/*class: Boo:OutputUnit(4, {libB, libC})*/
+class Boo<T> implements Aoo<T> {}
+
+/*class: Coo:OutputUnit(4, {libB, libC})*/
+/*member: Coo.:OutputUnit(6, {libC})*/
+class Coo<T> {}
+
+/*class: Doo:OutputUnit(4, {libB, libC})*/
+/*member: Doo.:OutputUnit(6, {libC})*/
+class Doo<T> extends Coo<T> with Boo<T> {}
+
+/*member: createDooFunFunFoo:OutputUnit(6, {libC})*/
+createDooFunFunFoo() => Doo<FunFunFoo>();
+
+/*class: B:OutputUnit(2, {libA, libC})*/
+/*member: B.:OutputUnit(6, {libC})*/
+class B {}
+
+/*class: B2:OutputUnit(2, {libA, libC})*/
+/*member: B2.:OutputUnit(6, {libC})*/
+class B2 extends B {}
+
+/*class: C1:OutputUnit(2, {libA, libC})*/
+class C1 {}
+
+/*class: C2:OutputUnit(2, {libA, libC})*/
+/*member: C2.:OutputUnit(6, {libC})*/
+class C2 {}
+
+/*class: C3:OutputUnit(2, {libA, libC})*/
+/*member: C3.:OutputUnit(6, {libC})*/
+class C3 extends C2 with C1 {}
+
+/*class: D1:OutputUnit(2, {libA, libC})*/
+class D1 {}
+
+/*class: D2:OutputUnit(2, {libA, libC})*/
+/*member: D2.:OutputUnit(6, {libC})*/
+class D2 {}
+
+/*class: D3:OutputUnit(2, {libA, libC})*/
+class D3 = D2 with D1;
+
+/*member: isMega:OutputUnit(5, {libA})*/
+bool isMega(o) {
+  return o is B2 || o is C3 || o is D3;
+}
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/liba.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/liba.dart
new file mode 100644
index 0000000..a712114
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/liba.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, 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.7
+
+import 'lib.dart' as lib;
+
+/*member: isFoo:OutputUnit(5, {libA})*/
+bool isFoo(o) => lib.isFoo(o);
+
+/*member: isFunFunFoo:OutputUnit(5, {libA})*/
+bool isFunFunFoo(o) => lib.isFunFunFoo(o);
+
+/*member: isMega:OutputUnit(5, {libA})*/
+bool isMega(o) => lib.isMega(o);
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/libb.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/libb.dart
new file mode 100644
index 0000000..591fe47
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/libb.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, 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.7
+
+import 'lib.dart' as lib;
+
+/*member: callFooMethod:OutputUnit(3, {libB})*/
+int callFooMethod() => lib.callFooMethod();
+
+/*member: isFoo:OutputUnit(3, {libB})*/
+bool isFoo(o) => lib.isFoo(o);
+
+/*member: isFunFunFoo:OutputUnit(3, {libB})*/
+bool isFunFunFoo(o) => lib.isFunFunFoo(o);
+
+/*member: isDooFunFunFoo:OutputUnit(3, {libB})*/
+bool isDooFunFunFoo(o) => o is lib.Doo<lib.FunFunFoo>;
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/libc.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/libc.dart
new file mode 100644
index 0000000..1c04601
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/libc.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, 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.7
+
+import 'lib.dart' as lib;
+
+/*member: isFoo:OutputUnit(6, {libC})*/
+bool isFoo(o) => lib.isFoo(o);
+
+/*member: isFunFunFoo:OutputUnit(6, {libC})*/
+bool isFunFunFoo(o) => lib.isFunFunFoo(o);
+
+/*member: createB2:OutputUnit(6, {libC})*/
+createB2() => new lib.B2();
+
+/*member: createC3:OutputUnit(6, {libC})*/
+createC3() => new lib.C3();
+
+/*member: createD3:OutputUnit(6, {libC})*/
+createD3() => new lib.D3();
+
+/*member: createDooFunFunFoo:OutputUnit(6, {libC})*/
+createDooFunFunFoo() => lib.createDooFunFunFoo();
diff --git a/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart b/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart
new file mode 100644
index 0000000..885e32e
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/lazy_types/main.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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.7
+
+import 'liba.dart' deferred as libA;
+import 'libb.dart' deferred as libB;
+import 'libc.dart' deferred as libC;
+
+/*member: foo:OutputUnit(main, {}),constants=[FunctionConstant(callFooMethod)=OutputUnit(3, {libB}),FunctionConstant(createB2)=OutputUnit(6, {libC}),FunctionConstant(createC3)=OutputUnit(6, {libC}),FunctionConstant(createD3)=OutputUnit(6, {libC}),FunctionConstant(createDooFunFunFoo)=OutputUnit(6, {libC}),FunctionConstant(isDooFunFunFoo)=OutputUnit(3, {libB}),FunctionConstant(isFoo)=OutputUnit(3, {libB}),FunctionConstant(isFoo)=OutputUnit(5, {libA}),FunctionConstant(isFoo)=OutputUnit(6, {libC}),FunctionConstant(isFunFunFoo)=OutputUnit(3, {libB}),FunctionConstant(isFunFunFoo)=OutputUnit(5, {libA}),FunctionConstant(isFunFunFoo)=OutputUnit(6, {libC}),FunctionConstant(isMega)=OutputUnit(5, {libA})]*/
+void foo() async {
+  await libA.loadLibrary();
+  await libB.loadLibrary();
+  await libC.loadLibrary();
+  print((libA.isFoo)(null as dynamic));
+  print((libA.isFunFunFoo)(null as dynamic));
+  print((libA.isFoo)(null as dynamic));
+  print((libA.isMega)(null as dynamic));
+
+  print((libB.isFoo)(null as dynamic));
+  print((libB.callFooMethod)());
+  print((libB.isFunFunFoo)(null as dynamic));
+  print((libB.isDooFunFunFoo)(null as dynamic));
+
+  print((libC.isFoo)(null as dynamic));
+  print((libC.isFunFunFoo)(null as dynamic));
+  print((libC.createB2)());
+  print((libC.createC3)());
+  print((libC.createD3)());
+  print((libC.createDooFunFunFoo)());
+}
+
+/*member: main:OutputUnit(main, {})*/
+main() {
+  foo();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/lib.dart b/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/lib.dart
new file mode 100644
index 0000000..0379450
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/lib.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, 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.7
+
+// All of these types are considered instantiated because we create an instance
+// of [C].
+
+/*class: A:OutputUnit(1, {lib})*/
+/*member: A.:OutputUnit(1, {lib})*/
+class A {}
+
+/*class: Box:OutputUnit(1, {lib})*/
+/*member: Box.:OutputUnit(1, {lib})*/
+class Box<T> {
+  /*member: Box.value:OutputUnit(1, {lib})*/
+  int value;
+}
+
+/*class: B:OutputUnit(1, {lib})*/
+/*member: B.:OutputUnit(1, {lib})*/
+class B<T> extends A {
+  /*member: B.box:OutputUnit(1, {lib})*/
+  final box = new Box<T>();
+}
+
+/*class: C:OutputUnit(1, {lib})*/
+/*member: C.:OutputUnit(1, {lib})*/
+class C extends B<N> {}
+
+// N is not instantiated, but used as a type argument in C and indirectly in a
+// Box<N>.
+// If we don't mark it as part of the output unit of C, we accidentally add it
+// to the main output unit. However, A is in the output unit of C so we fail
+// when trying to finalize the declaration of N while loading the main output
+// unit.
+/*class: N:OutputUnit(1, {lib})*/
+class N extends A {}
diff --git a/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/main.dart b/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/main.dart
new file mode 100644
index 0000000..0f072de
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/uninstantiated_type_variable/main.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2020, 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.7
+
+import 'lib.dart' deferred as lib;
+
+/// Regression test: if a type variable is used, but not instantiated, it still
+/// needs to be mapped to the deferred unit where it is used.
+///
+/// If not, we may include it in the main unit and may not see that the base
+/// class is not added to the main unit.
+/*member: main:OutputUnit(main, {})*/
+main() {
+  lib.loadLibrary().then(/*OutputUnit(main, {})*/ (_) {
+    dontInline(new lib.C()).box.value;
+  });
+}
+
+@pragma('dart2js:noInline')
+/*member: dontInline:OutputUnit(main, {})*/
+dontInline(x) => x;
diff --git a/pkg/compiler/test/model/native_test.dart b/pkg/compiler/test/model/native_test.dart
index 88d5340..418bf59 100644
--- a/pkg/compiler/test/model/native_test.dart
+++ b/pkg/compiler/test/model/native_test.dart
@@ -138,8 +138,8 @@
       '54',
     ]);
 
-    await runTest('tests/dart2js_2/native/native_test.dart',
-        'tests/dart2js_2/native/', {
+    await runTest(
+        'tests/dart2js_2/native/native_test.dart', 'tests/dart2js_2/native/', {
       'Class': Kind.regular,
       'NativeClass': Kind.native,
       'topLevelField': Kind.regular,
@@ -226,7 +226,10 @@
       subTest.lines[lineIndex] = line;
       int commentIndex = prefix.indexOf('// ');
       if (commentIndex != -1) {
-        subTest.expectedError = prefix.substring(commentIndex + 3).trim();
+        String combinedErrors = prefix.substring(commentIndex + 3);
+        for (String error in combinedErrors.split(',')) {
+          subTest.expectedErrors.add(error.trim());
+        }
       }
       commonLines.add('');
     } else {
@@ -325,17 +328,20 @@
       entryPoint: entryPoint,
       memorySourceFiles: sources,
       diagnosticHandler: collector);
-  Expect.isFalse(result.isSuccess, "Expected compile time error for\n$subTest");
-  Expect.equals(
-      1, collector.errors.length, "Expected compile time error for\n$subTest");
-  Expect.equals(
-      'MessageKind.${subTest.expectedError}',
-      collector.errors.first.messageKind.toString(),
-      "Unexpected compile time error for\n$subTest");
+  Expect.isFalse(result.isSuccess,
+      "Expected compile time error(s) for\n$subTest");
+  List<String> expected =
+      subTest.expectedErrors.map((error) => 'MessageKind.' + error).toList();
+  List<String> actual =
+      collector.errors.map((error) => error.messageKind.toString()).toList();
+  expected.sort();
+  actual.sort();
+  Expect.listEquals(expected, actual,
+      "Unexpected compile time error(s) for\n$subTest");
 }
 
 class SubTest {
-  String expectedError;
+  List<String> expectedErrors = [];
   final Map<int, String> lines = <int, String>{};
 
   String generateCode(List<String> commonLines) {
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index c6333f5..301068b 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -26,7 +26,10 @@
   // provided before any command and to provide a more consistent help message
   // with the rest of the tool.
   @override
-  final ArgParser argParser = ArgParser();
+  final ArgParser argParser = ArgParser(
+    // Don't parse flags after script name.
+    allowTrailingOptions: false,
+  );
 
   @override
   final bool verbose;
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index 061f6fa..a1e7fe2 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -7,7 +7,7 @@
   sdk: '>=2.6.0 <3.0.0'
 dependencies:
   args: ^1.6.0
-  cli_util: ^0.1.4
+  cli_util: '>=0.1.4 <0.3.0'
   dart2native:
     path: ../dart2native
   dds:
diff --git a/pkg/dartdev/test/commands/run_test.dart b/pkg/dartdev/test/commands/run_test.dart
index ba7d746..38c40c1 100644
--- a/pkg/dartdev/test/commands/run_test.dart
+++ b/pkg/dartdev/test/commands/run_test.dart
@@ -108,12 +108,12 @@
     final result = p.runSync('run', [
       '--enable-experiment=non-nullable',
       name,
-      'argument1',
+      '--argument1',
       'argument2',
     ]);
 
     // --enable-experiment and main.dart should not be passed.
-    expect(result.stdout, equals('[argument1, argument2]\n'));
+    expect(result.stdout, equals('[--argument1, argument2]\n'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
@@ -126,12 +126,12 @@
     final result = p.runSync('run', [
       '--enable-experiment=non-nullable',
       Uri.file(name).toString(),
-      'argument1',
+      '--argument1',
       'argument2',
     ]);
 
     // --enable-experiment and main.dart should not be passed.
-    expect(result.stdout, equals('[argument1, argument2]\n'));
+    expect(result.stdout, equals('[--argument1, argument2]\n'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
index ca488e6..8f39796 100644
--- a/pkg/dartfix/pubspec.yaml
+++ b/pkg/dartfix/pubspec.yaml
@@ -16,7 +16,7 @@
   # protocol is experimental and will continue to evolve.
   analysis_server_client: '>=1.1.3 <1.1.4'
   args: ^1.4.0
-  cli_util: ^0.1.3
+  cli_util: ^0.2.0
   path: ^1.7.0
   pub_semver: ^1.4.4
 
diff --git a/pkg/dartfix/test/src/migrate_command_test.dart b/pkg/dartfix/test/src/migrate_command_test.dart
index 4215266..a2fcf89 100644
--- a/pkg/dartfix/test/src/migrate_command_test.dart
+++ b/pkg/dartfix/test/src/migrate_command_test.dart
@@ -169,6 +169,16 @@
   }
 
   @override
+  void write(String message) {
+    stdoutBuffer.write(message);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    stdoutBuffer.writeCharCode(charCode);
+  }
+
+  @override
   void stderr(String message) {
     stderrBuffer.writeln(message);
   }
diff --git a/pkg/dartfix/test/src/test_context.dart b/pkg/dartfix/test/src/test_context.dart
index be43d3f..9e55c3f 100644
--- a/pkg/dartfix/test/src/test_context.dart
+++ b/pkg/dartfix/test/src/test_context.dart
@@ -67,6 +67,16 @@
   }
 
   @override
+  void write(String message) {
+    stdoutBuffer.write(message);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    stdoutBuffer.writeCharCode(charCode);
+  }
+
+  @override
   void trace(String message) {
     if (debug) {
       stdoutBuffer.writeln(message);
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 cbb624a..cbcc354 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -1410,7 +1410,7 @@
     _getter
       ..isStatic = !isInstanceMember
       ..isExtensionMember = isExtensionMember
-      ..isAbstract = isAbstract
+      ..isAbstract = isAbstract && !isExternal
       ..isExternal = isExternal;
     // TODO(johnniwinther): How can the name already have been computed?
     _getter.name ??= new Name(getterName, libraryBuilder.library);
@@ -1428,7 +1428,7 @@
       _setter
         ..isStatic = !isInstanceMember
         ..isExtensionMember = isExtensionMember
-        ..isAbstract = isAbstract
+        ..isAbstract = isAbstract && !isExternal
         ..isExternal = isExternal;
       // TODO(johnniwinther): How can the name already have been computed?
       _setter?.name ??= new Name(setterName, libraryBuilder.library);
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 49d7a0b..d7755a4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2302,6 +2302,14 @@
       if (a.value.isNaN && b.value.isNaN) return falseConstant;
       if (a.value == 0.0 && b.value == 0.0) return trueConstant;
     }
+
+    if (a is DoubleConstant && b is IntConstant) {
+      return makeBoolConstant(a.value == b.value);
+    }
+
+    if (a is IntConstant && b is DoubleConstant) {
+      return makeBoolConstant(a.value == b.value);
+    }
     return null;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 0d6a2b1..c93ef12 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -51,7 +51,7 @@
 const int declaresConstConstructorMask = initializingFormalMask << 1;
 
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
-/// by [Modifier.validate] below.
+/// by [Modifier.toMask] below.
 const int varMask = 0;
 
 const Modifier Abstract = const Modifier(ModifierEnum.Abstract, abstractMask);
@@ -90,10 +90,8 @@
 
   toString() => "modifier(${'$kind'.substring('ModifierEnum.'.length)})";
 
-  static int validate(List<Modifier> modifiers, {bool isAbstract: false}) {
-    // TODO(ahe): Rename this method, validation is now taken care of by the
-    // parser.
-    int result = isAbstract ? abstractMask : 0;
+  static int toMask(List<Modifier> modifiers) {
+    int result = 0;
     if (modifiers == null) return result;
     for (Modifier modifier in modifiers) {
       result |= modifier.mask;
@@ -108,4 +106,13 @@
     if (identical('var', lexeme)) return Var.mask;
     return unhandled(lexeme, "Modifier.validateVarFinalOrConst", -1, null);
   }
+
+  /// Returns [modifier] with [abstractMask] added if [isAbstract] and
+  /// [modifiers] doesn't contain [externalMask].
+  static int addAbstractMask(int modifiers, {bool isAbstract: false}) {
+    if (isAbstract && (modifiers & externalMask) == 0) {
+      modifiers |= abstractMask;
+    }
+    return modifiers;
+  }
 }
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 53b4729..7fa2286 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -813,9 +813,7 @@
       }
     }
     int modifiers = pop();
-    if (isAbstract) {
-      modifiers |= abstractMask;
-    }
+    modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract);
     if (nativeMethodName != null) {
       modifiers |= externalMask;
     }
@@ -1059,13 +1057,11 @@
         isAbstract = false;
       }
     }
-    int modifiers = Modifier.validate(pop(), isAbstract: isAbstract);
+    int modifiers = Modifier.toMask(pop());
+    modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract);
     if (nativeMethodName != null) {
       modifiers |= externalMask;
     }
-    if ((modifiers & externalMask) != 0) {
-      modifiers &= ~abstractMask;
-    }
     bool isConst = (modifiers & constMask) != 0;
     int varFinalOrConstOffset = pop();
     List<MetadataBuilder> metadata = pop();
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 6459cc1..e375f71 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -441,6 +441,8 @@
 InvalidVoid/script2: Fail
 JsInteropAnonymousFactoryPositionalParameters/analyzerCode: Fail # Web compiler specific
 JsInteropAnonymousFactoryPositionalParameters/example: Fail # Web compiler specific
+JsInteropEnclosingClassJSAnnotation/analyzerCode: Fail # Web compiler specific
+JsInteropEnclosingClassJSAnnotation/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 62ae4a3..f317340 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4090,6 +4090,14 @@
   template: "Factory constructors for @anonymous JS interop classes should not contain any positional parameters."
   tip: "Try replacing them with named parameters instead."
 
+JsInteropEnclosingClassJSAnnotation:
+  template: "Member has a JS interop annotation but the enclosing class does not."
+  tip: "Try adding the annotation to the enclosing class."
+
+JsInteropEnclosingClassJSAnnotationContext:
+  template: "This is the enclosing class."
+  severity: CONTEXT
+
 JsInteropIndexNotSupported:
   template: "JS interop classes do not support [] and []= operator methods."
   tip: "Try replacing with a normal method."
diff --git a/pkg/front_end/test/crashing_test_case_minimizer.dart b/pkg/front_end/test/crashing_test_case_minimizer.dart
index 425e5c2..c6aca7f 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer.dart
@@ -20,6 +20,9 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+    show ExperimentalFlag;
+
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
@@ -546,6 +549,10 @@
 CompilerContext setupCompilerContext() {
   CompilerOptions options = getOptions();
 
+  if (nnbd) {
+    options.experimentalFlags = {ExperimentalFlag.nonNullable: true};
+  }
+
   TargetFlags targetFlags = new TargetFlags(
       enableNullSafety: nnbd, trackWidgetCreation: widgetTransformation);
   Target target;
diff --git a/pkg/front_end/testcases/general/external_method.dart b/pkg/front_end/testcases/general/external_method.dart
new file mode 100644
index 0000000..976d23b
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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.
+
+external void externalMethod();
+
+class Class {
+  external void externalMethod();
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/external_method.dart.outline.expect b/pkg/front_end/testcases/general/external_method.dart.outline.expect
new file mode 100644
index 0000000..b9975e3
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    ;
+  external method externalMethod() → void;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+external static method externalMethod() → void;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/external_method.dart.strong.expect b/pkg/front_end/testcases/general/external_method.dart.strong.expect
new file mode 100644
index 0000000..1fed66d
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  external method externalMethod() → void;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+external static method externalMethod() → void;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect
new file mode 100644
index 0000000..1fed66d
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  external method externalMethod() → void;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+external static method externalMethod() → void;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect b/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect
new file mode 100644
index 0000000..a36e380
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+external void externalMethod();
+
+class Class {
+  external void externalMethod();
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b902ad8
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+class Class {
+  external void externalMethod();
+}
+
+external void externalMethod();
+void main() {}
diff --git a/pkg/front_end/testcases/general/micro.dart.outline.expect b/pkg/front_end/testcases/general/micro.dart.outline.expect
index 110be54..7f70142 100644
--- a/pkg/front_end/testcases/general/micro.dart.outline.expect
+++ b/pkg/front_end/testcases/general/micro.dart.outline.expect
@@ -115,8 +115,8 @@
 }
 static method staticMethod() → dynamic
   ;
-external static abstract method externalStatic() → core::bool*;
-external static abstract method createBar() → self::Bar*;
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
 static method stringArgument(dynamic x) → dynamic
   ;
 static method intArgument(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/general/micro.dart.strong.expect b/pkg/front_end/testcases/general/micro.dart.strong.expect
index 5170680..302f493 100644
--- a/pkg/front_end/testcases/general/micro.dart.strong.expect
+++ b/pkg/front_end/testcases/general/micro.dart.strong.expect
@@ -123,8 +123,8 @@
 static method staticMethod() → dynamic {
   return "sdfg";
 }
-external static abstract method externalStatic() → core::bool*;
-external static abstract method createBar() → self::Bar*;
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
 static method stringArgument(dynamic x) → dynamic {}
 static method intArgument(dynamic x) → dynamic {}
 static method makeDynamicCall(dynamic receiver) → void {
diff --git a/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect
index 5170680..302f493 100644
--- a/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect
@@ -123,8 +123,8 @@
 static method staticMethod() → dynamic {
   return "sdfg";
 }
-external static abstract method externalStatic() → core::bool*;
-external static abstract method createBar() → self::Bar*;
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
 static method stringArgument(dynamic x) → dynamic {}
 static method intArgument(dynamic x) → dynamic {}
 static method makeDynamicCall(dynamic receiver) → void {
diff --git a/pkg/front_end/testcases/general/optional.dart.outline.expect b/pkg/front_end/testcases/general/optional.dart.outline.expect
index fc765ff..7960d64 100644
--- a/pkg/front_end/testcases/general/optional.dart.outline.expect
+++ b/pkg/front_end/testcases/general/optional.dart.outline.expect
@@ -77,6 +77,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-external static abstract method createExternal() → self::External*;
+external static method createExternal() → self::External*;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/optional.dart.strong.expect b/pkg/front_end/testcases/general/optional.dart.strong.expect
index 699fb55..fdbfad7 100644
--- a/pkg/front_end/testcases/general/optional.dart.strong.expect
+++ b/pkg/front_end/testcases/general/optional.dart.strong.expect
@@ -108,7 +108,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-external static abstract method createExternal() → self::External*;
+external static method createExternal() → self::External*;
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
   dynamic string1 = foo.{self::Foo::method}(1);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect
index 5170680..302f493 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect
@@ -123,8 +123,8 @@
 static method staticMethod() → dynamic {
   return "sdfg";
 }
-external static abstract method externalStatic() → core::bool*;
-external static abstract method createBar() → self::Bar*;
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
 static method stringArgument(dynamic x) → dynamic {}
 static method intArgument(dynamic x) → dynamic {}
 static method makeDynamicCall(dynamic receiver) → void {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect
index 5170680..302f493 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect
@@ -123,8 +123,8 @@
 static method staticMethod() → dynamic {
   return "sdfg";
 }
-external static abstract method externalStatic() → core::bool*;
-external static abstract method createBar() → self::Bar*;
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
 static method stringArgument(dynamic x) → dynamic {}
 static method intArgument(dynamic x) → dynamic {}
 static method makeDynamicCall(dynamic receiver) → void {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect
index 6e7a5a8..79679d1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect
@@ -108,7 +108,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-external static abstract method createExternal() → self::External*;
+external static method createExternal() → self::External*;
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
   dynamic string1 = foo.{self::Foo::method}(1);
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
index 0f64f8f..4ac62a9 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
@@ -193,22 +193,22 @@
   abstract set initializedField1(core::int #t2) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #t3) → void;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t4) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t5) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t4) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t5) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #t6) → void;
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   static field core::int staticField;
   static final field core::int finalStaticField;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t7) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t8) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t7) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t8) → void;
 }
 extension Extension on self::A {
   get extensionInstanceField = get self::Extension|extensionInstanceField;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
index 002cc9d..8181af4 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
@@ -225,22 +225,22 @@
   abstract set initializedField1(core::int #t4) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #t5) → void;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t6) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t7) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t6) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t7) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #t8) → void;
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   static field core::int staticField = null;
   static final field core::int finalStaticField = null;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t9) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t10) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t9) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t10) → void;
 }
 extension Extension on self::A {
   get extensionInstanceField = get self::Extension|extensionInstanceField;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
index 002cc9d..8181af4 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
@@ -225,22 +225,22 @@
   abstract set initializedField1(core::int #t4) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #t5) → void;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t6) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t7) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t6) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t7) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #t8) → void;
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   static field core::int staticField = null;
   static final field core::int finalStaticField = null;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t9) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t10) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t9) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t10) → void;
 }
 extension Extension on self::A {
   get extensionInstanceField = get self::Extension|extensionInstanceField;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
index 002cc9d..8181af4 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
@@ -225,22 +225,22 @@
   abstract set initializedField1(core::int #t4) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #t5) → void;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t6) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t7) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t6) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t7) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #t8) → void;
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   static field core::int staticField = null;
   static final field core::int finalStaticField = null;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t9) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t10) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t9) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t10) → void;
 }
 extension Extension on self::A {
   get extensionInstanceField = get self::Extension|extensionInstanceField;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
index 002cc9d..8181af4 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
@@ -225,22 +225,22 @@
   abstract set initializedField1(core::int #t4) → void;
   abstract get initializedField2() → core::int;
   abstract set initializedField2(core::int #t5) → void;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t6) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t7) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t6) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t7) → void;
   external get externalLateInstanceField() → core::int;
   external set externalLateInstanceField(core::int #t8) → void;
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   static field core::int staticField = null;
   static final field core::int finalStaticField = null;
-  external abstract get externalInstanceField() → core::int;
-  external abstract set externalInstanceField(core::int #t9) → void;
-  external abstract get externalFinalInstanceField() → core::int;
-  external abstract get externalCovariantInstanceField() → core::num;
-  external abstract set externalCovariantInstanceField(covariant core::num #t10) → void;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #t9) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant core::num #t10) → void;
 }
 extension Extension on self::A {
   get extensionInstanceField = get self::Extension|extensionInstanceField;
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
index f734994..1d570f5 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
@@ -35,6 +35,6 @@
 static method method(core::int a) → core::int
   ;
 @_in::patch
-external static abstract method patchedMethod(core::int a) → void;
+external static method patchedMethod(core::int a) → void;
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int
   ;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
index 25d8360..85646dd 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
@@ -58,6 +58,6 @@
 static method method([core::int i]) → void
   ;
 @_in::patch
-external static abstract method patchedMethod([core::int i]) → void;
+external static method patchedMethod([core::int i]) → void;
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod([core::int i]) → void
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart
new file mode 100644
index 0000000..3e5c10c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart
@@ -0,0 +1,8 @@
+import 'flutter_issue_63029_lib1.dart';
+import 'flutter_issue_63029_lib2.dart';
+
+class E extends A {}
+
+class F extends B<E> with D<E> {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline.expect
new file mode 100644
index 0000000..2c99d44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+import 'flutter_issue_63029_lib1.dart';
+import 'flutter_issue_63029_lib2.dart';
+
+class E extends A {}
+
+class F extends B<E> with D<E> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2c99d44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+import 'flutter_issue_63029_lib1.dart';
+import 'flutter_issue_63029_lib2.dart';
+
+class E extends A {}
+
+class F extends B<E> with D<E> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
new file mode 100644
index 0000000..e8fe043
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart:6:7: Error: 'B<E>' doesn't implement 'B<E>' so it can't be used with 'D<E>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib1.dart'.
+//  - 'E' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib2.dart'.
+// class F extends B<E> with D<E> {}
+//       ^
+//
+import self as self;
+import "flutter_issue_63029_lib1.dart" as flu;
+import "flutter_issue_63029_lib2.dart" as flu2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+import "org-dartlang-testcase:///flutter_issue_63029_lib2.dart";
+
+class E extends flu::A {
+  synthetic constructor •() → self::E
+    : super flu::A::•()
+    ;
+}
+abstract class _F&B&D = flu::B<self::E> with flu2::D<self::E> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_F&B&D
+    : super flu::B::•()
+    ;
+  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+}
+class F extends self::_F&B&D {
+  synthetic constructor •() → self::F
+    : super self::_F&B&D::•()
+    ;
+  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as flu;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → flu::A
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends flu::A = flu::A> extends core::Object {
+  synthetic constructor •() → flu::B<flu::B::T>
+    : super core::Object::•()
+    ;
+}
+
+library;
+import self as flu2;
+import "dart:core" as core;
+import "flutter_issue_63029_lib1.dart" as flu;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → flu2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+abstract class D<T extends flu::A* = flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect
new file mode 100644
index 0000000..f39dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect
@@ -0,0 +1,96 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart:6:7: Error: 'B<E>' doesn't implement 'B<E>' so it can't be used with 'D<E>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib1.dart'.
+//  - 'E' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib2.dart'.
+// class F extends B<E> with D<E> {}
+//       ^
+//
+import self as self;
+import "flutter_issue_63029_lib1.dart" as flu;
+import "flutter_issue_63029_lib2.dart" as flu2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+import "org-dartlang-testcase:///flutter_issue_63029_lib2.dart";
+
+class E extends flu::A {
+  synthetic constructor •() → self::E
+    : super flu::A::•()
+    ;
+}
+abstract class _F&B&D extends flu::B<self::E> implements flu2::D<self::E> /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_F&B&D
+    : super flu::B::•()
+    ;
+  abstract member-signature operator /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ ==(dynamic other) → core::bool*;
+  abstract member-signature get /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ _identityHashCode() → core::int*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature get /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ hashCode() → core::int*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ toString() → core::String*;
+  abstract member-signature method /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get /*isNullableByDefault, from org-dartlang-testcase:///flutter_issue_63029_lib2.dart */ runtimeType() → core::Type*;
+}
+class F extends self::_F&B&D {
+  synthetic constructor •() → self::F
+    : super self::_F&B&D::•()
+    ;
+  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as flu;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → flu::A
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends flu::A = flu::A> extends core::Object {
+  synthetic constructor •() → flu::B<flu::B::T>
+    : super core::Object::•()
+    ;
+}
+
+library;
+import self as flu2;
+import "dart:core" as core;
+import "flutter_issue_63029_lib1.dart" as flu;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → flu2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+abstract class D<T extends flu::A* = flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib1.dart b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib1.dart
new file mode 100644
index 0000000..90bdb8f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib1.dart
@@ -0,0 +1,3 @@
+abstract class A {}
+
+abstract class B<T extends A> {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib2.dart b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib2.dart
new file mode 100644
index 0000000..7205587
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029_lib2.dart
@@ -0,0 +1,7 @@
+// @dart = 2.8
+
+import 'flutter_issue_63029_lib1.dart';
+
+class C {}
+
+mixin D<T extends A> on B<T> implements C {}
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 4a5614a..c9238d3 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -293,6 +293,9 @@
     currentMember = node;
     var oldParent = enterParent(node);
     classTypeParametersAreInScope = !node.isStatic;
+    if (node.isAbstract && node.isExternal) {
+      problem(node, "Procedure cannot be both abstract and external.");
+    }
     node.function.accept(this);
     classTypeParametersAreInScope = false;
     visitList(node.annotations, this);
diff --git a/pkg/nnbd_migration/pubspec.yaml b/pkg/nnbd_migration/pubspec.yaml
index 2495d9c..dc1ee94 100644
--- a/pkg/nnbd_migration/pubspec.yaml
+++ b/pkg/nnbd_migration/pubspec.yaml
@@ -10,7 +10,7 @@
   analyzer_plugin: ^0.2.4
   args: ^1.4.4
   charcode: ^1.1.2
-  cli_util: ^0.1.4
+  cli_util: ^0.2.0
   collection: ^1.14.11
   crypto: ^2.0.6
   meta: ^1.1.6
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index ce1f1e3..cc7894d 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -1850,6 +1850,16 @@
   }
 
   @override
+  void write(String message) {
+    stdoutBuffer.write(message);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    stdoutBuffer.writeCharCode(charCode);
+  }
+
+  @override
   void trace(String message) {
     throw UnimplementedError('TODO(paulberry)');
   }
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index 7ea9107..ec9eda3 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -340,24 +340,21 @@
 }
 
 class VMKernelCompilationCommand extends CompilationCommand {
-  final List<String> batchArgs;
-
   VMKernelCompilationCommand(
       String outputFile,
       List<Uri> bootstrapDependencies,
       String executable,
       List<String> arguments,
       Map<String, String> environmentOverrides,
-      this.batchArgs,
       {bool alwaysCompile,
       int index = 0})
-      : super('vm_compile_to_kernel $batchArgs', outputFile,
-            bootstrapDependencies, executable, arguments, environmentOverrides,
+      : super('vm_compile_to_kernel', outputFile, bootstrapDependencies,
+            executable, arguments, environmentOverrides,
             alwaysCompile: alwaysCompile, index: index);
 
   VMKernelCompilationCommand indexedCopy(int index) =>
       VMKernelCompilationCommand(outputFile, _bootstrapDependencies, executable,
-          arguments, environmentOverrides, batchArgs,
+          arguments, environmentOverrides,
           alwaysCompile: _alwaysCompile, index: index);
 
   VMKernelCompilationCommandOutput createOutput(
@@ -372,11 +369,6 @@
           this, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
 
   int get maxNumRetries => 1;
-
-  @override
-  List<String> get batchArguments {
-    return batchArgs;
-  }
 }
 
 /// This is just a Pair(String, Map) class with hashCode and operator ==
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index b2425ea..e841c9d 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -1080,15 +1080,8 @@
     var pkgVmDir = Platform.script.resolve('../../../pkg/vm').toFilePath();
     var genKernel = '$pkgVmDir/tool/gen_kernel$shellScriptExtension';
 
-    var useAbiVersion = arguments.firstWhere(
-        (arg) => arg.startsWith('--use-abi-version='),
-        orElse: () => null);
-
     var kernelBinariesFolder = '${_configuration.buildDirectory}';
-    if (useAbiVersion != null) {
-      var version = useAbiVersion.split('=')[1];
-      kernelBinariesFolder += '/dart-sdk/lib/_internal/abiversions/$version';
-    } else if (_useSdk) {
+    if (_useSdk) {
       kernelBinariesFolder += '/dart-sdk/lib/_internal';
     }
 
@@ -1119,10 +1112,8 @@
       ..._configuration.genKernelOptions,
     ];
 
-    var batchArgs = [if (useAbiVersion != null) useAbiVersion];
-
     return VMKernelCompilationCommand(dillFile, bootstrapDependencies(),
-        genKernel, args, environmentOverrides, batchArgs,
+        genKernel, args, environmentOverrides,
         alwaysCompile: true);
   }
 }
diff --git a/pkg/test_runner/lib/src/fuchsia.dart b/pkg/test_runner/lib/src/fuchsia.dart
index 874ded5..182fe4b 100644
--- a/pkg/test_runner/lib/src/fuchsia.dart
+++ b/pkg/test_runner/lib/src/fuchsia.dart
@@ -28,11 +28,10 @@
   Process _server;
   String _deviceName;
 
-  static Future<void> publishPackage(
-      int emuCpus, String buildDir, String mode) async {
+  static Future<void> publishPackage(String buildDir, String mode) async {
     if (_inst == null) {
       _inst = FuchsiaEmulator();
-      await _inst._start(emuCpus);
+      await _inst._start();
     }
     await _inst._publishPackage(buildDir, mode);
   }
@@ -48,18 +47,11 @@
             arg.replaceAll(Repository.uri.toFilePath(), '/pkg/data/')));
   }
 
-  Future<void> _start(int emuCpus) async {
+  Future<void> _start() async {
     // Start the emulator.
-    DebugLogger.info('Starting Fuchsia emulator with $emuCpus CPUs');
-    _emu = await Process.start('xvfb-run', [
-      femuTool,
-      '--image',
-      'qemu-x64',
-      '-N',
-      '--headless',
-      '-s',
-      '$emuCpus'
-    ]);
+    DebugLogger.info('Starting Fuchsia emulator');
+    _emu = await Process.start(
+        'xvfb-run', [femuTool, '--image', 'qemu-x64', '-N', '--headless']);
 
     // Wait until the emulator is ready and has a valid device name.
     var deviceNameFuture = Completer<String>();
@@ -159,7 +151,7 @@
     var result = await Process.run(fpubTool, [packageFile]);
     if (result.exitCode != 0) {
       _stop();
-      _throwResult('Publishing package', result);
+      throw _formatFailedResult('Publishing package', result);
     }
 
     // Verify that the publication was successful by running hello_test.dart.
@@ -172,7 +164,7 @@
         _getSshArgs(mode, ['/pkg/data/pkg/testing/test/hello_test.dart']));
     if (result.exitCode != 0 || result.stdout != 'Hello, World!\n') {
       _stop();
-      _throwResult('Verifying publication', result);
+      throw _formatFailedResult('Verifying publication', result);
     }
     DebugLogger.info('Publication successful');
   }
@@ -190,10 +182,12 @@
           emulatorPidPattern.firstMatch(result.stdout as String)?.group(1) ??
               "");
       if (result.exitCode != 0 || emuPid == null) {
-        _throwResult('Searching for emulator process', result);
+        DebugLogger.info(
+            _formatFailedResult('Searching for emulator process', result));
+      } else {
+        Process.killPid(emuPid);
+        DebugLogger.info('Fuchsia emulator stopped');
       }
-      Process.killPid(emuPid);
-      DebugLogger.info('Fuchsia emulator stopped');
     }
 
     if (_server != null) {
@@ -205,9 +199,11 @@
       // to manually kill this process, using fserve.sh again.
       var result = Process.runSync(fserveTool, ['--kill']);
       if (result.exitCode != 0) {
-        _throwResult('Killing package manager', result);
+        DebugLogger.info(
+            _formatFailedResult('Killing package manager', result));
+      } else {
+        DebugLogger.info('Fuchsia package server stopped');
       }
-      DebugLogger.info('Fuchsia package server stopped');
     }
   }
 
@@ -218,8 +214,8 @@
     return output;
   }
 
-  void _throwResult(String name, ProcessResult result) {
-    throw '$name failed with exit code: ${result.exitCode}\n\n' +
+  String _formatFailedResult(String name, ProcessResult result) {
+    return '$name failed with exit code: ${result.exitCode}\n\n' +
         _formatOutputs(result.stdout as String, result.stderr as String);
   }
 }
diff --git a/pkg/test_runner/lib/src/static_error.dart b/pkg/test_runner/lib/src/static_error.dart
index 23fd8f3..08104d7 100644
--- a/pkg/test_runner/lib/src/static_error.dart
+++ b/pkg/test_runner/lib/src/static_error.dart
@@ -55,6 +55,44 @@
 class StaticError implements Comparable<StaticError> {
   static const _unspecified = "unspecified";
 
+  /// The error codes for all of the analyzer errors that are non-fatal
+  /// warnings.
+  ///
+  /// We can't rely on the type ("STATIC_WARNING", etc.) because for historical
+  /// reasons the "warning" types contain a large number of actual compile
+  /// errors.
+  // TODO(rnystrom): This list was generated on 2020/07/24 based on the list
+  // of error codes in sdk/pkg/analyzer/lib/error/error.dart. Is there a more
+  // systematic way to handle this?
+  static const _analyzerWarningCodes = {
+    "STATIC_WARNING.ANALYSIS_OPTION_DEPRECATED",
+    "STATIC_WARNING.INCLUDE_FILE_NOT_FOUND",
+    "STATIC_WARNING.INCLUDED_FILE_WARNING",
+    "STATIC_WARNING.INVALID_OPTION",
+    "STATIC_WARNING.INVALID_SECTION_FORMAT",
+    "STATIC_WARNING.SPEC_MODE_REMOVED",
+    "STATIC_WARNING.UNRECOGNIZED_ERROR_CODE",
+    "STATIC_WARNING.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE",
+    "STATIC_WARNING.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES",
+    "STATIC_WARNING.UNSUPPORTED_OPTION_WITHOUT_VALUES",
+    "STATIC_WARNING.UNSUPPORTED_VALUE",
+    "STATIC_WARNING.CAMERA_PERMISSIONS_INCOMPATIBLE",
+    "STATIC_WARNING.NO_TOUCHSCREEN_FEATURE",
+    "STATIC_WARNING.NON_RESIZABLE_ACTIVITY",
+    "STATIC_WARNING.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE",
+    "STATIC_WARNING.SETTING_ORIENTATION_ON_ACTIVITY",
+    "STATIC_WARNING.UNSUPPORTED_CHROME_OS_FEATURE",
+    "STATIC_WARNING.UNSUPPORTED_CHROME_OS_HARDWARE",
+    "STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION",
+    "STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR",
+    "STATIC_WARNING.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED",
+    "STATIC_WARNING.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL",
+    "STATIC_WARNING.MISSING_ENUM_CONSTANT_IN_SWITCH",
+    "STATIC_WARNING.UNNECESSARY_NON_NULL_ASSERTION",
+    "STATIC_WARNING.TOP_LEVEL_INSTANCE_GETTER",
+    "STATIC_WARNING.TOP_LEVEL_INSTANCE_METHOD",
+  };
+
   /// Parses the set of static error expectations defined in the Dart source
   /// file [source].
   static List<StaticError> parseExpectations(String source) =>
@@ -296,6 +334,25 @@
     return result;
   }
 
+  /// Whether this error is only considered a warning on all front ends that
+  /// report it.
+  bool get isWarning {
+    var analyzer = _errors[ErrorSource.analyzer];
+    if (analyzer != null && !_analyzerWarningCodes.contains(analyzer)) {
+      return false;
+    }
+
+    // TODO(42787): Once CFE starts reporting warnings, encode that in the
+    // message somehow and then look for it here.
+    if (hasError(ErrorSource.cfe)) return false;
+
+    // TODO(rnystrom): If the web compilers report warnings, encode that in the
+    // message somehow and then look for it here.
+    if (hasError(ErrorSource.web)) return false;
+
+    return true;
+  }
+
   String toString() {
     var result = "Error at $location";
 
diff --git a/pkg/test_runner/lib/src/test_configurations.dart b/pkg/test_runner/lib/src/test_configurations.dart
index 32201e8..93de210 100644
--- a/pkg/test_runner/lib/src/test_configurations.dart
+++ b/pkg/test_runner/lib/src/test_configurations.dart
@@ -155,7 +155,7 @@
     }
 
     if (configuration.system == System.fuchsia) {
-      await FuchsiaEmulator.publishPackage(configuration.taskCount,
+      await FuchsiaEmulator.publishPackage(
           configuration.buildDirectory, configuration.mode.name);
     }
   }
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 6fe642f..c5a0fd8 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -64,14 +64,24 @@
   /// generated from a multitest. Otherwise, returns an empty string.
   String get multitestKey;
 
-  /// If the text contains static error expectations, it's a "static error
+  /// If the test contains static error expectations, it's a "static error
   /// test".
   ///
   /// These tests exist to validate that a front end reports the right static
-  /// errors. They are skipped on configurations that don't intend to test
-  /// static error reporting.
+  /// errors. Unless the expected errors are all warnings, a static error test
+  /// is skipped on configurations that are not purely front end.
   bool get isStaticErrorTest => expectedErrors.isNotEmpty;
 
+  /// If the tests has no static error expectations, or all of the expectations
+  /// are warnings, then the test tests runtime semantics.
+  ///
+  /// Note that this is *not* the negation of [isStaticErrorTest]. A test that
+  /// contains only warning expectations is both a static "error" test and a
+  /// runtime test. The test runner will validate that the front ends produce
+  /// the expected warnings *and* that a runtime also correctly executes the
+  /// test.
+  bool get isRuntimeTest => expectedErrors.every((error) => error.isWarning);
+
   /// A hash code used to spread tests across shards.
   int get shardHash {
     // The VM C++ unit tests have a special fake TestFile with no suite
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 4351b8d..d05d3c1 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -557,16 +557,14 @@
   /// options.
   void _testCasesFromTestFile(
       TestFile testFile, ExpectationSet expectations, TestCaseEvent onTest) {
-    // Static error tests are skipped on every implementation except analyzer
-    // and Fasta.
-    // TODO(rnystrom): Should other configurations that use CFE support static
-    // error tests?
     // TODO(rnystrom): Skipping this here is a little unusual because most
     // skips are handled in _addTestCase(). However, if the configuration
     // is running on a browser, calling _addTestCase() will try to create
     // a set of commands which ultimately causes an exception in
     // DummyRuntimeConfiguration. This avoids that.
-    if (testFile.isStaticErrorTest &&
+    // If the test only has static expectations, skip it on any configurations
+    // that are not purely front ends.
+    if (!testFile.isRuntimeTest &&
         configuration.compiler != Compiler.dart2analyzer &&
         configuration.compiler != Compiler.fasta) {
       return;
@@ -579,7 +577,7 @@
 
     var expectationSet = expectations.expectations(testFile.name);
     if (configuration.compilerConfiguration.hasCompiler &&
-        (testFile.hasCompileError || testFile.isStaticErrorTest)) {
+        (testFile.hasCompileError || !testFile.isRuntimeTest)) {
       // If a compile-time error is expected, and we're testing a
       // compiler, we never need to attempt to run the program (in a
       // browser or otherwise).
diff --git a/pkg/test_runner/test/static_error_test.dart b/pkg/test_runner/test/static_error_test.dart
index 711e69b..a3e9897 100644
--- a/pkg/test_runner/test/static_error_test.dart
+++ b/pkg/test_runner/test/static_error_test.dart
@@ -11,6 +11,7 @@
 void main() {
   testHasError();
   testErrorFor();
+  testIsWarning();
   testIsSpecifiedFor();
   testCompareTo();
   testDescribeDifferences();
@@ -78,6 +79,42 @@
   Expect.equals("Web.", all.errorFor(ErrorSource.web));
 }
 
+void testIsWarning() {
+  // Analyzer only.
+  Expect.isTrue(
+      makeError(analyzerError: "STATIC_WARNING.INVALID_OPTION").isWarning);
+  Expect.isFalse(
+      makeError(analyzerError: "SYNTACTIC_ERROR.MISSING_FUNCTION_BODY")
+          .isWarning);
+  Expect.isFalse(makeError(
+          analyzerError: "COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS")
+      .isWarning);
+
+  // CFE only.
+  Expect.isFalse(makeError(cfeError: "Any error message.").isWarning);
+
+  // Web only.
+  Expect.isFalse(makeError(webError: "Any error message.").isWarning);
+
+  // Multiple front ends.
+  Expect.isFalse(makeError(
+          analyzerError: "STATIC_WARNING.INVALID_OPTION",
+          cfeError: "Any error message.")
+      .isWarning);
+  Expect.isFalse(
+      makeError(cfeError: "Any error message.", webError: "Any error message.")
+          .isWarning);
+  Expect.isFalse(makeError(
+          analyzerError: "STATIC_WARNING.INVALID_OPTION",
+          webError: "Any error message.")
+      .isWarning);
+  Expect.isFalse(makeError(
+          analyzerError: "STATIC_WARNING.INVALID_OPTION",
+          cfeError: "Any error message.",
+          webError: "Any error message.")
+      .isWarning);
+}
+
 void testIsSpecifiedFor() {
   var specifiedAll = makeError(
       line: 1,
diff --git a/pkg/test_runner/test/test_file_test.dart b/pkg/test_runner/test/test_file_test.dart
index 847fb49..251f60d 100644
--- a/pkg/test_runner/test/test_file_test.dart
+++ b/pkg/test_runner/test/test_file_test.dart
@@ -28,6 +28,7 @@
   testParseMultitest();
   testParseErrorFlags();
   testParseErrorExpectations();
+  testIsRuntimeTest();
   testName();
   testMultitest();
   testShardHash();
@@ -590,6 +591,53 @@
 """);
 }
 
+void testIsRuntimeTest() {
+  // No static errors at all.
+  var file = parseTestFile("");
+  Expect.isTrue(file.isRuntimeTest);
+
+  // Only warnings.
+  file = parseTestFile("""
+  int i = "s";
+  /\/ ^^^
+  /\/ [analyzer] STATIC_WARNING.INVALID_OPTION
+  /\/ ^^^
+  /\/ [analyzer] STATIC_WARNING.INVALID_OPTION
+  """);
+  Expect.isTrue(file.isRuntimeTest);
+
+  // Errors.
+  file = parseTestFile("""
+  int i = "s";
+  /\/ ^^^
+  /\/ [analyzer] COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS
+  """);
+  Expect.isFalse(file.isRuntimeTest);
+
+  file = parseTestFile("""
+  int i = "s";
+  /\/ ^^^
+  /\/ [cfe] Error message.
+  """);
+  Expect.isFalse(file.isRuntimeTest);
+
+  file = parseTestFile("""
+  int i = "s";
+  /\/ ^^^
+  /\/ [web] Error message.
+  """);
+  Expect.isFalse(file.isRuntimeTest);
+
+  // Mixed errors and warnings.
+  file = parseTestFile("""
+  int i = "s";
+  /\/ ^^^
+  /\/ [analyzer] STATIC_WARNING.INVALID_OPTION
+  /\/ [cfe] Error message.
+  """);
+  Expect.isFalse(file.isRuntimeTest);
+}
+
 void testName() {
   // Immediately inside suite.
   var file = TestFile.parse(Path("suite").absolute,
diff --git a/pkg/test_runner/test/utils.dart b/pkg/test_runner/test/utils.dart
index e8a87be..8c1e83a 100644
--- a/pkg/test_runner/test/utils.dart
+++ b/pkg/test_runner/test/utils.dart
@@ -26,8 +26,8 @@
     _MockTestSuite(configuration, testFiles);
 
 StaticError makeError(
-    {int line,
-    int column,
+    {int line = 1,
+    int column = 2,
     int length,
     String analyzerError,
     String cfeError,
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index ae66a6a6..88cff2c 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -4387,7 +4387,12 @@
       tryBlock.types.add(cp.addType(catchClause.guard));
 
       Label skipCatch;
-      if (catchClause.guard == const DynamicType()) {
+      final guardType = catchClause.guard;
+      // Exception objects are guaranteed to be non-nullable, so
+      // non-nullable Object is also a catch-all type.
+      if (guardType is DynamicType ||
+          (guardType is InterfaceType &&
+              guardType.classNode == coreTypes.objectClass)) {
         hasCatchAll = true;
       } else {
         asm.emitPush(exception);
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 43c9e3e..d76503d 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -762,6 +762,13 @@
         }
       }
 
+      if (member.name.name == '==') {
+        // In addition to what is returned from the function body,
+        // operator == performs implicit comparison with null
+        // and returns bool.
+        _returnValue.values.add(_boolType);
+      }
+
       _summary.result = _returnValue;
     }
 
diff --git a/pkg/vm/tool/gen_kernel b/pkg/vm/tool/gen_kernel
index 8174ed5..d0494c7 100755
--- a/pkg/vm/tool/gen_kernel
+++ b/pkg/vm/tool/gen_kernel
@@ -8,25 +8,6 @@
 
 set -e
 
-ABI_VERSION=""
-HAS_PLATFORM=""
-ARGV=()
-
-for arg in "$@"; do
-  case $arg in
-    --use-abi-version=*)
-    ABI_VERSION="$(echo "$arg" | sed "s|--use-abi-version=||")"
-    ;;
-    --platform*)
-    HAS_PLATFORM="TRUE"
-    ARGV+=("$arg")
-    ;;
-    *)
-    ARGV+=("$arg")
-    ;;
-  esac
-done
-
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
@@ -54,18 +35,4 @@
   OUT_DIR="$SDK_DIR/out"
 fi
 
-export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
-BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
-
-if [ $ABI_VERSION ]; then
-  ABI_DIR="$BIN_DIR/dart-sdk/lib/_internal/abiversions/$ABI_VERSION"
-  PLATFORM=()
-  if [ -z $HAS_PLATFORM ]; then
-    PLATFORM+=("--platform" "$ABI_DIR/vm_platform_strong.dill")
-  fi
-  exec "$BIN_DIR/dart" $DART_VM_FLAGS --enable-interpreter \
-    "$ABI_DIR/gen_kernel_bytecode.dill" "${PLATFORM[@]}" "${ARGV[@]}"
-else
-  exec "$DART" $DART_VM_FLAGS \
-    "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart" "${ARGV[@]}"
-fi
+exec "$DART" $DART_VM_FLAGS "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart" $@
diff --git a/pkg/vm_snapshot_analysis/CHANGELOG.md b/pkg/vm_snapshot_analysis/CHANGELOG.md
index 2bfcd15..36d229f 100644
--- a/pkg/vm_snapshot_analysis/CHANGELOG.md
+++ b/pkg/vm_snapshot_analysis/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.5.3
+- Add `compareProgramInfo` that takes in two program info objects and outputs
+a `Map` object containing the diff data.
+
 ## 0.5.2
 - Add support for package paths that look like `package:foo.bar.baz/src/foobar.dart`
 - Move `commands` back to lib.
diff --git a/pkg/vm_snapshot_analysis/lib/treemap.dart b/pkg/vm_snapshot_analysis/lib/treemap.dart
index 68103f3..36ce891 100644
--- a/pkg/vm_snapshot_analysis/lib/treemap.dart
+++ b/pkg/vm_snapshot_analysis/lib/treemap.dart
@@ -196,7 +196,7 @@
 /// given [v8_profile.Node].
 final Map<TreemapFormat, String Function(v8_profile.Node)> _nameFormatters = {
   TreemapFormat.dataAndCode: (n) => _isExecutableCode(n) ? '<code>' : '<data>',
-  TreemapFormat.objectType: (n) => n.type,
+  TreemapFormat.objectType: (n) => '<${n.type}>',
 };
 
 /// Returns a /-separated path to the given symbol within the treemap.
diff --git a/pkg/vm_snapshot_analysis/lib/utils.dart b/pkg/vm_snapshot_analysis/lib/utils.dart
index c226dad..abf3eb3 100644
--- a/pkg/vm_snapshot_analysis/lib/utils.dart
+++ b/pkg/vm_snapshot_analysis/lib/utils.dart
@@ -30,8 +30,13 @@
   final newSizes = loadProgramInfoFromJson(newJson,
       collapseAnonymousClosures: collapseAnonymousClosures);
 
-  final diff = computeDiff(oldSizes, newSizes);
+  return compareProgramInfo(oldSizes, newSizes, format: format);
+}
 
+Map<String, dynamic> compareProgramInfo(
+    ProgramInfo oldSizes, ProgramInfo newSizes,
+    {TreemapFormat format = TreemapFormat.collapsed}) {
+  final diff = computeDiff(oldSizes, newSizes);
   return treemapFromInfo(diff, format: format);
 }
 
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index 66e7a37..fce4b3d 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -1,6 +1,6 @@
 name: vm_snapshot_analysis
 description: Utilities for analysing AOT snapshot size.
-version: 0.5.2
+version: 0.5.3
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_snapshot_analysis
 
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index fb682c0..1b44cd3 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -160,7 +160,7 @@
                  "..:dart_config",
                  "..:dart_precompiler_config",
                ] + extra_configs
-    deps = [ ":generate_abi_version_cc_file" ] + extra_deps
+    deps = extra_deps
 
     defines = [ "EXCLUDE_CFE_AND_KERNEL_PLATFORM" ]
 
@@ -178,7 +178,6 @@
       "snapshot_utils.h",
 
       # Very limited native resolver provided.
-      "$target_gen_dir/abi_version.cc",
       "builtin_gen_snapshot.cc",
       "dfe.cc",
       "dfe.h",
@@ -728,25 +727,6 @@
             get_target_outputs(":platform_strong_dill_linkable")
 }
 
-action("generate_abi_version_cc_file") {
-  inputs = [
-    "../../tools/utils.py",
-    "../../tools/VERSION",
-    "abi_version_in.cc",
-  ]
-  output = "$target_gen_dir/abi_version.cc"
-  outputs = [ output ]
-
-  script = "../../tools/make_version.py"
-  args = [
-    "--quiet",
-    "--output",
-    rebase_path(output, root_build_dir),
-    "--input",
-    rebase_path("abi_version_in.cc", root_build_dir),
-  ]
-}
-
 template("dart_executable") {
   use_product_mode = dart_runtime_mode == "release"
   if (defined(invoker.use_product_mode)) {
@@ -803,7 +783,6 @@
 
     deps = [
       ":crashpad",
-      ":generate_abi_version_cc_file",
       "//third_party/boringssl",
       "//third_party/zlib",
     ]
@@ -840,7 +819,6 @@
                 "snapshot_utils.h",
                 "vmservice_impl.cc",
                 "vmservice_impl.h",
-                "$target_gen_dir/abi_version.cc",
               ] + extra_sources
 
     if (is_win) {
@@ -1006,7 +984,6 @@
     ":dart_kernel_platform_cc",
     ":dart_snapshot_cc",
     ":gen_kernel_bytecode_dill",
-    ":generate_abi_version_cc_file",
     ":standalone_dart_io",
     "..:libdart_precompiler",
     "//third_party/zlib",
@@ -1043,7 +1020,6 @@
   heap_tests = rebase_path(heap_sources_tests, ".", "../vm/heap")
 
   sources = [
-              "$target_gen_dir/abi_version.cc",
               "builtin.cc",
               "dfe.cc",
               "dfe.h",
diff --git a/runtime/bin/abi_version.h b/runtime/bin/abi_version.h
deleted file mode 100644
index acd0cdf..0000000
--- a/runtime/bin/abi_version.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_BIN_ABI_VERSION_H_
-#define RUNTIME_BIN_ABI_VERSION_H_
-
-namespace dart {
-
-class AbiVersion {
- public:
-  static int GetCurrent();
-  static int GetOldestSupported();
-};
-
-}  // namespace dart
-
-#endif  // RUNTIME_BIN_ABI_VERSION_H_
diff --git a/runtime/bin/abi_version_in.cc b/runtime/bin/abi_version_in.cc
deleted file mode 100644
index ad737b2..0000000
--- a/runtime/bin/abi_version_in.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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.
-
-#include "bin/abi_version.h"
-
-namespace dart {
-
-int AbiVersion::GetCurrent() {
-  return {{ABI_VERSION}};
-}
-
-int AbiVersion::GetOldestSupported() {
-  return {{OLDEST_SUPPORTED_ABI_VERSION}};
-}
-
-}  // namespace dart
diff --git a/runtime/bin/builtin_impl_sources.gni b/runtime/bin/builtin_impl_sources.gni
index 90790d3..b8ea4eb 100644
--- a/runtime/bin/builtin_impl_sources.gni
+++ b/runtime/bin/builtin_impl_sources.gni
@@ -7,7 +7,6 @@
 # io_impl_sources.gypi.
 
 builtin_impl_sources = [
-  "abi_version.h",
   "crypto.cc",
   "crypto.h",
   "crypto_android.cc",
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 58718b7..755ef82 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -4,13 +4,11 @@
 
 #include "bin/dfe.h"
 
-#include "bin/abi_version.h"
 #include "bin/dartutils.h"
 #include "bin/directory.h"
 #include "bin/error_exit.h"
 #include "bin/exe_utils.h"
 #include "bin/file.h"
-#include "bin/main_options.h"
 #include "bin/platform.h"
 #include "bin/utils.h"
 #include "include/dart_tools_api.h"
@@ -33,6 +31,28 @@
 namespace dart {
 namespace bin {
 
+// The run_vm_tests binary has the DART_PRECOMPILER set in order to allow unit
+// tests to exercise JIT and AOT pipeline.
+//
+// Only on X64 do we have kernel-service.dart.snapshot available otherwise we
+// need to fall back to the built-in one (if we have it).
+#if defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) ||                                \
+    (defined(DART_PRECOMPILER) && defined(TARGET_ARCH_X64))
+const uint8_t* kernel_service_dill = nullptr;
+const intptr_t kernel_service_dill_size = 0;
+#else
+const uint8_t* kernel_service_dill = kKernelServiceDill;
+const intptr_t kernel_service_dill_size = kKernelServiceDillSize;
+#endif
+
+#if defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
+const uint8_t* platform_strong_dill = nullptr;
+const intptr_t platform_strong_dill_size = 0;
+#else
+const uint8_t* platform_strong_dill = kPlatformStrongDill;
+const intptr_t platform_strong_dill_size = kPlatformStrongDillSize;
+#endif
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
 DFE dfe;
 #endif
@@ -46,31 +66,6 @@
       frontend_filename_(nullptr),
       application_kernel_buffer_(nullptr),
       application_kernel_buffer_size_(0) {
-  // The run_vm_tests binary has the DART_PRECOMPILER set in order to allow unit
-  // tests to exercise JIT and AOT pipeline.
-  //
-  // Only on X64 do we have kernel-service.dart.snapshot available otherwise we
-  // need to fall back to the built-in one (if we have it).
-#if defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) ||                                \
-    (defined(DART_PRECOMPILER) && defined(TARGET_ARCH_X64))
-  kernel_service_dill_ = nullptr;
-  kernel_service_dill_size_ = 0;
-#else
-  kernel_service_dill_ = kKernelServiceDill;
-  kernel_service_dill_size_ = kKernelServiceDillSize;
-#endif
-
-#if defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
-  platform_strong_dill_for_compilation_ = nullptr;
-  platform_strong_dill_for_compilation_size_ = 0;
-  platform_strong_dill_for_execution_ = nullptr;
-  platform_strong_dill_for_execution_size_ = 0;
-#else
-  platform_strong_dill_for_compilation_ = kPlatformStrongDill;
-  platform_strong_dill_for_compilation_size_ = kPlatformStrongDillSize;
-  platform_strong_dill_for_execution_ = kPlatformStrongDill;
-  platform_strong_dill_for_execution_size_ = kPlatformStrongDillSize;
-#endif
 }
 
 DFE::~DFE() {
@@ -85,72 +80,28 @@
 }
 
 void DFE::Init() {
-  Init(Options::kAbiVersionUnset);
-}
-
-void DFE::Init(int target_abi_version) {
-  if (platform_strong_dill_for_compilation_ == nullptr) {
+  if (platform_strong_dill == nullptr) {
     return;
   }
 
-  if (!InitKernelServiceAndPlatformDills(target_abi_version)) {
-    return;
-  }
-
-  Dart_SetDartLibrarySourcesKernel(platform_strong_dill_for_compilation_,
-                                   platform_strong_dill_for_compilation_size_);
+  InitKernelServiceAndPlatformDills();
+  Dart_SetDartLibrarySourcesKernel(platform_strong_dill,
+                                   platform_strong_dill_size);
 }
 
-bool DFE::InitKernelServiceAndPlatformDills(int target_abi_version) {
-  const char kAbiVersionsDir[] = "dart-sdk/lib/_internal/abiversions";
-  const char kKernelServiceDillFile[] = "kernel_service.dill";
-  const char kPlatformStrongDillFile[] = "vm_platform_strong.dill";
-
+void DFE::InitKernelServiceAndPlatformDills() {
   if (frontend_filename_ != nullptr) {
-    return true;
+    return;
   }
 
   // |dir_prefix| includes the last path seperator.
   auto dir_prefix = EXEUtils::GetDirectoryPrefixFromExeName();
 
-  if (target_abi_version != Options::kAbiVersionUnset) {
-    kernel_service_dill_ = nullptr;
-    kernel_service_dill_size_ = 0;
-    platform_strong_dill_for_compilation_ = nullptr;
-    platform_strong_dill_for_compilation_size_ = 0;
-
-    // Look in the old abi version directory.
-    char* script_uri =
-        Utils::SCreate("%s%s/%d/%s", dir_prefix.get(), kAbiVersionsDir,
-                       target_abi_version, kPlatformStrongDillFile);
-    if (!TryReadKernelFile(
-            script_uri,
-            const_cast<uint8_t**>(&platform_strong_dill_for_compilation_),
-            &platform_strong_dill_for_compilation_size_)) {
-      Syslog::PrintErr("Can't find old ABI dill file: %s\n", script_uri);
-      free(script_uri);
-      return false;
-    }
-    free(script_uri);
-    script_uri = Utils::SCreate("%s%s/%d/%s", dir_prefix.get(), kAbiVersionsDir,
-                                target_abi_version, kKernelServiceDillFile);
-    if (!TryReadKernelFile(script_uri,
-                           const_cast<uint8_t**>(&kernel_service_dill_),
-                           &kernel_service_dill_size_)) {
-      Syslog::PrintErr("Can't find old ABI dill file: %s\n", script_uri);
-      free(script_uri);
-      return false;
-    } else {
-      frontend_filename_ = script_uri;
-      return true;
-    }
-  }
-
   // Look for the frontend snapshot next to the executable.
   frontend_filename_ =
       Utils::SCreate("%s%s", dir_prefix.get(), kKernelServiceSnapshot);
   if (File::Exists(nullptr, frontend_filename_)) {
-    return true;
+    return;
   }
   free(frontend_filename_);
   frontend_filename_ = nullptr;
@@ -161,31 +112,30 @@
       Utils::SCreate("%s%s%s%s", dir_prefix.get(), kSnapshotsDirectory,
                      File::PathSeparator(), kKernelServiceSnapshot);
   if (File::Exists(nullptr, frontend_filename_)) {
-    return true;
+    return;
   }
   free(frontend_filename_);
   frontend_filename_ = nullptr;
-  return true;
 }
 
 bool DFE::KernelServiceDillAvailable() const {
-  return kernel_service_dill_ != nullptr;
+  return kernel_service_dill != nullptr;
 }
 
 void DFE::LoadKernelService(const uint8_t** kernel_service_buffer,
                             intptr_t* kernel_service_buffer_size) {
-  *kernel_service_buffer = kernel_service_dill_;
-  *kernel_service_buffer_size = kernel_service_dill_size_;
+  *kernel_service_buffer = kernel_service_dill;
+  *kernel_service_buffer_size = kernel_service_dill_size;
 }
 
 void DFE::LoadPlatform(const uint8_t** kernel_buffer,
                        intptr_t* kernel_buffer_size) {
-  *kernel_buffer = platform_strong_dill_for_execution_;
-  *kernel_buffer_size = platform_strong_dill_for_execution_size_;
+  *kernel_buffer = platform_strong_dill;
+  *kernel_buffer_size = platform_strong_dill_size;
 }
 
 bool DFE::CanUseDartFrontend() const {
-  return (platform_strong_dill_for_compilation_ != nullptr) &&
+  return (platform_strong_dill != nullptr) &&
          (KernelServiceDillAvailable() || (frontend_filename() != nullptr));
 }
 
@@ -238,9 +188,9 @@
   PathSanitizer path_sanitizer(script_uri);
   const char* sanitized_uri = path_sanitizer.sanitized_uri();
 
-  return Dart_CompileToKernel(
-      sanitized_uri, platform_strong_dill_for_compilation_,
-      platform_strong_dill_for_compilation_size_, incremental, package_config);
+  return Dart_CompileToKernel(sanitized_uri, platform_strong_dill,
+                              platform_strong_dill_size, incremental,
+                              package_config);
 }
 
 void DFE::CompileAndReadScript(const char* script_uri,
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index c75b6ea..eb475bf 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -24,7 +24,6 @@
   // Call Init before Dart_Initialize to prevent races between the
   // different isolates.
   void Init();
-  void Init(int target_abi_version);
 
   char* frontend_filename() const { return frontend_filename_; }
 
@@ -108,18 +107,12 @@
   bool use_dfe_;
   bool use_incremental_compiler_;
   char* frontend_filename_;
-  const uint8_t* kernel_service_dill_;
-  intptr_t kernel_service_dill_size_;
-  const uint8_t* platform_strong_dill_for_compilation_;
-  intptr_t platform_strong_dill_for_compilation_size_;
-  const uint8_t* platform_strong_dill_for_execution_;
-  intptr_t platform_strong_dill_for_execution_size_;
 
   // Kernel binary specified on the cmd line.
   uint8_t* application_kernel_buffer_;
   intptr_t application_kernel_buffer_size_;
 
-  bool InitKernelServiceAndPlatformDills(int target_abi_version);
+  void InitKernelServiceAndPlatformDills();
 
   DISALLOW_COPY_AND_ASSIGN(DFE);
 };
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index 8394deb..f15bc3b 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -399,7 +399,7 @@
   } else if ((old_mask == 0) && (new_mask != 0)) {
     AddToPort(port_handle_, di);
   } else if ((old_mask != 0) && (new_mask != 0)) {
-    ASSERT(!di->IsListeningSocket());
+    ASSERT((old_mask == new_mask) || !di->IsListeningSocket());
     RemoveFromPort(port_handle_, di);
     AddToPort(port_handle_, di);
   }
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index d1918b0..e2e87d8 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -9,6 +9,7 @@
 
 #include <errno.h>           // NOLINT
 #include <fcntl.h>           // NOLINT
+#include <lib/fdio/fdio.h>   // NOLINT
 #include <lib/fdio/namespace.h>  // NOLINT
 #include <libgen.h>          // NOLINT
 #include <sys/mman.h>        // NOLINT
@@ -51,8 +52,10 @@
 void File::Close() {
   ASSERT(handle_->fd() >= 0);
   if (handle_->fd() == STDOUT_FILENO) {
-    // If stdout, redirect fd to /dev/null.
-    int null_fd = NO_RETRY_EXPECTED(open("/dev/null", O_WRONLY));
+    // If stdout, redirect fd to Fuchsia's equivalent of /dev/null.
+    auto* null_fdio = fdio_null_create();
+    ASSERT(null_fdio != nullptr);
+    int null_fd = NO_RETRY_EXPECTED(fdio_bind_to_fd(null_fdio, -1, 0));
     ASSERT(null_fd >= 0);
     VOID_NO_RETRY_EXPECTED(dup2(null_fd, handle_->fd()));
     VOID_NO_RETRY_EXPECTED(close(null_fd));
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 2cf7ab9..f2d33c5 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -608,7 +608,7 @@
   line.Printf("{ \"id\": %" Pd ", \"path\": \"", id);
   line.AddEscapedString(path);
   line.Printf("\" }");
-  if (!manifest_file->Print("%s\n", line.buf())) {
+  if (!manifest_file->Print("%s\n", line.buffer())) {
     PrintErrAndExit("Error: Unable to write file: %s\n\n",
                     loading_unit_manifest_filename);
   }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 5f9c5e5..69d82b0 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -1163,7 +1163,7 @@
 // they might affect how the platform is loaded.
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (script_name != nullptr) {
-    dfe.Init(Options::target_abi_version());
+    dfe.Init();
     uint8_t* application_kernel_buffer = NULL;
     intptr_t application_kernel_buffer_size = 0;
     dfe.ReadScript(script_name, &application_kernel_buffer,
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 42a677b6..8fa4f79 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -8,7 +8,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "bin/abi_version.h"
 #include "bin/dartdev_isolate.h"
 #include "bin/error_exit.h"
 #include "bin/options.h"
@@ -373,33 +372,6 @@
   return false;
 }
 
-int Options::target_abi_version_ = Options::kAbiVersionUnset;
-bool Options::ProcessAbiVersionOption(const char* arg,
-                                      CommandLineOptions* vm_options) {
-  const char* value = OptionProcessor::ProcessOption(arg, "--use_abi_version=");
-  if (value == NULL) {
-    return false;
-  }
-  int ver = 0;
-  for (int i = 0; value[i] != '\0'; ++i) {
-    if (value[i] >= '0' && value[i] <= '9') {
-      ver = (ver * 10) + value[i] - '0';
-    } else {
-      Syslog::PrintErr("--use_abi_version must be an int\n");
-      return false;
-    }
-  }
-  if (ver < AbiVersion::GetOldestSupported() ||
-      ver > AbiVersion::GetCurrent()) {
-    Syslog::PrintErr("--use_abi_version must be between %d and %d inclusive\n",
-                     AbiVersion::GetOldestSupported(),
-                     AbiVersion::GetCurrent());
-    return false;
-  }
-  target_abi_version_ = ver;
-  return true;
-}
-
 bool Options::ProcessEnableExperimentOption(const char* arg,
                                             CommandLineOptions* vm_options) {
   const char* value =
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 90234e0..76c50be 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -69,7 +69,6 @@
   V(ProcessEnvironmentOption)                                                  \
   V(ProcessEnableVmServiceOption)                                              \
   V(ProcessObserveOption)                                                      \
-  V(ProcessAbiVersionOption)                                                   \
   V(ProcessEnableExperimentOption)                                             \
   V(ProcessVMDebuggingOptions)
 
@@ -127,9 +126,6 @@
   static const char* vm_service_server_ip() { return vm_service_server_ip_; }
   static int vm_service_server_port() { return vm_service_server_port_; }
 
-  static constexpr int kAbiVersionUnset = -1;
-  static int target_abi_version() { return target_abi_version_; }
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
   static DFE* dfe() { return dfe_; }
   static void set_dfe(DFE* dfe) { dfe_ = dfe; }
@@ -178,7 +174,6 @@
                                     int default_port,
                                     const char* default_ip);
 
-  static int target_abi_version_;
   static MallocGrowableArray<const char*> enabled_experiments_;
 
 #define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag;
diff --git a/runtime/bin/namespace_android.cc b/runtime/bin/namespace_android.cc
index 62a69f8..f5a2a9f 100644
--- a/runtime/bin/namespace_android.cc
+++ b/runtime/bin/namespace_android.cc
@@ -61,7 +61,7 @@
     // Normalize it.
     char result[PATH_MAX];
     const intptr_t result_len =
-        File::CleanUnixPath(tbuf.buf(), result, PATH_MAX);
+        File::CleanUnixPath(tbuf.buffer(), result, PATH_MAX);
     if (result_len < 0) {
       errno = ENAMETOOLONG;
       return false;
diff --git a/runtime/bin/namespace_fuchsia.cc b/runtime/bin/namespace_fuchsia.cc
index 6e93bcb..c8cfbcb 100644
--- a/runtime/bin/namespace_fuchsia.cc
+++ b/runtime/bin/namespace_fuchsia.cc
@@ -81,7 +81,7 @@
   // Normalize it.
   char result[PATH_MAX];
   const intptr_t result_len =
-      File::CleanUnixPath(tbuf.buf(), result, PATH_MAX);
+      File::CleanUnixPath(tbuf.buffer(), result, PATH_MAX);
   if (result_len < 0) {
     errno = ENAMETOOLONG;
     return false;
diff --git a/runtime/bin/namespace_linux.cc b/runtime/bin/namespace_linux.cc
index 6cb3e07..416ea3d 100644
--- a/runtime/bin/namespace_linux.cc
+++ b/runtime/bin/namespace_linux.cc
@@ -61,7 +61,7 @@
     // Normalize it.
     char result[PATH_MAX];
     const intptr_t result_len =
-        File::CleanUnixPath(tbuf.buf(), result, PATH_MAX);
+        File::CleanUnixPath(tbuf.buffer(), result, PATH_MAX);
     if (result_len < 0) {
       errno = ENAMETOOLONG;
       return false;
diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc
index a21bc8e..207971f 100644
--- a/runtime/bin/secure_socket_filter.cc
+++ b/runtime/bin/secure_socket_filter.cc
@@ -245,7 +245,8 @@
     SecureSocketUtils::FetchErrorString(filter->ssl_, &error_string);
     CObjectArray* result = new CObjectArray(CObject::NewArray(2));
     result->SetAt(0, new CObjectInt32(CObject::NewInt32(error_code)));
-    result->SetAt(1, new CObjectString(CObject::NewString(error_string.buf())));
+    result->SetAt(1,
+                  new CObjectString(CObject::NewString(error_string.buffer())));
     return result;
   }
 }
diff --git a/runtime/bin/secure_socket_utils.cc b/runtime/bin/secure_socket_utils.cc
index 259b06e..e3cdbf4 100644
--- a/runtime/bin/secure_socket_utils.cc
+++ b/runtime/bin/secure_socket_utils.cc
@@ -54,7 +54,7 @@
   {
     TextBuffer error_string(SSL_ERROR_MESSAGE_BUFFER_SIZE);
     SecureSocketUtils::FetchErrorString(ssl, &error_string);
-    OSError os_error_struct(status, error_string.buf(), OSError::kBoringSSL);
+    OSError os_error_struct(status, error_string.buffer(), OSError::kBoringSSL);
     Dart_Handle os_error = DartUtils::NewDartOSError(&os_error_struct);
     exception =
         DartUtils::NewDartIOException(exception_type, message, os_error);
diff --git a/runtime/platform/text_buffer.cc b/runtime/platform/text_buffer.cc
index ed2c640..5d08892 100644
--- a/runtime/platform/text_buffer.cc
+++ b/runtime/platform/text_buffer.cc
@@ -11,73 +11,52 @@
 
 namespace dart {
 
-TextBuffer::TextBuffer(intptr_t buf_size) {
-  ASSERT(buf_size > 0);
-  buf_ = reinterpret_cast<char*>(malloc(buf_size));
-  if (buf_ == NULL) {
-    OUT_OF_MEMORY();
-  }
-  buf_size_ = buf_size;
-  Clear();
-}
-
-TextBuffer::~TextBuffer() {
-  free(buf_);
-  buf_ = NULL;
-}
-
-void TextBuffer::Clear() {
-  msg_len_ = 0;
-  buf_[0] = '\0';
-}
-
-char* TextBuffer::Steal() {
-  char* r = buf_;
-  buf_ = NULL;
-  buf_size_ = 0;
-  msg_len_ = 0;
-  return r;
-}
-
-void TextBuffer::AddChar(char ch) {
-  EnsureCapacity(sizeof(ch));
-  buf_[msg_len_] = ch;
-  msg_len_++;
-  buf_[msg_len_] = '\0';
-}
-
-void TextBuffer::AddRaw(const uint8_t* buffer, intptr_t buffer_length) {
-  EnsureCapacity(buffer_length);
-  memmove(&buf_[msg_len_], buffer, buffer_length);
-  msg_len_ += buffer_length;
-  buf_[msg_len_] = '\0';
-}
-
-intptr_t TextBuffer::Printf(const char* format, ...) {
+intptr_t BaseTextBuffer::Printf(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  intptr_t remaining = buf_size_ - msg_len_;
+  intptr_t remaining = capacity_ - length_;
   ASSERT(remaining >= 0);
-  intptr_t len = Utils::VSNPrint(buf_ + msg_len_, remaining, format, args);
+  intptr_t len = Utils::VSNPrint(buffer_ + length_, remaining, format, args);
   va_end(args);
   if (len >= remaining) {
-    EnsureCapacity(len);
-    remaining = buf_size_ - msg_len_;
+    if (!EnsureCapacity(len)) {
+      length_ = capacity_ - 1;
+      buffer_[length_] = '\0';
+      return remaining - 1;
+    }
+    remaining = capacity_ - length_;
     ASSERT(remaining > len);
     va_list args2;
     va_start(args2, format);
-    intptr_t len2 = Utils::VSNPrint(buf_ + msg_len_, remaining, format, args2);
+    intptr_t len2 =
+        Utils::VSNPrint(buffer_ + length_, remaining, format, args2);
     va_end(args2);
     ASSERT(len == len2);
   }
-  msg_len_ += len;
-  buf_[msg_len_] = '\0';
+  length_ += len;
+  buffer_[length_] = '\0';
   return len;
 }
 
+void BaseTextBuffer::AddChar(char ch) {
+  if (!EnsureCapacity(sizeof(ch))) return;
+  buffer_[length_] = ch;
+  length_++;
+  buffer_[length_] = '\0';
+}
+
+void BaseTextBuffer::AddRaw(const uint8_t* buffer, intptr_t buffer_length) {
+  if (!EnsureCapacity(buffer_length)) {
+    buffer_length = capacity_ - length_ - 1;  // Copy what fits.
+  }
+  memmove(&buffer_[length_], buffer, buffer_length);
+  length_ += buffer_length;
+  buffer_[length_] = '\0';
+}
+
 // Write a UTF-32 code unit so it can be read by a JSON parser in a string
 // literal. Use official encoding from JSON specification. http://json.org/
-void TextBuffer::EscapeAndAddCodeUnit(uint32_t codeunit) {
+void BaseTextBuffer::EscapeAndAddCodeUnit(uint32_t codeunit) {
   switch (codeunit) {
     case '"':
       AddRaw(reinterpret_cast<uint8_t const*>("\\\""), 2);
@@ -117,49 +96,56 @@
 
 // Write an incomplete UTF-16 code unit so it can be read by a JSON parser in a
 // string literal.
-void TextBuffer::EscapeAndAddUTF16CodeUnit(uint16_t codeunit) {
+void BaseTextBuffer::EscapeAndAddUTF16CodeUnit(uint16_t codeunit) {
   Printf("\\u%04X", codeunit);
 }
 
-void TextBuffer::AddString(const char* s) {
+void BaseTextBuffer::AddString(const char* s) {
   Printf("%s", s);
 }
 
-void TextBuffer::AddEscapedString(const char* s) {
+void BaseTextBuffer::AddEscapedString(const char* s) {
   intptr_t len = strlen(s);
   for (int i = 0; i < len; i++) {
     EscapeAndAddCodeUnit(s[i]);
   }
 }
 
-void TextBuffer::EnsureCapacity(intptr_t len) {
-  intptr_t remaining = buf_size_ - msg_len_;
+TextBuffer::TextBuffer(intptr_t buf_size) {
+  ASSERT(buf_size > 0);
+  buffer_ = reinterpret_cast<char*>(malloc(buf_size));
+  if (buffer_ == nullptr) {
+    OUT_OF_MEMORY();
+  }
+  capacity_ = buf_size;
+  Clear();
+}
+
+TextBuffer::~TextBuffer() {
+  free(buffer_);
+  buffer_ = nullptr;
+}
+
+char* TextBuffer::Steal() {
+  char* r = buffer_;
+  buffer_ = nullptr;
+  capacity_ = 0;
+  length_ = 0;
+  return r;
+}
+
+bool TextBuffer::EnsureCapacity(intptr_t len) {
+  intptr_t remaining = capacity_ - length_;
   if (remaining <= len) {
-    intptr_t new_size = buf_size_ + Utils::Maximum(buf_size_, len + 1);
-    char* new_buf = reinterpret_cast<char*>(realloc(buf_, new_size));
-    if (new_buf == NULL) {
+    intptr_t new_size = capacity_ + Utils::Maximum(capacity_, len + 1);
+    char* new_buf = reinterpret_cast<char*>(realloc(buffer_, new_size));
+    if (new_buf == nullptr) {
       OUT_OF_MEMORY();
     }
-    buf_ = new_buf;
-    buf_size_ = new_size;
+    buffer_ = new_buf;
+    capacity_ = new_size;
   }
-}
-
-void BufferFormatter::Print(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  VPrint(format, args);
-  va_end(args);
-}
-
-void BufferFormatter::VPrint(const char* format, va_list args) {
-  intptr_t available = size_ - position_;
-  if (available <= 0) return;
-  intptr_t written =
-      Utils::VSNPrint(buffer_ + position_, available, format, args);
-  if (written >= 0) {
-    position_ += (available <= written) ? available : written;
-  }
+  return true;
 }
 
 }  // namespace dart
diff --git a/runtime/platform/text_buffer.h b/runtime/platform/text_buffer.h
index 23deeed..c44d955 100644
--- a/runtime/platform/text_buffer.h
+++ b/runtime/platform/text_buffer.h
@@ -10,12 +10,14 @@
 
 namespace dart {
 
-// TextBuffer maintains a dynamic character buffer with a printf-style way to
-// append text.
-class TextBuffer : ValueObject {
+// BaseTextBuffer maintains a dynamic character buffer with a printf-style way
+// to append text. Internal buffer management is handled by subclasses.
+class BaseTextBuffer : public ValueObject {
  public:
-  explicit TextBuffer(intptr_t buf_size);
-  ~TextBuffer();
+  BaseTextBuffer() : buffer_(nullptr), capacity_(0), length_(0) {}
+  BaseTextBuffer(char* buffer, intptr_t capacity)
+      : buffer_(buffer), capacity_(capacity), length_(0) {}
+  virtual ~BaseTextBuffer() {}
 
   intptr_t Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void AddChar(char ch);
@@ -25,39 +27,67 @@
   void AddEscapedString(const char* s);
   void AddRaw(const uint8_t* buffer, intptr_t buffer_length);
 
-  void Clear();
+  // Returns a pointer to the current internal buffer. Whether the pointer is
+  // still valid after the BaseTextBuffer dies depends on the subclass.
+  char* buffer() const { return buffer_; }
+  intptr_t length() const { return length_; }
 
-  char* buf() { return buf_; }
-  intptr_t length() { return msg_len_; }
+  // Clears the stored contents. Unless specified otherwise by the subclass,
+  // should be assumed to invalidate the contents of previous calls to buffer().
+  virtual void Clear() = 0;
+
+ protected:
+  virtual bool EnsureCapacity(intptr_t len) = 0;
+
+  char* buffer_;
+  intptr_t capacity_;
+  intptr_t length_;
+
+  DISALLOW_COPY_AND_ASSIGN(BaseTextBuffer);
+};
+
+// TextBuffer uses manual memory management for the character buffer. Unless
+// Steal() is used, the internal buffer is deallocated when the object dies.
+class TextBuffer : public BaseTextBuffer {
+ public:
+  explicit TextBuffer(intptr_t buf_size);
+  ~TextBuffer();
+
+  // Resets the contents of the internal buffer.
+  void Clear() { set_length(0); }
+
   void set_length(intptr_t len) {
     ASSERT(len >= 0);
-    ASSERT(len <= msg_len_);
-    msg_len_ = len;
+    ASSERT(len <= length_);
+    length_ = len;
+    buffer_[len] = '\0';
   }
 
-  // Steal ownership of the buffer pointer.
+  // Take ownership of the buffer contents. Future uses of the TextBuffer object
+  // will not affect the contents of the returned buffer.
   // NOTE: TextBuffer is empty afterwards.
   char* Steal();
 
  private:
-  void EnsureCapacity(intptr_t len);
-  char* buf_;
-  intptr_t buf_size_;
-  intptr_t msg_len_;
+  bool EnsureCapacity(intptr_t len);
+
+  DISALLOW_COPY_AND_ASSIGN(TextBuffer);
 };
 
-class BufferFormatter : public ValueObject {
+class BufferFormatter : public BaseTextBuffer {
  public:
-  BufferFormatter(char* buffer, intptr_t size)
-      : position_(0), buffer_(buffer), size_(size) {}
+  BufferFormatter(char* buffer, intptr_t size) : BaseTextBuffer(buffer, size) {
+    buffer_[length_] = '\0';
+  }
 
-  void VPrint(const char* format, va_list args);
-  void Print(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+  void Clear() {
+    length_ = 0;
+    buffer_[length_] = '\0';
+  }
 
  private:
-  intptr_t position_;
-  char* buffer_;
-  const intptr_t size_;
+  // We can't extend, so only return true if there's room.
+  bool EnsureCapacity(intptr_t len) { return length_ + len <= capacity_ - 1; }
 
   DISALLOW_COPY_AND_ASSIGN(BufferFormatter);
 };
diff --git a/runtime/tests/vm/dart/b162922506_test.dart b/runtime/tests/vm/dart/b162922506_test.dart
new file mode 100644
index 0000000..bb7d8b7
--- /dev/null
+++ b/runtime/tests/vm/dart/b162922506_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2020, 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.
+
+// Regression test for b/162922506: verify that compiler does not use signed
+// 16-bit integers to store class ids for slots.
+
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as p;
+
+void main() async {
+  Directory tmp = await Directory.systemTemp.createTemp("b162922506");
+  File testBody = File(p.join(tmp.path, 'test.dart'));
+  try {
+    generateTestBody(testBody);
+    final result = await Process.run(Platform.executable, [
+      ...Platform.executableArguments,
+      '--deterministic',
+      '--optimization-counter-threshold=10',
+      '--no-use-osr',
+      testBody.path
+    ]);
+    if (result.exitCode != 0) {
+      print('''
+Subprocess output:
+${result.stdout}
+${result.stderr}
+''');
+    }
+    Expect.equals(0, result.exitCode);
+    Expect.equals("OK", (result.stdout as String).trim());
+  } finally {
+    await tmp.delete(recursive: true);
+  }
+}
+
+void generateTestBody(File testBody) {
+  final sb = StringBuffer();
+
+  sb.write("""
+import 'package:expect/expect.dart';
+""");
+  final n = 0x8010;
+  for (var i = 0; i < n; i++) {
+    sb.write("""
+class C$i {
+  final f;
+  C$i(this.f);
+
+""");
+    if (i == (n - 1)) {
+      sb.write("""
+  test({bool rareCase: false}) {
+    final v = this.f;
+    if (rareCase) {
+      return v.f;
+    }
+    return null;
+  }
+""");
+    }
+    sb.write("""
+
+}
+""");
+  }
+  sb.write("""
+void main() {
+  final obj = C${n - 1}(C${n - 2}(C${n - 3}(null)));
+  for (var i = 0; i < 100; i++) obj.test();
+  Expect.isTrue(obj.test(rareCase: true) is C${n - 3});
+  print("OK");
+}
+  """);
+
+  testBody.writeAsStringSync(sb.toString());
+}
diff --git a/runtime/tests/vm/dart_2/b162922506_test.dart b/runtime/tests/vm/dart_2/b162922506_test.dart
new file mode 100644
index 0000000..bb7d8b7
--- /dev/null
+++ b/runtime/tests/vm/dart_2/b162922506_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2020, 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.
+
+// Regression test for b/162922506: verify that compiler does not use signed
+// 16-bit integers to store class ids for slots.
+
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as p;
+
+void main() async {
+  Directory tmp = await Directory.systemTemp.createTemp("b162922506");
+  File testBody = File(p.join(tmp.path, 'test.dart'));
+  try {
+    generateTestBody(testBody);
+    final result = await Process.run(Platform.executable, [
+      ...Platform.executableArguments,
+      '--deterministic',
+      '--optimization-counter-threshold=10',
+      '--no-use-osr',
+      testBody.path
+    ]);
+    if (result.exitCode != 0) {
+      print('''
+Subprocess output:
+${result.stdout}
+${result.stderr}
+''');
+    }
+    Expect.equals(0, result.exitCode);
+    Expect.equals("OK", (result.stdout as String).trim());
+  } finally {
+    await tmp.delete(recursive: true);
+  }
+}
+
+void generateTestBody(File testBody) {
+  final sb = StringBuffer();
+
+  sb.write("""
+import 'package:expect/expect.dart';
+""");
+  final n = 0x8010;
+  for (var i = 0; i < n; i++) {
+    sb.write("""
+class C$i {
+  final f;
+  C$i(this.f);
+
+""");
+    if (i == (n - 1)) {
+      sb.write("""
+  test({bool rareCase: false}) {
+    final v = this.f;
+    if (rareCase) {
+      return v.f;
+    }
+    return null;
+  }
+""");
+    }
+    sb.write("""
+
+}
+""");
+  }
+  sb.write("""
+void main() {
+  final obj = C${n - 1}(C${n - 2}(C${n - 3}(null)));
+  for (var i = 0; i < 100; i++) obj.test();
+  Expect.isTrue(obj.test(rareCase: true) is C${n - 3});
+  print("OK");
+}
+  """);
+
+  testBody.writeAsStringSync(sb.toString());
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 13c1e72..7f379ab 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -79,6 +79,10 @@
 dart_2/redirection_type_shuffling_test/none: RuntimeError
 dart_2/snapshot_version_test: RuntimeError
 
+[ $compiler != dartk ]
+dart/b162922506_test: SkipByDesign # Only run in JIT
+dart_2/b162922506_test: SkipByDesign # Only run in JIT
+
 [ $compiler == dartkb ]
 dart/generic_field_invocation_test: SkipByDesign # KBC interpreters do not support --no_lazy_dispatchers
 dart_2/generic_field_invocation_test: SkipByDesign # KBC interpreters do not support --no_lazy_dispatchers
@@ -112,11 +116,13 @@
 cc/VerifyExplicit_Crash: Crash # Negative tests of VerifiedMemory should crash iff in DEBUG mode. TODO(koda): Improve support for negative tests.
 cc/VerifyImplicit_Crash: Crash # Negative tests of VerifiedMemory should crash iff in DEBUG mode. TODO(koda): Improve support for negative tests.
 dart/appjit_cha_deopt_test: Pass, Slow # Quite slow in debug mode, uses --optimization-counter-threshold=100
+dart/b162922506_test: SkipSlow # Generates very large input file
 dart/minimal_kernel_bytecode_test: SkipSlow # gen_kernel is too slow in debug mode
 dart/minimal_kernel_test: SkipSlow # gen_kernel is too slow in debug mode
 dart/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow in debug mode
 dart/spawn_shutdown_test: Pass, Slow # VM Shutdown test, It can take some time for all the isolates to shutdown in a Debug build.
 dart_2/appjit_cha_deopt_test: Pass, Slow # Quite slow in debug mode, uses --optimization-counter-threshold=100
+dart_2/b162922506_test: SkipSlow # Generates very large input file
 dart_2/minimal_kernel_bytecode_test: SkipSlow # gen_kernel is too slow in debug mode
 dart_2/minimal_kernel_test: SkipSlow # gen_kernel is too slow in debug mode
 dart_2/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow in debug mode
@@ -284,12 +290,14 @@
 
 [ ($arch == simarm || $arch == simarm64) && ($compiler == dartk || $compiler == dartkb) ]
 dart/appjit*: SkipSlow # DFE too slow
+dart/b162922506_test: SkipSlow # Generates large input file
 dart/data_uri_spawn_test: Skip # Please triage.
 dart/minimal_kernel_bytecode_test: SkipSlow # gen_kernel is too slow on simulated architectures
 dart/minimal_kernel_test: SkipSlow # gen_kernel is too slow on simulated architectures
 dart/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow on simulated architectures
 dart/snapshot_version_test: RuntimeError # Please triage.
 dart_2/appjit*: SkipSlow # DFE too slow
+dart_2/b162922506_test: SkipSlow # Generates large input file
 dart_2/data_uri_spawn_test: Skip # Please triage.
 dart_2/minimal_kernel_bytecode_test: SkipSlow # gen_kernel is too slow on simulated architectures
 dart_2/minimal_kernel_test: SkipSlow # gen_kernel is too slow on simulated architectures
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index f943cc4..0664cbb 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -14,6 +14,9 @@
 
 namespace dart {
 
+// Size of the class-id part of the object header. See ObjectLayout.
+typedef uint16_t ClassIdTagType;
+
 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                           \
   V(Class)                                                                     \
   V(PatchClass)                                                                \
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index aaaa159..a462905 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -271,7 +271,7 @@
                               list_[i].is_generated);
       handlers.SetHandledTypes(i, Array::empty_array());
     } else {
-      const bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
+      const bool has_catch_all = ContainsCatchAllType(*list_[i].handler_types);
       handlers.SetHandlerInfo(i, list_[i].outer_try_index, list_[i].pc_offset,
                               list_[i].needs_stacktrace, has_catch_all,
                               list_[i].is_generated);
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 8b74bde..6f89c91 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -190,9 +190,11 @@
     list_[try_index].needs_stacktrace = true;
   }
 
-  static bool ContainsDynamic(const Array& array) {
+  static bool ContainsCatchAllType(const Array& array) {
+    auto& type = AbstractType::Handle();
     for (intptr_t i = 0; i < array.Length(); i++) {
-      if (array.At(i) == Type::DynamicType()) {
+      type ^= array.At(i);
+      if (type.IsCatchAllType()) {
         return true;
       }
     }
diff --git a/runtime/vm/compiler/aot/dispatch_table_generator.cc b/runtime/vm/compiler/aot/dispatch_table_generator.cc
index af7a1e1..073a227 100644
--- a/runtime/vm/compiler/aot/dispatch_table_generator.cc
+++ b/runtime/vm/compiler/aot/dispatch_table_generator.cc
@@ -420,8 +420,12 @@
   const auto& info = KernelProgramInfo::Handle(Z, script.kernel_program_info());
   kernel::TableSelectorMetadata* metadata =
       kernel::TableSelectorMetadataForProgram(info, Z);
-  // This assert will fail if gen_kernel was run in non-AOT mode or without TFA.
-  RELEASE_ASSERT(metadata != nullptr);
+  // Errors out if gen_kernel was run in non-AOT mode or without TFA.
+  if (metadata == nullptr) {
+    FATAL(
+        "Missing table selector metadata!\n"
+        "Probably gen_kernel was run in non-AOT mode or without TFA.\n");
+  }
   for (intptr_t i = 0; i < metadata->selectors.length(); i++) {
     const kernel::TableSelectorInfo* info = &metadata->selectors[i];
     selector_map_.AddSelector(info->call_count, info->called_on_null,
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index 522e505..2d1515f 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -191,14 +191,14 @@
       for (intptr_t i = 1; i < inlined_functions.length(); i++) {
         const char* name = inlined_functions[i]->ToQualifiedCString();
         if (first) {
-          f.Print("        ;; Inlined [%s", name);
+          f.Printf("        ;; Inlined [%s", name);
           first = false;
         } else {
-          f.Print(" -> %s", name);
+          f.Printf(" -> %s", name);
         }
       }
       if (!first) {
-        f.Print("]\n");
+        f.AddString("]\n");
         formatter->Print("%s", str);
       }
     }
diff --git a/runtime/vm/compiler/backend/compile_type.h b/runtime/vm/compiler/backend/compile_type.h
index 32c9949..3a7d6aa 100644
--- a/runtime/vm/compiler/backend/compile_type.h
+++ b/runtime/vm/compiler/backend/compile_type.h
@@ -16,7 +16,7 @@
 namespace dart {
 
 class AbstractType;
-class BufferFormatter;
+class BaseTextBuffer;
 class Definition;
 class FlowGraphSerializer;
 class SExpression;
@@ -247,7 +247,7 @@
 
   bool Specialize(GrowableArray<intptr_t>* class_ids);
 
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
   SExpression* ToSExpression(FlowGraphSerializer* s) const;
   void AddExtraInfoToSExpression(SExpList* sexp, FlowGraphSerializer* s) const;
 
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index c285c51..5890545 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1295,6 +1295,14 @@
     // Trim extra inputs of ClosureCall and LoadField instructions from
     // the environment. Inputs of those instructions are not pushed onto
     // the stack at the point where deoptimization can occur.
+    // Note that in case of LoadField there can be two possible situations,
+    // the code here handles LoadField to LoadField lazy deoptimization in
+    // which we are transitioning from position after the call to initialization
+    // stub in optimized code to a similar position after the call to
+    // initialization stub in unoptimized code. There is another variant
+    // (LoadField deoptimizing into a position after a getter call) which is
+    // handled in a different way (see
+    // CallSpecializer::InlineImplicitInstanceGetter).
     deopt_env =
         deopt_env->DeepCopy(zone(), deopt_env->Length() - instr->InputCount() +
                                         instr->ArgumentCount());
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 8c76dad..8b3cc81 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -35,12 +35,12 @@
 
 namespace dart {
 
+class BaseTextBuffer;
 class BinaryFeedback;
 class BitVector;
 class BlockEntryInstr;
 class BlockEntryWithInitialDefs;
 class BoxIntegerInstr;
-class BufferFormatter;
 class CallTargets;
 class CatchBlockEntryInstr;
 class CheckBoundBase;
@@ -145,7 +145,7 @@
   void RefineReachingType(CompileType* type);
 
 #if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
 #endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
   SExpression* ToSExpression(FlowGraphSerializer* s) const;
@@ -550,14 +550,14 @@
   DECLARE_COMPARISON_METHODS
 
 #if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-#define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const;
+#define PRINT_TO_SUPPORT virtual void PrintTo(BaseTextBuffer* f) const;
 #else
 #define PRINT_TO_SUPPORT
 #endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 #if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 #define PRINT_OPERANDS_TO_SUPPORT                                              \
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  virtual void PrintOperandsTo(BaseTextBuffer* f) const;
 #else
 #define PRINT_OPERANDS_TO_SUPPORT
 #endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
@@ -911,8 +911,8 @@
   // Printing support.
   const char* ToCString() const;
 #if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-  virtual void PrintTo(BufferFormatter* f) const;
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
+  virtual void PrintOperandsTo(BaseTextBuffer* f) const;
 #endif
   virtual SExpression* ToSExpression(FlowGraphSerializer* s) const;
   virtual void AddOperandsToSExpression(SExpList* sexp,
@@ -1614,7 +1614,7 @@
   }
 
  protected:
-  void PrintInitialDefinitionsTo(BufferFormatter* f) const;
+  void PrintInitialDefinitionsTo(BaseTextBuffer* f) const;
 
  private:
   GrowableArray<Definition*> initial_definitions_;
@@ -5864,7 +5864,7 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  void PrintOperandsTo(BufferFormatter* f) const;
+  void PrintOperandsTo(BaseTextBuffer* f) const;
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
@@ -9330,7 +9330,7 @@
                        Definition* dead,
                        Definition* result) const;
 
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
   SExpression* ToSExpression(FlowGraphSerializer* s) const;
   const char* ToCString() const;
 
diff --git a/runtime/vm/compiler/backend/il_deserializer.cc b/runtime/vm/compiler/backend/il_deserializer.cc
index 30d4520..ca7bd32 100644
--- a/runtime/vm/compiler/backend/il_deserializer.cc
+++ b/runtime/vm/compiler/backend/il_deserializer.cc
@@ -102,7 +102,7 @@
   if (results.serialized != nullptr) {
     TextBuffer buf(1000);
     results.serialized->SerializeTo(zone, &buf, "");
-    js.PrintProperty("serialized", buf.buf());
+    js.PrintProperty("serialized", buf.buffer());
   }
 
   if (results.error_message != nullptr) {
@@ -112,7 +112,7 @@
     ASSERT(results.error_sexp != nullptr);
     TextBuffer buf(1000);
     results.error_sexp->SerializeTo(zone, &buf, "");
-    js.PrintProperty("expression", buf.buf());
+    js.PrintProperty("expression", buf.buffer());
 
     auto const sexp_position =
         GetSExpressionPosition(zone, results.serialized, results.error_sexp);
@@ -121,7 +121,7 @@
   }
 
   js.CloseObject();
-  THR_Print("Results of round trip serialization: %s\n", js.buffer()->buf());
+  THR_Print("Results of round trip serialization: %s\n", js.buffer()->buffer());
 }
 
 void FlowGraphDeserializer::RoundTripSerialization(CompilerPassState* state) {
@@ -159,7 +159,7 @@
     if (FLAG_trace_round_trip_serialization && results.serialized != nullptr) {
       TextBuffer buf(1000);
       results.serialized->SerializeTo(zone, &buf, "");
-      THR_Print("Serialized flow graph:\n%s\n", buf.buf());
+      THR_Print("Serialized flow graph:\n%s\n", buf.buffer());
     }
 
     // For the deserializer, use the thread from the compiler pass and zone
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index a1289a9..b326057 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -103,11 +103,11 @@
       String::Handle(dst_type.Name()).ToCString(), dst_name.ToCString());
 }
 
-static void PrintTargetsHelper(BufferFormatter* f,
+static void PrintTargetsHelper(BaseTextBuffer* f,
                                const CallTargets& targets,
                                intptr_t num_checks_to_print) {
-  f->Print(" Targets[");
-  f->Print("%" Pd ": ", targets.length());
+  f->AddString(" Targets[");
+  f->Printf("%" Pd ": ", targets.length());
   Function& target = Function::Handle();
   if ((num_checks_to_print == FlowGraphPrinter::kPrintAll) ||
       (num_checks_to_print > targets.length())) {
@@ -119,36 +119,36 @@
     const intptr_t count = target_info->count;
     target = target_info->target->raw();
     if (i > 0) {
-      f->Print(" | ");
+      f->AddString(" | ");
     }
     if (range.IsSingleCid()) {
       const Class& cls =
           Class::Handle(Isolate::Current()->class_table()->At(range.cid_start));
-      f->Print("%s", String::Handle(cls.Name()).ToCString());
-      f->Print(" cid %" Pd " cnt:%" Pd " trgt:'%s'", range.cid_start, count,
-               target.ToQualifiedCString());
+      f->Printf("%s", String::Handle(cls.Name()).ToCString());
+      f->Printf(" cid %" Pd " cnt:%" Pd " trgt:'%s'", range.cid_start, count,
+                target.ToQualifiedCString());
     } else {
       const Class& cls = Class::Handle(target.Owner());
-      f->Print("cid %" Pd "-%" Pd " %s", range.cid_start, range.cid_end,
-               String::Handle(cls.Name()).ToCString());
-      f->Print(" cnt:%" Pd " trgt:'%s'", count, target.ToQualifiedCString());
+      f->Printf("cid %" Pd "-%" Pd " %s", range.cid_start, range.cid_end,
+                String::Handle(cls.Name()).ToCString());
+      f->Printf(" cnt:%" Pd " trgt:'%s'", count, target.ToQualifiedCString());
     }
 
     if (target_info->exactness.IsTracking()) {
-      f->Print(" %s", target_info->exactness.ToCString());
+      f->Printf(" %s", target_info->exactness.ToCString());
     }
   }
   if (num_checks_to_print < targets.length()) {
-    f->Print("...");
+    f->AddString("...");
   }
-  f->Print("]");
+  f->AddString("]");
 }
 
-static void PrintCidsHelper(BufferFormatter* f,
+static void PrintCidsHelper(BaseTextBuffer* f,
                             const Cids& targets,
                             intptr_t num_checks_to_print) {
-  f->Print(" Cids[");
-  f->Print("%" Pd ": ", targets.length());
+  f->AddString(" Cids[");
+  f->Printf("%" Pd ": ", targets.length());
   if ((num_checks_to_print == FlowGraphPrinter::kPrintAll) ||
       (num_checks_to_print > targets.length())) {
     num_checks_to_print = targets.length();
@@ -156,32 +156,33 @@
   for (intptr_t i = 0; i < num_checks_to_print; i++) {
     const CidRange& range = targets[i];
     if (i > 0) {
-      f->Print(" | ");
+      f->AddString(" | ");
     }
     const Class& cls =
         Class::Handle(Isolate::Current()->class_table()->At(range.cid_start));
-    f->Print("%s etc. ", String::Handle(cls.Name()).ToCString());
+    f->Printf("%s etc. ", String::Handle(cls.Name()).ToCString());
     if (range.IsSingleCid()) {
-      f->Print(" cid %" Pd, range.cid_start);
+      f->Printf(" cid %" Pd, range.cid_start);
     } else {
-      f->Print(" cid %" Pd "-%" Pd, range.cid_start, range.cid_end);
+      f->Printf(" cid %" Pd "-%" Pd, range.cid_start, range.cid_end);
     }
   }
   if (num_checks_to_print < targets.length()) {
-    f->Print("...");
+    f->AddString("...");
   }
-  f->Print("]");
+  f->AddString("]");
 }
 
-static void PrintICDataHelper(BufferFormatter* f,
+static void PrintICDataHelper(BaseTextBuffer* f,
                               const ICData& ic_data,
                               intptr_t num_checks_to_print) {
-  f->Print(" IC[");
+  f->AddString(" IC[");
   if (ic_data.is_tracking_exactness()) {
-    f->Print("(%s) ",
-             AbstractType::Handle(ic_data.receivers_static_type()).ToCString());
+    f->Printf(
+        "(%s) ",
+        AbstractType::Handle(ic_data.receivers_static_type()).ToCString());
   }
-  f->Print("%" Pd ": ", ic_data.NumberOfChecks());
+  f->Printf("%" Pd ": ", ic_data.NumberOfChecks());
   Function& target = Function::Handle();
   if ((num_checks_to_print == FlowGraphPrinter::kPrintAll) ||
       (num_checks_to_print > ic_data.NumberOfChecks())) {
@@ -192,40 +193,40 @@
     ic_data.GetCheckAt(i, &class_ids, &target);
     const intptr_t count = ic_data.GetCountAt(i);
     if (i > 0) {
-      f->Print(" | ");
+      f->AddString(" | ");
     }
     for (intptr_t k = 0; k < class_ids.length(); k++) {
       if (k > 0) {
-        f->Print(", ");
+        f->AddString(", ");
       }
       const Class& cls =
           Class::Handle(Isolate::Current()->class_table()->At(class_ids[k]));
-      f->Print("%s", String::Handle(cls.Name()).ToCString());
+      f->Printf("%s", String::Handle(cls.Name()).ToCString());
     }
-    f->Print(" cnt:%" Pd " trgt:'%s'", count, target.ToQualifiedCString());
+    f->Printf(" cnt:%" Pd " trgt:'%s'", count, target.ToQualifiedCString());
     if (ic_data.is_tracking_exactness()) {
-      f->Print(" %s", ic_data.GetExactnessAt(i).ToCString());
+      f->Printf(" %s", ic_data.GetExactnessAt(i).ToCString());
     }
   }
   if (num_checks_to_print < ic_data.NumberOfChecks()) {
-    f->Print("...");
+    f->AddString("...");
   }
-  f->Print("]");
+  f->AddString("]");
 }
 
-static void PrintICDataSortedHelper(BufferFormatter* f,
+static void PrintICDataSortedHelper(BaseTextBuffer* f,
                                     const ICData& ic_data_orig) {
   const ICData& ic_data =
       ICData::Handle(ic_data_orig.AsUnaryClassChecksSortedByCount());
-  f->Print(" IC[n:%" Pd "; ", ic_data.NumberOfChecks());
+  f->Printf(" IC[n:%" Pd "; ", ic_data.NumberOfChecks());
   for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
     const intptr_t count = ic_data.GetCountAt(i);
     const intptr_t cid = ic_data.GetReceiverClassIdAt(i);
     const Class& cls =
         Class::Handle(Isolate::Current()->class_table()->At(cid));
-    f->Print("%s : %" Pd ", ", String::Handle(cls.Name()).ToCString(), count);
+    f->Printf("%s : %" Pd ", ", String::Handle(cls.Name()).ToCString(), count);
   }
-  f->Print("]");
+  f->AddString("]");
 }
 
 void FlowGraphPrinter::PrintICData(const ICData& ic_data,
@@ -247,16 +248,16 @@
   // TODO(erikcorry): Print args descriptor.
 }
 
-static void PrintUse(BufferFormatter* f, const Definition& definition) {
+static void PrintUse(BaseTextBuffer* f, const Definition& definition) {
   if (definition.HasSSATemp()) {
     if (definition.HasPairRepresentation()) {
-      f->Print("(v%" Pd ", v%" Pd ")", definition.ssa_temp_index(),
-               definition.ssa_temp_index() + 1);
+      f->Printf("(v%" Pd ", v%" Pd ")", definition.ssa_temp_index(),
+                definition.ssa_temp_index() + 1);
     } else {
-      f->Print("v%" Pd "", definition.ssa_temp_index());
+      f->Printf("v%" Pd "", definition.ssa_temp_index());
     }
   } else if (definition.HasTemp()) {
-    f->Print("t%" Pd "", definition.temp_index());
+    f->Printf("t%" Pd "", definition.temp_index());
   }
 }
 
@@ -267,114 +268,114 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-void Instruction::PrintTo(BufferFormatter* f) const {
+void Instruction::PrintTo(BaseTextBuffer* f) const {
   if (GetDeoptId() != DeoptId::kNone) {
-    f->Print("%s:%" Pd "(", DebugName(), GetDeoptId());
+    f->Printf("%s:%" Pd "(", DebugName(), GetDeoptId());
   } else {
-    f->Print("%s(", DebugName());
+    f->Printf("%s(", DebugName());
   }
   PrintOperandsTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void Instruction::PrintOperandsTo(BufferFormatter* f) const {
+void Instruction::PrintOperandsTo(BaseTextBuffer* f) const {
   for (int i = 0; i < InputCount(); ++i) {
-    if (i > 0) f->Print(", ");
+    if (i > 0) f->AddString(", ");
     if (InputAt(i) != NULL) InputAt(i)->PrintTo(f);
   }
 }
 
-void Definition::PrintTo(BufferFormatter* f) const {
+void Definition::PrintTo(BaseTextBuffer* f) const {
   PrintUse(f, *this);
-  if (HasSSATemp() || HasTemp()) f->Print(" <- ");
+  if (HasSSATemp() || HasTemp()) f->AddString(" <- ");
   if (GetDeoptId() != DeoptId::kNone) {
-    f->Print("%s:%" Pd "(", DebugName(), GetDeoptId());
+    f->Printf("%s:%" Pd "(", DebugName(), GetDeoptId());
   } else {
-    f->Print("%s(", DebugName());
+    f->Printf("%s(", DebugName());
   }
   PrintOperandsTo(f);
-  f->Print(")");
+  f->AddString(")");
   if (range_ != NULL) {
-    f->Print(" ");
+    f->AddString(" ");
     range_->PrintTo(f);
   }
 
   if (type_ != NULL) {
-    f->Print(" ");
+    f->AddString(" ");
     type_->PrintTo(f);
   }
 }
 
-void CheckNullInstr::PrintOperandsTo(BufferFormatter* f) const {
+void CheckNullInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Definition::PrintOperandsTo(f);
   switch (exception_type()) {
     case kNoSuchMethod:
-      f->Print(", NoSuchMethodError");
+      f->AddString(", NoSuchMethodError");
       break;
     case kArgumentError:
-      f->Print(", ArgumentError");
+      f->AddString(", ArgumentError");
       break;
     case kCastError:
-      f->Print(", CastError");
+      f->AddString(", CastError");
       break;
   }
 }
 
-void Definition::PrintOperandsTo(BufferFormatter* f) const {
+void Definition::PrintOperandsTo(BaseTextBuffer* f) const {
   for (int i = 0; i < InputCount(); ++i) {
-    if (i > 0) f->Print(", ");
+    if (i > 0) f->AddString(", ");
     if (InputAt(i) != NULL) {
       InputAt(i)->PrintTo(f);
     }
   }
 }
 
-void RedefinitionInstr::PrintOperandsTo(BufferFormatter* f) const {
+void RedefinitionInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Definition::PrintOperandsTo(f);
   if (constrained_type_ != nullptr) {
-    f->Print(" ^ %s", constrained_type_->ToCString());
+    f->Printf(" ^ %s", constrained_type_->ToCString());
   }
 }
 
-void ReachabilityFenceInstr::PrintOperandsTo(BufferFormatter* f) const {
+void ReachabilityFenceInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
 }
 
-void Value::PrintTo(BufferFormatter* f) const {
+void Value::PrintTo(BaseTextBuffer* f) const {
   PrintUse(f, *definition());
 
   if ((reaching_type_ != NULL) && (reaching_type_ != definition()->type_)) {
-    f->Print(" ");
+    f->AddString(" ");
     reaching_type_->PrintTo(f);
   }
 }
 
-void ConstantInstr::PrintOperandsTo(BufferFormatter* f) const {
+void ConstantInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   const char* cstr = value().ToCString();
   const char* new_line = strchr(cstr, '\n');
   if (new_line == NULL) {
-    f->Print("#%s", cstr);
+    f->Printf("#%s", cstr);
   } else {
     const intptr_t pos = new_line - cstr;
     char* buffer = Thread::Current()->zone()->Alloc<char>(pos + 1);
     strncpy(buffer, cstr, pos);
     buffer[pos] = '\0';
-    f->Print("#%s\\n...", buffer);
+    f->Printf("#%s\\n...", buffer);
   }
 }
 
-void ConstraintInstr::PrintOperandsTo(BufferFormatter* f) const {
+void ConstraintInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
-  f->Print(" ^ ");
+  f->AddString(" ^ ");
   constraint()->PrintTo(f);
 }
 
-void Range::PrintTo(BufferFormatter* f) const {
-  f->Print("[");
+void Range::PrintTo(BaseTextBuffer* f) const {
+  f->AddString("[");
   min_.PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   max_.PrintTo(f);
-  f->Print("]");
+  f->AddString("]");
 }
 
 const char* Range::ToCString(const Range* range) {
@@ -386,24 +387,24 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-void RangeBoundary::PrintTo(BufferFormatter* f) const {
+void RangeBoundary::PrintTo(BaseTextBuffer* f) const {
   switch (kind_) {
     case kSymbol:
-      f->Print("v%" Pd "",
-               reinterpret_cast<Definition*>(value_)->ssa_temp_index());
-      if (offset_ != 0) f->Print("%+" Pd64 "", offset_);
+      f->Printf("v%" Pd "",
+                reinterpret_cast<Definition*>(value_)->ssa_temp_index());
+      if (offset_ != 0) f->Printf("%+" Pd64 "", offset_);
       break;
     case kNegativeInfinity:
-      f->Print("-inf");
+      f->AddString("-inf");
       break;
     case kPositiveInfinity:
-      f->Print("+inf");
+      f->AddString("+inf");
       break;
     case kConstant:
-      f->Print("%" Pd64 "", value_);
+      f->Printf("%" Pd64 "", value_);
       break;
     case kUnknown:
-      f->Print("_|_");
+      f->AddString("_|_");
       break;
   }
 }
@@ -415,61 +416,61 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-void MakeTempInstr::PrintOperandsTo(BufferFormatter* f) const {}
+void MakeTempInstr::PrintOperandsTo(BaseTextBuffer* f) const {}
 
-void DropTempsInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%" Pd "", num_temps());
+void DropTempsInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%" Pd "", num_temps());
   if (value() != NULL) {
-    f->Print(", ");
+    f->AddString(", ");
     value()->PrintTo(f);
   }
 }
 
-void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const {
+void AssertAssignableInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   dst_type()->PrintTo(f);
-  f->Print(", '%s',", dst_name().ToCString());
-  f->Print(" instantiator_type_args(");
+  f->Printf(", '%s',", dst_name().ToCString());
+  f->AddString(" instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
-  f->Print("), function_type_args(");
+  f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void AssertSubtypeInstr::PrintOperandsTo(BufferFormatter* f) const {
+void AssertSubtypeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   sub_type()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   super_type()->PrintTo(f);
-  f->Print(", '%s', ", dst_name().ToCString());
-  f->Print(" instantiator_type_args(");
+  f->Printf(", '%s', ", dst_name().ToCString());
+  f->AddString(" instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
-  f->Print("), function_type_args(");
+  f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void AssertBooleanInstr::PrintOperandsTo(BufferFormatter* f) const {
+void AssertBooleanInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
 }
 
-void ClosureCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print(" function=");
+void ClosureCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->AddString(" function=");
   InputAt(InputCount() - 1)->PrintTo(f);
-  f->Print("<%" Pd ">", type_args_len());
+  f->Printf("<%" Pd ">", type_args_len());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     ArgumentValueAt(i)->PrintTo(f);
   }
   if (entry_kind() == Code::EntryKind::kUnchecked) {
-    f->Print(" using unchecked entrypoint");
+    f->AddString(" using unchecked entrypoint");
   }
 }
 
-void InstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print(" %s<%" Pd ">", function_name().ToCString(), type_args_len());
+void InstanceCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf(" %s<%" Pd ">", function_name().ToCString(), type_args_len());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     ArgumentValueAt(i)->PrintTo(f);
   }
   if (HasICData()) {
@@ -480,287 +481,287 @@
     }
   }
   if (result_type() != nullptr) {
-    f->Print(", result_type = %s", result_type()->ToCString());
+    f->Printf(", result_type = %s", result_type()->ToCString());
   }
   if (entry_kind() == Code::EntryKind::kUnchecked) {
-    f->Print(" using unchecked entrypoint");
+    f->AddString(" using unchecked entrypoint");
   }
 }
 
-void PolymorphicInstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print(" %s<%" Pd ">", function_name().ToCString(), type_args_len());
+void PolymorphicInstanceCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf(" %s<%" Pd ">", function_name().ToCString(), type_args_len());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     ArgumentValueAt(i)->PrintTo(f);
   }
   PrintTargetsHelper(f, targets_, FlowGraphPrinter::kPrintAll);
   if (complete()) {
-    f->Print(" COMPLETE");
+    f->AddString(" COMPLETE");
   }
   if (entry_kind() == Code::EntryKind::kUnchecked) {
-    f->Print(" using unchecked entrypoint");
+    f->AddString(" using unchecked entrypoint");
   }
 }
 
-void DispatchTableCallInstr::PrintOperandsTo(BufferFormatter* f) const {
+void DispatchTableCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   const String& name =
       String::Handle(interface_target().QualifiedUserVisibleName());
-  f->Print(" cid=");
+  f->AddString(" cid=");
   class_id()->PrintTo(f);
-  f->Print(" %s<%" Pd ">", name.ToCString(), type_args_len());
+  f->Printf(" %s<%" Pd ">", name.ToCString(), type_args_len());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     ArgumentValueAt(i)->PrintTo(f);
   }
 }
 
-void StrictCompareInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(kind()));
+void StrictCompareInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", Token::Str(kind()));
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
   if (needs_number_check()) {
-    f->Print(", with number check");
+    f->Printf(", with number check");
   }
 }
 
-void TestCidsInstr::PrintOperandsTo(BufferFormatter* f) const {
+void TestCidsInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   left()->PrintTo(f);
-  f->Print(" %s [", Token::Str(kind()));
+  f->Printf(" %s [", Token::Str(kind()));
   intptr_t length = cid_results().length();
   for (intptr_t i = 0; i < length; i += 2) {
-    f->Print("0x%" Px ":%s ", cid_results()[i],
-             cid_results()[i + 1] == 0 ? "false" : "true");
+    f->Printf("0x%" Px ":%s ", cid_results()[i],
+              cid_results()[i + 1] == 0 ? "false" : "true");
   }
-  f->Print("] ");
+  f->AddString("] ");
   if (CanDeoptimize()) {
     ASSERT(deopt_id() != DeoptId::kNone);
-    f->Print("else deoptimize ");
+    f->AddString("else deoptimize ");
   } else {
     ASSERT(deopt_id() == DeoptId::kNone);
-    f->Print("else %s ", cid_results()[length - 1] != 0 ? "false" : "true");
+    f->Printf("else %s ", cid_results()[length - 1] != 0 ? "false" : "true");
   }
 }
 
-void EqualityCompareInstr::PrintOperandsTo(BufferFormatter* f) const {
+void EqualityCompareInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   left()->PrintTo(f);
-  f->Print(" %s ", Token::Str(kind()));
+  f->Printf(" %s ", Token::Str(kind()));
   right()->PrintTo(f);
 }
 
-void StaticCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print(" %s<%" Pd "> ", String::Handle(function().name()).ToCString(),
-           type_args_len());
+void StaticCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf(" %s<%" Pd "> ", String::Handle(function().name()).ToCString(),
+            type_args_len());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    if (i > 0) f->Print(", ");
+    if (i > 0) f->AddString(", ");
     ArgumentValueAt(i)->PrintTo(f);
   }
   if (entry_kind() == Code::EntryKind::kUnchecked) {
-    f->Print(", using unchecked entrypoint");
+    f->AddString(", using unchecked entrypoint");
   }
   if (function().recognized_kind() != MethodRecognizer::kUnknown) {
-    f->Print(", recognized_kind = %s",
-             MethodRecognizer::KindToCString(function().recognized_kind()));
+    f->Printf(", recognized_kind = %s",
+              MethodRecognizer::KindToCString(function().recognized_kind()));
   }
   if (result_type() != nullptr) {
-    f->Print(", result_type = %s", result_type()->ToCString());
+    f->Printf(", result_type = %s", result_type()->ToCString());
   }
 }
 
-void LoadLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s @%d", local().name().ToCString(), local().index().value());
+void LoadLocalInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s @%d", local().name().ToCString(), local().index().value());
 }
 
-void StoreLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s @%d, ", local().name().ToCString(), local().index().value());
+void StoreLocalInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s @%d, ", local().name().ToCString(), local().index().value());
   value()->PrintTo(f);
 }
 
-void NativeCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", native_name().ToCString());
+void NativeCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", native_name().ToCString());
 }
 
-void GuardFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s %s, ", String::Handle(field().name()).ToCString(),
-           field().GuardedPropertiesAsCString());
+void GuardFieldInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s %s, ", String::Handle(field().name()).ToCString(),
+            field().GuardedPropertiesAsCString());
   value()->PrintTo(f);
 }
 
-void StoreInstanceFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
+void StoreInstanceFieldInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   instance()->PrintTo(f);
-  f->Print(" . %s = ", slot().Name());
+  f->Printf(" . %s = ", slot().Name());
   value()->PrintTo(f);
 
   // Here, we just print the value of the enum field. We would prefer to get
   // the final decision on whether a store barrier will be emitted by calling
   // ShouldEmitStoreBarrier(), but that can change parts of the flow graph.
   if (emit_store_barrier_ == kNoStoreBarrier) {
-    f->Print(", NoStoreBarrier");
+    f->AddString(", NoStoreBarrier");
   }
 }
 
-void IfThenElseInstr::PrintOperandsTo(BufferFormatter* f) const {
+void IfThenElseInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   comparison()->PrintOperandsTo(f);
-  f->Print(" ? %" Pd " : %" Pd, if_true_, if_false_);
+  f->Printf(" ? %" Pd " : %" Pd, if_true_, if_false_);
 }
 
-void LoadStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", String::Handle(field().name()).ToCString());
+void LoadStaticFieldInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", String::Handle(field().name()).ToCString());
   if (calls_initializer()) {
-    f->Print(", CallsInitializer");
+    f->AddString(", CallsInitializer");
   }
 }
 
-void StoreStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", String::Handle(field().name()).ToCString());
+void StoreStaticFieldInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", String::Handle(field().name()).ToCString());
   value()->PrintTo(f);
 }
 
-void InstanceOfInstr::PrintOperandsTo(BufferFormatter* f) const {
+void InstanceOfInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
-  f->Print(" IS %s,", String::Handle(type().Name()).ToCString());
-  f->Print(" instantiator_type_args(");
+  f->Printf(" IS %s,", String::Handle(type().Name()).ToCString());
+  f->AddString(" instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
-  f->Print("), function_type_args(");
+  f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void RelationalOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(kind()));
+void RelationalOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", Token::Str(kind()));
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
 }
 
-void AllocateObjectInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", String::Handle(cls().ScrubbedName()).ToCString());
+void AllocateObjectInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", String::Handle(cls().ScrubbedName()).ToCString());
   for (intptr_t i = 0; i < InputCount(); ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     InputAt(i)->PrintTo(f);
   }
   if (Identity().IsNotAliased()) {
-    f->Print(" <not-aliased>");
+    f->AddString(" <not-aliased>");
   }
 }
 
-void MaterializeObjectInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", String::Handle(cls_.ScrubbedName()).ToCString());
+void MaterializeObjectInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", String::Handle(cls_.ScrubbedName()).ToCString());
   for (intptr_t i = 0; i < InputCount(); i++) {
-    f->Print(", ");
-    f->Print("%s: ", slots_[i]->Name());
+    f->AddString(", ");
+    f->Printf("%s: ", slots_[i]->Name());
     InputAt(i)->PrintTo(f);
   }
 }
 
-void LoadFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
+void LoadFieldInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   instance()->PrintTo(f);
-  f->Print(" . %s%s", slot().Name(), slot().is_immutable() ? " {final}" : "");
+  f->Printf(" . %s%s", slot().Name(), slot().is_immutable() ? " {final}" : "");
   if (calls_initializer()) {
-    f->Print(", CallsInitializer");
+    f->AddString(", CallsInitializer");
   }
 }
 
-void LoadUntaggedInstr::PrintOperandsTo(BufferFormatter* f) const {
+void LoadUntaggedInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   object()->PrintTo(f);
-  f->Print(", %" Pd, offset());
+  f->Printf(", %" Pd, offset());
 }
 
-void InstantiateTypeInstr::PrintOperandsTo(BufferFormatter* f) const {
+void InstantiateTypeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   const String& type_name = String::Handle(type().Name());
-  f->Print("%s,", type_name.ToCString());
-  f->Print(" instantiator_type_args(");
+  f->Printf("%s,", type_name.ToCString());
+  f->AddString(" instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
-  f->Print("), function_type_args(");
+  f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void InstantiateTypeArgumentsInstr::PrintOperandsTo(BufferFormatter* f) const {
+void InstantiateTypeArgumentsInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   const String& type_args = String::Handle(type_arguments().Name());
-  f->Print("%s,", type_args.ToCString());
-  f->Print(" instantiator_type_args(");
+  f->Printf("%s,", type_args.ToCString());
+  f->AddString(" instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
-  f->Print("), function_type_args(");
+  f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
-  f->Print("), instantiator_class(%s)", instantiator_class().ToCString());
+  f->Printf("), instantiator_class(%s)", instantiator_class().ToCString());
 }
 
-void AllocateContextInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%" Pd "", num_context_variables());
+void AllocateContextInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%" Pd "", num_context_variables());
 }
 
 void AllocateUninitializedContextInstr::PrintOperandsTo(
-    BufferFormatter* f) const {
-  f->Print("%" Pd "", num_context_variables());
+    BaseTextBuffer* f) const {
+  f->Printf("%" Pd "", num_context_variables());
 
   if (Identity().IsNotAliased()) {
-    f->Print(" <not-aliased>");
+    f->AddString(" <not-aliased>");
   }
 }
 
-void MathUnaryInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("'%s', ", MathUnaryInstr::KindToCString(kind()));
+void MathUnaryInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("'%s', ", MathUnaryInstr::KindToCString(kind()));
   value()->PrintTo(f);
 }
 
-void TruncDivModInstr::PrintOperandsTo(BufferFormatter* f) const {
+void TruncDivModInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Definition::PrintOperandsTo(f);
 }
 
-void ExtractNthOutputInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("Extract %" Pd " from ", index());
+void ExtractNthOutputInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("Extract %" Pd " from ", index());
   Definition::PrintOperandsTo(f);
 }
 
-void UnaryIntegerOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
+void UnaryIntegerOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", Token::Str(op_kind()));
   value()->PrintTo(f);
 }
 
-void CheckedSmiOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", Token::Str(op_kind()));
-  f->Print(", ");
+void CheckedSmiOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", Token::Str(op_kind()));
+  f->AddString(", ");
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
 }
 
-void CheckedSmiComparisonInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", Token::Str(kind()));
-  f->Print(", ");
+void CheckedSmiComparisonInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", Token::Str(kind()));
+  f->AddString(", ");
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
 }
 
-void BinaryIntegerOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", Token::Str(op_kind()));
+void BinaryIntegerOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", Token::Str(op_kind()));
   if (is_truncating()) {
-    f->Print(" [tr]");
+    f->AddString(" [tr]");
   } else if (!can_overflow()) {
-    f->Print(" [-o]");
+    f->AddString(" [-o]");
   }
-  f->Print(", ");
+  f->AddString(", ");
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
 }
 
-void BinaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
+void BinaryDoubleOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", Token::Str(op_kind()));
   left()->PrintTo(f);
-  f->Print(", ");
+  f->AddString(", ");
   right()->PrintTo(f);
 }
 
-void DoubleTestOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+void DoubleTestOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   switch (op_kind()) {
     case MethodRecognizer::kDouble_getIsNaN:
-      f->Print("IsNaN ");
+      f->AddString("IsNaN ");
       break;
     case MethodRecognizer::kDouble_getIsInfinite:
-      f->Print("IsInfinite ");
+      f->AddString("IsInfinite ");
       break;
     default:
       UNREACHABLE();
@@ -774,131 +775,131 @@
 #undef CASE
 };
 
-void SimdOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", simd_op_kind_string[kind()]);
+void SimdOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", simd_op_kind_string[kind()]);
   if (HasMask()) {
-    f->Print(", mask = %" Pd "", mask());
+    f->Printf(", mask = %" Pd "", mask());
   }
   for (intptr_t i = 0; i < InputCount(); i++) {
-    f->Print(", ");
+    f->AddString(", ");
     InputAt(i)->PrintTo(f);
   }
 }
 
-void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
+void UnaryDoubleOpInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", Token::Str(op_kind()));
   value()->PrintTo(f);
 }
 
-void LoadClassIdInstr::PrintOperandsTo(BufferFormatter* f) const {
+void LoadClassIdInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   if (!input_can_be_smi_) {
-    f->Print("<non-smi> ");
+    f->AddString("<non-smi> ");
   }
   object()->PrintTo(f);
 }
 
-void CheckClassIdInstr::PrintOperandsTo(BufferFormatter* f) const {
+void CheckClassIdInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
 
   const Class& cls =
       Class::Handle(Isolate::Current()->class_table()->At(cids().cid_start));
   const String& name = String::Handle(cls.ScrubbedName());
   if (cids().IsSingleCid()) {
-    f->Print(", %s", name.ToCString());
+    f->Printf(", %s", name.ToCString());
   } else {
     const Class& cls2 =
         Class::Handle(Isolate::Current()->class_table()->At(cids().cid_end));
     const String& name2 = String::Handle(cls2.ScrubbedName());
-    f->Print(", cid %" Pd "-%" Pd " %s-%s", cids().cid_start, cids().cid_end,
-             name.ToCString(), name2.ToCString());
+    f->Printf(", cid %" Pd "-%" Pd " %s-%s", cids().cid_start, cids().cid_end,
+              name.ToCString(), name2.ToCString());
   }
 }
 
-void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const {
+void CheckClassInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
   PrintCidsHelper(f, cids_, FlowGraphPrinter::kPrintAll);
   if (IsNullCheck()) {
-    f->Print(" nullcheck");
+    f->AddString(" nullcheck");
   }
 }
 
-void CheckConditionInstr::PrintOperandsTo(BufferFormatter* f) const {
+void CheckConditionInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   comparison()->PrintOperandsTo(f);
 }
 
-void InvokeMathCFunctionInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", MethodRecognizer::KindToCString(recognized_kind_));
+void InvokeMathCFunctionInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s, ", MethodRecognizer::KindToCString(recognized_kind_));
   Definition::PrintOperandsTo(f);
 }
 
 void BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(
-    BufferFormatter* f) const {
+    BaseTextBuffer* f) const {
   const GrowableArray<Definition*>& defns = initial_definitions_;
   if (defns.length() > 0) {
-    f->Print(" {");
+    f->AddString(" {");
     for (intptr_t i = 0; i < defns.length(); ++i) {
       Definition* def = defns[i];
-      f->Print("\n      ");
+      f->AddString("\n      ");
       def->PrintTo(f);
     }
-    f->Print("\n}");
+    f->AddString("\n}");
   }
 }
 
-void GraphEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[graph]:%" Pd, block_id(), GetDeoptId());
+void GraphEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[graph]:%" Pd, block_id(), GetDeoptId());
   BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(f);
 }
 
-void JoinEntryInstr::PrintTo(BufferFormatter* f) const {
+void JoinEntryInstr::PrintTo(BaseTextBuffer* f) const {
   if (try_index() != kInvalidTryIndex) {
-    f->Print("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(", block_id(),
-             try_index(), GetDeoptId());
+    f->Printf("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(", block_id(),
+              try_index(), GetDeoptId());
   } else {
-    f->Print("B%" Pd "[join]:%" Pd " pred(", block_id(), GetDeoptId());
+    f->Printf("B%" Pd "[join]:%" Pd " pred(", block_id(), GetDeoptId());
   }
   for (intptr_t i = 0; i < predecessors_.length(); ++i) {
-    if (i > 0) f->Print(", ");
-    f->Print("B%" Pd, predecessors_[i]->block_id());
+    if (i > 0) f->AddString(", ");
+    f->Printf("B%" Pd, predecessors_[i]->block_id());
   }
-  f->Print(")");
+  f->AddString(")");
   if (phis_ != NULL) {
-    f->Print(" {");
+    f->AddString(" {");
     for (intptr_t i = 0; i < phis_->length(); ++i) {
       if ((*phis_)[i] == NULL) continue;
-      f->Print("\n      ");
+      f->AddString("\n      ");
       (*phis_)[i]->PrintTo(f);
     }
-    f->Print("\n}");
+    f->AddString("\n}");
   }
   if (HasParallelMove()) {
-    f->Print(" ");
+    f->AddString(" ");
     parallel_move()->PrintTo(f);
   }
 }
 
-void IndirectEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[join indirect", block_id());
+void IndirectEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[join indirect", block_id());
   if (try_index() != kInvalidTryIndex) {
-    f->Print(" try_idx %" Pd, try_index());
+    f->Printf(" try_idx %" Pd, try_index());
   }
-  f->Print("]:%" Pd " pred(", GetDeoptId());
+  f->Printf("]:%" Pd " pred(", GetDeoptId());
   for (intptr_t i = 0; i < predecessors_.length(); ++i) {
-    if (i > 0) f->Print(", ");
-    f->Print("B%" Pd, predecessors_[i]->block_id());
+    if (i > 0) f->AddString(", ");
+    f->Printf("B%" Pd, predecessors_[i]->block_id());
   }
-  f->Print(")");
+  f->AddString(")");
   if (phis_ != NULL) {
-    f->Print(" {");
+    f->AddString(" {");
     for (intptr_t i = 0; i < phis_->length(); ++i) {
       if ((*phis_)[i] == NULL) continue;
-      f->Print("\n      ");
+      f->AddString("\n      ");
       (*phis_)[i]->PrintTo(f);
     }
-    f->Print("\n}");
+    f->AddString("\n}");
   }
   if (HasParallelMove()) {
-    f->Print(" ");
+    f->AddString(" ");
     parallel_move()->PrintTo(f);
   }
 }
@@ -935,62 +936,58 @@
   return "?";
 }
 
-void PhiInstr::PrintTo(BufferFormatter* f) const {
+void PhiInstr::PrintTo(BaseTextBuffer* f) const {
   if (HasPairRepresentation()) {
-    f->Print("(v%" Pd ", v%" Pd ") <- phi(", ssa_temp_index(),
-             ssa_temp_index() + 1);
+    f->Printf("(v%" Pd ", v%" Pd ") <- phi(", ssa_temp_index(),
+              ssa_temp_index() + 1);
   } else {
-    f->Print("v%" Pd " <- phi(", ssa_temp_index());
+    f->Printf("v%" Pd " <- phi(", ssa_temp_index());
   }
   for (intptr_t i = 0; i < inputs_.length(); ++i) {
     if (inputs_[i] != NULL) inputs_[i]->PrintTo(f);
-    if (i < inputs_.length() - 1) f->Print(", ");
+    if (i < inputs_.length() - 1) f->AddString(", ");
   }
-  f->Print(")");
-  if (is_alive()) {
-    f->Print(" alive");
-  } else {
-    f->Print(" dead");
-  }
+  f->AddString(")");
+  f->AddString(is_alive() ? " alive" : " dead");
   if (range_ != NULL) {
-    f->Print(" ");
+    f->AddString(" ");
     range_->PrintTo(f);
   }
 
   if (representation() != kNoRepresentation && representation() != kTagged) {
-    f->Print(" %s", RepresentationToCString(representation()));
+    f->Printf(" %s", RepresentationToCString(representation()));
   }
 
   if (HasType()) {
-    f->Print(" %s", TypeAsCString());
+    f->Printf(" %s", TypeAsCString());
   }
 }
 
-void UnboxIntegerInstr::PrintOperandsTo(BufferFormatter* f) const {
+void UnboxIntegerInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   if (is_truncating()) {
-    f->Print("[tr], ");
+    f->AddString("[tr], ");
   }
   Definition::PrintOperandsTo(f);
 }
 
-void IntConverterInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s->%s%s, ", RepresentationToCString(from()),
-           RepresentationToCString(to()), is_truncating() ? "[tr]" : "");
+void IntConverterInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s->%s%s, ", RepresentationToCString(from()),
+            RepresentationToCString(to()), is_truncating() ? "[tr]" : "");
   Definition::PrintOperandsTo(f);
 }
 
-void BitCastInstr::PrintOperandsTo(BufferFormatter* f) const {
+void BitCastInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Definition::PrintOperandsTo(f);
-  f->Print(" (%s -> %s)", RepresentationToCString(from()),
-           RepresentationToCString(to()));
+  f->Printf(" (%s -> %s)", RepresentationToCString(from()),
+            RepresentationToCString(to()));
 }
 
-void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%" Pd, index());
+void ParameterInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%" Pd, index());
 }
 
-void SpecialParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", KindToCString(kind()));
+void SpecialParameterInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s", KindToCString(kind()));
 }
 
 const char* SpecialParameterInstr::ToCString() const {
@@ -1000,125 +997,125 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-void CheckStackOverflowInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("stack=%" Pd ", loop=%" Pd, stack_depth(), loop_depth());
+void CheckStackOverflowInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("stack=%" Pd ", loop=%" Pd, stack_depth(), loop_depth());
 }
 
-void TargetEntryInstr::PrintTo(BufferFormatter* f) const {
+void TargetEntryInstr::PrintTo(BaseTextBuffer* f) const {
   if (try_index() != kInvalidTryIndex) {
-    f->Print("B%" Pd "[target try_idx %" Pd "]:%" Pd, block_id(), try_index(),
-             GetDeoptId());
+    f->Printf("B%" Pd "[target try_idx %" Pd "]:%" Pd, block_id(), try_index(),
+              GetDeoptId());
   } else {
-    f->Print("B%" Pd "[target]:%" Pd, block_id(), GetDeoptId());
+    f->Printf("B%" Pd "[target]:%" Pd, block_id(), GetDeoptId());
   }
   if (HasParallelMove()) {
-    f->Print(" ");
+    f->AddString(" ");
     parallel_move()->PrintTo(f);
   }
 }
 
-void OsrEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[osr entry]:%" Pd " stack_depth=%" Pd, block_id(),
-           GetDeoptId(), stack_depth());
+void OsrEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[osr entry]:%" Pd " stack_depth=%" Pd, block_id(),
+            GetDeoptId(), stack_depth());
   if (HasParallelMove()) {
-    f->Print("\n");
+    f->AddString("\n");
     parallel_move()->PrintTo(f);
   }
   BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(f);
 }
 
-void FunctionEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[function entry]:%" Pd, block_id(), GetDeoptId());
+void FunctionEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[function entry]:%" Pd, block_id(), GetDeoptId());
   if (HasParallelMove()) {
-    f->Print("\n");
+    f->AddString("\n");
     parallel_move()->PrintTo(f);
   }
   BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(f);
 }
 
-void NativeEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[native function entry]:%" Pd, block_id(), GetDeoptId());
+void NativeEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[native function entry]:%" Pd, block_id(), GetDeoptId());
   if (HasParallelMove()) {
-    f->Print("\n");
+    f->AddString("\n");
     parallel_move()->PrintTo(f);
   }
   BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(f);
 }
 
-void ReturnInstr::PrintOperandsTo(BufferFormatter* f) const {
+void ReturnInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Instruction::PrintOperandsTo(f);
   if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
-    f->Print(", yield_index = %" Pd "", yield_index());
+    f->Printf(", yield_index = %" Pd "", yield_index());
   }
 }
 
-void FfiCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print(" pointer=");
+void FfiCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->AddString(" pointer=");
   InputAt(TargetAddressIndex())->PrintTo(f);
   for (intptr_t i = 0, n = InputCount(); i < n - 1; ++i) {
-    f->Print(", ");
+    f->AddString(", ");
     InputAt(i)->PrintTo(f);
-    f->Print(" (@");
+    f->AddString(" (@");
     marshaller_.Location(i).PrintTo(f);
-    f->Print(")");
+    f->AddString(")");
   }
 }
 
-void EnterHandleScopeInstr::PrintOperandsTo(BufferFormatter* f) const {
+void EnterHandleScopeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   if (kind_ == Kind::kEnterHandleScope) {
-    f->Print("<enter handle scope>");
+    f->AddString("<enter handle scope>");
   } else {
-    f->Print("<get top api scope>");
+    f->AddString("<get top api scope>");
   }
 }
 
-void NativeReturnInstr::PrintOperandsTo(BufferFormatter* f) const {
+void NativeReturnInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
-  f->Print(" (@");
+  f->AddString(" (@");
   marshaller_.Location(compiler::ffi::kResultIndex).PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void NativeParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
+void NativeParameterInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   // Where the calling convention puts it.
   marshaller_.Location(index_).PrintTo(f);
-  f->Print(" at ");
+  f->AddString(" at ");
   // Where the arguments are when pushed on the stack.
   marshaller_.NativeLocationOfNativeParameter(index_).PrintTo(f);
 }
 
-void CatchBlockEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[target catch try_idx %" Pd " catch_try_idx %" Pd "]",
-           block_id(), try_index(), catch_try_index());
+void CatchBlockEntryInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("B%" Pd "[target catch try_idx %" Pd " catch_try_idx %" Pd "]",
+            block_id(), try_index(), catch_try_index());
   if (HasParallelMove()) {
-    f->Print("\n");
+    f->AddString("\n");
     parallel_move()->PrintTo(f);
   }
 
   BlockEntryWithInitialDefs::PrintInitialDefinitionsTo(f);
 }
 
-void LoadIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s[", RegisterNames::RegisterName(base_reg()));
+void LoadIndexedUnsafeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s[", RegisterNames::RegisterName(base_reg()));
   index()->PrintTo(f);
-  f->Print(" + %" Pd "]", offset());
+  f->Printf(" + %" Pd "]", offset());
 }
 
-void StoreIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s[", RegisterNames::RegisterName(base_reg()));
+void StoreIndexedUnsafeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
+  f->Printf("%s[", RegisterNames::RegisterName(base_reg()));
   index()->PrintTo(f);
-  f->Print(" + %" Pd "], ", offset());
+  f->Printf(" + %" Pd "], ", offset());
   value()->PrintTo(f);
 }
 
-void StoreIndexedInstr::PrintOperandsTo(BufferFormatter* f) const {
+void StoreIndexedInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   Instruction::PrintOperandsTo(f);
   if (!ShouldEmitStoreBarrier()) {
-    f->Print(", NoStoreBarrier");
+    f->AddString(", NoStoreBarrier");
   }
 }
 
-void TailCallInstr::PrintOperandsTo(BufferFormatter* f) const {
+void TailCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   const char* name = "<unknown code>";
   if (code_.IsStubCode()) {
     name = StubCode::NameOfStub(code_.EntryPoint());
@@ -1129,78 +1126,78 @@
                  .ToFullyQualifiedCString();
     }
   }
-  f->Print("%s(", name);
+  f->Printf("%s(", name);
   InputAt(0)->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void PushArgumentInstr::PrintOperandsTo(BufferFormatter* f) const {
+void PushArgumentInstr::PrintOperandsTo(BaseTextBuffer* f) const {
   value()->PrintTo(f);
 }
 
-void GotoInstr::PrintTo(BufferFormatter* f) const {
+void GotoInstr::PrintTo(BaseTextBuffer* f) const {
   if (HasParallelMove()) {
     parallel_move()->PrintTo(f);
-    f->Print(" ");
+    f->AddString(" ");
   }
   if (GetDeoptId() != DeoptId::kNone) {
-    f->Print("goto:%" Pd " B%" Pd "", GetDeoptId(), successor()->block_id());
+    f->Printf("goto:%" Pd " B%" Pd "", GetDeoptId(), successor()->block_id());
   } else {
-    f->Print("goto: B%" Pd "", successor()->block_id());
+    f->Printf("goto: B%" Pd "", successor()->block_id());
   }
 }
 
-void IndirectGotoInstr::PrintTo(BufferFormatter* f) const {
+void IndirectGotoInstr::PrintTo(BaseTextBuffer* f) const {
   if (GetDeoptId() != DeoptId::kNone) {
-    f->Print("igoto:%" Pd "(", GetDeoptId());
+    f->Printf("igoto:%" Pd "(", GetDeoptId());
   } else {
-    f->Print("igoto:(");
+    f->AddString("igoto:(");
   }
   InputAt(0)->PrintTo(f);
-  f->Print(")");
+  f->AddString(")");
 }
 
-void BranchInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("%s ", DebugName());
-  f->Print("if ");
+void BranchInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("%s ", DebugName());
+  f->AddString("if ");
   comparison()->PrintTo(f);
 
-  f->Print(" goto (%" Pd ", %" Pd ")", true_successor()->block_id(),
-           false_successor()->block_id());
+  f->Printf(" goto (%" Pd ", %" Pd ")", true_successor()->block_id(),
+            false_successor()->block_id());
 }
 
-void ParallelMoveInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("%s ", DebugName());
+void ParallelMoveInstr::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("%s ", DebugName());
   for (intptr_t i = 0; i < moves_.length(); i++) {
-    if (i != 0) f->Print(", ");
+    if (i != 0) f->AddString(", ");
     moves_[i]->dest().PrintTo(f);
-    f->Print(" <- ");
+    f->AddString(" <- ");
     moves_[i]->src().PrintTo(f);
   }
 }
 
-void Utf8ScanInstr::PrintTo(BufferFormatter* f) const {
+void Utf8ScanInstr::PrintTo(BaseTextBuffer* f) const {
   Definition::PrintTo(f);
-  f->Print(" [%s]", scan_flags_field_.Name());
+  f->Printf(" [%s]", scan_flags_field_.Name());
 }
 
-void Environment::PrintTo(BufferFormatter* f) const {
-  f->Print(" env={ ");
+void Environment::PrintTo(BaseTextBuffer* f) const {
+  f->AddString(" env={ ");
   int arg_count = 0;
   for (intptr_t i = 0; i < values_.length(); ++i) {
-    if (i > 0) f->Print(", ");
+    if (i > 0) f->AddString(", ");
     if (values_[i]->definition()->IsPushArgument()) {
-      f->Print("a%d", arg_count++);
+      f->Printf("a%d", arg_count++);
     } else {
       values_[i]->PrintTo(f);
     }
     if ((locations_ != NULL) && !locations_[i].IsInvalid()) {
-      f->Print(" [");
+      f->AddString(" [");
       locations_[i].PrintTo(f);
-      f->Print("]");
+      f->AddString("]");
     }
   }
-  f->Print(" }");
+  f->AddString(" }");
   if (outer_ != NULL) outer_->PrintTo(f);
 }
 
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index 309224d..5e6fc92 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -10,6 +10,7 @@
 #include "vm/compiler/method_recognizer.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
+#include "vm/zone_text_buffer.h"
 
 namespace dart {
 
@@ -75,14 +76,9 @@
   object_store_->set_llvm_constant_hash_table(llvm_constant_map_.Release());
 }
 
-void FlowGraphSerializer::SerializeToBuffer(const FlowGraph* flow_graph,
-                                            TextBuffer* buffer) {
-  SerializeToBuffer(Thread::Current()->zone(), flow_graph, buffer);
-}
-
 void FlowGraphSerializer::SerializeToBuffer(Zone* zone,
                                             const FlowGraph* flow_graph,
-                                            TextBuffer* buffer) {
+                                            BaseTextBuffer* buffer) {
   ASSERT(buffer != nullptr);
   auto const sexp = SerializeToSExp(zone, flow_graph);
   if (FLAG_pretty_print_serialization) {
@@ -93,10 +89,6 @@
   buffer->AddString("\n\n");
 }
 
-SExpression* FlowGraphSerializer::SerializeToSExp(const FlowGraph* flow_graph) {
-  return SerializeToSExp(Thread::Current()->zone(), flow_graph);
-}
-
 SExpression* FlowGraphSerializer::SerializeToSExp(Zone* zone,
                                                   const FlowGraph* flow_graph) {
   FlowGraphSerializer serializer(zone, flow_graph);
@@ -163,7 +155,7 @@
   return new (zone()) SExpSymbol(OS::SCreate(zone(), "B%" Pd "", block_id));
 }
 
-void FlowGraphSerializer::SerializeCanonicalName(TextBuffer* b,
+void FlowGraphSerializer::SerializeCanonicalName(BaseTextBuffer* b,
                                                  const Object& obj) {
   ASSERT(!obj.IsNull());
   if (obj.IsFunction()) {
@@ -223,9 +215,9 @@
 
 SExpression* FlowGraphSerializer::CanonicalNameToSExp(const Object& obj) {
   ASSERT(!obj.IsNull());
-  TextBuffer b(100);
+  ZoneTextBuffer b(zone_, 100);
   SerializeCanonicalName(&b, obj);
-  return new (zone()) SExpSymbol(OS::SCreate(zone(), "%s", b.buf()));
+  return new (zone()) SExpSymbol(b.buffer());
 }
 
 SExpSymbol* FlowGraphSerializer::BlockEntryKindToTag(BlockEntryKind k) {
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h
index 8a65fad3..c5d8d6f 100644
--- a/runtime/vm/compiler/backend/il_serializer.h
+++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -50,12 +50,9 @@
   SExpSymbol* BlockEntryKindToTag(BlockEntryKind k);
   static bool BlockEntryKindHasInitialDefs(BlockEntryKind kind);
 
-  static void SerializeToBuffer(const FlowGraph* flow_graph,
-                                TextBuffer* buffer);
   static void SerializeToBuffer(Zone* zone,
                                 const FlowGraph* flow_graph,
-                                TextBuffer* buffer);
-  static SExpression* SerializeToSExp(const FlowGraph* flow_graph);
+                                BaseTextBuffer* buffer);
   static SExpression* SerializeToSExp(Zone* zone, const FlowGraph* flow_graph);
 
   const FlowGraph* flow_graph() const { return flow_graph_; }
@@ -69,7 +66,7 @@
   SExpression* UseToSExp(const Definition* definition);
 
   // Helper method for creating canonical names.
-  void SerializeCanonicalName(TextBuffer* b, const Object& obj);
+  void SerializeCanonicalName(BaseTextBuffer* b, const Object& obj);
 
   // Methods for serializing Dart values. If the argument
   // value is the null object, the null pointer is returned.
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 8d7c759..2c40969 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -249,24 +249,24 @@
   return "?";
 }
 
-void Location::PrintTo(BufferFormatter* f) const {
+void Location::PrintTo(BaseTextBuffer* f) const {
   if (!FLAG_support_il_printer) {
     return;
   }
   if (kind() == kStackSlot) {
-    f->Print("S%+" Pd "", stack_index());
+    f->Printf("S%+" Pd "", stack_index());
   } else if (kind() == kDoubleStackSlot) {
-    f->Print("DS%+" Pd "", stack_index());
+    f->Printf("DS%+" Pd "", stack_index());
   } else if (kind() == kQuadStackSlot) {
-    f->Print("QS%+" Pd "", stack_index());
+    f->Printf("QS%+" Pd "", stack_index());
   } else if (IsPairLocation()) {
-    f->Print("(");
+    f->AddString("(");
     AsPairLocation()->At(0).PrintTo(f);
-    f->Print(", ");
+    f->AddString(", ");
     AsPairLocation()->At(1).PrintTo(f);
-    f->Print(")");
+    f->AddString(")");
   } else {
-    f->Print("%s", Name());
+    f->Printf("%s", Name());
   }
 }
 
@@ -371,34 +371,34 @@
   return loc;
 }
 
-void LocationSummary::PrintTo(BufferFormatter* f) const {
+void LocationSummary::PrintTo(BaseTextBuffer* f) const {
   if (!FLAG_support_il_printer) {
     return;
   }
   if (input_count() > 0) {
-    f->Print(" (");
+    f->AddString(" (");
     for (intptr_t i = 0; i < input_count(); i++) {
-      if (i != 0) f->Print(", ");
+      if (i != 0) f->AddString(", ");
       in(i).PrintTo(f);
     }
-    f->Print(")");
+    f->AddString(")");
   }
 
   if (temp_count() > 0) {
-    f->Print(" [");
+    f->AddString(" [");
     for (intptr_t i = 0; i < temp_count(); i++) {
-      if (i != 0) f->Print(", ");
+      if (i != 0) f->AddString(", ");
       temp(i).PrintTo(f);
     }
-    f->Print("]");
+    f->AddString("]");
   }
 
   if (!out(0).IsInvalid()) {
-    f->Print(" => ");
+    f->AddString(" => ");
     out(0).PrintTo(f);
   }
 
-  if (always_calls()) f->Print(" C");
+  if (always_calls()) f->AddString(" C");
 }
 
 #if defined(DEBUG)
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index d685250..34edf4c 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -18,7 +18,7 @@
 
 namespace dart {
 
-class BufferFormatter;
+class BaseTextBuffer;
 class ConstantInstr;
 class Definition;
 class PairLocation;
@@ -351,7 +351,7 @@
   intptr_t ToStackSlotOffset() const;
 
   const char* Name() const;
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
   void Print() const;
   const char* ToCString() const;
 
@@ -723,7 +723,7 @@
     return contains_call_ == kCallOnSharedSlowPath;
   }
 
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
 
   static LocationSummary* Make(Zone* zone,
                                intptr_t input_count,
diff --git a/runtime/vm/compiler/backend/loops.cc b/runtime/vm/compiler/backend/loops.cc
index 21a4a77..4ff2dc8 100644
--- a/runtime/vm/compiler/backend/loops.cc
+++ b/runtime/vm/compiler/backend/loops.cc
@@ -941,28 +941,32 @@
   return false;
 }
 
-const char* InductionVar::ToCString() const {
-  char buffer[1024];
-  BufferFormatter f(buffer, sizeof(buffer));
+void InductionVar::PrintTo(BaseTextBuffer* f) const {
   switch (kind_) {
     case kInvariant:
       if (mult_ != 0) {
-        f.Print("(%" Pd64 " + %" Pd64 " x %.4s)", offset_, mult_,
-                def_->ToCString());
+        f->Printf("(%" Pd64 " + %" Pd64 " x %.4s)", offset_, mult_,
+                  def_->ToCString());
       } else {
-        f.Print("%" Pd64, offset_);
+        f->Printf("%" Pd64, offset_);
       }
       break;
     case kLinear:
-      f.Print("LIN(%s + %s * i)", initial_->ToCString(), next_->ToCString());
+      f->Printf("LIN(%s + %s * i)", initial_->ToCString(), next_->ToCString());
       break;
     case kWrapAround:
-      f.Print("WRAP(%s, %s)", initial_->ToCString(), next_->ToCString());
+      f->Printf("WRAP(%s, %s)", initial_->ToCString(), next_->ToCString());
       break;
     case kPeriodic:
-      f.Print("PERIOD(%s, %s)", initial_->ToCString(), next_->ToCString());
+      f->Printf("PERIOD(%s, %s)", initial_->ToCString(), next_->ToCString());
       break;
   }
+}
+
+const char* InductionVar::ToCString() const {
+  char buffer[1024];
+  BufferFormatter f(buffer, sizeof(buffer));
+  PrintTo(&f);
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
@@ -1112,24 +1116,28 @@
   return false;
 }
 
-const char* LoopInfo::ToCString() const {
-  char buffer[1024];
-  BufferFormatter f(buffer, sizeof(buffer));
-  f.Print("%*c", static_cast<int>(2 * NestingDepth()), ' ');
-  f.Print("loop%" Pd " B%" Pd " ", id_, header_->block_id());
+void LoopInfo::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("%*c", static_cast<int>(2 * NestingDepth()), ' ');
+  f->Printf("loop%" Pd " B%" Pd " ", id_, header_->block_id());
   intptr_t num_blocks = 0;
   for (BitVector::Iterator it(blocks_); !it.Done(); it.Advance()) {
     num_blocks++;
   }
-  f.Print("#blocks=%" Pd, num_blocks);
-  if (outer_ != nullptr) f.Print(" outer=%" Pd, outer_->id_);
-  if (inner_ != nullptr) f.Print(" inner=%" Pd, inner_->id_);
-  if (next_ != nullptr) f.Print(" next=%" Pd, next_->id_);
-  f.Print(" [");
+  f->Printf("#blocks=%" Pd, num_blocks);
+  if (outer_ != nullptr) f->Printf(" outer=%" Pd, outer_->id_);
+  if (inner_ != nullptr) f->Printf(" inner=%" Pd, inner_->id_);
+  if (next_ != nullptr) f->Printf(" next=%" Pd, next_->id_);
+  f->AddString(" [");
   for (intptr_t i = 0, n = back_edges_.length(); i < n; i++) {
-    f.Print(" B%" Pd, back_edges_[i]->block_id());
+    f->Printf(" B%" Pd, back_edges_[i]->block_id());
   }
-  f.Print(" ]");
+  f->AddString(" ]");
+}
+
+const char* LoopInfo::ToCString() const {
+  char buffer[1024];
+  BufferFormatter f(buffer, sizeof(buffer));
+  PrintTo(&f);
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
diff --git a/runtime/vm/compiler/backend/loops.h b/runtime/vm/compiler/backend/loops.h
index 704508b..9a70102 100644
--- a/runtime/vm/compiler/backend/loops.h
+++ b/runtime/vm/compiler/backend/loops.h
@@ -128,6 +128,7 @@
   const GrowableArray<Bound>& bounds() { return bounds_; }
 
   // For debugging.
+  void PrintTo(BaseTextBuffer* f) const;
   const char* ToCString() const;
 
   // Returns true if x is invariant.
@@ -258,6 +259,7 @@
   LoopInfo* next() const { return next_; }
 
   // For debugging.
+  void PrintTo(BaseTextBuffer* f) const;
   const char* ToCString() const;
 
  private:
diff --git a/runtime/vm/compiler/backend/loops_test.cc b/runtime/vm/compiler/backend/loops_test.cc
index 3898334..8f1201e 100644
--- a/runtime/vm/compiler/backend/loops_test.cc
+++ b/runtime/vm/compiler/backend/loops_test.cc
@@ -24,12 +24,12 @@
 namespace dart {
 
 // Helper method to construct an induction debug string for loop hierarchy.
-void TestString(BufferFormatter* f,
+void TestString(BaseTextBuffer* f,
                 LoopInfo* loop,
                 const GrowableArray<BlockEntryInstr*>& preorder) {
   for (; loop != nullptr; loop = loop->next()) {
     intptr_t depth = loop->NestingDepth();
-    f->Print("%*c[%" Pd "\n", static_cast<int>(2 * depth), ' ', loop->id());
+    f->Printf("%*c[%" Pd "\n", static_cast<int>(2 * depth), ' ', loop->id());
     for (BitVector::Iterator block_it(loop->blocks()); !block_it.Done();
          block_it.Advance()) {
       BlockEntryInstr* block = preorder[block_it.Current()];
@@ -38,12 +38,12 @@
           InductionVar* induc = loop->LookupInduction(it.Current());
           if (induc != nullptr) {
             // Obtain the debug string for induction and bounds.
-            f->Print("%*c%s", static_cast<int>(2 * depth), ' ',
-                     induc->ToCString());
+            f->Printf("%*c%s", static_cast<int>(2 * depth), ' ',
+                      induc->ToCString());
             for (auto bound : induc->bounds()) {
-              f->Print(" %s", bound.limit_->ToCString());
+              f->Printf(" %s", bound.limit_->ToCString());
             }
-            f->Print("\n");
+            f->AddString("\n");
           }
         }
       }
@@ -51,13 +51,13 @@
         InductionVar* induc =
             loop->LookupInduction(it.Current()->AsDefinition());
         if (InductionVar::IsInduction(induc)) {
-          f->Print("%*c%s\n", static_cast<int>(2 * depth), ' ',
-                   induc->ToCString());
+          f->Printf("%*c%s\n", static_cast<int>(2 * depth), ' ',
+                    induc->ToCString());
         }
       }
     }
     TestString(f, loop->inner(), preorder);
-    f->Print("%*c]\n", static_cast<int>(2 * depth), ' ');
+    f->Printf("%*c]\n", static_cast<int>(2 * depth), ' ');
   }
 }
 
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index a802eaa..281e3c9 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -1310,22 +1310,22 @@
   }
 
 #ifndef PRODUCT
-  static void PrettyPrintIndexBoundRecursively(BufferFormatter* f,
+  static void PrettyPrintIndexBoundRecursively(BaseTextBuffer* f,
                                                Definition* index_bound) {
     BinarySmiOpInstr* binary_op = index_bound->AsBinarySmiOp();
     if (binary_op != NULL) {
-      f->Print("(");
+      f->AddString("(");
       PrettyPrintIndexBoundRecursively(f, binary_op->left()->definition());
-      f->Print(" %s ", Token::Str(binary_op->op_kind()));
+      f->Printf(" %s ", Token::Str(binary_op->op_kind()));
       PrettyPrintIndexBoundRecursively(f, binary_op->right()->definition());
-      f->Print(")");
+      f->AddString(")");
     } else if (index_bound->IsConstant()) {
-      f->Print("%" Pd "",
-               Smi::Cast(index_bound->AsConstant()->value()).Value());
+      f->Printf("%" Pd "",
+                Smi::Cast(index_bound->AsConstant()->value()).Value());
     } else {
-      f->Print("v%" Pd "", index_bound->ssa_temp_index());
+      f->Printf("v%" Pd "", index_bound->ssa_temp_index());
     }
-    f->Print(" {%s}", Range::ToCString(index_bound->range()));
+    f->Printf(" {%s}", Range::ToCString(index_bound->range()));
   }
 
   static const char* IndexBoundToCString(Definition* index_bound) {
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index 0ed4936..0f8cc42 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -244,7 +244,7 @@
   // IsSymbol() -> upper bound computed from definition + offset.
   RangeBoundary UpperBound() const;
 
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
   const char* ToCString() const;
   SExpression* ToSExpression(FlowGraphSerializer* s);
 
@@ -345,7 +345,7 @@
                  RangeBoundary::MaxConstant(size));
   }
 
-  void PrintTo(BufferFormatter* f) const;
+  void PrintTo(BaseTextBuffer* f) const;
   static const char* ToCString(const Range* range);
   SExpression* ToSExpression(FlowGraphSerializer* s);
 
diff --git a/runtime/vm/compiler/backend/sexpression.cc b/runtime/vm/compiler/backend/sexpression.cc
index 12006b4..7307ef3 100644
--- a/runtime/vm/compiler/backend/sexpression.cc
+++ b/runtime/vm/compiler/backend/sexpression.cc
@@ -7,6 +7,7 @@
 #include <ctype.h>
 #include "platform/utils.h"
 #include "vm/double_conversion.h"
+#include "vm/zone_text_buffer.h"
 
 namespace dart {
 
@@ -18,13 +19,9 @@
 }
 
 const char* SExpression::ToCString(Zone* zone) const {
-  TextBuffer buf(1 * KB);
+  ZoneTextBuffer buf(zone, 1 * KB);
   SerializeToLine(&buf);
-  auto const buf_len = buf.length();
-  char* ret = zone->Alloc<char>(buf_len + 1);
-  strncpy(ret, buf.buf(), buf_len);
-  ret[buf_len] = '\0';
-  return ret;
+  return buf.buffer();
 }
 
 bool SExpBool::Equals(SExpression* sexp) const {
@@ -36,7 +33,7 @@
   return value() == val;
 }
 
-void SExpBool::SerializeToLine(TextBuffer* buffer) const {
+void SExpBool::SerializeToLine(BaseTextBuffer* buffer) const {
   buffer->AddString(value() ? SExpParser::kBoolTrueSymbol
                             : SExpParser::kBoolFalseSymbol);
 }
@@ -50,7 +47,7 @@
   return value() == val;
 }
 
-void SExpDouble::SerializeToLine(TextBuffer* buffer) const {
+void SExpDouble::SerializeToLine(BaseTextBuffer* buffer) const {
   // Use existing Dart serialization for Doubles.
   const intptr_t kBufSize = 128;
   char strbuf[kBufSize];
@@ -67,7 +64,7 @@
   return value() == val;
 }
 
-void SExpInteger::SerializeToLine(TextBuffer* buffer) const {
+void SExpInteger::SerializeToLine(BaseTextBuffer* buffer) const {
   buffer->Printf("%" Pd64 "", value());
 }
 
@@ -80,10 +77,12 @@
   return strcmp(value(), str) == 0;
 }
 
-void SExpString::SerializeToLine(TextBuffer* buffer) const {
-  buffer->AddChar('"');
-  buffer->AddEscapedString(value());
-  buffer->AddChar('"');
+void SExpString::SerializeToLine(BaseTextBuffer* buffer) const {
+  TextBuffer buf(80);
+  buf.AddChar('"');
+  buf.AddEscapedString(value());
+  buf.AddChar('"');
+  buffer->AddString(buf.buffer());
 }
 
 bool SExpSymbol::Equals(SExpression* sexp) const {
@@ -95,7 +94,7 @@
   return strcmp(value(), str) == 0;
 }
 
-void SExpSymbol::SerializeToLine(TextBuffer* buffer) const {
+void SExpSymbol::SerializeToLine(BaseTextBuffer* buffer) const {
   buffer->AddString(value());
 }
 
@@ -128,9 +127,9 @@
 const char* const SExpList::kExtraIndent = "  ";
 
 static intptr_t HandleLineBreaking(Zone* zone,
-                                   TextBuffer* buffer,
+                                   BaseTextBuffer* buffer,
                                    SExpression* element,
-                                   TextBuffer* line_buffer,
+                                   BaseTextBuffer* line_buffer,
                                    const char* sub_indent,
                                    intptr_t width,
                                    bool leading_space,
@@ -141,7 +140,7 @@
 
   if ((leading_length + single_line_width) < remaining) {
     if (leading_space) buffer->AddChar(' ');
-    buffer->AddString(line_buffer->buf());
+    buffer->AddString(line_buffer->buffer());
     line_buffer->Clear();
     return remaining - (leading_length + single_line_width);
   }
@@ -150,7 +149,7 @@
   const intptr_t line_used = buffer->length() - old_length + 1;
   remaining = width - line_used;
   if ((single_line_width < remaining) || element->IsAtom()) {
-    buffer->AddString(line_buffer->buf());
+    buffer->AddString(line_buffer->buffer());
     line_buffer->Clear();
     return remaining - single_line_width;
   }
@@ -161,7 +160,7 @@
 
 // Assumes that we are starting on a line after [indent] amount of space.
 void SExpList::SerializeTo(Zone* zone,
-                           TextBuffer* buffer,
+                           BaseTextBuffer* buffer,
                            const char* indent,
                            intptr_t width) const {
   TextBuffer single_line(width);
@@ -177,14 +176,14 @@
   if (!extra_info_.IsEmpty()) {
     SerializeExtraInfoToLine(&single_line);
     if (single_line.length() < remaining - 1) {
-      buffer->Printf(" %s", single_line.buf());
+      buffer->Printf(" %s", single_line.buffer());
     } else {
       const intptr_t old_length = buffer->length();
       buffer->Printf("\n%s", sub_indent);
       const intptr_t line_used = buffer->length() - old_length + 1;
       remaining = width - line_used;
       if (single_line.length() < remaining) {
-        buffer->AddString(single_line.buf());
+        buffer->AddString(single_line.buffer());
       } else {
         SerializeExtraInfoTo(zone, buffer, sub_indent, width);
       }
@@ -193,7 +192,7 @@
   buffer->AddChar(')');
 }
 
-void SExpList::SerializeToLine(TextBuffer* buffer) const {
+void SExpList::SerializeToLine(BaseTextBuffer* buffer) const {
   buffer->AddChar('(');
   for (intptr_t i = 0; i < contents_.length(); i++) {
     if (i != 0) buffer->AddChar(' ');
@@ -207,7 +206,7 @@
 }
 
 void SExpList::SerializeExtraInfoTo(Zone* zone,
-                                    TextBuffer* buffer,
+                                    BaseTextBuffer* buffer,
                                     const char* indent,
                                     int width) const {
   const char* sub_indent = OS::SCreate(zone, "%s%s", indent, kExtraIndent);
@@ -226,7 +225,7 @@
   buffer->Printf("\n%s}", indent);
 }
 
-void SExpList::SerializeExtraInfoToLine(TextBuffer* buffer) const {
+void SExpList::SerializeExtraInfoToLine(BaseTextBuffer* buffer) const {
   buffer->AddString("{");
   auto it = ExtraIterator();
   while (auto kv = it.Next()) {
diff --git a/runtime/vm/compiler/backend/sexpression.h b/runtime/vm/compiler/backend/sexpression.h
index 40b79a3..6bdc36e 100644
--- a/runtime/vm/compiler/backend/sexpression.h
+++ b/runtime/vm/compiler/backend/sexpression.h
@@ -81,10 +81,10 @@
   virtual const char* DebugName() const = 0;
   virtual bool Equals(SExpression* sexp) const = 0;
   virtual void SerializeTo(Zone* zone,
-                           TextBuffer* buffer,
+                           BaseTextBuffer* buffer,
                            const char* indent,
                            intptr_t width = 80) const = 0;
-  virtual void SerializeToLine(TextBuffer* buffer) const = 0;
+  virtual void SerializeToLine(BaseTextBuffer* buffer) const = 0;
 
  private:
   // Starting character position of the s-expression in the original
@@ -100,7 +100,7 @@
   virtual const SExpAtom* AsAtom() const { return this; }
   // No atoms have sub-elements, so they always print to a single line.
   virtual void SerializeTo(Zone* zone,
-                           TextBuffer* buffer,
+                           BaseTextBuffer* buffer,
                            const char* indent,
                            intptr_t width = 80) const {
     SerializeToLine(buffer);
@@ -124,7 +124,7 @@
     value_type value() const { return val_; }                                  \
     virtual bool Equals(SExpression* sexp) const;                              \
     bool Equals(value_type val) const;                                         \
-    virtual void SerializeToLine(TextBuffer* buffer) const;                    \
+    virtual void SerializeToLine(BaseTextBuffer* buffer) const;                \
     DEFINE_S_EXPRESSION_TYPE_CHECK(name)                                       \
    private:                                                                    \
     value_type const val_;                                                     \
@@ -168,20 +168,20 @@
   DEFINE_S_EXPRESSION_TYPE_CHECK(List)
   virtual bool Equals(SExpression* sexp) const;
   virtual void SerializeTo(Zone* zone,
-                           TextBuffer* buffer,
+                           BaseTextBuffer* buffer,
                            const char* indent,
                            intptr_t width = 80) const;
-  virtual void SerializeToLine(TextBuffer* buffer) const;
+  virtual void SerializeToLine(BaseTextBuffer* buffer) const;
 
  private:
   static const char* const kElemIndent;
   static const char* const kExtraIndent;
 
   void SerializeExtraInfoTo(Zone* zone,
-                            TextBuffer* buffer,
+                            BaseTextBuffer* buffer,
                             const char* indent,
                             int width) const;
-  void SerializeExtraInfoToLine(TextBuffer* buffer) const;
+  void SerializeExtraInfoToLine(BaseTextBuffer* buffer) const;
 
   ZoneGrowableArray<SExpression*> contents_;
   ExtraInfoHashMap extra_info_;
diff --git a/runtime/vm/compiler/backend/sexpression_test.cc b/runtime/vm/compiler/backend/sexpression_test.cc
index db0b1ed..8c0edac 100644
--- a/runtime/vm/compiler/backend/sexpression_test.cc
+++ b/runtime/vm/compiler/backend/sexpression_test.cc
@@ -191,13 +191,13 @@
 
   TextBuffer buf(100);
   sexp->SerializeTo(zone, &buf, "", 9999);
-  SExpression* round_trip = SExpression::FromCString(zone, buf.buf());
+  SExpression* round_trip = SExpression::FromCString(zone, buf.buffer());
   CheckDeserializedSExpParts(round_trip);
   EXPECT(sexp->Equals(round_trip));
 
   char* const old_serialization = buf.Steal();
   round_trip->SerializeTo(zone, &buf, "", 9999);
-  char* const new_serialization = buf.buf();
+  char* const new_serialization = buf.buffer();
   EXPECT_STREQ(old_serialization, new_serialization);
   free(old_serialization);
 }
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index f314bd3..f59bc7c 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -197,7 +197,7 @@
 
   Slot(Kind kind,
        int8_t bits,
-       int16_t cid,
+       ClassIdTagType cid,
        intptr_t offset_in_bytes,
        const void* data,
        const AbstractType* static_type)
@@ -229,7 +229,7 @@
 
   const Kind kind_;
   const int8_t flags_;  // is_immutable, is_nullable
-  const int16_t cid_;   // Concrete cid of a value or kDynamicCid.
+  const ClassIdTagType cid_;  // Concrete cid of a value or kDynamicCid.
 
   const intptr_t offset_in_bytes_;
 
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 8d2bb7a..f3fcd25 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -877,10 +877,10 @@
   return CanPotentiallyBeSmi(*ToAbstractType(), /*recurse=*/true);
 }
 
-void CompileType::PrintTo(BufferFormatter* f) const {
+void CompileType::PrintTo(BaseTextBuffer* f) const {
   const char* type_name = "?";
   if (IsNone()) {
-    f->Print("T{}");
+    f->AddString("T{}");
     return;
   } else if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) {
     const Class& cls =
@@ -894,7 +894,7 @@
     type_name = "!null";
   }
 
-  f->Print("T{%s%s}", type_name, is_nullable_ ? "?" : "");
+  f->Printf("T{%s%s}", type_name, is_nullable_ ? "?" : "");
 }
 
 const char* CompileType::ToCString() const {
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index c84bdaf..2c7f4dc 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -774,18 +774,16 @@
       new (Z) Value(receiver), slot, call->token_pos(), calls_initializer,
       calls_initializer ? call->deopt_id() : DeoptId::kNone);
 
-  Environment* load_env = nullptr;
-  if (calls_initializer) {
-    // Drop getter argument from the environment as it is not
-    // pushed on the stack when initializer is called.
-    load_env =
-        call->env()->DeepCopy(Z, call->env()->Length() - call->ArgumentCount());
+  // Note that this is a case of LoadField -> InstanceCall lazy deopt.
+  // Which means that we don't need to remove arguments from the environment
+  // because normal getter call expects receiver pushed (unlike the case
+  // of LoadField -> LoadField deoptimization handled by
+  // FlowGraph::AttachEnvironment).
+  if (!calls_initializer) {
+    // If we don't call initializer then we don't need an environment.
+    call->RemoveEnvironment();
   }
-  call->RemoveEnvironment();
   ReplaceCall(call, load);
-  if (calls_initializer) {
-    load_env->DeepCopyTo(Z, load);
-  }
 
   if (load->slot().nullable_cid() != kDynamicCid) {
     // Reset value types if we know concrete cid.
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index 691ef28..f253ffc 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -562,7 +562,7 @@
     FlowGraphSerializer::SerializeToBuffer(stack_zone.GetZone(), flow_graph,
                                            &buffer);
 
-    file_write(buffer.buf(), buffer.length(), stream);
+    file_write(buffer.buffer(), buffer.length(), stream);
   }
 });
 #endif
diff --git a/runtime/vm/compiler/ffi/native_location.cc b/runtime/vm/compiler/ffi/native_location.cc
index 0c7fb16..bbc762e 100644
--- a/runtime/vm/compiler/ffi/native_location.cc
+++ b/runtime/vm/compiler/ffi/native_location.cc
@@ -210,47 +210,46 @@
   return compiler::Address(loc.base_register(), loc.offset_in_bytes());
 }
 
-static void PrintRepresentations(BufferFormatter* f,
-                                 const NativeLocation& loc) {
-  f->Print(" ");
+static void PrintRepresentations(BaseTextBuffer* f, const NativeLocation& loc) {
+  f->AddString(" ");
   loc.container_type().PrintTo(f);
   if (!loc.container_type().Equals(loc.payload_type())) {
-    f->Print("[");
+    f->AddString("[");
     loc.payload_type().PrintTo(f);
-    f->Print("]");
+    f->AddString("]");
   }
 }
 
-void NativeLocation::PrintTo(BufferFormatter* f) const {
-  f->Print("I");
+void NativeLocation::PrintTo(BaseTextBuffer* f) const {
+  f->AddString("I");
   PrintRepresentations(f, *this);
 }
 
-void NativeRegistersLocation::PrintTo(BufferFormatter* f) const {
+void NativeRegistersLocation::PrintTo(BaseTextBuffer* f) const {
   if (num_regs() == 1) {
-    f->Print("%s", RegisterNames::RegisterName(regs_->At(0)));
+    f->Printf("%s", RegisterNames::RegisterName(regs_->At(0)));
   } else {
-    f->Print("(");
+    f->AddString("(");
     for (intptr_t i = 0; i < num_regs(); i++) {
-      if (i != 0) f->Print(", ");
-      f->Print("%s", RegisterNames::RegisterName(regs_->At(i)));
+      if (i != 0) f->Printf(", ");
+      f->Printf("%s", RegisterNames::RegisterName(regs_->At(i)));
     }
-    f->Print(")");
+    f->AddString(")");
   }
   PrintRepresentations(f, *this);
 }
 
-void NativeFpuRegistersLocation::PrintTo(BufferFormatter* f) const {
+void NativeFpuRegistersLocation::PrintTo(BaseTextBuffer* f) const {
   switch (fpu_reg_kind()) {
     case kQuadFpuReg:
-      f->Print("%s", RegisterNames::FpuRegisterName(fpu_reg()));
+      f->Printf("%s", RegisterNames::FpuRegisterName(fpu_reg()));
       break;
 #if defined(TARGET_ARCH_ARM)
     case kDoubleFpuReg:
-      f->Print("%s", RegisterNames::FpuDRegisterName(fpu_d_reg()));
+      f->Printf("%s", RegisterNames::FpuDRegisterName(fpu_d_reg()));
       break;
     case kSingleFpuReg:
-      f->Print("%s", RegisterNames::FpuSRegisterName(fpu_s_reg()));
+      f->Printf("%s", RegisterNames::FpuSRegisterName(fpu_s_reg()));
       break;
 #endif  // defined(TARGET_ARCH_ARM)
     default:
@@ -260,8 +259,8 @@
   PrintRepresentations(f, *this);
 }
 
-void NativeStackLocation::PrintTo(BufferFormatter* f) const {
-  f->Print("S%+" Pd, offset_in_bytes_);
+void NativeStackLocation::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("S%+" Pd, offset_in_bytes_);
   PrintRepresentations(f, *this);
 }
 
diff --git a/runtime/vm/compiler/ffi/native_location.h b/runtime/vm/compiler/ffi/native_location.h
index 7db24e6..fefee76 100644
--- a/runtime/vm/compiler/ffi/native_location.h
+++ b/runtime/vm/compiler/ffi/native_location.h
@@ -16,7 +16,7 @@
 
 namespace dart {
 
-class BufferFormatter;
+class BaseTextBuffer;
 
 namespace compiler {
 
@@ -94,7 +94,7 @@
     UNREACHABLE();
   }
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
   const char* ToCString() const;
 
   const NativeRegistersLocation& AsRegisters() const;
@@ -169,7 +169,7 @@
 
   virtual NativeRegistersLocation& Split(intptr_t index, Zone* zone) const;
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
 
   virtual bool Equals(const NativeLocation& other) const;
 
@@ -254,7 +254,7 @@
   bool IsLowestBits() const;
 #endif  // defined(TARGET_ARCH_ARM)
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
 
   virtual bool Equals(const NativeLocation& other) const;
 
@@ -303,7 +303,7 @@
 
   virtual NativeStackLocation& Split(intptr_t index, Zone* zone) const;
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
 
   virtual bool Equals(const NativeLocation& other) const;
 
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index 57db124..e4daa47 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -316,12 +316,12 @@
   }
 }
 
-void NativeType::PrintTo(BufferFormatter* f) const {
-  f->Print("I");
+void NativeType::PrintTo(BaseTextBuffer* f) const {
+  f->AddString("I");
 }
 
-void NativeFundamentalType::PrintTo(BufferFormatter* f) const {
-  f->Print("%s", FundamentalTypeToCString(representation_));
+void NativeFundamentalType::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("%s", FundamentalTypeToCString(representation_));
 }
 
 const NativeType& NativeType::WidenTo4Bytes(Zone* zone) const {
diff --git a/runtime/vm/compiler/ffi/native_type.h b/runtime/vm/compiler/ffi/native_type.h
index 0eee4de..b0dc39b 100644
--- a/runtime/vm/compiler/ffi/native_type.h
+++ b/runtime/vm/compiler/ffi/native_type.h
@@ -17,7 +17,7 @@
 
 namespace dart {
 
-class BufferFormatter;
+class BaseTextBuffer;
 
 namespace compiler {
 
@@ -102,7 +102,7 @@
   // Otherwise, return original representation.
   const NativeType& WidenTo4Bytes(Zone* zone) const;
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
   const char* ToCString() const;
 
   virtual ~NativeType() {}
@@ -153,7 +153,7 @@
   virtual bool Equals(const NativeType& other) const;
   virtual NativeFundamentalType& Split(intptr_t part, Zone* zone) const;
 
-  virtual void PrintTo(BufferFormatter* f) const;
+  virtual void PrintTo(BaseTextBuffer* f) const;
 
   virtual ~NativeFundamentalType() {}
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 2939eff..ee3a6bb 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -4750,19 +4750,12 @@
   for (intptr_t i = 0; i < catch_count; ++i) {
     intptr_t catch_offset = ReaderOffset();   // Catch has no tag.
     TokenPosition position = ReadPosition();  // read position.
-    Tag tag = PeekTag();                      // peek guard type.
-    AbstractType* type_guard = NULL;
-    if (tag != kDynamicType) {
-      type_guard = &T.BuildType();  // read guard.
-      handler_types.SetAt(i, *type_guard);
-    } else {
-      SkipDartType();  // read guard.
-      handler_types.SetAt(i, Object::dynamic_type());
-    }
+    const AbstractType& type_guard = T.BuildType();  // read guard.
+    handler_types.SetAt(i, type_guard);
 
     Fragment catch_handler_body = EnterScope(catch_offset);
 
-    tag = ReadTag();  // read first part of exception.
+    Tag tag = ReadTag();  // read first part of exception.
     if (tag == kSomething) {
       catch_handler_body += LoadLocal(CurrentException());
       catch_handler_body +=
@@ -4796,22 +4789,22 @@
       }
     }
 
-    if (type_guard != NULL) {
+    if (!type_guard.IsCatchAllType()) {
       catch_body += LoadLocal(CurrentException());
 
-      if (!type_guard->IsInstantiated(kCurrentClass)) {
+      if (!type_guard.IsInstantiated(kCurrentClass)) {
         catch_body += LoadInstantiatorTypeArguments();
       } else {
         catch_body += NullConstant();
       }
 
-      if (!type_guard->IsInstantiated(kFunctions)) {
+      if (!type_guard.IsInstantiated(kFunctions)) {
         catch_body += LoadFunctionTypeArguments();
       } else {
         catch_body += NullConstant();
       }
 
-      catch_body += Constant(*type_guard);
+      catch_body += Constant(type_guard);
 
       catch_body += InstanceCall(
           position, Library::PrivateCoreLibName(Symbols::_instanceOf()),
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 72d86d6..e419af5 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -855,7 +855,7 @@
     }
     b.AddString("End of function pool.\n\n");
   }
-  THR_Print("%s", b.buf());
+  THR_Print("%s", b.buffer());
 }
 #endif
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1b04132..f190dcc 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1081,15 +1081,15 @@
     Dart_FinalizableHandle object,
     Dart_Handle strong_ref_to_object,
     intptr_t external_allocation_size) {
-  if (!Dart_IdentityEquals(strong_ref_to_object,
-                           HandleFromFinalizable(object))) {
+  if (!::Dart_IdentityEquals(strong_ref_to_object,
+                             HandleFromFinalizable(object))) {
     FATAL1(
         "%s expects arguments 'object' and 'strong_ref_to_object' to point to "
         "the same object.",
         CURRENT_FUNC);
   }
   auto wph_object = reinterpret_cast<Dart_WeakPersistentHandle>(object);
-  Dart_UpdateExternalSize(wph_object, external_allocation_size);
+  ::Dart_UpdateExternalSize(wph_object, external_allocation_size);
 }
 
 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) {
@@ -1122,8 +1122,8 @@
 DART_EXPORT void Dart_DeleteFinalizableHandle(
     Dart_FinalizableHandle object,
     Dart_Handle strong_ref_to_object) {
-  if (!Dart_IdentityEquals(strong_ref_to_object,
-                           HandleFromFinalizable(object))) {
+  if (!::Dart_IdentityEquals(strong_ref_to_object,
+                             HandleFromFinalizable(object))) {
     FATAL1(
         "%s expects arguments 'object' and 'strong_ref_to_object' to point to "
         "the same object.",
@@ -1132,7 +1132,7 @@
 
   auto wph_object = reinterpret_cast<Dart_WeakPersistentHandle>(object);
 
-  return Dart_DeleteWeakPersistentHandle(wph_object);
+  ::Dart_DeleteWeakPersistentHandle(wph_object);
 }
 
 // --- Initialization and Globals ---
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index 8b927ec..da8bb08 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -774,7 +774,7 @@
     i += offset;
   }
   if (!changed) return cstr;
-  return OS::SCreate(zone_, "%s", buffer.buf());
+  return OS::SCreate(zone_, "%s", buffer.buffer());
 }
 
 Trie<const char>* Dwarf::CreateReverseObfuscationTrie(Zone* zone) {
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index d25d01d..db2e2f3 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -15,9 +15,9 @@
 TEST_CASE(JSON_TextBuffer) {
   TextBuffer w(5);  // Small enough to make buffer grow at least once.
   w.Printf("{ \"%s\" : %d", "length", 175);
-  EXPECT_STREQ("{ \"length\" : 175", w.buf());
+  EXPECT_STREQ("{ \"length\" : 175", w.buffer());
   w.Printf(", \"%s\" : \"%s\" }", "command", "stopIt");
-  EXPECT_STREQ("{ \"length\" : 175, \"command\" : \"stopIt\" }", w.buf());
+  EXPECT_STREQ("{ \"length\" : 175, \"command\" : \"stopIt\" }", w.buffer());
 }
 
 TEST_CASE(JSON_JSONStream_Primitives) {
diff --git a/runtime/vm/json_writer.cc b/runtime/vm/json_writer.cc
index 587bf15..b0358f3 100644
--- a/runtime/vm/json_writer.cc
+++ b/runtime/vm/json_writer.cc
@@ -69,7 +69,7 @@
 void JSONWriter::UncloseObject() {
   intptr_t len = buffer_.length();
   ASSERT(len > 0);
-  ASSERT(buffer_.buf()[len - 1] == '}');
+  ASSERT(buffer_.buffer()[len - 1] == '}');
   open_objects_++;
   buffer_.set_length(len - 1);
 }
@@ -315,7 +315,7 @@
 }
 
 bool JSONWriter::NeedComma() {
-  const char* buffer = buffer_.buf();
+  const char* buffer = buffer_.buffer();
   intptr_t length = buffer_.length();
   if (length == 0) {
     return false;
diff --git a/runtime/vm/json_writer.h b/runtime/vm/json_writer.h
index c9d4375..311e476 100644
--- a/runtime/vm/json_writer.h
+++ b/runtime/vm/json_writer.h
@@ -17,7 +17,7 @@
   explicit JSONWriter(intptr_t buf_size = 256);
 
   TextBuffer* buffer() { return &buffer_; }
-  const char* ToCString() { return buffer_.buf(); }
+  const char* ToCString() { return buffer_.buffer(); }
 
   void Steal(char** buffer, intptr_t* buffer_length);
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e06504c..58327ce 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -8,6 +8,7 @@
 
 #include "include/dart_api.h"
 #include "platform/assert.h"
+#include "platform/text_buffer.h"
 #include "platform/unaligned.h"
 #include "platform/unicode.h"
 #include "vm/bit_vector.h"
@@ -183,7 +184,7 @@
 
 const double MegamorphicCache::kLoadFactor = 0.50;
 
-static void AppendSubString(ZoneTextBuffer* buffer,
+static void AppendSubString(BaseTextBuffer* buffer,
                             const char* name,
                             intptr_t start_pos,
                             intptr_t len) {
@@ -1051,6 +1052,7 @@
                                     Smi::New(0));
     empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->hash_,
                                     Smi::New(0));
+    empty_type_arguments_->ComputeHash();
     empty_type_arguments_->SetCanonical();
   }
 
@@ -4990,9 +4992,9 @@
   ASSERT(!value.IsNull() && value.IsCanonical() && value.IsOld());
   ASSERT((declaration_type() == Object::null()) ||
          (declaration_type() == value.raw()));  // Set during own finalization.
-  // Since declaration type is used as the runtime type of instances of a
-  // non-generic class, the nullability is set to kNonNullable instead of
-  // kLegacy when the non-nullable experiment is enabled.
+  // Since DeclarationType is used as the runtime type of instances of a
+  // non-generic class, its nullability must be kNonNullable.
+  // The exception is DeclarationType of Null which is kNullable.
   ASSERT(value.type_class_id() != kNullCid || value.IsNullable());
   ASSERT(value.type_class_id() == kNullCid || value.IsNonNullable());
   StorePointer(&raw_ptr()->declaration_type_, value.raw());
@@ -5862,14 +5864,13 @@
   StoreSmi(&raw_ptr()->nullability_, Smi::New(value));
 }
 
-intptr_t TypeArguments::ComputeHash() const {
-  if (IsNull()) return 0;
-  const intptr_t num_types = Length();
-  if (IsRaw(0, num_types)) return 0;
+intptr_t TypeArguments::HashForRange(intptr_t from_index, intptr_t len) const {
+  if (IsNull()) return kAllDynamicHash;
+  if (IsRaw(from_index, len)) return kAllDynamicHash;
   uint32_t result = 0;
   AbstractType& type = AbstractType::Handle();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
+  for (intptr_t i = 0; i < len; i++) {
+    type = TypeAt(from_index + i);
     // The hash may be calculated during type finalization (for debugging
     // purposes only) while a type argument is still temporarily null.
     if (type.IsNull() || type.IsNullTypeRef()) {
@@ -5878,7 +5879,16 @@
     result = CombineHashes(result, type.Hash());
   }
   result = FinalizeHash(result, kHashBits);
-  SetHash(result);
+  return result;
+}
+
+intptr_t TypeArguments::ComputeHash() const {
+  if (IsNull()) return kAllDynamicHash;
+  const intptr_t num_types = Length();
+  const uint32_t result = HashForRange(0, num_types);
+  if (result != 0) {
+    SetHash(result);
+  }
   return result;
 }
 
@@ -5941,7 +5951,7 @@
     intptr_t from_index,
     intptr_t len,
     NameVisibility name_visibility,
-    ZoneTextBuffer* printer,
+    BaseTextBuffer* printer,
     NameDisambiguation name_disambiguation /* = NameDisambiguation::kNo */)
     const {
   printer->AddString("<");
@@ -8900,7 +8910,7 @@
 void Function::PrintSignatureParameters(Thread* thread,
                                         Zone* zone,
                                         NameVisibility name_visibility,
-                                        ZoneTextBuffer* printer) const {
+                                        BaseTextBuffer* printer) const {
   AbstractType& param_type = AbstractType::Handle(zone);
   const intptr_t num_params = NumParameters();
   const intptr_t num_fixed_params = num_fixed_parameters();
@@ -8941,7 +8951,7 @@
       if (num_opt_named_params > 0) {
         name = ParameterNameAt(i);
         printer->AddString(" ");
-        printer->AddString(name);
+        printer->AddString(name.ToCString());
       }
       if (i != (num_params - 1)) {
         printer->AddString(", ");
@@ -8993,7 +9003,7 @@
 }
 
 void Function::PrintSignature(NameVisibility name_visibility,
-                              ZoneTextBuffer* printer) const {
+                              BaseTextBuffer* printer) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -9279,7 +9289,7 @@
 }
 
 void Function::PrintName(const NameFormattingParams& params,
-                         ZoneTextBuffer* printer) const {
+                         BaseTextBuffer* printer) const {
   // If |this| is the generated asynchronous body closure, use the
   // name of the parent function.
   Function& fun = Function::Handle(raw());
@@ -14682,7 +14692,7 @@
 }
 
 const char* ExceptionHandlers::ToCString() const {
-#define FORMAT1 "%" Pd " => %#x  (%" Pd " types) (outer %d) %s\n"
+#define FORMAT1 "%" Pd " => %#x  (%" Pd " types) (outer %d)%s%s\n"
 #define FORMAT2 "  %d. %s\n"
   if (num_entries() == 0) {
     return "empty ExceptionHandlers\n";
@@ -14697,9 +14707,11 @@
     handled_types = GetHandledTypes(i);
     const intptr_t num_types =
         handled_types.IsNull() ? 0 : handled_types.Length();
-    len += Utils::SNPrint(NULL, 0, FORMAT1, i, info.handler_pc_offset,
-                          num_types, info.outer_try_index,
-                          info.is_generated != 0 ? "(generated)" : "");
+    len += Utils::SNPrint(
+        NULL, 0, FORMAT1, i, info.handler_pc_offset, num_types,
+        info.outer_try_index,
+        ((info.needs_stacktrace != 0) ? " (needs stack trace)" : ""),
+        ((info.is_generated != 0) ? " (generated)" : ""));
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
       ASSERT(!type.IsNull());
@@ -14715,10 +14727,11 @@
     handled_types = GetHandledTypes(i);
     const intptr_t num_types =
         handled_types.IsNull() ? 0 : handled_types.Length();
-    num_chars +=
-        Utils::SNPrint((buffer + num_chars), (len - num_chars), FORMAT1, i,
-                       info.handler_pc_offset, num_types, info.outer_try_index,
-                       info.is_generated != 0 ? "(generated)" : "");
+    num_chars += Utils::SNPrint(
+        (buffer + num_chars), (len - num_chars), FORMAT1, i,
+        info.handler_pc_offset, num_types, info.outer_try_index,
+        ((info.needs_stacktrace != 0) ? " (needs stack trace)" : ""),
+        ((info.is_generated != 0) ? " (generated)" : ""));
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
       num_chars += Utils::SNPrint((buffer + num_chars), (len - num_chars),
@@ -19217,14 +19230,14 @@
 
 void AbstractType::PrintName(
     NameVisibility name_visibility,
-    ZoneTextBuffer* printer,
+    BaseTextBuffer* printer,
     NameDisambiguation name_disambiguation /* = NameDisambiguation::kNo */)
     const {
   ASSERT(name_visibility != kScrubbedName);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Class& cls = Class::Handle(zone);
-  String& class_name = String::Handle(zone);
+  String& name_str = String::Handle(zone);
   if (IsTypeParameter()) {
     const TypeParameter& param = TypeParameter::Cast(*this);
 
@@ -19246,7 +19259,8 @@
       }
     }
 
-    printer->AddString(String::Handle(zone, param.name()));
+    name_str = param.name();
+    printer->AddString(name_str.ToCString());
     printer->AddString(NullabilitySuffix(name_visibility));
     return;
   }
@@ -19272,10 +19286,10 @@
     }
     // Instead of printing the actual signature, use the typedef name with
     // its type arguments, if any.
-    class_name = cls.Name();  // Typedef name.
+    name_str = cls.Name();  // Typedef name.
     if (!IsFinalized() || IsBeingFinalized()) {
       // TODO(regis): Check if this is dead code.
-      printer->AddString(class_name);
+      printer->AddString(name_str.ToCString());
       printer->AddString(NullabilitySuffix(name_visibility));
       return;
     }
@@ -19284,8 +19298,8 @@
   // Do not print the full vector, but only the declared type parameters.
   num_type_params = cls.NumTypeParameters();
   if (name_visibility == kInternalName) {
-    class_name = cls.Name();
-    printer->AddString(class_name);
+    name_str = cls.Name();
+    printer->AddString(name_str.ToCString());
   } else {
     ASSERT(name_visibility == kUserVisibleName);
     // Map internal types to their corresponding public interfaces.
@@ -20298,7 +20312,7 @@
 
 intptr_t Type::ComputeHash() const {
   ASSERT(IsFinalized());
-  uint32_t result = 1;
+  uint32_t result = 0;
   result = CombineHashes(result, type_class_id());
   // A legacy type should have the same hash as its non-nullable version to be
   // consistent with the definition of type equality in Dart code.
@@ -20307,7 +20321,20 @@
     type_nullability = Nullability::kNonNullable;
   }
   result = CombineHashes(result, static_cast<uint32_t>(type_nullability));
-  result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash());
+  uint32_t type_args_hash = TypeArguments::kAllDynamicHash;
+  if (arguments() != TypeArguments::null()) {
+    // Only include hashes of type arguments corresponding to type parameters.
+    // This prevents obtaining different hashes depending on the location of
+    // TypeRefs in the super class type argument vector.
+    const TypeArguments& type_args = TypeArguments::Handle(arguments());
+    const Class& cls = Class::Handle(type_class());
+    const intptr_t num_type_params = cls.NumTypeParameters();
+    if (num_type_params > 0) {
+      const intptr_t from_index = cls.NumTypeArguments() - num_type_params;
+      type_args_hash = type_args.HashForRange(from_index, num_type_params);
+    }
+  }
+  result = CombineHashes(result, type_args_hash);
   if (IsFunctionType()) {
     AbstractType& type = AbstractType::Handle();
     const Function& sig_fun = Function::Handle(signature());
@@ -21018,18 +21045,21 @@
 const char* TypeParameter::ToCString() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
+  auto& name_str = String::Handle(thread->zone(), name());
   printer.Printf("TypeParameter: name ");
-  printer.AddString(String::Handle(name()));
+  printer.AddString(name_str.ToCString());
   printer.AddString(NullabilitySuffix(kInternalName));
   printer.Printf("; index: %" Pd ";", index());
   if (IsFunctionTypeParameter()) {
     const Function& function = Function::Handle(parameterized_function());
     printer.Printf(" function: ");
-    printer.AddString(String::Handle(function.name()));
+    name_str = function.name();
+    printer.AddString(name_str.ToCString());
   } else {
     const Class& cls = Class::Handle(parameterized_class());
     printer.Printf(" class: ");
-    printer.AddString(String::Handle(cls.Name()));
+    name_str = cls.Name();
+    printer.AddString(name_str.ToCString());
   }
   printer.Printf("; bound: ");
   const AbstractType& upper_bound = AbstractType::Handle(bound());
@@ -24317,7 +24347,7 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 // Prints the best representation(s) for the call address.
-static void PrintNonSymbolicStackFrameBody(ZoneTextBuffer* buffer,
+static void PrintNonSymbolicStackFrameBody(BaseTextBuffer* buffer,
                                            uword call_addr,
                                            uword isolate_instructions,
                                            uword vm_instructions,
@@ -24353,12 +24383,12 @@
 }
 #endif
 
-static void PrintSymbolicStackFrameIndex(ZoneTextBuffer* buffer,
+static void PrintSymbolicStackFrameIndex(BaseTextBuffer* buffer,
                                          intptr_t frame_index) {
   buffer->Printf("#%-6" Pd "", frame_index);
 }
 
-static void PrintSymbolicStackFrameBody(ZoneTextBuffer* buffer,
+static void PrintSymbolicStackFrameBody(BaseTextBuffer* buffer,
                                         const char* function_name,
                                         const char* url,
                                         intptr_t line = -1,
@@ -24374,7 +24404,7 @@
 }
 
 static void PrintSymbolicStackFrame(Zone* zone,
-                                    ZoneTextBuffer* buffer,
+                                    BaseTextBuffer* buffer,
                                     const Function& function,
                                     TokenPosition token_pos,
                                     intptr_t frame_index) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ed97d50..2824547 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -71,7 +71,7 @@
 #undef REUSABLE_FORWARD_DECLARATION
 
 class Symbols;
-class ZoneTextBuffer;
+class BaseTextBuffer;
 
 #if defined(DEBUG)
 #define CHECK_HANDLE() CheckHandle();
@@ -2478,7 +2478,7 @@
   const char* NameCString(NameVisibility name_visibility) const;
 
   void PrintName(const NameFormattingParams& params,
-                 ZoneTextBuffer* printer) const;
+                 BaseTextBuffer* printer) const;
   StringPtr QualifiedScrubbedName() const;
   StringPtr QualifiedUserVisibleName() const;
 
@@ -2552,7 +2552,7 @@
   StringPtr UserVisibleSignature() const;
 
   void PrintSignature(NameVisibility name_visibility,
-                      ZoneTextBuffer* printer) const;
+                      BaseTextBuffer* printer) const;
 
   // Returns true if the signature of this function is instantiated, i.e. if it
   // does not involve generic parameter types or generic result type.
@@ -3792,7 +3792,7 @@
   void PrintSignatureParameters(Thread* thread,
                                 Zone* zone,
                                 NameVisibility name_visibility,
-                                ZoneTextBuffer* printer) const;
+                                BaseTextBuffer* printer) const;
 
   // Returns true if the type of the formal parameter at the given position in
   // this function is contravariant with the type of the other formal parameter
@@ -7528,6 +7528,9 @@
   // architecture.
   static const intptr_t kHashBits = 30;
 
+  // Hash value for a type argument vector consisting solely of dynamic types.
+  static const intptr_t kAllDynamicHash = 1;
+
   intptr_t Length() const;
   AbstractTypePtr TypeAt(intptr_t index) const;
   AbstractTypePtr TypeAtNullSafe(intptr_t index) const;
@@ -7583,7 +7586,7 @@
       intptr_t from_index,
       intptr_t len,
       NameVisibility name_visibility,
-      ZoneTextBuffer* printer,
+      BaseTextBuffer* printer,
       NameDisambiguation name_disambiguation = NameDisambiguation::kNo) const;
 
   // Check if the subvector of length 'len' starting at 'from_index' of this
@@ -7742,6 +7745,7 @@
     return 0;
   }
   intptr_t Hash() const;
+  intptr_t HashForRange(intptr_t from_index, intptr_t len) const;
 
   static TypeArgumentsPtr New(intptr_t len, Heap::Space space = Heap::kOld);
 
@@ -7910,7 +7914,7 @@
   // type arguments, if any.
   void PrintName(
       NameVisibility visibility,
-      ZoneTextBuffer* printer,
+      BaseTextBuffer* printer,
       NameDisambiguation name_disambiguation = NameDisambiguation::kNo) const;
 
   // Add the class name and URI of each occuring type to the uris
@@ -7997,6 +8001,11 @@
   // Returns unmodified type if this type is not a 'FutureOr' type.
   AbstractTypePtr UnwrapFutureOr() const;
 
+  // Returns true if catching this type will catch all exceptions.
+  // Exception objects are guaranteed to be non-nullable, so
+  // non-nullable Object is also a catch-all type.
+  bool IsCatchAllType() const { return IsDynamicType() || IsObjectType(); }
+
   // Check the subtype relationship.
   bool IsSubtypeOf(const AbstractType& other,
                    Heap::Space space,
@@ -11321,7 +11330,7 @@
 }
 
 inline intptr_t TypeArguments::Hash() const {
-  if (IsNull()) return 0;
+  if (IsNull()) return kAllDynamicHash;
   intptr_t result = Smi::Value(raw_ptr()->hash_);
   if (result != 0) {
     return result;
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 901efba..e127267 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -643,7 +643,7 @@
   }
 
   Service::SendEventWithData(Service::heapsnapshot_stream.id(), "HeapSnapshot",
-                             kMetadataReservation, js.buffer()->buf(),
+                             kMetadataReservation, js.buffer()->buffer(),
                              js.buffer()->length(), buffer_, size_);
   buffer_ = nullptr;
   size_ = 0;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 3e634e4..afcf33d 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -138,8 +138,6 @@
   // See Object::MakeUnusedSpaceTraversable.
   COMPILE_ASSERT(kCardRememberedBit == 0);
 
-  COMPILE_ASSERT(8 * sizeof(uint16_t) == kClassIdTagSize);
-
   // Encodes the object size in the tag in units of object alignment.
   class SizeTag {
    public:
@@ -181,8 +179,11 @@
     }
   };
 
-  class ClassIdTag
-      : public BitField<uint32_t, intptr_t, kClassIdTagPos, kClassIdTagSize> {};
+  class ClassIdTag : public BitField<uint32_t,
+                                     ClassIdTagType,
+                                     kClassIdTagPos,
+                                     kClassIdTagSize> {};
+  COMPILE_ASSERT(kBitsPerByte * sizeof(ClassIdTagType) == kClassIdTagSize);
 
   class CardRememberedBit
       : public BitField<uint32_t, bool, kCardRememberedBit, 1> {};
@@ -1195,9 +1196,9 @@
 #endif
   TokenPosition token_pos_;
   TokenPosition end_token_pos_;
-  uint16_t guarded_cid_;
-  uint16_t is_nullable_;  // kNullCid if field can contain null value and
-                          // kInvalidCid otherwise.
+  ClassIdTagType guarded_cid_;
+  ClassIdTagType is_nullable_;  // kNullCid if field can contain null value and
+                                // kInvalidCid otherwise.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
@@ -1402,7 +1403,7 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   VISIT_NOTHING();
-  uint16_t cid_;
+  ClassIdTagType cid_;
 #else
   VISIT_FROM(ObjectPtr, target_);
   ObjectPtr target_;
@@ -1988,8 +1989,8 @@
   CodePtr target_;
   VISIT_TO(ObjectPtr, target_);
   uword entry_point_;
-  uint16_t lower_limit_;
-  uint16_t upper_limit_;
+  ClassIdTagType lower_limit_;
+  ClassIdTagType upper_limit_;
 };
 
 class MonomorphicSmiableCallLayout : public ObjectLayout {
@@ -2256,7 +2257,7 @@
   AbstractTypePtr bound_;  // ObjectType if no explicit bound specified.
   FunctionPtr parameterized_function_;
   VISIT_TO(ObjectPtr, parameterized_function_)
-  uint16_t parameterized_class_id_;
+  ClassIdTagType parameterized_class_id_;
   TokenPosition token_pos_;
   int16_t index_;
   uint8_t flags_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 3b7af8f..f82c430 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -1142,7 +1142,7 @@
       event->stream_info()->consumer() != nullptr) {
     auto length = js.buffer()->length();
     event->stream_info()->consumer()(
-        reinterpret_cast<uint8_t*>(js.buffer()->buf()), length);
+        reinterpret_cast<uint8_t*>(js.buffer()->buffer()), length);
   }
 }
 
@@ -1623,8 +1623,9 @@
   data[reservation + 0] = 0;
   data[reservation + 1] = 128;
   data[reservation + 2] = 255;
-  SendEventWithData(echo_stream.id(), "_Echo", reservation, js.buffer()->buf(),
-                    js.buffer()->length(), data, data_size);
+  SendEventWithData(echo_stream.id(), "_Echo", reservation,
+                    js.buffer()->buffer(), js.buffer()->length(), data,
+                    data_size);
 }
 
 static bool TriggerEchoEvent(Thread* thread, JSONStream* js) {
diff --git a/runtime/vm/version.h b/runtime/vm/version.h
index a3769f6..cab6c26 100644
--- a/runtime/vm/version.h
+++ b/runtime/vm/version.h
@@ -14,8 +14,6 @@
   static const char* String();
   static const char* SnapshotString();
   static const char* CommitString();
-  static int CurrentAbiVersion();
-  static int OldestSupportedAbiVersion();
   static const char* SdkHash();
 
  private:
diff --git a/runtime/vm/version_in.cc b/runtime/vm/version_in.cc
index f63fe3f..2fcf5c5 100644
--- a/runtime/vm/version_in.cc
+++ b/runtime/vm/version_in.cc
@@ -5,7 +5,6 @@
 #include "vm/version.h"
 
 #include "vm/cpu.h"
-#include "vm/flags.h"
 #include "vm/os.h"
 
 namespace dart {
@@ -30,14 +29,6 @@
   return commit_;
 }
 
-int Version::CurrentAbiVersion() {
-  return {{ABI_VERSION}};
-}
-
-int Version::OldestSupportedAbiVersion() {
-  return {{OLDEST_SUPPORTED_ABI_VERSION}};
-}
-
 const char* Version::SdkHash() {
   return git_short_hash_;
 }
diff --git a/runtime/vm/zone_text_buffer.cc b/runtime/vm/zone_text_buffer.cc
index 446f952..f265937 100644
--- a/runtime/vm/zone_text_buffer.cc
+++ b/runtime/vm/zone_text_buffer.cc
@@ -14,51 +14,13 @@
 namespace dart {
 
 ZoneTextBuffer::ZoneTextBuffer(Zone* zone, intptr_t initial_capacity)
-    : zone_(zone), buffer_(NULL), length_(0), capacity_(0) {
+    : zone_(zone) {
   ASSERT(initial_capacity > 0);
   buffer_ = reinterpret_cast<char*>(zone->Alloc<char>(initial_capacity));
   capacity_ = initial_capacity;
   buffer_[length_] = '\0';
 }
 
-intptr_t ZoneTextBuffer::Printf(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  intptr_t remaining = capacity_ - length_;
-  ASSERT(remaining >= 0);
-  intptr_t len = Utils::VSNPrint(buffer_ + length_, remaining, format, args);
-  va_end(args);
-  if (len >= remaining) {
-    EnsureCapacity(len);
-    remaining = capacity_ - length_;
-    ASSERT(remaining > len);
-    va_list args2;
-    va_start(args2, format);
-    intptr_t len2 =
-        Utils::VSNPrint(buffer_ + length_, remaining, format, args2);
-    va_end(args2);
-    ASSERT(len == len2);
-  }
-  length_ += len;
-  buffer_[length_] = '\0';
-  return len;
-}
-
-void ZoneTextBuffer::AddChar(char ch) {
-  EnsureCapacity(sizeof(ch));
-  buffer_[length_] = ch;
-  length_++;
-  buffer_[length_] = '\0';
-}
-
-void ZoneTextBuffer::AddString(const char* s) {
-  Printf("%s", s);
-}
-
-void ZoneTextBuffer::AddString(const String& s) {
-  Printf("%s", s.ToCString());
-}
-
 void ZoneTextBuffer::Clear() {
   const intptr_t initial_capacity = 64;
   buffer_ = reinterpret_cast<char*>(zone_->Alloc<char>(initial_capacity));
@@ -67,13 +29,14 @@
   buffer_[length_] = '\0';
 }
 
-void ZoneTextBuffer::EnsureCapacity(intptr_t len) {
+bool ZoneTextBuffer::EnsureCapacity(intptr_t len) {
   intptr_t remaining = capacity_ - length_;
   if (remaining <= len) {
     intptr_t new_capacity = capacity_ + Utils::Maximum(capacity_, len);
     buffer_ = zone_->Realloc<char>(buffer_, capacity_, new_capacity);
     capacity_ = new_capacity;
   }
+  return true;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/zone_text_buffer.h b/runtime/vm/zone_text_buffer.h
index 1b7fef3..21e6739 100644
--- a/runtime/vm/zone_text_buffer.h
+++ b/runtime/vm/zone_text_buffer.h
@@ -5,6 +5,7 @@
 #ifndef RUNTIME_VM_ZONE_TEXT_BUFFER_H_
 #define RUNTIME_VM_ZONE_TEXT_BUFFER_H_
 
+#include "platform/text_buffer.h"
 #include "vm/allocation.h"
 #include "vm/globals.h"
 
@@ -13,29 +14,22 @@
 class String;
 class Zone;
 
-// TextBuffer maintains a dynamic character buffer with a printf-style way to
-// append text.
-class ZoneTextBuffer : ValueObject {
+// ZoneTextBuffer allocates the character buffer in the given zone. Thus,
+// pointers returned by buffer() have the same lifetime as the zone.
+class ZoneTextBuffer : public BaseTextBuffer {
  public:
   explicit ZoneTextBuffer(Zone* zone, intptr_t initial_capacity = 64);
   ~ZoneTextBuffer() {}
 
-  intptr_t Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  void AddChar(char ch);
-  void AddString(const char* s);
-  void AddString(const String& s);
-
-  char* buffer() { return buffer_; }
-  intptr_t length() const { return length_; }
-
+  // Allocates a new internal buffer. Thus, the contents of buffers returned by
+  // previous calls to buffer() are no longer affected by this object.
   void Clear();
 
  private:
-  void EnsureCapacity(intptr_t len);
+  bool EnsureCapacity(intptr_t len);
   Zone* zone_;
-  char* buffer_;
-  intptr_t length_;
-  intptr_t capacity_;
+
+  DISALLOW_COPY_AND_ASSIGN(ZoneTextBuffer);
 };
 
 }  // namespace dart
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index ea136e6..4e327d9 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -616,12 +616,6 @@
   outputs = [ "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}" ]
 }
 
-copy("copy_abi_dill_files") {
-  visibility = [ ":create_sdk_with_abi_versions" ]
-  sources = [ "../tools/abiversions" ]
-  outputs = [ "$root_out_dir/dart-sdk/lib/_internal/abiversions" ]
-}
-
 copy("copy_dart2js_dill_files") {
   visibility = [ ":create_full_sdk" ]
   deps = [
@@ -968,11 +962,3 @@
     public_deps += [ ":create_full_sdk" ]
   }
 }
-
-# Same as create_sdk, but with abi version files.
-group("create_sdk_with_abi_versions") {
-  public_deps = [
-    ":copy_abi_dill_files",
-    ":create_sdk",
-  ]
-}
diff --git a/sdk/lib/_http/http_parser.dart b/sdk/lib/_http/http_parser.dart
index 9459789..cb13b24 100644
--- a/sdk/lib/_http/http_parser.dart
+++ b/sdk/lib/_http/http_parser.dart
@@ -978,7 +978,6 @@
 
   static bool _isValueChar(int byte) {
     return (byte > 31 && byte < 128) ||
-        (byte == _CharCode.SP) ||
         (byte == _CharCode.HT);
   }
 
diff --git a/tests/dart2js/jsinterop_test.dart b/tests/dart2js/jsinterop_test.dart
index f44b2b4..397f5e2 100644
--- a/tests/dart2js/jsinterop_test.dart
+++ b/tests/dart2js/jsinterop_test.dart
@@ -58,16 +58,16 @@
   // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
   external factory Class.externalFact(); //# 09: continued
 
-  @JS('a') // GENERIC  //# 10: compile-time error
+  @JS('a') // GENERIC, GENERIC  //# 10: compile-time error
   Class.jsInteropGenerative(); //# 10: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  @JS('a') // GENERIC  //# 11: compile-time error
   factory Class.jsInteropFact() => null; //# 11: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  @JS('a') // GENERIC  //# 12: compile-time error
   external Class.externalJsInteropGenerative(); //# 12: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  @JS('a') // GENERIC  //# 13: compile-time error
   external factory Class.externalJsInteropFact(); //# 13: continued
 
   var instanceField;
@@ -80,28 +80,28 @@
   static set staticSetter(_) {}
   static staticMethod() {}
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  @JS('a') // GENERIC  //# 14: compile-time error
   var instanceJsInteropField; //# 14: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  @JS('a') // GENERIC  //# 15: compile-time error
   get instanceJsInteropGetter => null; //# 15: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  @JS('a') // GENERIC  //# 16: compile-time error
   set instanceJsInteropSetter(_) {} //# 16: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  @JS('a') // GENERIC  //# 17: compile-time error
   instanceJsInteropMethod() {} //# 17: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  @JS('a') // GENERIC  //# 18: compile-time error
   static var staticJsInteropField; //# 18: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  @JS('a') // GENERIC  //# 19: compile-time error
   static get staticJsInteropGetter => null; //# 19: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  @JS('a') // GENERIC  //# 20: compile-time error
   static set staticJsInteropSetter(_) {} //# 20: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  @JS('a') // GENERIC  //# 21: compile-time error
   static staticJsInteropMethod() {} //# 21: continued
 
   // NON_NATIVE_EXTERNAL               //# 22: compile-time error
@@ -122,22 +122,22 @@
   // NON_NATIVE_EXTERNAL           //# 27: compile-time error
   external static externalStaticMethod(); //# 27: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  @JS('a') // GENERIC  //# 28: compile-time error
   external get externalInstanceJsInteropGetter; //# 28: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  @JS('a') // GENERIC  //# 29: compile-time error
   external set externalInstanceJsInteropSetter(_); //# 29: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  @JS('a') // GENERIC  //# 30: compile-time error
   external externalInstanceJsInteropMethod(); //# 30: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  @JS('a') // GENERIC  //# 31: compile-time error
   external static get externalStaticJsInteropGetter; //# 31: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  @JS('a') // GENERIC  //# 32: compile-time error
   external static set externalStaticJsInteropSetter(_); //# 32: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  @JS('a') // GENERIC  //# 33: compile-time error
   external static externalStaticJsInteropMethod(); //# 33: continued
 }
 
diff --git a/tests/dart2js/non_jsinterop_test.dart b/tests/dart2js/non_jsinterop_test.dart
index 67f239b..68eebe7 100644
--- a/tests/dart2js/non_jsinterop_test.dart
+++ b/tests/dart2js/non_jsinterop_test.dart
@@ -60,16 +60,16 @@
   // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
   external factory Class.externalFact(); //# 09: continued
 
-  @JS('a') // GENERIC  //# 10: compile-time error
+  @JS('a') // GENERIC, GENERIC  //# 10: compile-time error
   Class.jsInteropGenerative(); //# 10: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  @JS('a') // GENERIC  //# 11: compile-time error
   factory Class.jsInteropFact() => null; //# 11: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  @JS('a') // GENERIC  //# 12: compile-time error
   external Class.externalJsInteropGenerative(); //# 12: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  @JS('a') // GENERIC  //# 13: compile-time error
   external factory Class.externalJsInteropFact(); //# 13: continued
 
   var instanceField;
@@ -82,28 +82,28 @@
   static set staticSetter(_) {}
   static staticMethod() {}
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  @JS('a') // GENERIC  //# 14: compile-time error
   var instanceJsInteropField; //# 14: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  @JS('a') // GENERIC  //# 15: compile-time error
   get instanceJsInteropGetter => null; //# 15: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  @JS('a') // GENERIC  //# 16: compile-time error
   set instanceJsInteropSetter(_) {} //# 16: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  @JS('a') // GENERIC  //# 17: compile-time error
   instanceJsInteropMethod() {} //# 17: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  @JS('a') // GENERIC  //# 18: compile-time error
   static var staticJsInteropField; //# 18: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  @JS('a') // GENERIC  //# 19: compile-time error
   static get staticJsInteropGetter => null; //# 19: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  @JS('a') // GENERIC  //# 20: compile-time error
   static set staticJsInteropSetter(_) {} //# 20: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  @JS('a') // GENERIC  //# 21: compile-time error
   static staticJsInteropMethod() {} //# 21: continued
 
   // NON_NATIVE_EXTERNAL               //# 22: compile-time error
@@ -124,22 +124,22 @@
   // NON_NATIVE_EXTERNAL           //# 27: compile-time error
   external static externalStaticMethod(); //# 27: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  @JS('a') // GENERIC  //# 28: compile-time error
   external get externalInstanceJsInteropGetter; //# 28: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  @JS('a') // GENERIC  //# 29: compile-time error
   external set externalInstanceJsInteropSetter(_); //# 29: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  @JS('a') // GENERIC  //# 30: compile-time error
   external externalInstanceJsInteropMethod(); //# 30: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  @JS('a') // GENERIC  //# 31: compile-time error
   external static get externalStaticJsInteropGetter; //# 31: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  @JS('a') // GENERIC  //# 32: compile-time error
   external static set externalStaticJsInteropSetter(_); //# 32: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  @JS('a') // GENERIC  //# 33: compile-time error
   external static externalStaticJsInteropMethod(); //# 33: continued
 }
 
diff --git a/tests/dart2js_2/jsinterop_test.dart b/tests/dart2js_2/jsinterop_test.dart
index 23521a0..2db564c 100644
--- a/tests/dart2js_2/jsinterop_test.dart
+++ b/tests/dart2js_2/jsinterop_test.dart
@@ -60,16 +60,16 @@
   // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
   external factory Class.externalFact(); //# 09: continued
 
-  @JS('a') // GENERIC  //# 10: compile-time error
+  @JS('a') // GENERIC, GENERIC  //# 10: compile-time error
   Class.jsInteropGenerative(); //# 10: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  @JS('a') // GENERIC  //# 11: compile-time error
   factory Class.jsInteropFact() => null; //# 11: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  @JS('a') // GENERIC  //# 12: compile-time error
   external Class.externalJsInteropGenerative(); //# 12: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  @JS('a') // GENERIC  //# 13: compile-time error
   external factory Class.externalJsInteropFact(); //# 13: continued
 
   var instanceField;
@@ -82,28 +82,28 @@
   static set staticSetter(_) {}
   static staticMethod() {}
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  @JS('a') // GENERIC  //# 14: compile-time error
   var instanceJsInteropField; //# 14: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  @JS('a') // GENERIC  //# 15: compile-time error
   get instanceJsInteropGetter => null; //# 15: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  @JS('a') // GENERIC  //# 16: compile-time error
   set instanceJsInteropSetter(_) {} //# 16: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  @JS('a') // GENERIC  //# 17: compile-time error
   instanceJsInteropMethod() {} //# 17: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  @JS('a') // GENERIC  //# 18: compile-time error
   static var staticJsInteropField; //# 18: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  @JS('a') // GENERIC  //# 19: compile-time error
   static get staticJsInteropGetter => null; //# 19: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  @JS('a') // GENERIC  //# 20: compile-time error
   static set staticJsInteropSetter(_) {} //# 20: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  @JS('a') // GENERIC  //# 21: compile-time error
   static staticJsInteropMethod() {} //# 21: continued
 
   // NON_NATIVE_EXTERNAL               //# 22: compile-time error
@@ -124,22 +124,22 @@
   // NON_NATIVE_EXTERNAL           //# 27: compile-time error
   external static externalStaticMethod(); //# 27: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  @JS('a') // GENERIC  //# 28: compile-time error
   external get externalInstanceJsInteropGetter; //# 28: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  @JS('a') // GENERIC  //# 29: compile-time error
   external set externalInstanceJsInteropSetter(_); //# 29: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  @JS('a') // GENERIC  //# 30: compile-time error
   external externalInstanceJsInteropMethod(); //# 30: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  @JS('a') // GENERIC  //# 31: compile-time error
   external static get externalStaticJsInteropGetter; //# 31: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  @JS('a') // GENERIC  //# 32: compile-time error
   external static set externalStaticJsInteropSetter(_); //# 32: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  @JS('a') // GENERIC  //# 33: compile-time error
   external static externalStaticJsInteropMethod(); //# 33: continued
 }
 
diff --git a/tests/dart2js_2/non_jsinterop_test.dart b/tests/dart2js_2/non_jsinterop_test.dart
index bbaae2c..1bac858 100644
--- a/tests/dart2js_2/non_jsinterop_test.dart
+++ b/tests/dart2js_2/non_jsinterop_test.dart
@@ -62,16 +62,16 @@
   // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
   external factory Class.externalFact(); //# 09: continued
 
-  @JS('a') // GENERIC  //# 10: compile-time error
+  @JS('a') // GENERIC, GENERIC  //# 10: compile-time error
   Class.jsInteropGenerative(); //# 10: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  @JS('a') // GENERIC  //# 11: compile-time error
   factory Class.jsInteropFact() => null; //# 11: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  @JS('a') // GENERIC  //# 12: compile-time error
   external Class.externalJsInteropGenerative(); //# 12: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  @JS('a') // GENERIC  //# 13: compile-time error
   external factory Class.externalJsInteropFact(); //# 13: continued
 
   var instanceField;
@@ -84,28 +84,28 @@
   static set staticSetter(_) {}
   static staticMethod() {}
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  @JS('a') // GENERIC  //# 14: compile-time error
   var instanceJsInteropField; //# 14: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  @JS('a') // GENERIC  //# 15: compile-time error
   get instanceJsInteropGetter => null; //# 15: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  @JS('a') // GENERIC  //# 16: compile-time error
   set instanceJsInteropSetter(_) {} //# 16: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  @JS('a') // GENERIC  //# 17: compile-time error
   instanceJsInteropMethod() {} //# 17: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  @JS('a') // GENERIC  //# 18: compile-time error
   static var staticJsInteropField; //# 18: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  @JS('a') // GENERIC  //# 19: compile-time error
   static get staticJsInteropGetter => null; //# 19: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  @JS('a') // GENERIC  //# 20: compile-time error
   static set staticJsInteropSetter(_) {} //# 20: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  @JS('a') // GENERIC  //# 21: compile-time error
   static staticJsInteropMethod() {} //# 21: continued
 
   // NON_NATIVE_EXTERNAL               //# 22: compile-time error
@@ -126,22 +126,22 @@
   // NON_NATIVE_EXTERNAL           //# 27: compile-time error
   external static externalStaticMethod(); //# 27: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  @JS('a') // GENERIC  //# 28: compile-time error
   external get externalInstanceJsInteropGetter; //# 28: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  @JS('a') // GENERIC  //# 29: compile-time error
   external set externalInstanceJsInteropSetter(_); //# 29: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  @JS('a') // GENERIC  //# 30: compile-time error
   external externalInstanceJsInteropMethod(); //# 30: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  @JS('a') // GENERIC  //# 31: compile-time error
   external static get externalStaticJsInteropGetter; //# 31: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  @JS('a') // GENERIC  //# 32: compile-time error
   external static set externalStaticJsInteropSetter(_); //# 32: continued
 
-  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  @JS('a') // GENERIC  //# 33: compile-time error
   external static externalStaticJsInteropMethod(); //# 33: continued
 }
 
diff --git a/tests/language/constructor/missing_initializer_test.dart b/tests/language/constructor/missing_initializer_test.dart
new file mode 100644
index 0000000..3604aa8
--- /dev/null
+++ b/tests/language/constructor/missing_initializer_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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.
+
+// Test that it is an error for a class with no generative constructors to
+// have a final instance variable without an initializing expression, except
+// if it is `abstract` or `external`. The latter also holds in a class with
+// generative constructors.
+
+// Has factory, hence no default, hence no generative constructors.
+abstract class A {
+  final dynamic n;
+  //            ^
+  // [analyzer] COMPILE_TIME_ERROR.FINAL_NOT_INITIALIZED
+  // [cfe] unspecified
+
+  // Uninitialized, but no errors.
+  abstract final int x1;
+  abstract final int? x2;
+  external final String x3;
+  external final String? x4;
+
+  factory A() = B;
+}
+
+class B implements A {
+  dynamic get n => 1;
+  int get x1 => 1;
+  int? get x2 => null;
+  String get x3 => "";
+  String? get x4 => null;
+}
+
+class C = Object with A;
+
+// Has a generative constructor: default.
+abstract class D {
+  // Uninitialized, but no errors.
+  abstract final int x1;
+  abstract final int? x2;
+  external final String x3;
+  external final String? x4;
+}
+
+void main() {
+  A();
+  C();
+  var _ = D;
+}
diff --git a/tests/language/regress/regress42954_test.dart b/tests/language/regress/regress42954_test.dart
new file mode 100644
index 0000000..93c5d2b
--- /dev/null
+++ b/tests/language/regress/regress42954_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2020, 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<T> {
+  Type get type => T;
+}
+
+class B extends A<B> {}
+
+void main() {
+  var first = B;
+  var second = B().type;
+
+  Expect.equals(first, second);
+  Expect.equals(second, first);
+  Expect.equals(first.hashCode, second.hashCode);
+}
diff --git a/tests/language/vm/deopt_during_field_init_test.dart b/tests/language/vm/deopt_during_field_init_test.dart
new file mode 100644
index 0000000..6fb6f78
--- /dev/null
+++ b/tests/language/vm/deopt_during_field_init_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2020, 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.
+// Test that we don't hit unbalanced stack after deoptimization from LoadField
+// back to getter call.
+
+// VMOptions=--no-use-osr --optimization-counter-threshold=10 --no-background-compilation
+
+int counter = 0;
+
+class A {
+  late final Object field = init();
+
+  @pragma('vm:never-inline')
+  int init() {
+    counter++;
+    if (counter > 20) {
+      finalizeB();
+    }
+    return counter;
+  }
+}
+
+class B extends A {
+  final Object field = "Foo";
+}
+
+@pragma('vm:never-inline')
+finalizeB() {
+  print(new B().field);
+}
+
+@pragma('vm:never-inline')
+test(A a) {
+  print(a.field);
+}
+
+main() {
+  for (var i = 0; i < 100; i++) {
+    test(new A());
+  }
+}
diff --git a/tests/language_2/regress/regress42946_test.dart b/tests/language_2/regress/regress42946_test.dart
new file mode 100644
index 0000000..008793f
--- /dev/null
+++ b/tests/language_2/regress/regress42946_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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';
+
+/// https://github.com/dart-lang/sdk/issues/42946
+void main() {
+  // fix bug in constant eval
+  const x = (2.0 == 2);
+  const a = (2.0 == 2.0);
+  const b = (0.0 == 0.0);
+  const c = (double.nan == double.nan);
+  const d = (2.0 == 1.0);
+
+  Expect.isTrue(x);
+  Expect.isTrue(a);
+  Expect.isTrue(b);
+  Expect.isFalse(c);
+  Expect.isFalse(d);
+}
diff --git a/tests/language_2/regress/regress42954_test.dart b/tests/language_2/regress/regress42954_test.dart
new file mode 100644
index 0000000..93c5d2b
--- /dev/null
+++ b/tests/language_2/regress/regress42954_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2020, 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<T> {
+  Type get type => T;
+}
+
+class B extends A<B> {}
+
+void main() {
+  var first = B;
+  var second = B().type;
+
+  Expect.equals(first, second);
+  Expect.equals(second, first);
+  Expect.equals(first.hashCode, second.hashCode);
+}
diff --git a/tests/lib/html/js_typed_interop_type_test.dart b/tests/lib/html/js_typed_interop_type_test.dart
index ba1f2da..a7195ab 100644
--- a/tests/lib/html/js_typed_interop_type_test.dart
+++ b/tests/lib/html/js_typed_interop_type_test.dart
@@ -26,7 +26,7 @@
 @JS()
 @anonymous
 class C {
-  final foo;
+  external get foo;
 
   external factory C({foo});
 }
@@ -34,7 +34,7 @@
 @JS()
 @anonymous
 class D {
-  final foo;
+  external get foo;
 
   external factory D({foo});
 }
diff --git a/tests/lib/js/js_annotation_static_test.dart b/tests/lib/js/js_annotation_static_test.dart
new file mode 100644
index 0000000..ef7dc40
--- /dev/null
+++ b/tests/lib/js/js_annotation_static_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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(srujzs): Fix this test once web static error testing is supported.
+
+// Tests static errors for incorrect JS annotations.
+
+@JS()
+library js_annotation_static_test;
+
+import 'package:js/js.dart';
+
+class Foo {
+  //  ^^^
+  // [web] TODO(srujzs): Test context once supported.
+  @JS()
+  external Foo(int bar);
+  //       ^
+  // [web] TODO(srujzs): Add error once supported.
+  @JS()
+  external factory Foo.fooFactory();
+  //               ^
+  // [web] TODO(srujzs): Add error once supported.
+  @JS()
+  external int get bar;
+  //               ^^^
+  // [web] TODO(srujzs): Add error once supported.
+  @JS()
+  external set bar(int val);
+  //           ^^^
+  // [web] TODO(srujzs): Add error once supported.
+  @JS()
+  external int baz();
+  //           ^^^
+  // [web] TODO(srujzs): Add error once supported.
+  @JS()
+  external static int bazStatic();
+  //                  ^^^^^^^^^
+  // [web] TODO(srujzs): Add error once supported.
+}
+
+@JS()
+external int qux();
+
+main() {}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index e9477e1..f99d678 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -60,6 +60,15 @@
 io/wait_for_test: SkipByDesign # Uses mirrors.
 verbose_gc_to_bmu_test: Skip # Attempts to spawn dart using Platform.executable
 
+[ $system == fuchsia ] # Fuchsia test runner doesn't support multi-tests yet.
+deny_listed_test: Skip
+io/dart_std_io_pipe_test: Skip
+io/platform_resolved_executable_test: Skip
+io/signals_exception_test: Skip
+io/socket_ipv6_test: Skip
+package/invalid_uri_test: Skip
+regress_29350_test: Skip
+
 [ $builder_tag == swarming && $system == macos ]
 io/*: Skip # Issue 30618
 
diff --git a/tools/VERSION b/tools/VERSION
index 7e59cc4..ab87528 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,39 +1 @@
-# This file is used by tools/utils.py to generate version strings.
-# The numbers are changed as follows:
-#
-#  * New release cycle has begun (i.e. stable release was just made):
-#     - increase MINOR by 1
-#     - set "PATCH 0"
-#     - set "PRERELEASE 0"
-#     - set "PRERELEASE_PATCH 0"
-#
-#  * Doing a push-to-trunk from bleeding_edge:
-#    (The first push-to-trunk in the release cycle will set PRERELEASE to 0)
-#     - increase PRERELEASE by 1
-#     - set "PRERELEASE_PATCH 0"
-#
-#  * Doing a cherry-pick to trunk:
-#     - increase PRERELEASE_PATCH by 1
-#
-#  * Making a stable release (i.e. new stable branch):
-#     - set "PRERELEASE 0"
-#     - set "PRERELEASE_PATCH 0"
-#    The new stable release version will sort higher than the prereleases.
-#
-#  * Making cherry-picks to stable channel
-#     - increase PATCH by 1
-#
-#  * Making a change to the ABI:
-#     - increase ABI_VERSION by 1
-#
-#  * Deprecating an old ABI version:
-#     - increase OLDEST_SUPPORTED_ABI_VERSION to the version that is supported.
-#
-CHANNEL dev
-MAJOR 2
-MINOR 10
-PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 0
-ABI_VERSION 39
-OLDEST_SUPPORTED_ABI_VERSION 39
+PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 512d8a3..556782f 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1339,24 +1339,6 @@
           ]
         },
         {
-          "name": "co19 nnbd tests in weak mode with asserts",
-          "arguments": [
-            "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
-            "co19"
-          ],
-          "fileset": "vm-kernel",
-          "shards": 3
-        },
-        {
-          "name": "co19 nnbd tests in strong mode",
-          "arguments": [
-            "-ndartkp-strong-${system}-${mode}-${arch}",
-            "co19"
-          ],
-          "fileset": "vm-kernel",
-          "shards": 3
-        },
-        {
           "name": "vm nnbd tests in weak mode with asserts",
           "arguments": [
             "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
@@ -1368,7 +1350,7 @@
             "vm"
           ],
           "fileset": "vm-kernel",
-          "shards": 3
+          "shards": 4
         },
         {
           "name": "vm nnbd tests in strong mode",
@@ -1382,7 +1364,25 @@
             "vm"
           ],
           "fileset": "vm-kernel",
-          "shards": 3
+          "shards": 4
+        },
+        {
+          "name": "co19 nnbd tests in strong mode",
+          "arguments": [
+            "-ndartkp-strong-${system}-${mode}-${arch}",
+            "co19"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 4
+        },
+        {
+          "name": "co19 nnbd tests in weak mode with asserts",
+          "arguments": [
+            "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
+            "co19"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 4
         }
       ]
     },
@@ -2695,14 +2695,6 @@
           "arguments": [
             "api_docs"
           ]
-        },
-        {
-          "name": "upload abi dills",
-          "script": "tools/upload_abi_dills.sh",
-          "arguments": [
-            "tools/VERSION",
-            "out/ReleaseX64"
-          ]
         }
       ]
     },
diff --git a/tools/download_abi_dills.py b/tools/download_abi_dills.py
deleted file mode 100644
index 7ad544c..0000000
--- a/tools/download_abi_dills.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Downloads dill files from CIPD for each supported ABI version.
-
-import os
-import subprocess
-import sys
-import utils
-
-
-def procWait(p):
-    while p.returncode is None:
-        p.communicate()
-        p.poll()
-    return p.returncode
-
-
-def findAbiVersion(version):
-    cmd = ['cipd', 'instances', 'dart/abiversions/%d' % version]
-    p = subprocess.Popen(
-        cmd,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE,
-        shell=utils.IsWindows(),
-        cwd=utils.DART_DIR)
-    return procWait(p) == 0
-
-
-def main():
-    abi_version = int(utils.GetAbiVersion())
-    oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
-    cmd = ['cipd', 'ensure', '-root', 'tools/abiversions', '-ensure-file', '-']
-    ensure_file = ''
-    for i in range(oldest_abi_version, abi_version + 1):
-        if findAbiVersion(i):
-            ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
-    if not ensure_file:
-        return 0
-    p = subprocess.Popen(
-        cmd,
-        stdin=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE,
-        shell=utils.IsWindows(),
-        cwd=utils.DART_DIR)
-    p.communicate(ensure_file)
-    p.stdin.close()
-    return procWait(p)
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 169fbbc..0caf03b 100755
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -34,9 +34,25 @@
     packageDirectory('pkg/front_end/testcases/nonfunction_type_aliases/'),
   ];
 
+  var feAnalyzerSharedPackageDirs = [
+    packageDirectory(
+        'pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/'),
+    packageDirectory(
+        'pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment/'),
+    packageDirectory(
+        'pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/'),
+    packageDirectory('pkg/_fe_analyzer_shared/test/flow_analysis/nullability/'),
+    packageDirectory(
+        'pkg/_fe_analyzer_shared/test/flow_analysis/reachability/'),
+    packageDirectory(
+        'pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/'),
+    packageDirectory('pkg/_fe_analyzer_shared/test/inheritance/'),
+  ];
+
   var packages = [
     ...makePackageConfigs(packageDirs),
-    ...makeCfePackageConfigs(cfePackageDirs)
+    ...makeCfePackageConfigs(cfePackageDirs),
+    ...makeFeAnalyzerSharedPackageConfigs(feAnalyzerSharedPackageDirs)
   ];
   packages.sort((a, b) => a["name"].compareTo(b["name"]));
 
@@ -107,6 +123,21 @@
   }
 }
 
+/// Generates package configurations for the special pseudo-packages used by
+/// the _fe_analyzer_shared id tests.
+Iterable<Map<String, String>> makeFeAnalyzerSharedPackageConfigs(
+    List<String> packageDirs) sync* {
+  for (var packageDir in packageDirs) {
+    yield {
+      'name': '_fe_analyzer_shared_${p.basename(packageDir)}',
+      'rootUri': p
+          .toUri(p.relative(packageDir, from: p.dirname(configFilePath)))
+          .toString(),
+      'packageUri': '.nonexisting/',
+    };
+  }
+}
+
 /// Generates a path to [relativePath] within the repo.
 String packageDirectory(String relativePath) => p.join(repoRoot, relativePath);
 
diff --git a/tools/make_version.py b/tools/make_version.py
index f8356f8..1dc0dbe 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -108,14 +108,6 @@
         version_time = 'Unknown timestamp'
     version = version.replace('{{COMMIT_TIME}}', version_time.decode('utf-8'))
 
-    abi_version = utils.GetAbiVersion(version_file)
-    version = version.replace('{{ABI_VERSION}}', abi_version)
-
-    oldest_supported_abi_version = utils.GetOldestSupportedAbiVersion(
-        version_file)
-    version = version.replace('{{OLDEST_SUPPORTED_ABI_VERSION}}',
-                              oldest_supported_abi_version)
-
     snapshot_hash = MakeSnapshotHashString()
     version = version.replace('{{SNAPSHOT_HASH}}', snapshot_hash)
 
diff --git a/tools/run_abi_tests.py b/tools/run_abi_tests.py
deleted file mode 100644
index 47566f6..0000000
--- a/tools/run_abi_tests.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# 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.
-
-# Runs tests with old ABI versions and check if the results differ from the
-# current results.
-
-import argparse
-import json
-import os
-import subprocess
-import sys
-import time
-import utils
-
-scriptDir = os.path.dirname(os.path.realpath(__file__))
-outDir = os.path.join(scriptDir, '..', 'out', 'ReleaseX64')
-abiDir = os.path.join(outDir, 'dart-sdk', 'lib', '_internal', 'abiversions')
-
-
-# Parse command line args to flags.
-def parseArgs():
-    parser = argparse.ArgumentParser(
-        'Runs test.py on all supported ABI versions')
-    parser.add_argument(
-        '--output-directory',
-        default=os.path.join(outDir, 'logs'),
-        metavar='DIR',
-        dest='logDir',
-        help='Directory to output results.json and logs.json to.')
-    parser.add_argument(
-        '-n',
-        metavar='NAME',
-        dest='configuration_name',
-        help='Name of the configuration to use in the results.')
-    return parser.parse_args()
-
-
-# Info about a running test.
-class Test:
-
-    def __init__(self, cmd, resultFile, logFile, version):
-        self.cmd = cmd  # The test command.
-        self.resultFile = resultFile  # The expected location of the result file.
-        self.logFile = logFile  # The expected location of the log file.
-        self.version = version  # The ABI version, or None.
-
-
-# Recursively make directories for the path.
-def makeDirs(path):
-    try:
-        os.makedirs(path)
-    except OSError:
-        pass
-
-
-# Build a Test object for the given version (or None).
-def buildTest(version):
-    testDir = os.path.join(outDir,
-                           'test%s' % ('' if version is None else str(version)))
-    logDir = os.path.join(testDir, 'logs')
-    makeDirs(logDir)
-
-    vm_options = ['--enable-interpreter']
-    if version is not None:
-        vm_options += ['--use-abi-version=%d' % version]
-    cmd = [
-        'python',
-        os.path.join(scriptDir, 'test.py'),
-        '--compiler=dartkb',
-        '--mode=release',
-        '--write-results',
-        '--write-logs',
-        '--output_directory=%s' % logDir,
-        '--vm-options=%s' % ' '.join(vm_options),
-        'lib_2',
-    ]
-
-    resultFile = os.path.join(logDir, 'results.json')
-    logFile = os.path.join(logDir, 'logs.json')
-    return Test(cmd, resultFile, logFile, version)
-
-
-# Returns whether the dill files exist for an ABI version.
-def abiVersionExists(version):
-    return os.path.isdir(os.path.join(abiDir, str(version)))
-
-
-# Build tests for every supported version, and return a list of Test objects.
-def buildAllTests():
-    abi_version = int(utils.GetAbiVersion())
-    oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
-    tests = [buildTest(None)]
-    for version in xrange(oldest_abi_version, abi_version + 1):
-        if abiVersionExists(version):
-            tests.append(buildTest(version))
-    return tests
-
-
-# Run all tests, one by one, and wait for them all to complete.
-def runAllTests(tests):
-    for test in tests:
-        print('\n\n\n=== Running tests %s ===' % (
-            ('for ABI version %d' % test.version)
-            if test.version is not None else ('without an ABI version')))
-        print(subprocess.list2cmdline(test.cmd) + '\n\n')
-        proc = subprocess.Popen(test.cmd)
-        while proc.returncode is None:
-            time.sleep(1)
-            proc.communicate()
-            proc.poll()
-
-
-# Read a test result file or log file and convert JSON lines to a dictionary of
-# JSON records indexed by name. Assumes result and log files both use name key.
-def readTestFile(fileName):
-    with open(fileName, 'r') as f:
-        return {r['name']: r for r in [json.loads(line) for line in f]}
-
-
-# Read the test result or log files for every version and return a dict like:
-# {name: {version: resultJson, ...}, ...}
-def readAllTestFiles(tests, nameGetter):
-    allRecords = {}
-    for test in tests:
-        records = readTestFile(nameGetter(test))
-        for name, result in records.items():
-            if name not in allRecords:
-                allRecords[name] = {}
-            allRecords[name][test.version] = result
-    return allRecords
-
-
-# Pick any element of the dictionary, favoring the None key if it exists.
-def pickOne(d):
-    if None in d:
-        return d[None]
-    for v in d.values():
-        return v
-    return None
-
-
-# Diff the results of a test for each version and construct a new test result
-# that reports whether the test results match for each version.
-def diffResults(results, configuration_name):
-    outResult = pickOne(results)
-    exp = results[None]['result'] if None in results else None
-    outResult['configuration'] = configuration_name
-    outResult['expected'] = exp
-    outResult['result'] = exp
-    outResult['matches'] = True
-    diffs = []
-    for version, result in results.items():
-        if version is not None:
-            act = result['result']
-            if exp != act:
-                diffs.append(version)
-                outResult[
-                    'result'] = act  # May be overwritten by other versions.
-                outResult['matches'] = False
-    return outResult, diffs
-
-
-# Create a log entry for a test that has diffs. Concatenate all the log records
-# and include which tests failed.
-def makeLog(diffs, results, logRecords, configuration_name):
-    result = pickOne(results)
-    logs = ["%s: %s" % (str(v), l['log']) for v, l in logRecords.items()]
-    log = ('This test fails if there is a difference in the test results\n'
-           'between ABI versions. The expected result is the result on the\n'
-           'current ABI: %s\n'
-           'These ABI versions reported a different result: %s\n\n'
-           'These are the logs of the test runs on different ABI versions.\n'
-           'There are no logs for versions where the test passed.\n\n%s' %
-           (result['result'], repr(diffs), '\n\n\n'.join(logs)))
-    return {
-        'name': result['name'],
-        'configuration': configuration_name,
-        'result': result['result'],
-        'log': log,
-    }
-
-
-# Diff the results of all the tests and create the merged result and log files.
-def diffAllResults(tests, flags):
-    allResults = readAllTestFiles(tests, lambda test: test.resultFile)
-    allLogs = readAllTestFiles(tests, lambda test: test.logFile)
-    makeDirs(flags.logDir)
-    resultFileName = os.path.join(flags.logDir, 'results.json')
-    logFileName = os.path.join(flags.logDir, 'logs.json')
-    with open(resultFileName, 'w') as resultFile:
-        with open(logFileName, 'w') as logFile:
-            for name, results in allResults.items():
-                outResult, diffs = diffResults(results,
-                                               flags.configuration_name)
-                resultFile.write(json.dumps(outResult) + '\n')
-                if diffs:
-                    logRecords = allLogs.get(name, {})
-                    logFile.write(
-                        json.dumps(
-                            makeLog(diffs, results, logRecords, flags.
-                                    configuration_name)) + '\n')
-    print('Log files emitted to %s and %s' % (resultFileName, logFileName))
-
-
-def main():
-    flags = parseArgs()
-    tests = buildAllTests()
-    runAllTests(tests)
-    diffAllResults(tests, flags)
-    return 0
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/tools/upload_abi_dills.sh b/tools/upload_abi_dills.sh
deleted file mode 100755
index 28d3627..0000000
--- a/tools/upload_abi_dills.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env bash
-
-# 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.
-
-# Uploads the following dill files to CIPD, indexed by the current ABI version:
-#   $build_dir/vm_platform_strong.dill
-#   $build_dir/gen/kernel_service.dill
-#   $build_dir/gen_kernel_bytecode.dill
-# This script is a no-op unless $BUILDBOT_BUILDERNAME is "dart-sdk-linux-be".
-# It's also a no-op if dill files were already uploaded today.
-#
-# If the ABI was modified, the ABI_VERSION in tools/VERSIONS should be manually
-# incremented accordingly.
-set -e
-set -x
-
-if [ -z "$2" ]; then
-  echo "Usage: upload_abi_dills.sh version_file build_dir"
-  exit 1
-fi
-
-if [ "$BUILDBOT_BUILDERNAME" != "dart-sdk-linux-be" ]; then
-  echo "This script only works on the dart-sdk-linux-be buildbot"
-  exit 0
-fi
-
-abi_version=$(sed -n "s/^ABI_VERSION \([0-9]*\)$/\1/p" "$1")
-git_revision=$(git rev-parse HEAD)
-current_date=$(date +%F)
-search_results=$(cipd search \
-  "dart/abiversions/$abi_version" \
-  -tag "date:$current_date" | grep "Instances:" || echo "")
-
-if [ ! -z "$search_results" ]; then
-  exit 0
-fi
-
-sdk_dir=$(pwd)
-tmpdir=$(mktemp -d)
-chmod 755 $tmpdir
-cleanup() {
-  rm -rf "$tmpdir"
-}
-trap cleanup EXIT HUP INT QUIT TERM PIPE
-pushd "$tmpdir"
-
-mkdir abiversions
-cp "$sdk_dir/$2/vm_platform_strong.dill" "abiversions/vm_platform_strong.dill"
-cp "$sdk_dir/$2/gen/kernel_service.dill" "abiversions/kernel_service.dill"
-cp "$sdk_dir/$2/gen_kernel_bytecode.dill" "abiversions/gen_kernel_bytecode.dill"
-
-cipd create \
-  -name dart/abiversions/$abi_version \
-  -in abiversions \
-  -install-mode copy \
-  -tag version:$abi_version \
-  -tag date:$current_date \
-  -tag git_revision:$git_revision \
-  -ref latest \
-  -ref version_$abi_version
-
-popd
diff --git a/tools/utils.py b/tools/utils.py
index 23c8812..cbd1759 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -114,15 +114,13 @@
 class Version(object):
 
     def __init__(self, channel, major, minor, patch, prerelease,
-                 prerelease_patch, abi_version, oldest_supported_abi_version):
+                 prerelease_patch):
         self.channel = channel
         self.major = major
         self.minor = minor
         self.patch = patch
         self.prerelease = prerelease
         self.prerelease_patch = prerelease_patch
-        self.abi_version = abi_version
-        self.oldest_supported_abi_version = oldest_supported_abi_version
 
 
 # Try to guess the host operating system.
@@ -410,16 +408,6 @@
     return os.environ.get(key, '')
 
 
-def GetAbiVersion(version_file=None):
-    version = ReadVersionFile(version_file)
-    return version.abi_version
-
-
-def GetOldestSupportedAbiVersion(version_file=None):
-    version = ReadVersionFile(version_file)
-    return version.oldest_supported_abi_version
-
-
 def ReadVersionFile(version_file=None):
 
     def match_against(pattern, file_content):
@@ -445,15 +433,10 @@
     patch = match_against('^PATCH (\d+)$', content)
     prerelease = match_against('^PRERELEASE (\d+)$', content)
     prerelease_patch = match_against('^PRERELEASE_PATCH (\d+)$', content)
-    abi_version = match_against('^ABI_VERSION (\d+)$', content)
-    oldest_supported_abi_version = match_against(
-        '^OLDEST_SUPPORTED_ABI_VERSION (\d+)$', content)
 
-    if (channel and major and minor and prerelease and prerelease_patch and
-            abi_version and oldest_supported_abi_version):
+    if (channel and major and minor and prerelease and prerelease_patch):
         return Version(channel, major, minor, patch, prerelease,
-                       prerelease_patch, abi_version,
-                       oldest_supported_abi_version)
+                       prerelease_patch)
 
     print('Warning: VERSION file ({}) has wrong format'.format(version_file))
     return None
diff --git a/utils/compiler/create_snapshot_entry.dart b/utils/compiler/create_snapshot_entry.dart
index 633667c..d915d4d 100644
--- a/utils/compiler/create_snapshot_entry.dart
+++ b/utils/compiler/create_snapshot_entry.dart
@@ -10,10 +10,9 @@
 import 'dart:async';
 
 Future<String> getVersion(var rootPath) {
-  var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
   var printVersionScript = rootPath.resolve("tools/make_version.py");
   return Process.run(
-          "python$suffix", [printVersionScript.toFilePath(), "--quiet"])
+          "python", [printVersionScript.toFilePath(), "--quiet"], runInShell:true)
       .then((result) {
     if (result.exitCode != 0) {
       throw "Could not generate version";