Version 2.0.0-dev.53.0

Merge commit '16f6ce2fee29658425337f324522d1be14840412' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9d3a3cd..1ef9bfb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.0-dev.53.0
+
 ## 2.0.0-dev.52.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index 15caef2..dc79768 100644
--- a/DEPS
+++ b/DEPS
@@ -35,39 +35,39 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_rev": "@d4b3fc9af414c990b4d22f313e533b275d2f27c5",
-  "co19_2_rev": "@74562e984a81673b581e148b5802684d6df840d2",
+  "co19_rev": "d4b3fc9af414c990b4d22f313e533b275d2f27c5",
+  "co19_2_rev": "74562e984a81673b581e148b5802684d6df840d2",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
   # by the Flutter engine. If there are problems with the toolchain, contact
   # fuchsia-toolchain@.
-  "buildtools_revision": "@446d5b1019dcbe7835236dc85261e91cf29a9239",
+  "buildtools_revision": "446d5b1019dcbe7835236dc85261e91cf29a9239",
 
   # Scripts that make 'git cl format' work.
-  "clang_format_scripts_rev": "@c09c8deeac31f05bd801995c475e7c8070f9ecda",
+  "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
 
-  "gperftools_revision": "@02eeed29df112728564a5dde6417fa4622b57a06",
+  "gperftools_revision": "02eeed29df112728564a5dde6417fa4622b57a06",
 
   # Revisions of /third_party/* dependencies.
-  "args_tag": "@1.4.1",
-  "async_tag": "@2.0.6",
-  "barback-0.13.0_rev": "@34853",
-  "barback-0.14.0_rev": "@36398",
-  "barback-0.14.1_rev": "@38525",
-  "barback_tag" : "@0.15.2+14",
-  "bazel_worker_tag": "@v0.1.9",
-  "boolean_selector_tag" : "@1.0.3",
-  "boringssl_gen_rev": "@344f455fd13d46f054726638e76026156ea73aa9",
-  "boringssl_rev" : "@672f6fc2486745d0cabc3aaeb4e0a3cd13b37b12",
-  "charcode_tag": "@v1.1.1",
-  "chrome_rev" : "@19997",
-  "cli_util_tag" : "@0.1.2+1",
-  "collection_tag": "@1.14.6",
-  "convert_tag": "@2.0.1",
-  "crypto_tag" : "@2.0.2+1",
-  "csslib_tag" : "@0.14.1",
-  "dart2js_info_tag" : "@0.5.6+2",
+  "args_tag": "1.4.1",
+  "async_tag": "2.0.6",
+  "barback-0.13.0_rev": "34853",
+  "barback-0.14.0_rev": "36398",
+  "barback-0.14.1_rev": "38525",
+  "barback_tag" : "0.15.2+14",
+  "bazel_worker_tag": "v0.1.9",
+  "boolean_selector_tag" : "1.0.3",
+  "boringssl_gen_rev": "344f455fd13d46f054726638e76026156ea73aa9",
+  "boringssl_rev" : "672f6fc2486745d0cabc3aaeb4e0a3cd13b37b12",
+  "charcode_tag": "v1.1.1",
+  "chrome_rev" : "19997",
+  "cli_util_tag" : "0.1.2+1",
+  "collection_tag": "1.14.6",
+  "convert_tag": "2.0.1",
+  "crypto_tag" : "2.0.2+1",
+  "csslib_tag" : "0.14.1",
+  "dart2js_info_tag" : "0.5.6+2",
 
   # Note: updates to dart_style have to be coordinated carefully with
   # the infrastructure-team so that the internal formatter in
@@ -81,287 +81,284 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "@1.0.12",  # Please see the note above before updating.
+  "dart_style_tag": "1.0.12",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "@v0.18.1",
-  "fixnum_tag": "@0.10.5",
-  "func_rev": "@25eec48146a58967d75330075ab376b3838b18a8",
-  "glob_tag": "@1.1.5",
-  "html_tag" : "@0.13.3",
-  "http_io_tag": "@35dc43c9144cf7ed4236843dacd62ebaf89df21a",
-  "http_multi_server_tag" : "@2.0.4",
-  "http_parser_tag" : "@3.1.1",
-  "http_retry_tag": "@0.1.1",
-  "http_tag" : "@0.11.3+16",
-  "http_throttle_tag" : "@1.0.1",
-  "idl_parser_rev": "@5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "@0.15.2",
-  "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
-  "json_rpc_2_tag": "@2.0.6",
-  "linter_tag": "@0.1.49",
-  "logging_tag": "@0.11.3+1",
-  "markdown_tag": "@1.1.1",
-  "matcher_tag": "@0.12.1+4",
-  "mime_tag": "@0.9.6",
-  "mockito_tag": "@a92db054fba18bc2d605be7670aee74b7cadc00a",
-  "mustache4dart_tag" : "@v2.1.0",
-  "oauth2_tag": "@1.1.0",
-  "observatory_pub_packages_rev": "@d3a3aebefbd35aa30fe7bbc2889b772b398f7d7f",
-  "package_config_tag": "@1.0.3",
-  "package_resolver_tag": "@1.0.2+1",
-  "path_tag": "@1.5.1",
-  "plugin_tag": "@0.2.0+2",
-  "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
-  "pool_tag": "@1.3.4",
-  "protobuf_tag": "@0.7.1",
-  "pub_rev": "@2e821bff00c00889afe5200e3a33f280ce942336",
-  "pub_semver_tag": "@1.3.7",
-  "quiver_tag": "@5aaa3f58c48608af5b027444d561270b53f15dbf",
-  "resource_rev":"@af5a5bf65511943398146cf146e466e5f0b95cb9",
-  "root_certificates_rev": "@16ef64be64c7dfdff2b9f4b910726e635ccc519e",
-  "shelf_static_rev": "@v0.2.7",
-  "shelf_packages_handler_tag": "@1.0.3",
-  "shelf_tag": "@0.7.2",
-  "shelf_web_socket_tag": "@0.2.2",
-  "source_map_stack_trace_tag": "@1.1.4",
-  "source_maps-0.9.4_rev": "@38524",
-  "source_maps_tag": "@0.10.4",
-  "source_span_tag": "@1.4.0",
-  "stack_trace_tag": "@1.9.2",
-  "stream_channel_tag": "@1.6.4",
-  "string_scanner_tag": "@1.0.2",
-  "sunflower_rev": "@879b704933413414679396b129f5dfa96f7a0b1e",
-  "test_descriptor_tag": "@1.0.3",
-  "test_process_tag": "@1.0.1",
-  "term_glyph_tag": "@1.0.0",
-  "test_reflective_loader_tag": "@0.1.4",
-  "test_tag": "@0.12.30+1",
-  "tuple_tag": "@v1.0.1",
-  "typed_data_tag": "@1.1.3",
-  "usage_tag": "@3.3.0",
-  "utf_tag": "@0.9.0+4",
-  "watcher_tag": "@0.9.7+7",
-  "web_components_rev": "@8f57dac273412a7172c8ade6f361b407e2e4ed02",
-  "web_socket_channel_tag": "@1.0.7",
-  "WebCore_rev": "@fb11e887f77919450e497344da570d780e078bc8",
-  "yaml_tag": "@2.1.13",
-  "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
+  "dartdoc_tag" : "v0.19.0",
+  "fixnum_tag": "0.10.5",
+  "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
+  "glob_tag": "1.1.5",
+  "html_tag" : "0.13.3",
+  "http_io_tag": "35dc43c9144cf7ed4236843dacd62ebaf89df21a",
+  "http_multi_server_tag" : "2.0.4",
+  "http_parser_tag" : "3.1.1",
+  "http_retry_tag": "0.1.1",
+  "http_tag" : "0.11.3+16",
+  "http_throttle_tag" : "1.0.1",
+  "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
+  "intl_tag": "0.15.2",
+  "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
+  "json_rpc_2_tag": "2.0.6",
+  "linter_tag": "0.1.49",
+  "logging_tag": "0.11.3+1",
+  "markdown_tag": "1.1.1",
+  "matcher_tag": "0.12.1+4",
+  "mime_tag": "0.9.6",
+  "mockito_tag": "a92db054fba18bc2d605be7670aee74b7cadc00a",
+  "mustache4dart_tag" : "v2.1.1",
+  "oauth2_tag": "1.1.0",
+  "observatory_pub_packages_rev": "d3a3aebefbd35aa30fe7bbc2889b772b398f7d7f",
+  "package_config_tag": "1.0.3",
+  "package_resolver_tag": "1.0.2+1",
+  "path_tag": "1.5.1",
+  "plugin_tag": "0.2.0+2",
+  "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
+  "pool_tag": "1.3.4",
+  "protobuf_tag": "0.7.1",
+  "pub_rev": "2e821bff00c00889afe5200e3a33f280ce942336",
+  "pub_semver_tag": "1.3.7",
+  "quiver_tag": "5aaa3f58c48608af5b027444d561270b53f15dbf",
+  "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
+  "root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
+  "shelf_static_rev": "v0.2.7",
+  "shelf_packages_handler_tag": "1.0.3",
+  "shelf_tag": "0.7.2",
+  "shelf_web_socket_tag": "0.2.2",
+  "source_map_stack_trace_tag": "1.1.4",
+  "source_maps-0.9.4_rev": "38524",
+  "source_maps_tag": "0.10.4",
+  "source_span_tag": "1.4.0",
+  "stack_trace_tag": "1.9.2",
+  "stream_channel_tag": "1.6.4",
+  "string_scanner_tag": "1.0.2",
+  "sunflower_rev": "879b704933413414679396b129f5dfa96f7a0b1e",
+  "test_descriptor_tag": "1.0.3",
+  "test_process_tag": "1.0.1",
+  "term_glyph_tag": "1.0.0",
+  "test_reflective_loader_tag": "0.1.4",
+  "test_tag": "0.12.30+1",
+  "tuple_tag": "v1.0.1",
+  "typed_data_tag": "1.1.3",
+  "usage_tag": "3.3.0",
+  "utf_tag": "0.9.0+4",
+  "watcher_tag": "0.9.7+7",
+  "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
+  "web_socket_channel_tag": "1.0.7",
+  "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
+  "yaml_tag": "2.1.13",
+  "zlib_rev": "c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
 }
 
 deps = {
   # Stuff needed for GN build.
   Var("dart_root") + "/buildtools":
-     Var("fuchsia_git") + "/buildtools" + Var("buildtools_revision"),
+     Var("fuchsia_git") + "/buildtools" + "@" + Var("buildtools_revision"),
   Var("dart_root") + "/buildtools/clang_format/script":
     Var("chromium_git") + "/chromium/llvm-project/cfe/tools/clang-format.git" +
-    Var("clang_format_scripts_rev"),
+    "@" + Var("clang_format_scripts_rev"),
 
   Var("dart_root") + "/tests/co19/src":
-      Var("dart_git") + "co19.git" + Var("co19_rev"),
+      Var("dart_git") + "co19.git" + "@" + Var("co19_rev"),
 
 Var("dart_root") + "/tests/co19_2/src":
       Var("chromium_git") + "/external/github.com/dart-lang/co19.git" +
-      Var("co19_2_rev"),
+      "@" + Var("co19_2_rev"),
 
   Var("dart_root") + "/third_party/zlib":
       Var("chromium_git") + "/chromium/src/third_party/zlib.git" +
-      Var("zlib_rev"),
+      "@" + Var("zlib_rev"),
 
   Var("dart_root") + "/third_party/boringssl":
-      Var("dart_git") + "boringssl_gen.git" + Var("boringssl_gen_rev"),
+      Var("dart_git") + "boringssl_gen.git" + "@" + Var("boringssl_gen_rev"),
   Var("dart_root") + "/third_party/boringssl/src":
       "https://boringssl.googlesource.com/boringssl.git" +
-      Var("boringssl_rev"),
+      "@" + Var("boringssl_rev"),
 
   Var("dart_root") + "/third_party/root_certificates":
       Var("dart_git") + "root_certificates.git" +
-      Var("root_certificates_rev"),
+      "@" + Var("root_certificates_rev"),
 
   Var("dart_root") + "/third_party/jinja2":
       Var("chromium_git") + "/chromium/src/third_party/jinja2.git" +
-      Var("jinja2_rev"),
+      "@" + Var("jinja2_rev"),
 
   Var("dart_root") + "/third_party/ply":
       Var("chromium_git") + "/chromium/src/third_party/ply.git" +
-      Var("ply_rev"),
+      "@" + Var("ply_rev"),
 
   Var("dart_root") + "/tools/idl_parser":
       Var("chromium_git") + "/chromium/src/tools/idl_parser.git" +
-      Var("idl_parser_rev"),
+      "@" + Var("idl_parser_rev"),
 
   Var("dart_root") + "/third_party/WebCore":
-      Var("dart_git") + "webcore.git" + Var("WebCore_rev"),
+      Var("dart_git") + "webcore.git" + "@" + Var("WebCore_rev"),
 
   Var("dart_root") + "/third_party/tcmalloc/gperftools":
       Var('chromium_git') + '/external/github.com/gperftools/gperftools.git' +
-      Var("gperftools_revision"),
+      "@" + Var("gperftools_revision"),
 
   Var("dart_root") + "/third_party/pkg/args":
-      Var("dart_git") + "args.git" + Var("args_tag"),
+      Var("dart_git") + "args.git" + "@" + Var("args_tag"),
   Var("dart_root") + "/third_party/pkg/async":
-      Var("dart_git") + "async.git" + Var("async_tag"),
+      Var("dart_git") + "async.git" + "@" + Var("async_tag"),
   Var("dart_root") + "/third_party/pkg/barback":
-      Var("dart_git") + "barback.git" + Var("barback_tag"),
+      Var("dart_git") + "barback.git" + "@" + Var("barback_tag"),
   Var("dart_root") + "/third_party/pkg/bazel_worker":
-      Var("dart_git") + "bazel_worker.git" + Var("bazel_worker_tag"),
+      Var("dart_git") + "bazel_worker.git" + "@" + Var("bazel_worker_tag"),
   Var("dart_root") + "/third_party/pkg/boolean_selector":
       Var("dart_git") + "boolean_selector.git" +
-      Var("boolean_selector_tag"),
+      "@" + Var("boolean_selector_tag"),
   Var("dart_root") + "/third_party/pkg/charcode":
-      Var("dart_git") + "charcode.git" + Var("charcode_tag"),
+      Var("dart_git") + "charcode.git" + "@" + Var("charcode_tag"),
   Var("dart_root") + "/third_party/pkg/cli_util":
-      Var("dart_git") + "cli_util.git" + Var("cli_util_tag"),
+      Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_tag"),
   Var("dart_root") + "/third_party/pkg/collection":
-      Var("dart_git") + "collection.git" + Var("collection_tag"),
+      Var("dart_git") + "collection.git" + "@" + Var("collection_tag"),
   Var("dart_root") + "/third_party/pkg/convert":
-      Var("dart_git") + "convert.git" + Var("convert_tag"),
+      Var("dart_git") + "convert.git" + "@" + Var("convert_tag"),
   Var("dart_root") + "/third_party/pkg/crypto":
-      Var("dart_git") + "crypto.git" + Var("crypto_tag"),
+      Var("dart_git") + "crypto.git" + "@" + Var("crypto_tag"),
   Var("dart_root") + "/third_party/pkg/csslib":
-      Var("dart_git") + "csslib.git" + Var("csslib_tag"),
+      Var("dart_git") + "csslib.git" + "@" + Var("csslib_tag"),
   Var("dart_root") + "/third_party/pkg_tested/dart_style":
-      Var("dart_git") + "dart_style.git" + Var("dart_style_tag"),
+      Var("dart_git") + "dart_style.git" + "@" + Var("dart_style_tag"),
   Var("dart_root") + "/third_party/pkg/dart2js_info":
-      Var("dart_git") + "dart2js_info.git" + Var("dart2js_info_tag"),
+      Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
-      Var("dart_git") + "dartdoc.git" + Var("dartdoc_tag"),
+      Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
   Var("dart_root") + "/third_party/pkg/fixnum":
-      Var("dart_git") + "fixnum.git" + Var("fixnum_tag"),
+      Var("dart_git") + "fixnum.git" + "@" + Var("fixnum_tag"),
   Var("dart_root") + "/third_party/pkg/func":
-      Var("dart_git") + "func.git" + Var("func_rev"),
+      Var("dart_git") + "func.git" + "@" + Var("func_rev"),
   Var("dart_root") + "/third_party/pkg/glob":
-      Var("dart_git") + "glob.git" + Var("glob_tag"),
+      Var("dart_git") + "glob.git" + "@" + Var("glob_tag"),
   Var("dart_root") + "/third_party/pkg/html":
-      Var("dart_git") + "html.git" + Var("html_tag"),
+      Var("dart_git") + "html.git" + "@" + Var("html_tag"),
   Var("dart_root") + "/third_party/pkg/http":
-      Var("dart_git") + "http.git" + Var("http_tag"),
+      Var("dart_git") + "http.git" + "@" + Var("http_tag"),
   Var("dart_root") + "/third_party/pkg_tested/http_io":
-    Var("dart_git") + "http_io.git" + Var("http_io_tag"),
+    Var("dart_git") + "http_io.git" + "@" + Var("http_io_tag"),
   Var("dart_root") + "/third_party/pkg/http_multi_server":
       Var("dart_git") + "http_multi_server.git" +
-      Var("http_multi_server_tag"),
+      "@" + Var("http_multi_server_tag"),
   Var("dart_root") + "/third_party/pkg/http_parser":
-      Var("dart_git") + "http_parser.git" + Var("http_parser_tag"),
+      Var("dart_git") + "http_parser.git" + "@" + Var("http_parser_tag"),
   Var("dart_root") + "/third_party/pkg/http_retry":
       Var("dart_git") + "http_retry.git" +
-      Var("http_retry_tag"),
+      "@" + Var("http_retry_tag"),
   Var("dart_root") + "/third_party/pkg/http_throttle":
       Var("dart_git") + "http_throttle.git" +
-      Var("http_throttle_tag"),
+      "@" + Var("http_throttle_tag"),
   Var("dart_root") + "/third_party/pkg/intl":
-      Var("dart_git") + "intl.git" + Var("intl_tag"),
+      Var("dart_git") + "intl.git" + "@" + Var("intl_tag"),
   Var("dart_root") + "/third_party/pkg/json_rpc_2":
-      Var("dart_git") + "json_rpc_2.git" + Var("json_rpc_2_tag"),
+      Var("dart_git") + "json_rpc_2.git" + "@" + Var("json_rpc_2_tag"),
   Var("dart_root") + "/third_party/pkg/linter":
-      Var("dart_git") + "linter.git" + Var("linter_tag"),
+      Var("dart_git") + "linter.git" + "@" + Var("linter_tag"),
   Var("dart_root") + "/third_party/pkg/logging":
-      Var("dart_git") + "logging.git" + Var("logging_tag"),
+      Var("dart_git") + "logging.git" + "@" + Var("logging_tag"),
   Var("dart_root") + "/third_party/pkg/markdown":
-      Var("dart_git") + "markdown.git" + Var("markdown_tag"),
+      Var("dart_git") + "markdown.git" + "@" + Var("markdown_tag"),
   Var("dart_root") + "/third_party/pkg/matcher":
-      Var("dart_git") + "matcher.git" + Var("matcher_tag"),
+      Var("dart_git") + "matcher.git" + "@" + Var("matcher_tag"),
   Var("dart_root") + "/third_party/pkg/mime":
-      Var("dart_git") + "mime.git" + Var("mime_tag"),
+      Var("dart_git") + "mime.git" + "@" + Var("mime_tag"),
   Var("dart_root") + "/third_party/pkg/mockito":
-      Var("dart_git") + "mockito.git" + Var("mockito_tag"),
+      Var("dart_git") + "mockito.git" + "@" + Var("mockito_tag"),
   Var("dart_root") + "/third_party/pkg/mustache4dart":
       Var("chromium_git")
       + "/external/github.com/valotas/mustache4dart.git"
-      + Var("mustache4dart_tag"),
+      + "@" + Var("mustache4dart_tag"),
   Var("dart_root") + "/third_party/pkg/oauth2":
-      Var("dart_git") + "oauth2.git" + Var("oauth2_tag"),
+      Var("dart_git") + "oauth2.git" + "@" + Var("oauth2_tag"),
   Var("dart_root") + "/third_party/observatory_pub_packages":
       Var("dart_git") + "observatory_pub_packages.git"
-      + Var("observatory_pub_packages_rev"),
+      + "@" + Var("observatory_pub_packages_rev"),
   Var("dart_root") + "/third_party/pkg_tested/package_config":
       Var("dart_git") + "package_config.git" +
-      Var("package_config_tag"),
+      "@" + Var("package_config_tag"),
   Var("dart_root") + "/third_party/pkg_tested/package_resolver":
       Var("dart_git") + "package_resolver.git"
-      + Var("package_resolver_tag"),
+      + "@" + Var("package_resolver_tag"),
   Var("dart_root") + "/third_party/pkg/path":
-      Var("dart_git") + "path.git" + Var("path_tag"),
+      Var("dart_git") + "path.git" + "@" + Var("path_tag"),
   Var("dart_root") + "/third_party/pkg/plugin":
-      Var("dart_git") + "plugin.git" + Var("plugin_tag"),
+      Var("dart_git") + "plugin.git" + "@" + Var("plugin_tag"),
   Var("dart_root") + "/third_party/pkg/pool":
-      Var("dart_git") + "pool.git" + Var("pool_tag"),
+      Var("dart_git") + "pool.git" + "@" + Var("pool_tag"),
   Var("dart_root") + "/third_party/pkg/protobuf":
-      Var("dart_git") + "protobuf.git" + Var("protobuf_tag"),
+      Var("dart_git") + "protobuf.git" + "@" + Var("protobuf_tag"),
   Var("dart_root") + "/third_party/pkg/pub_semver":
-      Var("dart_git") + "pub_semver.git" + Var("pub_semver_tag"),
+      Var("dart_git") + "pub_semver.git" + "@" + Var("pub_semver_tag"),
   Var("dart_root") + "/third_party/pkg/pub":
-      Var("dart_git") + "pub.git" + Var("pub_rev"),
+      Var("dart_git") + "pub.git" + "@" + Var("pub_rev"),
   Var("dart_root") + "/third_party/pkg/quiver":
       Var("chromium_git")
       + "/external/github.com/google/quiver-dart.git"
-      + Var("quiver_tag"),
+      + "@" + Var("quiver_tag"),
   Var("dart_root") + "/third_party/pkg/resource":
-      Var("dart_git") + "resource.git" + Var("resource_rev"),
+      Var("dart_git") + "resource.git" + "@" + Var("resource_rev"),
   Var("dart_root") + "/third_party/pkg/shelf":
-      Var("dart_git") + "shelf.git" + Var("shelf_tag"),
+      Var("dart_git") + "shelf.git" + "@" + Var("shelf_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
       Var("dart_git") + "shelf_packages_handler.git"
-      + Var("shelf_packages_handler_tag"),
+      + "@" + Var("shelf_packages_handler_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_static":
-      Var("dart_git") + "shelf_static.git" + Var("shelf_static_rev"),
+      Var("dart_git") + "shelf_static.git" + "@" + Var("shelf_static_rev"),
   Var("dart_root") + "/third_party/pkg/shelf_web_socket":
       Var("dart_git") + "shelf_web_socket.git" +
-      Var("shelf_web_socket_tag"),
+      "@" + Var("shelf_web_socket_tag"),
   Var("dart_root") + "/third_party/pkg/source_maps":
-      Var("dart_git") + "source_maps.git" + Var("source_maps_tag"),
+      Var("dart_git") + "source_maps.git" + "@" + Var("source_maps_tag"),
   Var("dart_root") + "/third_party/pkg/source_span":
-      Var("dart_git") + "source_span.git" + Var("source_span_tag"),
+      Var("dart_git") + "source_span.git" + "@" + Var("source_span_tag"),
   Var("dart_root") + "/third_party/pkg/source_map_stack_trace":
       Var("dart_git") + "source_map_stack_trace.git" +
-      Var("source_map_stack_trace_tag"),
+      "@" + Var("source_map_stack_trace_tag"),
   Var("dart_root") + "/third_party/pkg/stack_trace":
-      Var("dart_git") + "stack_trace.git" + Var("stack_trace_tag"),
+      Var("dart_git") + "stack_trace.git" + "@" + Var("stack_trace_tag"),
   Var("dart_root") + "/third_party/pkg/stream_channel":
       Var("dart_git") + "stream_channel.git" +
-      Var("stream_channel_tag"),
+      "@" + Var("stream_channel_tag"),
   Var("dart_root") + "/third_party/pkg/string_scanner":
       Var("dart_git") + "string_scanner.git" +
-      Var("string_scanner_tag"),
+      "@" + Var("string_scanner_tag"),
   Var("dart_root") + "/third_party/sunflower":
       Var("chromium_git") +
       "/external/github.com/dart-lang/sample-sunflower.git" +
-      Var("sunflower_rev"),
+      "@" + Var("sunflower_rev"),
   Var("dart_root") + "/third_party/pkg/term_glyph":
-      Var("dart_git") + "term_glyph.git" + Var("term_glyph_tag"),
+      Var("dart_git") + "term_glyph.git" + "@" + Var("term_glyph_tag"),
   Var("dart_root") + "/third_party/pkg/test":
-      Var("dart_git") + "test.git" + Var("test_tag"),
+      Var("dart_git") + "test.git" + "@" + Var("test_tag"),
   Var("dart_root") + "/third_party/pkg/test_descriptor":
-      Var("dart_git") + "test_descriptor.git" + Var("test_descriptor_tag"),
+      Var("dart_git") + "test_descriptor.git" + "@" + Var("test_descriptor_tag"),
   Var("dart_root") + "/third_party/pkg/test_process":
-      Var("dart_git") + "test_process.git" + Var("test_process_tag"),
+      Var("dart_git") + "test_process.git" + "@" + Var("test_process_tag"),
   Var("dart_root") + "/third_party/pkg/test_reflective_loader":
       Var("dart_git") + "test_reflective_loader.git" +
-      Var("test_reflective_loader_tag"),
+      "@" + Var("test_reflective_loader_tag"),
   Var("dart_root") + "/third_party/pkg/tuple":
-      Var("dart_git") + "tuple.git" + Var("tuple_tag"),
+      Var("dart_git") + "tuple.git" + "@" + Var("tuple_tag"),
   Var("dart_root") + "/third_party/pkg/typed_data":
-      Var("dart_git") + "typed_data.git" + Var("typed_data_tag"),
+      Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
   Var("dart_root") + "/third_party/pkg/usage":
-      Var("dart_git") + "usage.git" + Var("usage_tag"),
+      Var("dart_git") + "usage.git" + "@" + Var("usage_tag"),
   Var("dart_root") + "/third_party/pkg/utf":
-      Var("dart_git") + "utf.git" + Var("utf_tag"),
+      Var("dart_git") + "utf.git" + "@" + Var("utf_tag"),
   Var("dart_root") + "/third_party/pkg/watcher":
-      Var("dart_git") + "watcher.git" + Var("watcher_tag"),
+      Var("dart_git") + "watcher.git" + "@" + Var("watcher_tag"),
   Var("dart_root") + "/third_party/pkg/web_components":
       Var("dart_git") + "web-components.git" +
-      Var("web_components_rev"),
+      "@" + Var("web_components_rev"),
   Var("dart_root") + "/third_party/pkg/web_socket_channel":
       Var("dart_git") + "web_socket_channel.git" +
-      Var("web_socket_channel_tag"),
+      "@" + Var("web_socket_channel_tag"),
   Var("dart_root") + "/third_party/pkg/yaml":
-      Var("dart_git") + "yaml.git" + Var("yaml_tag"),
-}
-
-deps_os = {
-  "win": {
-    Var("dart_root") + "/third_party/cygwin":
-      Var("chromium_git") + "/chromium/deps/cygwin.git" +
-      "@c89e446b273697fadf3a10ff1007a97c0b7de6df",
+      Var("dart_git") + "yaml.git" + "@" + Var("yaml_tag"),
+  Var("dart_root") + "/third_party/cygwin": {
+    "url": Var("chromium_git") + "/chromium/deps/cygwin.git" + "@" +
+        "c89e446b273697fadf3a10ff1007a97c0b7de6df",
+    "condition": "checkout_win",
   },
 }
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 002314b..4d83619 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -190,7 +190,7 @@
 
   windows = utils.GuessOS() == 'win32'
   if windows:
-    dart += '.bat'
+    dart += '.exe'
 
   if not os.path.isfile(dart):
     print('WARNING: dart not found: %s' % dart)
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 8085a6b..f8b1648 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 57;
+  static const int DATA_VERSION = 58;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index b82ab39..d775100 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -403,12 +403,10 @@
    * Return `true` if the API signature changed since the last refresh.
    */
   bool refresh({bool allowCached: false}) {
-    List<int> contentBytes;
     {
       var rawFileState = _fsState._fileContentCache.get(path, allowCached);
       _content = rawFileState.content;
       _exists = rawFileState.exists;
-      contentBytes = rawFileState.contentBytes;
       _contentHash = rawFileState.contentHash;
     }
 
@@ -416,7 +414,6 @@
     {
       ApiSignature signature = new ApiSignature();
       signature.addUint32List(_fsState._salt);
-      signature.addInt(contentBytes.length);
       signature.addString(_contentHash);
       _unlinkedKey = '${signature.toHex()}.unlinked';
     }
@@ -974,11 +971,9 @@
   final String path;
   final bool exists;
   final String content;
-  final List<int> contentBytes;
   final String contentHash;
 
-  _FileContent(this.path, this.exists, this.content, this.contentBytes,
-      this.contentHash);
+  _FileContent(this.path, this.exists, this.content, this.contentHash);
 }
 
 /**
@@ -1024,7 +1019,7 @@
       List<int> contentHashBytes = md5.convert(contentBytes).bytes;
       String contentHash = hex.encode(contentHashBytes);
 
-      file = new _FileContent(path, exists, content, contentBytes, contentHash);
+      file = new _FileContent(path, exists, content, contentHash);
       _pathToFile[path] = file;
     }
     return file;
diff --git a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
index ba03cb8..5778af8 100644
--- a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
@@ -277,9 +277,11 @@
     if (json is int) {
       return json;
     } else if (json is String) {
-      return int.parse(json, onError: (String value) {
+      int value = int.tryParse(json);
+      if (value == null) {
         throw mismatch(jsonPath, 'int', json);
-      });
+      }
+      return value;
     }
     throw mismatch(jsonPath, 'int', json);
   }
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index de73841..e08a1d1 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -440,13 +440,19 @@
     helpAndFail('Extra arguments: ${extra.join(" ")}');
   }
 
+  if (checkedMode && strongMode) {
+    checkedMode = false;
+    hints.add("Option '${Flags.enableCheckedMode}' is not needed in strong "
+        "mode.");
+  }
+
   if (trustTypeAnnotations) {
     if (checkedMode) {
       helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
           "checked mode.");
     } else if (strongMode) {
-      hints.add("Option '--trust-type-annotations' is not available "
-          "in strong mode. Try usign '--omit-implicit-checks' instead.");
+      hints.add("Option '${Flags.trustTypeAnnotations}' is not available "
+          "in strong mode. Try using '${Flags.omitImplicitChecks}' instead.");
     }
   }
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index e97726c..165643c 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -8,6 +8,7 @@
     show ChunkedConversionSink, JsonEncoder, StringConversionSink;
 
 import 'package:dart2js_info/info.dart';
+import 'package:path/path.dart' as p;
 
 import '../compiler_new.dart';
 import 'common/names.dart';
@@ -77,7 +78,17 @@
       libname = '<unnamed>';
     }
     int size = compiler.dumpInfoTask.sizeOf(lib);
-    LibraryInfo info = new LibraryInfo(libname, lib.canonicalUri, null, size);
+
+    var uri = lib.canonicalUri;
+    if (Uri.base.isScheme('file') && lib.canonicalUri.isScheme('file')) {
+      var basePath = p.fromUri(Uri.base);
+      var libPath = p.fromUri(lib.canonicalUri);
+      if (p.isWithin(basePath, libPath)) {
+        uri = p.toUri(p.relative(libPath, from: basePath));
+      }
+    }
+
+    LibraryInfo info = new LibraryInfo(libname, uri, null, size);
     _entityToInfo[lib] = info;
 
     environment.forEachLibraryMember(lib, (MemberEntity member) {
@@ -127,8 +138,12 @@
   GlobalTypeInferenceElementResult _resultOfParameter(Local e) =>
       compiler.globalInference.results.resultOfParameter(e);
 
-  FieldInfo visitField(FieldEntity field) {
-    if (!_hasBeenResolved(field)) {
+  FieldInfo visitField(FieldEntity field, {ClassEntity containingClass}) {
+    var isInInstantiatedClass = false;
+    if (containingClass != null) {
+      isInInstantiatedClass = closedWorld.isInstantiated(containingClass);
+    }
+    if (!isInInstantiatedClass && !_hasBeenResolved(field)) {
       return null;
     }
     TypeMask inferredType = _resultOfMember(field).type;
@@ -137,6 +152,8 @@
 
     int size = compiler.dumpInfoTask.sizeOf(field);
     String code = compiler.dumpInfoTask.codeOf(field);
+
+    // TODO(het): Why doesn't `size` account for the code size already?
     if (code != null) size += code.length;
 
     FieldInfo info = new FieldInfo(
@@ -193,7 +210,7 @@
           }
         }
       } else if (member.isField) {
-        FieldInfo fieldInfo = visitField(member);
+        FieldInfo fieldInfo = visitField(member, containingClass: clazz);
         if (fieldInfo != null) {
           classInfo.fields.add(fieldInfo);
           fieldInfo.parent = classInfo;
diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
index 4b80a11..3c0949f 100644
--- a/pkg/compiler/lib/src/elements/resolution_types.dart
+++ b/pkg/compiler/lib/src/elements/resolution_types.dart
@@ -1117,7 +1117,7 @@
  * substitute for the bound of [typeVariable]. [bound] holds the bound against
  * which [typeArgument] should be checked.
  */
-typedef void CheckTypeVariableBound(GenericType type, DartType typeArgument,
+typedef void CheckTypeVariableBound<T>(T context, DartType typeArgument,
     TypeVariableType typeVariable, DartType bound);
 
 class Types extends DartTypes {
@@ -1248,14 +1248,16 @@
   }
 
   @override
-  void checkTypeVariableBounds(
-      covariant ResolutionInterfaceType type,
-      void checkTypeVariableBound(InterfaceType type, DartType typeArgument,
+  void checkTypeVariableBounds<T>(
+      T context,
+      List<DartType> typeArguments,
+      List<DartType> typeVariables,
+      void checkTypeVariableBound(T context, DartType typeArgument,
           TypeVariableType typeVariable, DartType bound)) {
-    void f(DartType type, DartType typeArgument, TypeVariableType typeVariable,
+    void f(T context, DartType typeArgument, TypeVariableType typeVariable,
             DartType bound) =>
-        checkTypeVariableBound(type, typeArgument, typeVariable, bound);
-    genericCheckTypeVariableBounds(type, f);
+        checkTypeVariableBound(context, typeArgument, typeVariable, bound);
+    genericCheckTypeVariableBounds(context, typeArguments, typeVariables, f);
   }
 
   /**
@@ -1263,18 +1265,18 @@
    * declared on [element]. Calls [checkTypeVariableBound] on each type
    * argument and bound.
    */
-  void genericCheckTypeVariableBounds(
-      GenericType type, CheckTypeVariableBound checkTypeVariableBound) {
-    TypeDeclarationElement element = type.element;
-    List<ResolutionDartType> typeArguments = type.typeArguments;
-    List<ResolutionDartType> typeVariables = element.typeVariables;
+  void genericCheckTypeVariableBounds<T>(
+      T context,
+      List<DartType> typeArguments,
+      List<DartType> typeVariables,
+      CheckTypeVariableBound<T> checkTypeVariableBound) {
     assert(typeVariables.length == typeArguments.length);
     for (int index = 0; index < typeArguments.length; index++) {
       ResolutionTypeVariableType typeVariable = typeVariables[index];
       ResolutionDartType bound =
-          typeVariable.element.bound.substByContext(type);
+          typeVariable.element.bound.subst(typeArguments, typeVariables);
       ResolutionDartType typeArgument = typeArguments[index];
-      checkTypeVariableBound(type, typeArgument, typeVariable, bound);
+      checkTypeVariableBound(context, typeArgument, typeVariable, bound);
     }
   }
 
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index b60700f..20264b1 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -1408,9 +1408,11 @@
   /// Checks the type arguments of [type] against the type variable bounds
   /// declared on `type.element`. Calls [checkTypeVariableBound] on each type
   /// argument and bound.
-  void checkTypeVariableBounds(
-      InterfaceType type,
-      void checkTypeVariableBound(InterfaceType type, DartType typeArgument,
+  void checkTypeVariableBounds<T>(
+      T context,
+      List<DartType> typeArguments,
+      List<DartType> typeVariables,
+      void checkTypeVariableBound(T context, DartType typeArgument,
           TypeVariableType typeVariable, DartType bound));
 
   /// Returns the [ClassEntity] which declares the type variables occurring in
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 5b6488d..ab2f509 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -19,6 +19,7 @@
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show Emitter;
+import '../options.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../world.dart' show ClosedWorld;
@@ -139,8 +140,9 @@
 
   /// Computes the [RuntimeTypesNeed] for the data registered with this builder.
   RuntimeTypesNeed computeRuntimeTypesNeed(
-      ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
-      {bool enableTypeAssertions, bool strongMode});
+      ResolutionWorldBuilder resolutionWorldBuilder,
+      ClosedWorld closedWorld,
+      CompilerOptions options);
 }
 
 class TrivialRuntimeTypesNeedBuilder implements RuntimeTypesNeedBuilder {
@@ -157,8 +159,9 @@
 
   @override
   RuntimeTypesNeed computeRuntimeTypesNeed(
-      ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
-      {bool enableTypeAssertions, bool strongMode}) {
+      ResolutionWorldBuilder resolutionWorldBuilder,
+      ClosedWorld closedWorld,
+      CompilerOptions options) {
     return const TrivialRuntimeTypesNeed();
   }
 }
@@ -200,8 +203,7 @@
 
   /// Computes the [RuntimeTypesChecks] for the data in this builder.
   RuntimeTypesChecks computeRequiredChecks(
-      CodegenWorldBuilder codegenWorldBuilder,
-      {bool strongMode});
+      CodegenWorldBuilder codegenWorldBuilder, CompilerOptions options);
 
   bool get rtiChecksBuilderClosed;
 }
@@ -221,8 +223,7 @@
 
   @override
   RuntimeTypesChecks computeRequiredChecks(
-      CodegenWorldBuilder codegenWorldBuilder,
-      {bool strongMode}) {
+      CodegenWorldBuilder codegenWorldBuilder, CompilerOptions options) {
     rtiChecksBuilderClosed = true;
 
     Map<ClassEntity, ClassUse> classUseMap = <ClassEntity, ClassUse>{};
@@ -235,7 +236,7 @@
         ..typeArgument = true
         ..checkedTypeArgument = true
         ..functionType = _computeFunctionType(_elementEnvironment, cls,
-            strongMode: strongMode);
+            strongMode: options.strongMode);
       classUseMap[cls] = classUse;
     }
     TypeChecks typeChecks = _substitutions._requiredChecks =
@@ -1387,8 +1388,9 @@
 
   @override
   RuntimeTypesNeed computeRuntimeTypesNeed(
-      ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
-      {bool enableTypeAssertions, bool strongMode}) {
+      ResolutionWorldBuilder resolutionWorldBuilder,
+      ClosedWorld closedWorld,
+      CompilerOptions options) {
     TypeVariableTests typeVariableTests = new TypeVariableTests(
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
@@ -1437,7 +1439,7 @@
       });
     }
 
-    Set<Local> localFunctions = strongMode
+    Set<Local> localFunctions = options.strongMode
         ? resolutionWorldBuilder.localFunctions.toSet()
         : resolutionWorldBuilder.localFunctionsWithFreeTypeVariables.toSet();
     Set<FunctionEntity> closurizedMembers =
@@ -1459,7 +1461,7 @@
 
       Set<Local> localFunctionsToRemove;
       Set<FunctionEntity> closurizedMembersToRemove;
-      if (strongMode) {
+      if (options.strongMode) {
         for (Local function in localFunctions) {
           FunctionType functionType =
               _elementEnvironment.getLocalFunctionType(function);
@@ -1535,7 +1537,7 @@
     processChecks(typeVariableTests.explicitIsChecks);
     processChecks(typeVariableTests.implicitIsChecks);
 
-    if (enableTypeAssertions) {
+    if (options.enableTypeAssertions) {
       checkClosures();
     }
 
@@ -1555,6 +1557,29 @@
       }
     }
 
+    if (options.parameterCheckPolicy.isEmitted) {
+      void checkFunction(Entity function, FunctionType type) {
+        for (FunctionTypeVariable typeVariable in type.typeVariables) {
+          DartType bound = typeVariable.bound;
+          if (!bound.isDynamic &&
+              !bound.isVoid &&
+              bound != closedWorld.commonElements.objectType) {
+            potentiallyNeedTypeArguments(function);
+            break;
+          }
+        }
+      }
+
+      for (FunctionEntity method in resolutionWorldBuilder.genericMethods) {
+        checkFunction(method, _elementEnvironment.getFunctionType(method));
+      }
+
+      for (Local function in resolutionWorldBuilder.genericLocalFunctions) {
+        checkFunction(
+            function, _elementEnvironment.getLocalFunctionType(function));
+      }
+    }
+
     Set<Selector> selectorsNeedingTypeArguments = new Set<Selector>();
     typeVariableTests
         .forEachAppliedSelector((Selector selector, Set<Entity> targets) {
@@ -1692,8 +1717,7 @@
   }
 
   RuntimeTypesChecks computeRequiredChecks(
-      CodegenWorldBuilder codegenWorldBuilder,
-      {bool strongMode}) {
+      CodegenWorldBuilder codegenWorldBuilder, CompilerOptions options) {
     TypeVariableTests typeVariableTests = new TypeVariableTests(
         _elementEnvironment, _commonElements, _types, codegenWorldBuilder,
         forRtiNeeds: false);
@@ -1786,7 +1810,7 @@
       void processClass(ClassEntity cls) {
         ClassFunctionType functionType = _computeFunctionType(
             _elementEnvironment, cls,
-            strongMode: strongMode);
+            strongMode: options.strongMode);
         if (functionType != null) {
           ClassUse classUse =
               classUseMap.putIfAbsent(cls, () => new ClassUse());
@@ -1812,6 +1836,20 @@
       liveClasses.forEach(processSuperClasses);
     }
 
+    if (options.parameterCheckPolicy.isEmitted) {
+      for (FunctionEntity method in codegenWorldBuilder.genericMethods) {
+        if (_rtiNeed.methodNeedsTypeArguments(method)) {
+          for (TypeVariableType typeVariable
+              in _elementEnvironment.getFunctionTypeVariables(method)) {
+            DartType bound =
+                _elementEnvironment.getTypeVariableBound(typeVariable.element);
+            processCheckedType(bound);
+            liveTypeVisitor.visit(bound, true);
+          }
+        }
+      }
+    }
+
     cachedRequiredChecks = _computeChecks(classUseMap);
     rtiChecksBuilderClosed = true;
     return new _RuntimeTypesChecks(this, cachedRequiredChecks);
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index d4a56bc..84f2502 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -13,6 +13,7 @@
 import '../js_backend/namer.dart' show Namer;
 import '../js_backend/native_data.dart';
 import '../js_backend/interceptor_data.dart';
+import '../js_backend/runtime_types.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector;
 import '../universe/world_builder.dart'
@@ -28,6 +29,7 @@
 
   final CodeEmitterTask _emitterTask;
   final Namer _namer;
+  final RuntimeTypesEncoder _rtiEncoder;
   final NativeData _nativeData;
   final InterceptorData _interceptorData;
   final CodegenWorldBuilder _codegenWorldBuilder;
@@ -37,6 +39,7 @@
   ParameterStubGenerator(
       this._emitterTask,
       this._namer,
+      this._rtiEncoder,
       this._nativeData,
       this._interceptorData,
       this._codegenWorldBuilder,
@@ -164,9 +167,11 @@
       for (TypeVariableType typeVariable
           in _closedWorld.elementEnvironment.getFunctionTypeVariables(member)) {
         if (selector.typeArgumentCount == 0) {
-          // TODO(32741): Insert the type variable bound instead of `null`.
-          targetArguments[count++] =
-              _emitter.constantReference(new NullConstantValue());
+          targetArguments[count++] = _rtiEncoder.getTypeRepresentation(
+              _emitter,
+              _closedWorld.elementEnvironment
+                  .getTypeVariableBound(typeVariable.element),
+              (_) => _emitter.constantReference(new NullConstantValue()));
         } else {
           String jsName = '\$${typeVariable.element.name}';
           stubParameters[parameterIndex++] = new jsAst.Parameter(jsName);
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 3b55095..87667ed 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
@@ -985,6 +985,7 @@
     ParameterStubGenerator generator = new ParameterStubGenerator(
         _task,
         _namer,
+        _rtiEncoder,
         _nativeData,
         _interceptorData,
         _worldBuilder,
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index 6f979fd..1f1895b 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -113,7 +113,7 @@
   }
 
   void computeRequiredTypeChecks(RuntimeTypesChecksBuilder rtiChecksBuilder) {
-    _rtiChecks = rtiChecksBuilder.computeRequiredChecks(_codegenWorldBuilder,
-        strongMode: _options.strongMode);
+    _rtiChecks =
+        rtiChecksBuilder.computeRequiredChecks(_codegenWorldBuilder, _options);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 5216b83..1a73d22 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -2113,9 +2113,7 @@
             typesImplementedBySubclasses,
             classHierarchyNodes,
             classSets) {
-    computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder,
-        enableTypeAssertions: options.enableTypeAssertions,
-        strongMode: options.strongMode);
+    computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/types.dart b/pkg/compiler/lib/src/kernel/types.dart
index 9f6efde..6775859 100644
--- a/pkg/compiler/lib/src/kernel/types.dart
+++ b/pkg/compiler/lib/src/kernel/types.dart
@@ -69,23 +69,20 @@
   }
 
   @override
-  void checkTypeVariableBounds(
-      InterfaceType instantiatedType,
-      void checkTypeVariableBound(InterfaceType type, DartType typeArgument,
+  void checkTypeVariableBounds<T>(
+      T context,
+      List<DartType> typeArguments,
+      List<DartType> typeVariables,
+      void checkTypeVariableBound(T context, DartType typeArgument,
           TypeVariableType typeVariable, DartType bound)) {
-    InterfaceType declaredType = getThisType(instantiatedType.element);
-    List<DartType> typeArguments = instantiatedType.typeArguments;
-    List<DartType> typeVariables = declaredType.typeArguments;
     assert(typeVariables.length == typeArguments.length);
     for (int index = 0; index < typeArguments.length; index++) {
       DartType typeArgument = typeArguments[index];
       TypeVariableType typeVariable = typeVariables[index];
-      DartType bound = substByContext(
-          elementMap.elementEnvironment
-              .getTypeVariableBound(typeVariable.element),
-          instantiatedType);
-      checkTypeVariableBound(
-          instantiatedType, typeArgument, typeVariable, bound);
+      DartType bound = elementMap.elementEnvironment
+          .getTypeVariableBound(typeVariable.element)
+          .subst(typeArguments, typeVariables);
+      checkTypeVariableBound(context, typeArgument, typeVariable, bound);
     }
   }
 
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 01e4689..53fa292 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -316,7 +316,8 @@
       ..enableMinification = _hasOption(options, Flags.minify)
       ..enableNativeLiveTypeAnalysis =
           !_hasOption(options, Flags.disableNativeLiveTypeAnalysis)
-      ..enableTypeAssertions = _hasOption(options, Flags.enableCheckedMode)
+      ..enableTypeAssertions = _hasOption(options, Flags.enableCheckedMode) &&
+          !_hasOption(options, Flags.strongMode)
       ..enableUserAssertions = _hasOption(options, Flags.enableCheckedMode) ||
           _hasOption(options, Flags.enableAsserts)
       ..experimentalTrackAllocations =
@@ -460,6 +461,9 @@
   static const trusted = const CheckPolicy(isTrusted: true);
   static const checked = const CheckPolicy(isEmitted: true);
   static const ignored = const CheckPolicy(isIgnored: true);
+
+  String toString() => 'CheckPolicy(isTrusted=$isTrusted,'
+      'isEmitted=$isEmitted,isIgnored=$isIgnored)';
 }
 
 String _extractStringOption(
diff --git a/pkg/compiler/lib/src/resolution/type_resolver.dart b/pkg/compiler/lib/src/resolution/type_resolver.dart
index 40d5dd9..47b9ef0 100644
--- a/pkg/compiler/lib/src/resolution/type_resolver.dart
+++ b/pkg/compiler/lib/src/resolution/type_resolver.dart
@@ -415,7 +415,8 @@
       }
     }
 
-    types.genericCheckTypeVariableBounds(type, checkTypeVariableBound);
+    types.genericCheckTypeVariableBounds(type, type.typeArguments,
+        type.element.typeVariables, checkTypeVariableBound);
   }
 
   /**
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 23353e6..8a75570 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1566,19 +1566,29 @@
     }
   }
 
-  void assertIsSubtype(ast.Node node, ResolutionDartType subtype,
-      ResolutionDartType supertype, String message) {
+  void assertIsSubtype(
+      ast.Node node,
+      ResolutionDartType subtype,
+      ResolutionDartType supertype,
+      String prefix,
+      String infix,
+      String suffix) {
     HInstruction subtypeInstruction = typeBuilder.analyzeTypeArgument(
         localsHandler.substInContext(subtype), sourceElement);
     HInstruction supertypeInstruction = typeBuilder.analyzeTypeArgument(
         localsHandler.substInContext(supertype), sourceElement);
-    HInstruction messageInstruction =
-        graph.addConstantString(message, closedWorld);
+    HInstruction prefixInstruction =
+        graph.addConstantString(prefix, closedWorld);
+    HInstruction infixInstruction = graph.addConstantString(infix, closedWorld);
+    HInstruction suffixInstruction =
+        graph.addConstantString(suffix, closedWorld);
     MethodElement element = commonElements.assertIsSubtype;
     var inputs = <HInstruction>[
       subtypeInstruction,
       supertypeInstruction,
-      messageInstruction
+      prefixInstruction,
+      infixInstruction,
+      suffixInstruction,
     ];
     HInstruction assertIsSubtype = new HInvokeStatic(element, inputs,
         subtypeInstruction.instructionType, const <DartType>[]);
@@ -3691,15 +3701,21 @@
       int subtypeRelation = types.computeSubtypeRelation(typeArgument, bound);
       if (subtypeRelation == DartTypes.IS_SUBTYPE) return;
 
-      String message = "Can't create an instance of malbounded type '$type': "
-          "'${typeArgument}' is not a subtype of bound '${bound}' for "
-          "type variable '${typeVariable}' of type "
-          "${type == instance
-              ? "'${type.element.thisType}'"
-              : "'${instance.element.thisType}' on the supertype "
-                "'${instance}' of '${type}'"
-            }.";
+      String prefix = "Can't create an instance of malbounded type '$type': '";
+      String infix = "' is not a subtype of bound '";
+      String suffix;
+
+      if (type == instance) {
+        suffix = "' of type variable '${typeVariable}' of type "
+            "'${type.element.thisType}'.";
+      } else {
+        suffix = "' of type variable '${typeVariable}' of type "
+            "'${instance.element.thisType}' on the supertype "
+            "'${instance}' of '${type}'.";
+      }
+
       if (subtypeRelation == DartTypes.NOT_SUBTYPE) {
+        String message = "TypeError: $prefix$typeArgument$infix$bound$suffix";
         generateTypeError(node, message);
         definitelyFails = true;
         return;
@@ -3708,18 +3724,20 @@
             typeArgument, () => new Set<ResolutionDartType>());
         if (!seenChecks.contains(bound)) {
           seenChecks.add(bound);
-          assertIsSubtype(node, typeArgument, bound, message);
+          assertIsSubtype(node, typeArgument, bound, prefix, infix, suffix);
         }
       }
     }
 
-    types.checkTypeVariableBounds(type, addTypeVariableBoundCheck);
+    types.checkTypeVariableBounds(type, type.typeArguments,
+        type.element.typeVariables, addTypeVariableBoundCheck);
     if (definitelyFails) {
       return true;
     }
     for (ResolutionInterfaceType supertype in type.element.allSupertypes) {
       ResolutionInterfaceType instance = type.asInstanceOf(supertype.element);
-      types.checkTypeVariableBounds(instance, addTypeVariableBoundCheck);
+      types.checkTypeVariableBounds(instance, instance.typeArguments,
+          instance.element.typeVariables, addTypeVariableBoundCheck);
       if (definitelyFails) {
         return true;
       }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 029f975..3d8966f 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -991,6 +991,30 @@
 
     function.positionalParameters.forEach(_handleParameter);
     function.namedParameters.toList()..forEach(_handleParameter);
+
+    checkTypeVariableBounds(targetElement);
+  }
+
+  void checkTypeVariableBounds(FunctionEntity method) {
+    if (rtiNeed.methodNeedsTypeArguments(method)) {
+      ir.FunctionNode function = getFunctionNode(_elementMap, method);
+      for (ir.TypeParameter typeParameter in function.typeParameters) {
+        Local local = localsMap.getLocalTypeVariable(
+            new ir.TypeParameterType(typeParameter), _elementMap);
+        HInstruction newParameter = localsHandler.directLocals[local];
+        DartType bound = _getDartTypeIfValid(typeParameter.bound);
+        if (!bound.isDynamic &&
+            !bound.isVoid &&
+            bound != _commonElements.objectType) {
+          _assertIsType(
+              newParameter,
+              bound,
+              "The type argument '",
+              "' is not a subtype of the type variable bound '",
+              "' of type variable '${local.name}' in '${method.name}'.");
+        }
+      }
+    }
   }
 
   /// Builds a SSA graph for FunctionNodes of external methods.
@@ -4250,15 +4274,21 @@
       int subtypeRelation = types.computeSubtypeRelation(typeArgument, bound);
       if (subtypeRelation == DartTypes.IS_SUBTYPE) return;
 
-      String message = "Can't create an instance of malbounded type '$type': "
-          "'${typeArgument}' is not a subtype of bound '${bound}' for "
-          "type variable '${typeVariable}' of type "
-          "${type == instance
-              ? "'${types.getThisType(type.element)}'"
-              : "'${types.getThisType(instance.element)}' on the supertype "
-                "'${instance}' of '${type}'"
-            }.";
+      String prefix = "Can't create an instance of malbounded type '$type': '";
+      String infix = "' is not a subtype of bound '";
+      String suffix;
+
+      if (type == instance) {
+        suffix = "' type variable '${typeVariable}' of type "
+            "'${types.getThisType(type.element)}'.";
+      } else {
+        suffix = "' type variable '${typeVariable}' of type "
+            "'${types.getThisType(instance.element)}' on the supertype "
+            "'${instance}' of '${type}'.";
+      }
+
       if (subtypeRelation == DartTypes.NOT_SUBTYPE) {
+        String message = "TypeError: $prefix$typeArgument$infix$bound$suffix";
         generateTypeError(message, sourceInformation);
         knownInvalidBounds = true;
         return;
@@ -4267,19 +4297,29 @@
             seenChecksMap.putIfAbsent(typeArgument, () => new Set<DartType>());
         if (!seenChecks.contains(bound)) {
           seenChecks.add(bound);
-          _assertIsSubtype(typeArgument, bound, message);
+          _assertIsSubtype(typeArgument, bound, prefix, infix, suffix);
         }
       }
     }
 
-    types.checkTypeVariableBounds(type, _addTypeVariableBoundCheck);
+    types.checkTypeVariableBounds(
+        type,
+        type.typeArguments,
+        _elementMap.elementEnvironment.getThisType(type.element).typeArguments,
+        _addTypeVariableBoundCheck);
     if (knownInvalidBounds) {
       return true;
     }
     for (InterfaceType supertype
         in types.getSupertypes(constructor.enclosingClass)) {
       InterfaceType instance = types.asInstanceOf(type, supertype.element);
-      types.checkTypeVariableBounds(instance, _addTypeVariableBoundCheck);
+      types.checkTypeVariableBounds(
+          instance,
+          instance.typeArguments,
+          _elementMap.elementEnvironment
+              .getThisType(instance.element)
+              .typeArguments,
+          _addTypeVariableBoundCheck);
       if (knownInvalidBounds) {
         return true;
       }
@@ -4287,22 +4327,33 @@
     return false;
   }
 
-  void _assertIsSubtype(DartType subtype, DartType supertype, String message) {
+  void _assertIsSubtype(DartType subtype, DartType supertype, String prefix,
+      String infix, String suffix) {
     HInstruction subtypeInstruction = typeBuilder.analyzeTypeArgument(
         localsHandler.substInContext(subtype), sourceElement);
+    _assertIsType(subtypeInstruction, supertype, prefix, infix, suffix);
+    registry?.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
+  }
+
+  void _assertIsType(HInstruction subtypeInstruction, DartType supertype,
+      String prefix, String infix, String suffix) {
     HInstruction supertypeInstruction = typeBuilder.analyzeTypeArgument(
         localsHandler.substInContext(supertype), sourceElement);
-    HInstruction messageInstruction =
-        graph.addConstantString(message, closedWorld);
+    HInstruction prefixInstruction =
+        graph.addConstantString(prefix, closedWorld);
+    HInstruction infixInstruction = graph.addConstantString(infix, closedWorld);
+    HInstruction suffixInstruction =
+        graph.addConstantString(suffix, closedWorld);
     FunctionEntity element = commonElements.assertIsSubtype;
     var inputs = <HInstruction>[
       subtypeInstruction,
       supertypeInstruction,
-      messageInstruction
+      prefixInstruction,
+      infixInstruction,
+      suffixInstruction
     ];
     HInstruction assertIsSubtype = new HInvokeStatic(element, inputs,
         subtypeInstruction.instructionType, const <DartType>[]);
-    registry?.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
     add(assertIsSubtype);
   }
 
@@ -5606,9 +5657,11 @@
   GlobalLocalsMap _globalLocalsMap;
 
   KernelTypeBuilder(
-      GraphBuilder builder, this._elementMap, this._globalLocalsMap)
+      KernelSsaGraphBuilder builder, this._elementMap, this._globalLocalsMap)
       : super(builder);
 
+  KernelSsaGraphBuilder get builder => super.builder;
+
   ClassTypeVariableAccess computeTypeVariableAccess(MemberEntity member) {
     return _elementMap.getClassTypeVariableAccessForMember(member);
   }
@@ -5625,6 +5678,7 @@
       potentiallyCheckOrTrustTypeOfParameter(
           argument, localsMap.getLocalType(_elementMap, parameter));
     });
+    builder.checkTypeVariableBounds(function);
   }
 }
 
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index b22749f..735c58e 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -104,6 +104,11 @@
     registerSeenClasses(node.returnType);
     node.positionalParameters.forEach(handleParameter);
     node.namedParameters.forEach(handleParameter);
+    if (_options.strongMode) {
+      for (ir.TypeParameter parameter in node.typeParameters) {
+        checkType(parameter.bound, TypeUseKind.PARAMETER_CHECK);
+      }
+    }
   }
 
   ResolutionImpact buildField(ir.Field field) {
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 5aa3fc6..dd8bea5 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -20,6 +20,7 @@
 import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
+import '../universe/use.dart' show StaticUse;
 import '../util/util.dart';
 import '../world.dart' show ClosedWorld;
 import 'interceptor_simplifier.dart';
@@ -538,10 +539,9 @@
         _closedWorld.locateSingleMember(node.selector, receiverType);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
     if (element != null &&
-        element.isFunction
+        element.isFunction &&
         // If we found out that the only target is an implicitly called
         // [:noSuchMethod:] we just ignore it.
-        &&
         node.selector.applies(element)) {
       FunctionEntity method = element;
 
@@ -654,6 +654,7 @@
         node.typeArguments,
         node.sourceInformation);
     result.element = method;
+    _registry.registerStaticUse(new StaticUse.inlining(method, null));
     return result;
   }
 
@@ -799,7 +800,7 @@
     //
     //    if (x) { init(); x = false; } else { x = false; }
     //
-    // which is further simplifed to:
+    // which is further simplified to:
     //
     //    if (x) { init(); }
     //    ...
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index b6b3485..12c547a0 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -618,6 +618,23 @@
     _instanceMemberUsage.forEach(processMemberUse);
     return functions;
   }
+
+  @override
+  Iterable<FunctionEntity> get genericMethods {
+    List<FunctionEntity> functions = <FunctionEntity>[];
+
+    void processMemberUse(Entity member, AbstractUsage memberUsage) {
+      if (member is FunctionEntity &&
+          memberUsage.hasUse &&
+          _elementEnvironment.getFunctionTypeVariables(member).isNotEmpty) {
+        functions.add(member);
+      }
+    }
+
+    _instanceMemberUsage.forEach(processMemberUse);
+    _staticMemberUsage.forEach(processMemberUse);
+    return functions;
+  }
 }
 
 class ElementCodegenWorldBuilderImpl extends CodegenWorldBuilderImpl {
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 2849612..7983684 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -975,6 +975,22 @@
     return classHierarchyBuilder.isInheritedInSubtypeOf(
         member.enclosingClass, type);
   }
+
+  @override
+  Iterable<FunctionEntity> get genericMethods {
+    List<FunctionEntity> functions = <FunctionEntity>[];
+
+    void processMemberUse(Entity member, AbstractUsage memberUsage) {
+      if (member is FunctionEntity &&
+          memberUsage.hasUse &&
+          _elementEnvironment.getFunctionTypeVariables(member).isNotEmpty) {
+        functions.add(member);
+      }
+    }
+
+    _memberUsage.forEach(processMemberUse);
+    return functions;
+  }
 }
 
 abstract class KernelResolutionWorldBuilderBase
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 9b67772..fdac83d 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -293,6 +293,9 @@
   /// Live generic local functions.
   Iterable<Local> get genericLocalFunctions;
 
+  /// Live generic methods.
+  Iterable<FunctionEntity> get genericMethods;
+
   /// Live user-defined 'noSuchMethod' implementations.
   Iterable<FunctionEntity> get userNoSuchMethods;
 
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index bfe1a5d..f2d8b34 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -1338,9 +1338,7 @@
             typesImplementedBySubclasses,
             classHierarchyNodes,
             classSets) {
-    computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder,
-        enableTypeAssertions: options.enableTypeAssertions,
-        strongMode: options.strongMode);
+    computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
   }
 
   bool checkClass(ClassElement cls) => cls.isDeclaration;
@@ -1470,11 +1468,9 @@
   RuntimeTypesNeed _rtiNeed;
 
   void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      {bool enableTypeAssertions, bool strongMode}) {
+      RuntimeTypesNeedBuilder rtiNeedBuilder, CompilerOptions options) {
     _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed(
-        resolutionWorldBuilder, this,
-        enableTypeAssertions: enableTypeAssertions, strongMode: strongMode);
+        resolutionWorldBuilder, this, options);
   }
 
   RuntimeTypesNeed get rtiNeed => _rtiNeed;
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 3cf04df..3530a9f 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -19,6 +19,8 @@
     path: ../../third_party/pkg/dart2js_info
   front_end:
     path: ../front_end
+  path:
+    path: ../../third_party/pkg/path
 dependency_overrides:
   front_end:
     path: ../front_end
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 3b3ad50..deb7004 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -34,6 +34,7 @@
 import '../compiler/js_names.dart' as JS;
 import '../compiler/module_builder.dart'
     show transformModuleFormat, ModuleFormat;
+import '../compiler/shared_command.dart';
 import '../js_ast/js_ast.dart' as JS;
 import '../js_ast/js_ast.dart' show js;
 import '../js_ast/source_map_printer.dart' show SourceMapPrintingContext;
@@ -113,17 +114,8 @@
       context.resultProvider =
           new InputPackagesResultProvider(context, summaryData);
     }
-    var variables = <String, String>{};
-    variables.addAll(options.declaredVariables);
-    variables.addAll({
-      'dart.isVM': 'false',
-      // TODO(vsm): Should this be hardcoded?
-      'dart.library.html': 'true',
-      'dart.library.io': 'false',
-      'dart.library.ui': 'false',
-      'dart.library.mirrors': 'false',
-      'dart.library.isolate': 'false'
-    });
+    var variables = new Map<String, String>.from(options.declaredVariables)
+      ..addAll(sdkLibraryVariables);
 
     context.declaredVariables = new DeclaredVariables.fromMap(variables);
     if (!context.analysisOptions.strongMode) {
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
new file mode 100644
index 0000000..3c4a177
--- /dev/null
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -0,0 +1,36 @@
+// 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.
+
+/// Shared code between Analyzer and Kernel CLI interfaces.
+///
+/// This file should only implement functionality that does not depend on
+/// Analyzer/Kernel imports.
+
+/// Variables that indicate which libraries are available in dev compiler.
+// TODO(jmesserly): provide an option to compile without dart:html & friends?
+Map<String, String> sdkLibraryVariables = {
+  'dart.isVM': 'false',
+  'dart.library.async': 'true',
+  'dart.library.core': 'true',
+  'dart.library.collection': 'true',
+  'dart.library.convert': 'true',
+  // TODO(jmesserly): this is not really supported in dart4web other than
+  // `debugger()`
+  'dart.library.developer': 'true',
+  'dart.library.io': 'false',
+  'dart.library.isolate': 'false',
+  'dart.library.js': 'true',
+  'dart.library.js_util': 'true',
+  'dart.library.math': 'true',
+  'dart.library.mirrors': 'false',
+  'dart.library.typed_data': 'true',
+  'dart.library.indexed_db': 'true',
+  'dart.library.html': 'true',
+  'dart.library.html_common': 'true',
+  'dart.library.svg': 'true',
+  'dart.library.ui': 'false',
+  'dart.library.web_audio': 'true',
+  'dart.library.web_gl': 'true',
+  'dart.library.web_sql': 'true',
+};
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 92a045d..0510037 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:dev_compiler/src/kernel/target.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:front_end/src/multi_root_file_system.dart';
@@ -17,9 +16,11 @@
 
 import '../compiler/js_names.dart' as JS;
 import '../compiler/module_builder.dart';
+import '../compiler/shared_command.dart';
 import '../js_ast/js_ast.dart' as JS;
 import '../js_ast/source_map_printer.dart' show SourceMapPrintingContext;
 import 'compiler.dart';
+import 'target.dart';
 
 const _binaryName = 'dartdevk';
 
@@ -373,15 +374,7 @@
   }
 
   // Add platform defined variables
-  declaredVariables.addAll({
-    'dart.isVM': 'false',
-    // TODO(vsm): Should this be hardcoded?
-    'dart.library.html': 'true',
-    'dart.library.io': 'false',
-    'dart.library.ui': 'false',
-    'dart.library.mirrors': 'false',
-    'dart.library.isolate': 'false'
-  });
+  declaredVariables.addAll(sdkLibraryVariables);
 
   return declaredVariables;
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index c39004a..e8aa203 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4652,8 +4652,7 @@
         args.positional.length == 1 &&
         // TODO(jmesserly): this does not correctly handle when the arguments to
         // fromEnvironment are constant non-literal values.
-        args.positional[0] is BasicLiteral &&
-        (args.named.isEmpty || args.named[0].value is BasicLiteral)) {
+        args.positional[0] is BasicLiteral) {
       var varName = (args.positional[0] as StringLiteral).value;
       var value = declaredVariables[varName];
       var defaultArg = args.named.isNotEmpty ? args.named[0].value : null;
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index c60a782..d9ed1f49 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -4,7 +4,8 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/kernel.dart' show Component;
+import 'package:kernel/kernel.dart'
+    show Component, DartType, NamedNode, Procedure, TypeParameter;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
@@ -12,8 +13,19 @@
 
 import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
 
+import '../fasta/scanner/string_scanner.dart' show StringScanner;
+
 import 'compiler_options.dart' show CompilerOptions;
 
+/// Identifies a position in the source program for expression compilation.
+///
+/// Currently this can be either a library-scope or a class-scope. This object
+/// may also contain references to FE-internal datastructures, so it is
+/// invalidated by any changes to the Kernel program.
+abstract class CompilationPosition {
+  final NamedNode kernelNode = null;
+}
+
 abstract class IncrementalKernelGenerator {
   factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint,
       [Uri bootstrapDill]) {
@@ -30,4 +42,42 @@
   /// valid files.  This guarantees that those files will be re-read on the
   /// next call to [computeDelta]).
   void invalidate(Uri uri);
+
+  /// Compile [expression] as an [Expression]. A function returning that
+  /// expression is compiled.
+  ///
+  /// [expression] may use the variables supplied in [definitions] as free
+  /// variables and [typeDefinitions] as free type variables. These will become
+  /// required parameters to the compiled function. All elements of
+  /// [definitions] and [typeDefinitions] will become parameters/type
+  /// parameters, whether or not they appear free in [expression]. The type
+  /// parameters should have a null parent pointer.
+  ///
+  /// [enclosingNode] must refer to either a [Library] or a [Class] in which
+  /// scope [expression] is compiled. If it refers to a [Class], the flag
+  /// [isStatic] determines whether [expression] may reference "this".
+  ///
+  /// It is illegal to use "await" in [expression] and the compiled function
+  /// will always be synchronous.
+  ///
+  /// [computeDelta] must have been called at least once prior.
+  ///
+  /// [compileExpression] will return [null] if the library or class for
+  /// [enclosingNode] could not be found. Otherwise, errors are reported in the
+  /// normal way.
+  Future<Procedure> compileExpression(
+      String expression,
+      Map<String, DartType> definitions,
+      List<TypeParameter> typeDefinitions,
+      CompilationPosition position,
+      [bool isStatic = false]);
+
+  /// Finds the [CompilationPosition] referenced by [library] and optionally
+  /// [class].
+  CompilationPosition resolveCompilationPosition(Uri library,
+      [String className]);
+}
+
+bool isLegalIdentifier(String identifier) {
+  return StringScanner.isLegalIdentifier(identifier);
 }
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 17a2764..1933002 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -8,13 +8,25 @@
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 
-import 'package:kernel/kernel.dart'
-    show Component, Library, LibraryPart, Procedure, Source;
-
 import '../api_prototype/file_system.dart' show FileSystemEntity;
 
+import 'package:kernel/kernel.dart'
+    show
+        AsyncMarker,
+        Component,
+        DartType,
+        DynamicType,
+        InterfaceType,
+        Library,
+        LibraryPart,
+        NamedNode,
+        Procedure,
+        ProcedureKind,
+        Source,
+        TypeParameter;
+
 import '../api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator;
+    show CompilationPosition, isLegalIdentifier, IncrementalKernelGenerator;
 
 import 'builder/builder.dart' show LibraryBuilder;
 
@@ -31,12 +43,55 @@
 
 import 'library_graph.dart' show LibraryGraph;
 
+import 'kernel/kernel_library_builder.dart' show KernelLibraryBuilder;
+
 import 'source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'ticker.dart' show Ticker;
 
 import 'uri_translator.dart' show UriTranslator;
 
+import 'modifier.dart' as Modifier;
+
+import '../scanner/token.dart' show Token;
+
+import 'scanner/error_token.dart' show ErrorToken;
+
+import 'scanner/string_scanner.dart' show StringScanner;
+
+import 'dill/built_type_builder.dart' show BuiltTypeBuilder;
+
+import 'kernel/kernel_formal_parameter_builder.dart'
+    show KernelFormalParameterBuilder;
+
+import 'kernel/kernel_procedure_builder.dart' show KernelProcedureBuilder;
+
+import 'builder/class_builder.dart' show ClassBuilder;
+
+import 'kernel/kernel_shadow_ast.dart' show ShadowTypeInferenceEngine;
+
+import 'kernel/body_builder.dart' show BodyBuilder;
+
+import 'kernel/kernel_type_variable_builder.dart'
+    show KernelTypeVariableBuilder;
+
+import 'parser/parser.dart' show Parser;
+
+import 'parser/member_kind.dart' show MemberKind;
+
+import 'scope.dart' show Scope;
+
+import 'type_inference/type_inferrer.dart' show TypeInferrer;
+
+class IncrementalCompilationPosition implements CompilationPosition {
+  final NamedNode kernelNode;
+  final LibraryBuilder libraryBuilder; // will not be null
+  final ClassBuilder classBuilder; // may be null if not inside a class
+
+  IncrementalCompilationPosition(
+      this.kernelNode, this.libraryBuilder, this.classBuilder);
+}
+
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
@@ -46,7 +101,7 @@
 
   DillTarget dillLoadedData;
   Map<Uri, Source> dillLoadedDataUriToSource = <Uri, Source>{};
-  List<LibraryBuilder> platformBuilders;
+  Map<Uri, LibraryBuilder> platformBuilders;
   Map<Uri, LibraryBuilder> userBuilders;
   final Uri initializeFromDillUri;
   bool initializedFromDill = false;
@@ -101,10 +156,10 @@
         }
         summaryBytes = null;
         userBuilders = <Uri, LibraryBuilder>{};
-        platformBuilders = <LibraryBuilder>[];
+        platformBuilders = <Uri, LibraryBuilder>{};
         dillLoadedData.loader.builders.forEach((uri, builder) {
           if (builder.uri.scheme == "dart") {
-            platformBuilders.add(builder);
+            platformBuilders[uri] = builder;
           } else {
             userBuilders[uri] = builder;
           }
@@ -132,7 +187,8 @@
         ticker.logMs("Decided to reuse ${reusedLibraries.length}"
             " of ${userCode.loader.builders.length} libraries");
       }
-      reusedLibraries.addAll(platformBuilders);
+
+      reusedLibraries.addAll(platformBuilders.values);
 
       KernelIncrementalTarget userCodeOld = userCode;
       userCode = new KernelIncrementalTarget(
@@ -168,8 +224,11 @@
         return new Component(
             libraries: compiledLibraries, uriToSource: <Uri, Source>{});
       }
-      userCodeOld?.loader?.builders?.clear();
-      userCodeOld = null;
+      if (componentWithDill != null) {
+        userCodeOld?.loader?.releaseAncillaryResources();
+        userCodeOld?.loader?.builders?.clear();
+        userCodeOld = null;
+      }
 
       List<Library> compiledLibraries =
           new List<Library>.from(userCode.loader.libraries);
@@ -188,8 +247,10 @@
         outputLibraries = compiledLibraries;
       }
 
-      // Clean up.
-      userCode.loader.releaseAncillaryResources();
+      if (componentWithDill == null) {
+        userCode.loader.builders.clear();
+        userCode = userCodeOld;
+      }
 
       // This is the incremental component.
       return new Component(libraries: outputLibraries, uriToSource: uriToSource)
@@ -318,6 +379,194 @@
     ticker.logMs("Appended libraries");
   }
 
+  IncrementalCompilationPosition resolveCompilationPosition(Uri libraryUri,
+      [String className]) {
+    if (userCode == null || dillLoadedData == null) return null;
+
+    // Find library.
+    LibraryBuilder enclosingLibrary = userCode.loader.builders[libraryUri];
+    if (enclosingLibrary == null) return null;
+
+    if (className == null) {
+      return new IncrementalCompilationPosition(
+          enclosingLibrary.target, enclosingLibrary, null);
+    }
+
+    ClassBuilder classBuilder = enclosingLibrary.scopeBuilder[className];
+    if (classBuilder == null) return null;
+
+    return new IncrementalCompilationPosition(
+        classBuilder.target, enclosingLibrary, classBuilder);
+  }
+
+  @override
+  Future<Procedure> compileExpression(
+      String expression,
+      Map<String, DartType> definitions,
+      List<TypeParameter> typeDefinitions,
+      covariant IncrementalCompilationPosition position,
+      [bool isStatic = false]) async {
+    assert(dillLoadedData != null && userCode != null);
+
+    dillLoadedData.loader.seenMessages.clear();
+    userCode.loader.seenMessages.clear();
+
+    for (TypeParameter typeParam in typeDefinitions) {
+      if (!isLegalIdentifier(typeParam.name)) return null;
+    }
+    for (String name in definitions.keys) {
+      if (!isLegalIdentifier(name)) return null;
+    }
+
+    String expressionPrefix =
+        '(${definitions.keys.map((name) => "dynamic $name").join(",")}) =>';
+
+    return context.runInContext((CompilerContext c) async {
+      // Find library builder or report error.
+      bool inClass = position.classBuilder != null;
+      LibraryBuilder enclosingLibraryBuilder = position.libraryBuilder;
+      ClassBuilder classBuilder = position.classBuilder;
+      Library enclosingLibrary = position.libraryBuilder.target;
+
+      dillLoadedData.loader.coreTypes = userCode.loader.coreTypes;
+
+      // Create a synthetic KernelLibraryBuilder to hold the compiled procedure.
+      // This ensures that the uri and character offset positions inside the
+      // expression refer to the the expression text, and not to random
+      // positions in the enclosing library's source.
+      Uri debugExprUri = new Uri(
+          scheme: "org-dartlang-debug", path: "synthetic_debug_expression");
+      KernelLibraryBuilder kernelLibraryBuilder = new KernelLibraryBuilder(
+          debugExprUri,
+          debugExprUri,
+          userCode.loader,
+          /*actualOrigin=*/ null,
+          enclosingLibrary);
+
+      // Parse the function prefix.
+      StringScanner scanner = new StringScanner(expressionPrefix);
+      Token startToken = scanner.tokenize();
+      assert(startToken is! ErrorToken);
+      assert(!scanner.hasErrors);
+
+      // Parse the expression. By parsing the expression separately from the
+      // function prefix, we ensure that the offsets for tokens coming from the
+      // expression are correct.
+      scanner = new StringScanner(expression);
+      Token expressionStartToken = scanner.tokenize();
+      while (expressionStartToken is ErrorToken) {
+        ErrorToken token = expressionStartToken;
+        // add compile time error
+        kernelLibraryBuilder.addCompileTimeError(token.assertionMessage,
+            token.charOffset, token.endOffset - token.charOffset, debugExprUri);
+      }
+
+      var functionLastToken = startToken;
+      while (!functionLastToken.next.isEof) {
+        functionLastToken.offset = -1;
+        functionLastToken = functionLastToken.next;
+      }
+      functionLastToken.offset = -1;
+
+      functionLastToken.next = expressionStartToken;
+      expressionStartToken.previous = functionLastToken;
+
+      // If we're in a library loaded from a dill file, we'll have to do some
+      // extra work to get the scope setup.
+      if (enclosingLibraryBuilder is DillLibraryBuilder) {
+        dillLoadedData.loader.buildOutline(enclosingLibraryBuilder);
+        Map<Uri, LibraryBuilder> libraries = <Uri, LibraryBuilder>{};
+        if (userBuilders != null) libraries.addAll(userBuilders);
+        libraries.addAll(platformBuilders);
+        enclosingLibraryBuilder.addImportsToScope(libraries);
+      }
+      Scope scope =
+          inClass ? classBuilder.scope : enclosingLibraryBuilder.scope;
+
+      // Create a [ProcedureBuilder] and a [BodyBuilder] to parse the expression.
+      dynamicType() => new BuiltTypeBuilder(new DynamicType());
+      List<KernelFormalParameterBuilder> formalParameterBuilders =
+          <KernelFormalParameterBuilder>[];
+      definitions.forEach((name, type) {
+        formalParameterBuilders.add(new KernelFormalParameterBuilder(
+            null,
+            Modifier.varMask,
+            new BuiltTypeBuilder(type),
+            name,
+            false,
+            kernelLibraryBuilder,
+            -1));
+      });
+      List<KernelTypeVariableBuilder> typeVariableBuilders =
+          <KernelTypeVariableBuilder>[];
+      typeDefinitions.forEach((TypeParameter typeParam) {
+        typeVariableBuilders.add(new KernelTypeVariableBuilder(
+            typeParam.name,
+            kernelLibraryBuilder,
+            -1,
+            new BuiltTypeBuilder(typeParam.bound),
+            typeParam));
+      });
+      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
+          /*metadata=*/ null,
+          isStatic ? Modifier.staticMask : Modifier.varMask,
+          dynamicType(),
+          "debugExpr",
+          typeVariableBuilders,
+          formalParameterBuilders,
+          ProcedureKind.Method,
+          kernelLibraryBuilder,
+          /*charOffset=*/ -1,
+          /*charOpenParenOffset=*/ -1,
+          /*charEndOffset=*/ -1);
+      Procedure procedure = procedureBuilder.build(kernelLibraryBuilder);
+      procedure.parent =
+          inClass ? classBuilder.target : kernelLibraryBuilder.target;
+      scope = procedureBuilder.computeTypeParameterScope(scope);
+      Scope formalParamScope =
+          procedureBuilder.computeFormalParameterScope(scope);
+      var typeInferenceEngine = new ShadowTypeInferenceEngine(
+          null, /*strongMode=*/ context.options.strongMode);
+      typeInferenceEngine.prepareTopLevel(
+          userCode.loader.coreTypes, userCode.loader.hierarchy);
+      InterfaceType thisType;
+      if (inClass) {
+        thisType = classBuilder.target.thisType;
+      }
+      TypeInferrer typeInferrer = typeInferenceEngine.createLocalTypeInferrer(
+          debugExprUri, thisType, kernelLibraryBuilder);
+      BodyBuilder bodyBuilder = new BodyBuilder(
+          kernelLibraryBuilder,
+          procedureBuilder,
+          scope,
+          formalParamScope,
+          userCode.loader.hierarchy,
+          userCode.loader.coreTypes,
+          classBuilder,
+          inClass && !isStatic,
+          null /*uri*/,
+          typeInferrer);
+      bodyBuilder.scope = formalParamScope;
+
+      // Parse the expression.
+      MemberKind kind = inClass
+          ? (isStatic ? MemberKind.StaticMethod : MemberKind.NonStaticMethod)
+          : MemberKind.TopLevelMethod;
+      Parser parser = new Parser(bodyBuilder);
+      Token token = parser.syntheticPreviousToken(startToken);
+      token = parser.parseFormalParametersOpt(token, kind);
+      var formals = bodyBuilder.pop();
+      bodyBuilder.checkEmpty(token.next.charOffset);
+      parser.parseFunctionBody(
+          token, /*isExpression=*/ true, /*allowAbstract=*/ false);
+      var body = bodyBuilder.pop();
+      bodyBuilder.checkEmpty(token.charOffset);
+      bodyBuilder.finishFunction([], formals, AsyncMarker.Sync, body);
+
+      return procedure;
+    });
+  }
+
   List<LibraryBuilder> computeReusedLibraries(
       Set<Uri> invalidatedUris, UriTranslator uriTranslator) {
     if (userCode == null && userBuilders == null) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 4742c42..0a02326 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -111,8 +111,11 @@
   /// the error message is the corresponding value in the map.
   Map<String, String> unserializableExports;
 
-  KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin)
-      : library = actualOrigin?.library ?? new Library(uri, fileUri: fileUri),
+  KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin,
+      [Library intendedTarget])
+      : library = intendedTarget ??
+            actualOrigin?.library ??
+            new Library(uri, fileUri: fileUri),
         super(loader, fileUri);
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 00ef2e1..485a005 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -29,9 +29,12 @@
 
   KernelTypeVariableBuilder(
       String name, KernelLibraryBuilder compilationUnit, int charOffset,
-      [KernelTypeBuilder bound])
-      : actualParameter = new TypeParameter(name, null)
-          ..fileOffset = charOffset,
+      [KernelTypeBuilder bound, TypeParameter actual])
+      // TODO(32378): We would like to use '??' here instead, but in conjuction
+      // with '..', it crashes Dart2JS.
+      : actualParameter = actual != null
+            ? (actual..fileOffset = charOffset)
+            : (new TypeParameter(name, null)..fileOffset = charOffset),
         super(name, bound, compilationUnit, charOffset);
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
index 236b31e..ee2d64b 100644
--- a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
@@ -4,7 +4,7 @@
 
 library dart2js.scanner.string_scanner;
 
-import '../../scanner/token.dart' show SyntheticStringToken, TokenType;
+import '../../scanner/token.dart' show SyntheticStringToken, Token, TokenType;
 
 import '../../scanner/token.dart' as analyzer show StringToken;
 
@@ -12,6 +12,8 @@
 
 import 'token.dart' show CommentToken, DartDocToken, StringToken;
 
+import 'error_token.dart' show ErrorToken;
+
 /**
  * Scanner that reads from a String and creates tokens that points to
  * substrings.
@@ -37,6 +39,12 @@
         : string;
   }
 
+  static bool isLegalIdentifier(String identifier) {
+    StringScanner scanner = new StringScanner(identifier);
+    Token startToken = scanner.tokenize();
+    return startToken is! ErrorToken && startToken.next.isEof;
+  }
+
   int advance() => string.codeUnitAt(++scanOffset);
   int peek() => string.codeUnitAt(scanOffset + 1);
 
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index c0611b0..37741b9 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -14,7 +14,6 @@
     show
         Procedure,
         Component,
-        CanonicalName,
         DynamicType,
         DartType,
         TypeParameter;
@@ -42,7 +41,7 @@
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+    show IncrementalCompiler, IncrementalCompilationPosition;
 
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 
@@ -123,7 +122,9 @@
 
   final bool isStaticMethod;
 
-  final CanonicalName enclosingNode;
+  final Uri library;
+
+  final String className;
 
   String expression;
 
@@ -135,7 +136,8 @@
       this.definitions,
       this.typeDefinitions,
       this.isStaticMethod,
-      this.enclosingNode,
+      this.library,
+      this.className,
       this.expression);
 
   String toString() {
@@ -143,7 +145,8 @@
         "$entryPoint, "
         "$definitions, "
         "$typeDefinitions,"
-        "$enclosingNode, "
+        "$library, "
+        "$className, "
         "static = $isStaticMethod)";
   }
 
@@ -155,7 +158,7 @@
     if (!(new File.fromUri(entryPoint)).existsSync()) {
       return "Entry point $entryPoint doesn't exist.";
     }
-    if (enclosingNode == null || enclosingNode == "") {
+    if (library == null) {
       return "No enclosing node.";
     }
     if (expression == null) {
@@ -233,7 +236,8 @@
     List<String> definitions = <String>[];
     List<String> typeDefinitions = <String>[];
     bool isStaticMethod = false;
-    CanonicalName enclosingNode;
+    Uri library;
+    String className;
     String expression;
 
     dynamic maps = loadYamlNode(contents, sourceUrl: uri);
@@ -248,13 +252,10 @@
         if (key == "entry_point") {
           entryPoint = description.uri.resolveUri(Uri.parse(value as String));
         } else if (key == "position") {
-          Uri positionUri =
-              description.uri.resolveUri(Uri.parse(value as String));
-          enclosingNode = new CanonicalName.root();
-          enclosingNode =
-              enclosingNode.getChild("${positionUri.removeFragment()}");
-          if (positionUri.fragment != null && positionUri.fragment != '') {
-            enclosingNode = enclosingNode.getChild(positionUri.fragment);
+          Uri uri = description.uri.resolveUri(Uri.parse(value as String));
+          library = uri.removeFragment();
+          if (uri.fragment != null && uri.fragment != '') {
+            className = uri.fragment;
           }
         } else if (key == "definitions") {
           definitions = (value as YamlList).map((x) => x as String).toList();
@@ -268,7 +269,7 @@
         }
       }
       var test = new TestCase(description, entryPoint, definitions,
-          typeDefinitions, isStaticMethod, enclosingNode, expression);
+          typeDefinitions, isStaticMethod, library, className, expression);
       var result = test.validate();
       if (result != null) {
         return new Result.fail(tests, result);
@@ -325,9 +326,15 @@
       }
 
       for (var compiler in [sourceCompiler, dillCompiler]) {
-        // TODO: actually run the compiler
-        test.results
-            .add(new CompilationResult(compiler == null ? null : null, []));
+        IncrementalCompilationPosition enclosingNode =
+            compiler.resolveCompilationPosition(test.library, test.className);
+        Procedure compiledProcedure;
+        if (enclosingNode != null) {
+          compiledProcedure = await compiler.compileExpression(test.expression,
+              definitions, typeParams, enclosingNode, test.isStaticMethod);
+        }
+        var errors = context.takeErrors();
+        test.results.add(new CompilationResult(compiledProcedure, errors));
       }
     }
     return new Result.pass(tests);
@@ -357,7 +364,7 @@
   final List<CompilationMessage> errors = <CompilationMessage>[];
 
   final CompilerOptions optionBuilder = new CompilerOptions()
-    ..strongMode = false
+    ..strongMode = true
     ..reportMessages = true
     ..verbose = true
     ..fileSystem = fs
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index ddacabc..4ce0e7b 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -49,6 +49,7 @@
     'lib/src/base',
     'lib/src/byte_store',
     'lib/src/fasta',
+    'lib/src/fasta/scanner'
   ]),
   'lib/src/api_unstable': new SubpackageRules(allowedDependencies: [
     'lib/src',
@@ -75,6 +76,7 @@
     'lib/src/fasta/scanner',
     'lib/src/fasta/source',
     'lib/src/fasta/util',
+    'lib/src/fasta/type_inference',
     'lib/src/scanner',
   ]),
   'lib/src/fasta/builder': new SubpackageRules(allowedDependencies: [
diff --git a/pkg/front_end/testcases/expression.status b/pkg/front_end/testcases/expression.status
index 87a97a3..87869b0 100644
--- a/pkg/front_end/testcases/expression.status
+++ b/pkg/front_end/testcases/expression.status
@@ -1,47 +1,3 @@
 // 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.
-
-class_capture.expression: Fail
-class_getter.expression: Fail
-class_invalid_static.expression: Fail
-class_invalid_static_capture.expression: Fail
-class_invalid_static_getter.expression: Fail
-class_invalid_static_setter.expression: Fail
-class_method.expression: Fail
-class_setter.expression: Fail
-class_static.expression: Fail
-class_static2.expression: Fail
-class_static3.expression: Fail
-class_type_param_bound.expression: Fail
-class_type_param_bound_illegal.expression: Fail
-class_type_param_reference.expression: Fail
-class_type_param_reference_arg.expression: Fail
-class_type_param_reference_arg_inferred.expression: Fail
-class_type_param_reference_ctor.expression: Fail
-class_type_param_reference_ctor_inferred.expression: Fail
-class_type_param_reference_var.expression: Fail
-core_lib_imported.expression: Fail
-core_lib_internal.expression: Fail
-eval.dart: Fail
-invalid.expression: Fail
-lib_ctor.expression: Fail
-lib_external_ctor.expression: Fail
-lib_nonctor.expression: Fail
-lib_nonreference.expression: Fail
-lib_nonshown_ctor.expression: Fail
-lib_reference.expression: Fail
-lib_simple.expression: Fail
-missing_variable_types.expression: Fail
-param_assign.expression: Fail
-param_capture.expression: Fail
-param_conflict.expression: Fail
-param_conflict_class.expression: Fail
-param_method.expression: Fail
-type_param_bound.expression: Fail
-type_param_shadow.expression: Fail
-type_param_shadow_arg.expression: Fail
-type_param_shadow_arg_ctor_inferred.expression: Fail
-type_param_shadow_arg_inferred.expression: Fail
-type_param_shadow_ctor.expression: Fail
-type_param_shadow_var.expression: Fail
diff --git a/pkg/front_end/testcases/expression/main.dart b/pkg/front_end/testcases/expression/main.dart
index ba2d61d..d946d39 100644
--- a/pkg/front_end/testcases/expression/main.dart
+++ b/pkg/front_end/testcases/expression/main.dart
@@ -2,10 +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.
 
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 library main;
 
 import 'dart:io' show File, Process, exit;
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index 6368c6b..b5a35db 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -3,5 +3,5 @@
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
   return () → dart.core::Null {
-    main::A::debugExpr::T k = let final dynamic #t1 = new main::A::•<dynamic>() in let dynamic _ = null in invalid-expression "Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'main::A::debugExpr::T'.\nTry changing the type of the left hand side, or casting the right hand side to 'main::A::debugExpr::T'.";
+    main::A::debugExpr::T k = let final dynamic #t1 = let dynamic _ = null in invalid-expression "Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'main::A::debugExpr::T'.\nTry changing the type of the left hand side, or casting the right hand side to 'main::A::debugExpr::T'." in let final dynamic #t2 = new main::A::•<dynamic>() in null;
   };
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index c5638dd..ba13f5c 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -42,8 +42,6 @@
 
 type UInt32 = big endian 32-bit unsigned integer
 
-type Double = Double-precision floating-point number.
-
 type List<T> {
   UInt length;
   T[length] items;
@@ -713,7 +711,7 @@
 
 type DoubleLiteral extends Expression {
   Byte tag = 40;
-  Double value;
+  StringReference valueString;
 }
 
 type TrueLiteral extends Expression {
@@ -876,7 +874,7 @@
 
 type DoubleConstant extends Constant {
   Byte tag = 3;
-  Double value;
+  StringReference value;
 }
 
 type StringConstant extends Constant {
@@ -1052,8 +1050,8 @@
 type TryCatch extends Statement {
   Byte tag = 75;
   Statement body;
-  // 1 if any catch needs a stacktrace (have a stacktrace variable).
-  Byte anyCatchNeedsStackTrace;
+  // "any catch needs a stacktrace" means it has a stacktrace variable.
+  Byte flags (anyCatchNeedsStackTrace, isSynthesized);
   List<Catch> catches;
 }
 
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 3bfd973..2d27d28 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4164,8 +4164,9 @@
 class TryCatch extends Statement {
   Statement body;
   List<Catch> catches;
+  bool isSynthetic;
 
-  TryCatch(this.body, this.catches) {
+  TryCatch(this.body, this.catches, {this.isSynthetic: false}) {
     body?.parent = this;
     setParents(catches, this);
   }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 384fcf5..d9e61cc 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -97,22 +97,6 @@
         readByte();
   }
 
-  final Float64List _doubleBuffer = new Float64List(1);
-  Uint8List _doubleBufferUint8;
-
-  double readDouble() {
-    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
-    _doubleBufferUint8[0] = readByte();
-    _doubleBufferUint8[1] = readByte();
-    _doubleBufferUint8[2] = readByte();
-    _doubleBufferUint8[3] = readByte();
-    _doubleBufferUint8[4] = readByte();
-    _doubleBufferUint8[5] = readByte();
-    _doubleBufferUint8[6] = readByte();
-    _doubleBufferUint8[7] = readByte();
-    return _doubleBuffer[0];
-  }
-
   List<int> readByteList() {
     List<int> bytes = new Uint8List(readUInt());
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
@@ -190,7 +174,7 @@
       case ConstantTag.IntConstant:
         return new IntConstant((readExpression() as IntLiteral).value);
       case ConstantTag.DoubleConstant:
-        return new DoubleConstant(readDouble());
+        return new DoubleConstant(double.parse(readStringReference()));
       case ConstantTag.StringConstant:
         return new StringConstant(readStringReference());
       case ConstantTag.MapConstant:
@@ -1349,7 +1333,7 @@
       case Tag.BigIntLiteral:
         return new IntLiteral(int.parse(readStringReference()));
       case Tag.DoubleLiteral:
-        return new DoubleLiteral(readDouble());
+        return new DoubleLiteral(double.parse(readStringReference()));
       case Tag.TrueLiteral:
         return new BoolLiteral(true);
       case Tag.FalseLiteral:
@@ -1565,8 +1549,8 @@
         return new ReturnStatement(readExpressionOption())..fileOffset = offset;
       case Tag.TryCatch:
         Statement body = readStatement();
-        readByte(); // whether any catch needs a stacktrace.
-        return new TryCatch(body, readCatchList());
+        int flags = readByte();
+        return new TryCatch(body, readCatchList(), isSynthetic: flags & 2 == 2);
       case Tag.TryFinally:
         return new TryFinally(readStatement(), readStatement());
       case Tag.YieldStatement:
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 7314521..adb16a0 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -147,7 +147,7 @@
       writeInteger(constant.value);
     } else if (constant is DoubleConstant) {
       writeByte(ConstantTag.DoubleConstant);
-      writeDouble(constant.value);
+      writeStringReference('${constant.value}');
     } else if (constant is StringConstant) {
       writeByte(ConstantTag.StringConstant);
       writeStringReference(constant.value);
@@ -1238,12 +1238,13 @@
 
   @override
   void visitDoubleLiteral(DoubleLiteral node) {
-    writeByte(Tag.DoubleLiteral);
     writeDouble(node.value);
   }
 
   writeDouble(double value) {
-    _sink.addDouble(value);
+    // TODO: Pick a better format for double literals.
+    writeByte(Tag.DoubleLiteral);
+    writeStringReference('$value');
   }
 
   @override
@@ -1543,17 +1544,16 @@
     writeOptionalNode(node.expression);
   }
 
+  int _encodeTryCatchFlags(bool needsStackTrace, bool isSynthetic) {
+    return (needsStackTrace ? 1 : 0) | (isSynthetic ? 2 : 0);
+  }
+
   @override
   void visitTryCatch(TryCatch node) {
     writeByte(Tag.TryCatch);
     writeNode(node.body);
-    if (node.catches.any((Catch c) => c.stackTrace != null)) {
-      // at least one catch needs the stack trace.
-      writeByte(1);
-    } else {
-      // no catch needs the stack trace.
-      writeByte(0);
-    }
+    bool needsStackTrace = node.catches.any((Catch c) => c.stackTrace != null);
+    writeByte(_encodeTryCatchFlags(needsStackTrace, node.isSynthetic));
     writeNodeList(node.catches);
   }
 
@@ -2190,20 +2190,8 @@
   int length = 0;
   int flushedLength = 0;
 
-  Float64List _doubleBuffer = new Float64List(1);
-  Uint8List _doubleBufferUint8;
-
   BufferedSink(this._sink);
 
-  void addDouble(double d) {
-    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
-    _doubleBuffer[0] = d;
-    addByte4(_doubleBufferUint8[0], _doubleBufferUint8[1],
-        _doubleBufferUint8[2], _doubleBufferUint8[3]);
-    addByte4(_doubleBufferUint8[4], _doubleBufferUint8[5],
-        _doubleBufferUint8[6], _doubleBufferUint8[7]);
-  }
-
   void addByte(int byte) {
     _buffer[length++] = byte;
     if (length == SIZE) {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index b7cfe0a..5553fd03 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -372,7 +372,8 @@
   }
 
   visitTryCatch(TryCatch node) {
-    return new TryCatch(clone(node.body), node.catches.map(clone).toList());
+    return new TryCatch(clone(node.body), node.catches.map(clone).toList(),
+        isSynthetic: node.isSynthetic);
   }
 
   visitCatch(Catch node) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index ae9076f..7cfea5e 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -355,14 +355,18 @@
     var exceptionVariable = new VariableDeclaration(":exception");
     var stackTraceVariable = new VariableDeclaration(":stack_trace");
 
-    return new TryCatch(buildReturn(labeledBody), <Catch>[
-      new Catch(
-          exceptionVariable,
-          new Block(<Statement>[
-            buildCatchBody(exceptionVariable, stackTraceVariable)
-          ]),
-          stackTrace: stackTraceVariable)
-    ]);
+    return new TryCatch(
+      buildReturn(labeledBody),
+      <Catch>[
+        new Catch(
+            exceptionVariable,
+            new Block(<Statement>[
+              buildCatchBody(exceptionVariable, stackTraceVariable)
+            ]),
+            stackTrace: stackTraceVariable)
+      ],
+      isSynthetic: true,
+    );
   }
 
   Statement buildCatchBody(
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 3e8395e..ea23c35 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -105,6 +105,22 @@
 ///   class that has this annotation is not immutable.
 const Immutable immutable = const Immutable();
 
+/// Used to annotate a test framework function that runs a single test.
+///
+/// Tools, such as IDEs, can show invocations of such function in a file
+/// structure view to help the user navigating in large test files.
+///
+/// The first parameter of the function must be the description of the test.
+const _IsTest isTest = const _IsTest();
+
+/// Used to annotate a test framework function that runs a group of tests.
+///
+/// Tools, such as IDEs, can show invocations of such function in a file
+/// structure view to help the user navigating in large test files.
+///
+/// The first parameter of the function must be the description of the group.
+const _IsTestGroup isTestGroup = const _IsTestGroup();
+
 /// Used to annotate a const constructor `c`. Indicates that any invocation of
 /// the constructor must use the keyword `const` unless one or more of the
 /// arguments to the constructor is not a compile-time constant.
@@ -244,6 +260,14 @@
   const _Factory();
 }
 
+class _IsTest {
+  const _IsTest();
+}
+
+class _IsTestGroup {
+  const _IsTestGroup();
+}
+
 class _Literal {
   const _Literal();
 }
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index c3b0f6b..ef4c8ef 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -64,10 +64,14 @@
   Compiler(this.fileSystem, Uri platformKernelPath,
       {this.strongMode: false,
       bool suppressWarnings: false,
-      bool syncAsync: false}) {
-    Uri packagesUri = (Platform.packageConfig != null)
-        ? Uri.parse(Platform.packageConfig)
-        : null;
+      bool syncAsync: false,
+      String packageConfig: null}) {
+    Uri packagesUri = null;
+    if (packageConfig != null) {
+      packagesUri = Uri.parse(packageConfig);
+    } else if (Platform.packageConfig != null) {
+      packagesUri = Uri.parse(Platform.packageConfig);
+    }
 
     if (verbose) {
       print("DFE: Platform.packageConfig: ${Platform.packageConfig}");
@@ -127,11 +131,15 @@
   IncrementalCompiler generator;
 
   IncrementalCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
-      {bool strongMode: false, bool suppressWarnings: false, syncAsync: false})
+      {bool strongMode: false,
+      bool suppressWarnings: false,
+      bool syncAsync: false,
+      String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             strongMode: strongMode,
             suppressWarnings: suppressWarnings,
-            syncAsync: syncAsync);
+            syncAsync: syncAsync,
+            packageConfig: packageConfig);
 
   @override
   Future<Component> compileInternal(Uri script) async {
@@ -153,11 +161,13 @@
       {this.requireMain: false,
       bool strongMode: false,
       bool suppressWarnings: false,
-      bool syncAsync: false})
+      bool syncAsync: false,
+      String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             strongMode: strongMode,
             suppressWarnings: suppressWarnings,
-            syncAsync: syncAsync);
+            syncAsync: syncAsync,
+            packageConfig: packageConfig);
 
   @override
   Future<Component> compileInternal(Uri script) async {
@@ -177,7 +187,8 @@
     List sourceFiles, Uri platformKernelPath, List<int> platformKernel,
     {bool strongMode: false,
     bool suppressWarnings: false,
-    bool syncAsync: false}) async {
+    bool syncAsync: false,
+    String packageConfig: null}) async {
   IncrementalCompilerWrapper compiler = lookupIncrementalCompiler(isolateId);
   if (compiler != null) {
     updateSources(compiler, sourceFiles);
@@ -194,7 +205,8 @@
     compiler = new IncrementalCompilerWrapper(fileSystem, platformKernelPath,
         strongMode: strongMode,
         suppressWarnings: suppressWarnings,
-        syncAsync: syncAsync);
+        syncAsync: syncAsync,
+        packageConfig: packageConfig);
     isolateCompilers[isolateId] = compiler;
   }
   return compiler;
@@ -244,6 +256,7 @@
   final List sourceFiles = request[7];
   final bool suppressWarnings = request[8];
   final bool syncAsync = request[9];
+  final String packageConfig = request[10];
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -295,7 +308,8 @@
         isolateId, sourceFiles, platformKernelPath, platformKernel,
         strongMode: strong,
         suppressWarnings: suppressWarnings,
-        syncAsync: syncAsync);
+        syncAsync: syncAsync,
+        packageConfig: packageConfig);
   } else {
     final FileSystem fileSystem = sourceFiles.isEmpty && platformKernel == null
         ? StandardFileSystem.instance
@@ -304,7 +318,8 @@
         requireMain: sourceFiles.isEmpty,
         strongMode: strong,
         suppressWarnings: suppressWarnings,
-        syncAsync: syncAsync);
+        syncAsync: syncAsync,
+        packageConfig: packageConfig);
   }
 
   CompilationResult result;
@@ -401,6 +416,7 @@
     [] /* source files */,
     false /* suppress warnings */,
     false /* synchronous async */,
+    null /* package_config */,
   ];
   _processLoadRequest(request);
 }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index fe7e529..f94b215 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -85,7 +85,8 @@
           'Scheme that is used in virtual filesystem set up via --filesystem-root'
           ' option',
       defaultsTo: 'org-dartlang-root',
-      hide: true);
+      hide: true)
+  ..addFlag('verbose', help: 'Enables verbose output from the compiler.');
 
 String usage = '''
 Usage: server [options] [input.dart]
@@ -210,6 +211,7 @@
       ..packagesFileUri = _getFileOrUri(_options['packages'])
       ..strongMode = options['strong']
       ..sdkSummary = sdkRoot.resolve(platformKernelDill)
+      ..verbose = options['verbose']
       ..onProblem =
           (message, Severity severity, List<FormattedMessage> context) {
         bool printMessage;
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index bac3e69..fb1c877 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -654,6 +654,35 @@
       int exitcode = await starter(args);
       expect(exitcode, equals(0));
     });
+
+    test('compile and produce deps file', () async {
+      if (Platform.isWindows) {
+        // TODO(dartbug.com/33032): Fix depfile generation on Windows.
+        return;
+      }
+      var file = new File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("main() {}\n");
+      var dillFile = new File('${tempDir.path}/app.dill');
+      expect(dillFile.existsSync(), equals(false));
+      var depFile = new File('${tempDir.path}/depfile');
+      expect(depFile.existsSync(), equals(false));
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--strong',
+        '--platform=${platformKernel.path}',
+        '--output-dill=${dillFile.path}',
+        '--depfile=${depFile.path}',
+        file.path
+      ];
+      int exitcode = await starter(args);
+      expect(exitcode, equals(0));
+
+      expect(depFile.existsSync(), true);
+      var depContents = depFile.readAsStringSync();
+      var depContentsParsed = depContents.split(':');
+      expect(depContentsParsed[0], dillFile.path);
+      expect(depContentsParsed[1], isNotEmpty);
+    });
   });
   return 0;
 }
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 585562d..00065fc 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -182,7 +182,6 @@
   public_configs = [ ":dart_public_config" ]
   sources = [
     "include/dart_api.h",
-    "include/dart_mirrors_api.h",
     "include/dart_native_api.h",
     "include/dart_tools_api.h",
   ]
@@ -214,11 +213,9 @@
     sources = [
       "$target_gen_dir/version.cc",
       "include/dart_api.h",
-      "include/dart_mirrors_api.h",
       "include/dart_native_api.h",
       "include/dart_tools_api.h",
       "vm/dart_api_impl.cc",
-      "vm/mirrors_api_impl.cc",
       "vm/native_api_impl.cc",
       "vm/version.h",
     ]
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 9cffabf..811ed14 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -150,7 +150,7 @@
 
 // Embedder Entrypoint:
 // The embedder calls this method with a custom package root.
-_setPackageRoot(String packageRoot) {
+String _setPackageRoot(String packageRoot) {
   if (!_setupCompleted) {
     _setupHooks();
   }
@@ -171,14 +171,16 @@
   // up for use in Platform.packageRoot. This is only set when the embedder
   // sets up the package root. Automatically discovered package root will
   // not update the VMLibraryHooks value.
-  VMLibraryHooks.packageRootString = _packageRoot.toString();
+  var packageRootStr = _packageRoot.toString();
+  VMLibraryHooks.packageRootString = packageRootStr;
   if (_traceLoading) {
     _log('Package root URI: $_packageRoot');
   }
+  return packageRootStr;
 }
 
 // Embedder Entrypoint:
-void _setPackagesMap(String packagesParam) {
+String _setPackagesMap(String packagesParam) {
   if (!_setupCompleted) {
     _setupHooks();
   }
@@ -204,6 +206,7 @@
   if (_traceLoading) {
     _log('Resolved packages map to: $packagesUri');
   }
+  return packagesUriStr;
 }
 
 // Resolves the script uri in the current working directory iff the given uri
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 8043ec0..bb4661e 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -496,28 +496,28 @@
 
 Dart_Handle DartUtils::SetupPackageRoot(const char* package_root,
                                         const char* packages_config) {
+  Dart_Handle result = Dart_Null();
+
   // Set up package root if specified.
   if (package_root != NULL) {
     ASSERT(packages_config == NULL);
-    Dart_Handle result = NewString(package_root);
+    result = NewString(package_root);
     RETURN_IF_ERROR(result);
     const int kNumArgs = 1;
     Dart_Handle dart_args[kNumArgs];
     dart_args[0] = result;
     result = Dart_Invoke(DartUtils::BuiltinLib(), NewString("_setPackageRoot"),
                          kNumArgs, dart_args);
-    RETURN_IF_ERROR(result);
   } else if (packages_config != NULL) {
-    Dart_Handle result = NewString(packages_config);
+    result = NewString(packages_config);
     RETURN_IF_ERROR(result);
     const int kNumArgs = 1;
     Dart_Handle dart_args[kNumArgs];
     dart_args[0] = result;
     result = Dart_Invoke(DartUtils::BuiltinLib(), NewString("_setPackagesMap"),
                          kNumArgs, dart_args);
-    RETURN_IF_ERROR(result);
   }
-  return Dart_True();
+  return result;
 }
 
 Dart_Handle DartUtils::PrepareForScriptLoading(bool is_service_isolate,
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 6bccb8d..11167d4 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -33,6 +33,10 @@
 namespace dart {
 namespace bin {
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+DFE dfe;
+#endif
+
 #if defined(DART_NO_SNAPSHOT) || defined(DART_PRECOMPILER)
 const uint8_t* kernel_service_dill = NULL;
 const intptr_t kernel_service_dill_size = 0;
@@ -213,10 +217,10 @@
   DISALLOW_COPY_AND_ASSIGN(WindowsPathSanitizer);
 };
 
-void* DFE::CompileAndReadScript(const char* script_uri,
-                                char** error,
-                                int* exit_code,
-                                bool strong) {
+Dart_KernelCompilationResult DFE::CompileScript(const char* script_uri,
+                                                bool strong,
+                                                bool incremental,
+                                                const char* package_config) {
   // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
   // instead of vm_platform.dill to Frontend for compilation.
 #if defined(HOST_OS_WINDOWS)
@@ -230,8 +234,18 @@
       strong ? platform_strong_dill : platform_dill;
   intptr_t platform_binary_size =
       strong ? platform_strong_dill_size : platform_dill_size;
-  Dart_KernelCompilationResult result = Dart_CompileToKernel(
-      sanitized_uri, platform_binary, platform_binary_size);
+  return Dart_CompileToKernel(sanitized_uri, platform_binary,
+                              platform_binary_size, incremental,
+                              package_config);
+}
+
+void* DFE::CompileAndReadScript(const char* script_uri,
+                                char** error,
+                                int* exit_code,
+                                bool strong,
+                                const char* package_config) {
+  Dart_KernelCompilationResult result =
+      CompileScript(script_uri, strong, true, package_config);
   switch (result.status) {
     case Dart_KernelCompilationStatus_Ok:
       return Dart_ReadKernelBinary(result.kernel, result.kernel_size,
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 558de85..d770bb0 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -45,14 +45,22 @@
   }
   void* application_kernel_binary() const { return application_kernel_binary_; }
 
-  // Compiles a script and reads the resulting kernel file.
+  // Compiles specified script.
+  // Returns result from compiling the script.
+  Dart_KernelCompilationResult CompileScript(const char* script_uri,
+                                             bool strong,
+                                             bool incremental,
+                                             const char* package_config);
+
+  // Compiles specified script and reads the resulting kernel file.
   // If the compilation is successful, returns a valid in memory kernel
   // representation of the script, NULL otherwise
   // 'error' and 'exit_code' have the error values in case of errors.
   void* CompileAndReadScript(const char* script_uri,
                              char** error,
                              int* exit_code,
-                             bool strong);
+                             bool strong,
+                             const char* package_config);
 
   // Reads the script kernel file if specified 'script_uri' is a kernel file.
   // Returns an in memory kernel representation of the specified script is a
@@ -94,6 +102,10 @@
   DISALLOW_COPY_AND_ASSIGN(DFE);
 };
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+extern DFE dfe;
+#endif
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 7e9725e..4cf1c9d 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -36,8 +36,6 @@
 namespace dart {
 namespace bin {
 
-DFE dfe;
-
 // Exit code indicating an API error.
 static const int kApiErrorExitCode = 253;
 // Exit code indicating a compilation error.
@@ -1530,7 +1528,12 @@
 #endif
   }
 
-  Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  char* error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  if (error != NULL) {
+    Log::PrintErr("Setting VM flags failed: %s\n", error);
+    free(error);
+    return kErrorExitCode;
+  }
 
   // Initialize the Dart VM.
   // Note: We don't expect isolates to be created from dart code during
@@ -1580,7 +1583,7 @@
     }
   }
 
-  char* error = Dart_Initialize(&init_params);
+  error = Dart_Initialize(&init_params);
   if (error != NULL) {
     Log::PrintErr("VM initialization failed: %s\n", error);
     free(error);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 36e3a24..9e2a352 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -80,10 +80,6 @@
  *   dart <app_snapshot_filename> [<script_options>]
  */
 static bool vm_run_app_snapshot = false;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-DFE dfe;
-#endif
-
 static char* app_script_uri = NULL;
 static const uint8_t* app_isolate_snapshot_data = NULL;
 static const uint8_t* app_isolate_snapshot_instructions = NULL;
@@ -224,6 +220,7 @@
                                        const char* packages_config,
                                        bool set_native_resolvers,
                                        bool isolate_run_app_snapshot,
+                                       Dart_IsolateFlags* flags,
                                        char** error,
                                        int* exit_code) {
   Dart_EnterScope();
@@ -241,7 +238,47 @@
   result = DartUtils::PrepareForScriptLoading(false, Options::trace_loading());
   CHECK_RESULT(result);
 
+  // Set up the load port provided by the service isolate so that we can
+  // load scripts.
+  result = DartUtils::SetupServiceLoadPort();
+  CHECK_RESULT(result);
+
+  // Setup package root if specified.
+  result = DartUtils::SetupPackageRoot(package_root, packages_config);
+  CHECK_RESULT(result);
+  const char* resolved_packages_config = NULL;
+  if (!Dart_IsNull(result)) {
+    result = Dart_StringToCString(result, &resolved_packages_config);
+    CHECK_RESULT(result);
+    ASSERT(resolved_packages_config != NULL);
+  }
+
+  result = Dart_SetEnvironmentCallback(EnvironmentCallback);
+  CHECK_RESULT(result);
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
+  if (Options::preview_dart_2() && !isolate_run_app_snapshot &&
+      kernel_program == NULL && !Dart_IsKernelIsolate(isolate)) {
+    if (!dfe.CanUseDartFrontend()) {
+      const char* format = "Dart frontend unavailable to compile script %s.";
+      intptr_t len = snprintf(NULL, 0, format, script_uri) + 1;
+      *error = reinterpret_cast<char*>(malloc(len));
+      ASSERT(error != NULL);
+      snprintf(*error, len, format, script_uri);
+      *exit_code = kErrorExitCode;
+      Dart_ExitScope();
+      Dart_ShutdownIsolate();
+      return NULL;
+    }
+    kernel_program = dfe.CompileAndReadScript(
+        script_uri, error, exit_code, flags->strong, resolved_packages_config);
+    if (kernel_program == NULL) {
+      Dart_ExitScope();
+      Dart_ShutdownIsolate();
+      return NULL;
+    }
+    isolate_data->kernel_program = kernel_program;
+  }
   if (kernel_program != NULL) {
     Dart_Handle uri = Dart_NewStringFromCString(script_uri);
     CHECK_RESULT(uri);
@@ -266,18 +303,6 @@
     CHECK_RESULT(result);
   }
 
-  // Set up the load port provided by the service isolate so that we can
-  // load scripts.
-  result = DartUtils::SetupServiceLoadPort();
-  CHECK_RESULT(result);
-
-  // Setup package root if specified.
-  result = DartUtils::SetupPackageRoot(package_root, packages_config);
-  CHECK_RESULT(result);
-
-  result = Dart_SetEnvironmentCallback(EnvironmentCallback);
-  CHECK_RESULT(result);
-
   if (isolate_run_app_snapshot) {
     result = DartUtils::SetupIOLibrary(Options::namespc(), script_uri,
                                        Options::exit_disabled());
@@ -324,9 +349,8 @@
   // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
   Dart_ExitIsolate();
-  bool retval = Dart_IsolateMakeRunnable(isolate);
-  if (!retval) {
-    *error = strdup("Invalid isolate state - Unable to make it runnable");
+  *error = Dart_IsolateMakeRunnable(isolate);
+  if (*error != NULL) {
     Dart_EnterIsolate(isolate);
     Dart_ShutdownIsolate();
     return NULL;
@@ -393,7 +417,8 @@
   }
 
   return IsolateSetupHelper(isolate, false, uri, package_root, packages_config,
-                            true, isolate_run_app_snapshot, error, exit_code);
+                            true, isolate_run_app_snapshot, flags, error,
+                            exit_code);
 }
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
 
@@ -438,7 +463,7 @@
   ASSERT(flags != NULL);
   flags->load_vmservice_library = true;
 
-  if (dfe.UseDartFrontend()) {
+  if (Options::preview_dart_2()) {
     // If there is intention to use DFE, then we create the isolate
     // from kernel only if we can.
     void* platform_program = dfe.platform_program(flags->strong) != NULL
@@ -551,7 +576,7 @@
   Dart_Isolate isolate = NULL;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (dfe.UseDartFrontend()) {
+  if (Options::preview_dart_2()) {
     void* platform_program = dfe.platform_program(flags->strong) != NULL
                                  ? dfe.platform_program(flags->strong)
                                  : kernel_program;
@@ -564,36 +589,18 @@
     // Isolate should be created only if it is a self contained kernel binary.
     isolate = Dart_CreateIsolateFromKernel(script_uri, main, platform_program,
                                            flags, isolate_data, error);
-
-    if (!isolate_run_app_snapshot && kernel_program == NULL) {
-      if (!dfe.CanUseDartFrontend()) {
-        const char* format = "Dart frontend unavailable to compile script %s.";
-        intptr_t len = snprintf(NULL, 0, format, script_uri) + 2;
-        *error = reinterpret_cast<char*>(malloc(len));
-        ASSERT(error != NULL);
-        snprintf(*error, len, format, script_uri);
-        return NULL;
-      }
-
-      kernel_program =
-          dfe.CompileAndReadScript(script_uri, error, exit_code, flags->strong);
-      if (kernel_program == NULL) {
-        if (Dart_CurrentIsolate() != NULL) {
-          Dart_ShutdownIsolate();
-        }
-        return NULL;
-      }
-    }
     isolate_data->kernel_program = kernel_program;
   } else {
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
     isolate = Dart_CreateIsolate(
         script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
         app_isolate_shared_data, app_isolate_shared_instructions, flags,
         isolate_data, error);
-#if !defined(DART_PRECOMPILED_RUNTIME)
   }
+#else
+  isolate = Dart_CreateIsolate(
+      script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
+      app_isolate_shared_data, app_isolate_shared_instructions, flags,
+      isolate_data, error);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   Dart_Isolate created_isolate = NULL;
@@ -601,9 +608,10 @@
     delete isolate_data;
   } else {
     bool set_native_resolvers = (kernel_program || isolate_snapshot_data);
-    created_isolate = IsolateSetupHelper(
-        isolate, is_main_isolate, script_uri, package_root, packages_config,
-        set_native_resolvers, isolate_run_app_snapshot, error, exit_code);
+    created_isolate =
+        IsolateSetupHelper(isolate, is_main_isolate, script_uri, package_root,
+                           packages_config, set_native_resolvers,
+                           isolate_run_app_snapshot, flags, error, exit_code);
   }
   int64_t end = Dart_TimelineGetMicros();
   Dart_TimelineEvent("CreateIsolateAndSetupHelper", start, end,
@@ -870,7 +878,12 @@
       // the core snapshot.
       Platform::Exit(kErrorExitCode);
     }
-    Snapshot::GenerateScript(Options::snapshot_filename());
+    if (Options::preview_dart_2()) {
+      Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
+                               flags.strong, Options::packages_file());
+    } else {
+      Snapshot::GenerateScript(Options::snapshot_filename());
+    }
   } else {
     // Lookup the library of the root script.
     Dart_Handle root_lib = Dart_RootLibrary();
@@ -1059,7 +1072,12 @@
     } else if (print_flags_seen) {
       // Will set the VM flags, print them out and then we exit as no
       // script was specified on the command line.
-      Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+      char* error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+      if (error != NULL) {
+        Log::PrintErr("Setting VM flags failed: %s\n", error);
+        free(error);
+        Platform::Exit(kErrorExitCode);
+      }
       Platform::Exit(0);
     } else {
       Options::PrintUsage();
@@ -1129,7 +1147,12 @@
     Process::SetExitHook(SnapshotOnExitHook);
   }
 
-  Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  char* error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  if (error != NULL) {
+    Log::PrintErr("Setting VM flags failed: %s\n", error);
+    free(error);
+    Platform::Exit(kErrorExitCode);
+  }
 
 // Note: must read platform only *after* VM flags are parsed because
 // they might affect how the platform is loaded.
@@ -1139,9 +1162,9 @@
   if (application_kernel_binary != NULL) {
     // Since we loaded the script anyway, save it.
     dfe.set_application_kernel_binary(application_kernel_binary);
-    // Since we saw a dill file, it means we have to use DFE for
-    // any further source file parsing.
-    dfe.set_use_dfe();
+    // Since we saw a dill file, it means we have to turn on all the
+    // preview_dart_2 options.
+    Options::SetPreviewDart2Options(&vm_options);
   }
 #endif
 
@@ -1171,7 +1194,7 @@
   init_params.start_kernel_isolate = false;
 #endif
 
-  char* error = Dart_Initialize(&init_params);
+  error = Dart_Initialize(&init_params);
   if (error != NULL) {
     EventHandler::Stop();
     Log::PrintErr("VM initialization failed: %s\n", error);
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index df3ec97..c5ce7a6 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -63,20 +63,19 @@
 CB_OPTIONS_LIST(CB_OPTION_DEFINITION)
 #undef CB_OPTION_DEFINITION
 
-static bool checked_set = false;
-static bool preview_dart_2_set = false;
-
-static void SetPreviewDart2Options(CommandLineOptions* vm_options) {
+void Options::SetPreviewDart2Options(CommandLineOptions* vm_options) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   Options::dfe()->set_use_dfe();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  preview_dart_2_set = true;
+  OPTION_FIELD(preview_dart_2) = true;
   vm_options->AddArgument("--strong");
   vm_options->AddArgument("--reify-generic-functions");
   vm_options->AddArgument("--limit-ints-to-64-bits");
 }
 
-DEFINE_BOOL_OPTION_CB(preview_dart_2, { SetPreviewDart2Options(vm_options); });
+bool OPTION_FIELD(preview_dart_2) = false;
+DEFINE_BOOL_OPTION_CB(preview_dart_2,
+                      { Options::SetPreviewDart2Options(vm_options); });
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 DFE* Options::dfe_ = NULL;
@@ -218,7 +217,8 @@
 "The following options are only used for VM development and may\n"
 "be changed in any future version:\n");
     const char* print_flags = "--print_flags";
-    Dart_SetVMFlags(1, &print_flags);
+    char* error = Dart_SetVMFlags(1, &print_flags);
+    ASSERT(error == NULL);
   }
 }
 // clang-format on
@@ -325,6 +325,8 @@
   return true;
 }
 
+static bool checked_set = false;
+
 int Options::ParseArguments(int argc,
                             char** argv,
                             bool vm_run_app_snapshot,
@@ -456,7 +458,7 @@
         " run using a snapshot is invalid.\n");
     return -1;
   }
-  if (checked_set && preview_dart_2_set) {
+  if (checked_set && Options::preview_dart_2()) {
     Log::PrintErr("Flags --checked and --preview-dart-2 are not compatible.\n");
     return -1;
   }
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index d4b46d8..b5e87d2 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -107,6 +107,9 @@
   CB_OPTIONS_LIST(CB_OPTIONS_DECL)
 #undef CB_OPTIONS_DECL
 
+  static bool preview_dart_2() { return preview_dart_2_; }
+  static void SetPreviewDart2Options(CommandLineOptions* vm_options);
+
   static dart::HashMap* environment() { return environment_; }
 
   static const char* vm_service_server_ip() { return vm_service_server_ip_; }
@@ -123,34 +126,24 @@
   static void DestroyEnvironment();
 
  private:
-#define STRING_OPTION_DECL(flag, variable)                                     \
-  static const char* variable##_;                                              \
-  static bool Process_##variable(const char* arg,                              \
-                                 CommandLineOptions* vm_options);
+#define STRING_OPTION_DECL(flag, variable) static const char* variable##_;
   STRING_OPTIONS_LIST(STRING_OPTION_DECL)
 #undef STRING_OPTION_DECL
 
-#define BOOL_OPTION_DECL(flag, variable)                                       \
-  static bool variable##_;                                                     \
-  static bool Process_##variable(const char* arg,                              \
-                                 CommandLineOptions* vm_options);
+#define BOOL_OPTION_DECL(flag, variable) static bool variable##_;
   BOOL_OPTIONS_LIST(BOOL_OPTION_DECL)
 #undef BOOL_OPTION_DECL
 
 #define SHORT_BOOL_OPTION_DECL(short_name, long_name, variable)                \
-  static bool variable##_;                                                     \
-  static bool Process_##variable(const char* arg,                              \
-                                 CommandLineOptions* vm_options);
+  static bool variable##_;
   SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_DECL)
 #undef SHORT_BOOL_OPTION_DECL
 
-#define ENUM_OPTION_DECL(flag, type, variable)                                 \
-  static type variable##_;                                                     \
-  static bool Process_##variable(const char* arg,                              \
-                                 CommandLineOptions* vm_options);
+#define ENUM_OPTION_DECL(flag, type, variable) static type variable##_;
   ENUM_OPTIONS_LIST(ENUM_OPTION_DECL)
 #undef ENUM_OPTION_DECL
 
+  static bool preview_dart_2_;
   static dart::HashMap* environment_;
 
 // Frontend argument processing.
@@ -170,7 +163,7 @@
 #define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag;
   STRING_OPTIONS_LIST(OPTION_FRIEND)
   BOOL_OPTIONS_LIST(OPTION_FRIEND)
-#undef STRING_OPTION_FRIEND
+#undef OPTION_FRIEND
 
 #define SHORT_BOOL_OPTION_FRIEND(short_name, long_name, variable)              \
   friend class OptionProcessor_##long_name;
@@ -182,6 +175,8 @@
   ENUM_OPTIONS_LIST(ENUM_OPTION_FRIEND)
 #undef ENUM_OPTION_FRIEND
 
+  friend class OptionProcessor_preview_dart_2;
+
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(Options);
 };
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 8293434..b896978 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -189,9 +189,8 @@
 
   Dart_ExitScope();
   Dart_ExitIsolate();
-  bool retval = Dart_IsolateMakeRunnable(isolate);
-  if (!retval) {
-    *error = strdup("Invalid isolate state - Unable to make it runnable");
+  *error = Dart_IsolateMakeRunnable(isolate);
+  if (*error != NULL) {
     Dart_EnterIsolate(isolate);
     Dart_ShutdownIsolate();
     return NULL;
@@ -269,10 +268,10 @@
   bin::TimerUtils::InitOnce();
   bin::EventHandler::Start();
 
-  bool set_vm_flags_success =
-      Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
-  ASSERT(set_vm_flags_success);
-  const char* err_msg = Dart::InitOnce(
+  const char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
+  ASSERT(error == NULL);
+
+  error = Dart::InitOnce(
       dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions,
       CreateIsolateAndSetup /* create */, NULL /* shutdown */,
       CleanupIsolate /* cleanup */, NULL /* thread_exit */,
@@ -280,15 +279,15 @@
       dart::bin::DartUtils::WriteFile, dart::bin::DartUtils::CloseFile,
       NULL /* entropy_source */, NULL /* get_service_assets */,
       start_kernel_isolate);
+  ASSERT(error == NULL);
 
-  ASSERT(err_msg == NULL);
   // Apply the filter to all registered tests.
   TestCaseBase::RunAll();
   // Apply the filter to all registered benchmarks.
   Benchmark::RunAll(argv[0]);
 
-  err_msg = Dart::Cleanup();
-  ASSERT(err_msg == NULL);
+  error = Dart::Cleanup();
+  ASSERT(error == NULL);
 
   bin::EventHandler::Stop();
 
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index dfceb0e..5bed503 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -5,6 +5,7 @@
 #include "bin/snapshot_utils.h"
 
 #include "bin/dartutils.h"
+#include "bin/dfe.h"
 #include "bin/error_exit.h"
 #include "bin/extensions.h"
 #include "bin/file.h"
@@ -241,7 +242,7 @@
   if (snapshot != NULL) {
     return snapshot;
   }
-#endif  //  defined(DART_PRECOMPILED_RUNTIME)
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
   return NULL;
 }
 
@@ -317,6 +318,22 @@
   file->Release();
 }
 
+void Snapshot::GenerateKernel(const char* snapshot_filename,
+                              const char* script_name,
+                              bool strong,
+                              const char* package_config) {
+#if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
+  Dart_KernelCompilationResult result =
+      dfe.CompileScript(script_name, strong, false, package_config);
+  if (result.status != Dart_KernelCompilationStatus_Ok) {
+    ErrorExit(kErrorExitCode, "%s\n", result.error);
+  }
+  WriteSnapshotFile(snapshot_filename, result.kernel, result.kernel_size);
+#else
+  UNREACHABLE();
+#endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
+}
+
 void Snapshot::GenerateScript(const char* snapshot_filename) {
   // First create a snapshot.
   uint8_t* buffer = NULL;
diff --git a/runtime/bin/snapshot_utils.h b/runtime/bin/snapshot_utils.h
index 8b74821..5f935b5 100644
--- a/runtime/bin/snapshot_utils.h
+++ b/runtime/bin/snapshot_utils.h
@@ -28,6 +28,10 @@
 
 class Snapshot {
  public:
+  static void GenerateKernel(const char* snapshot_filename,
+                             const char* script_name,
+                             bool strong,
+                             const char* package_config);
   static void GenerateScript(const char* snapshot_filename);
   static void GenerateAppJIT(const char* snapshot_filename);
   static void GenerateAppAOTAsBlobs(const char* snapshot_filename,
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 621b3f5..74f96e6 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -211,11 +211,10 @@
   // Make runnable.
   Dart_ExitScope();
   Dart_ExitIsolate();
-  bool retval = Dart_IsolateMakeRunnable(isolate);
-  if (!retval) {
+  error_msg_ = Dart_IsolateMakeRunnable(isolate);
+  if (error_msg_ != NULL) {
     Dart_EnterIsolate(isolate);
     Dart_ShutdownIsolate();
-    error_msg_ = "Invalid isolate state - Unable to make it runnable.";
     return false;
   }
   Dart_EnterIsolate(isolate);
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 7d7a298..1e39caf 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -64,6 +64,14 @@
 #endif
 #endif
 
+#if __GNUC__
+#define DART_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#elif _MSC_VER
+#define DART_WARN_UNUSED_RESULT _Check_return_
+#else
+#define DART_WARN_UNUSED_RESULT
+#endif
+
 #include <assert.h>
 
 /*
@@ -783,7 +791,8 @@
  * \return NULL if initialization is successful. Returns an error message
  *   otherwise. The caller is responsible for freeing the error message.
  */
-DART_EXPORT char* Dart_Initialize(Dart_InitializeParams* params);
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Initialize(
+    Dart_InitializeParams* params);
 
 /**
  * Cleanup state in the VM before process termination.
@@ -791,7 +800,7 @@
  * \return NULL if cleanup is successful. Returns an error message otherwise.
  *   The caller is responsible for freeing the error message.
  */
-DART_EXPORT char* Dart_Cleanup();
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup();
 
 /**
  * Sets command line flags. Should be called before Dart_Initialize.
@@ -799,9 +808,11 @@
  * \param argc The length of the arguments array.
  * \param argv An array of arguments.
  *
- * \return True if VM flags set successfully.
+ * \return NULL if successful. Returns an error message otherwise.
+ *  The caller is responsible for freeing the error message.
  */
-DART_EXPORT bool Dart_SetVMFlags(int argc, const char** argv);
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_SetVMFlags(int argc,
+                                                          const char** argv);
 
 /**
  * Returns true if the named VM flag is set.
@@ -1063,14 +1074,18 @@
 /**
  * Make isolate runnable.
  *
- * When isolates are spawned this function is used to indicate that
+ * When isolates are spawned, this function is used to indicate that
  * the creation and initialization (including script loading) of the
  * isolate is complete and the isolate can start.
- * This function does not expect there to be a current isolate.
+ * This function expects there to be no current isolate.
  *
  * \param isolate The isolate to be made runnable.
+ *
+ * \return NULL if successful. Returns an error message otherwise. The caller
+ * is responsible for freeing the error message.
  */
-DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate);
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_IsolateMakeRunnable(
+    Dart_Isolate isolate);
 
 /*
  * ==================
@@ -3198,7 +3213,9 @@
 DART_EXPORT Dart_KernelCompilationResult
 Dart_CompileToKernel(const char* script_uri,
                      const uint8_t* platform_kernel,
-                     const intptr_t platform_kernel_size);
+                     const intptr_t platform_kernel_size,
+                     bool incremental_compile,
+                     const char* package_config);
 
 typedef struct {
   const char* uri;
@@ -3210,7 +3227,8 @@
                             intptr_t platform_kernel_size,
                             int source_files_count,
                             Dart_SourceFile source_files[],
-                            bool incremental_compile);
+                            bool incremental_compile,
+                            const char* package_config);
 
 #define DART_KERNEL_ISOLATE_NAME "kernel-service"
 
diff --git a/runtime/include/dart_mirrors_api.h b/runtime/include/dart_mirrors_api.h
deleted file mode 100644
index 6352f92..0000000
--- a/runtime/include/dart_mirrors_api.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2013, 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_INCLUDE_DART_MIRRORS_API_H_
-#define RUNTIME_INCLUDE_DART_MIRRORS_API_H_
-
-#include "dart_api.h"
-
-/**
- * Returns the simple name for the provided type.
- */
-DART_EXPORT Dart_Handle Dart_TypeName(Dart_Handle type);
-
-/**
- * Returns the qualified name for the provided type.
- */
-DART_EXPORT Dart_Handle Dart_QualifiedTypeName(Dart_Handle type);
-
-/**
- * Returns a list of the names of all functions or methods declared in
- * a library or class.
- *
- * \param target A library or class.
- *
- * \return If no error occurs, a list of strings is returned.
- *   Otherwise an error handle is returned.
- */
-DART_EXPORT Dart_Handle Dart_GetFunctionNames(Dart_Handle target);
-
-/**
- * Looks up a function or method declaration by name from a library or
- * class.
- *
- * \param target The library or class containing the function.
- * \param function_name The name of the function.
- *
- * \return If an error is encountered, returns an error handle.
- *   Otherwise returns a function handle if the function is found of
- *   Dart_Null() if the function is not found.
- */
-DART_EXPORT Dart_Handle Dart_LookupFunction(Dart_Handle target,
-                                            Dart_Handle function_name);
-
-/**
- * Returns the name for the provided function or method.
- *
- * \return A valid string handle if no error occurs during the
- *   operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionName(Dart_Handle function);
-
-/**
- * Returns a handle to the owner of a function.
- *
- * The owner of an instance method or a static method is its defining
- * class. The owner of a top-level function is its defining
- * library. The owner of the function of a non-implicit closure is the
- * function of the method or closure that defines the non-implicit
- * closure.
- *
- * \return A valid handle to the owner of the function, or an error
- *   handle if the argument is not a valid handle to a function.
- */
-DART_EXPORT Dart_Handle Dart_FunctionOwner(Dart_Handle function);
-
-/**
- * Determines whether a function handle referes to a static function
- * of method.
- *
- * For the purposes of the embedding API, a top-level function is
- * implicitly declared static.
- *
- * \param function A handle to a function or method declaration.
- * \param is_static Returns whether the function or method is declared static.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionIsStatic(Dart_Handle function,
-                                              bool* is_static);
-
-/**
- * Determines whether a function handle referes to a constructor.
- *
- * \param function A handle to a function or method declaration.
- * \param is_static Returns whether the function or method is a constructor.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionIsConstructor(Dart_Handle function,
-                                                   bool* is_constructor);
-/* TODO(turnidge): Document behavior for factory constructors too. */
-
-/**
- * Determines whether a function or method is a getter.
- *
- * \param function A handle to a function or method declaration.
- * \param is_static Returns whether the function or method is a getter.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionIsGetter(Dart_Handle function,
-                                              bool* is_getter);
-
-/**
- * Determines whether a function or method is a setter.
- *
- * \param function A handle to a function or method declaration.
- * \param is_static Returns whether the function or method is a setter.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionIsSetter(Dart_Handle function,
-                                              bool* is_setter);
-
-/**
- * Returns the name of a library as declared in the #library directive.
- */
-DART_EXPORT Dart_Handle Dart_LibraryName(Dart_Handle library);
-
-/**
- * Returns a list of the names of all classes and interfaces declared
- * in a library.
- *
- * \return If no error occurs, a list of strings is returned.
- *   Otherwise an error handle is returned.
- */
-DART_EXPORT Dart_Handle Dart_LibraryGetClassNames(Dart_Handle library);
-
-/**
- * Retrieves the function of a closure.
- *
- * \return A handle to the function of the closure, or an error handle if the
- *   argument is not a closure.
- */
-DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure);
-
-#endif /* INCLUDE_DART_MIRRORS_API_H_ */ /* NOLINT */
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index c60f70c..c9b5f1d 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -16,7 +16,6 @@
 evaluate_activation_test/instance: RuntimeError
 evaluate_activation_test/scope: RuntimeError
 evaluate_in_sync_star_activation_test: RuntimeError
-pause_on_unhandled_async_exceptions2_test: RuntimeError # --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 pause_on_unhandled_async_exceptions_test: RuntimeError #  --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
 unused_changes_in_last_reload_test: RuntimeError
@@ -34,7 +33,6 @@
 [ $arch == simdbc64 && $compiler == dartk ]
 coverage_optimized_function_test: Crash # Please triage
 get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
-pause_on_unhandled_async_exceptions2_test: RuntimeError, Timeout # Issue 31765
 pause_on_unhandled_async_exceptions_test: RuntimeError, Timeout # Issue 31765
 
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
diff --git a/runtime/tests/vm/dart/issue32950_test.dart b/runtime/tests/vm/dart/issue32950_test.dart
new file mode 100644
index 0000000..7e14a7f
--- /dev/null
+++ b/runtime/tests/vm/dart/issue32950_test.dart
@@ -0,0 +1,22 @@
+import 'dart:isolate';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+main() async {
+  Directory tmp = await Directory.systemTemp.createTemp("testCopy");
+  var path = "${tmp.path}/other.dart";
+  var sourceFile = new File(path);
+  sourceFile.writeAsStringSync("""
+    import 'package:path/path.dart' as p;
+
+    void main() => print(p.current);
+  """);
+
+  var exitPort = new ReceivePort();
+  await Isolate.spawnUri(p.toUri(p.absolute(path)), [], null,
+      packageConfig: p.toUri(p.absolute(".packages")),
+      onExit: exitPort.sendPort);
+  await exitPort.first;
+  await sourceFile.delete();
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 26c3491..4c98cc9 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -9,10 +9,10 @@
 cc/Fail0: Fail # These tests are expected to crash on all platforms.
 cc/Fail1: Fail # These tests are expected to crash on all platforms.
 cc/Fail2: Fail # These tests are expected to crash on all platforms.
-cc/IsolateReload_PendingConstructorCall_AbstractToConcrete: Fail # Issue 32981
-cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail # Issue 32981
+cc/IsolateReload_PendingConstructorCall_AbstractToConcrete: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
+cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingStaticCall_DefinedToNSM: Fail # Issue 32981
-cc/IsolateReload_PendingStaticCall_NSMToDefined: Fail # Issue 32981
+cc/IsolateReload_PendingStaticCall_NSMToDefined: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingUnqualifiedCall_InstanceToStatic: Fail # Issue 32981
 cc/IsolateReload_PendingUnqualifiedCall_StaticToInstance: Fail # Issue 32981
 cc/IsolateReload_RunNewFieldInitializersWithGenerics: Fail # Issue 32299
@@ -36,6 +36,7 @@
 dart/byte_array_test: Skip # compilers not aware of byte arrays
 dart/error_messages_in_null_checks_test: SkipByDesign # Dart2js throws NullError exceptions with different messages.
 dart/inline_stack_frame_test: Skip # Issue 7953, Methods can be missing in dart2js stack traces due to inlining. Also when minifying they can be renamed, which is issue 7953.
+dart/issue32950_test: SkipByDesign # uses isolates.
 dart/optimized_stacktrace_line_and_column_test: RuntimeError # The source positions do not match with dart2js.
 dart/optimized_stacktrace_line_test: RuntimeError # The source positions do not match with dart2js.
 dart/redirection_type_shuffling_test: Skip # Depends on lazy enforcement of type bounds
@@ -71,6 +72,7 @@
 
 [ $runtime == dart_precompiled ]
 dart/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
+dart/issue32950_test: SkipByDesign # uses spawnUri.
 
 [ $runtime != vm ]
 dart/hello_fuchsia_test: SkipByDesign # This is a test for fuchsia OS
@@ -224,6 +226,7 @@
 
 [ $compiler == dartkp && ($runtime == dart_precompiled || $runtime == vm) ]
 dart/data_uri_import_test/utf16: MissingRuntimeError # UTF-16 data URIs work in dartk
+dart/issue32950_test: SkipByDesign # uses spawnUri.
 dart/redirection_type_shuffling_test: SkipByDesign # Includes dart:mirrors.
 dart/spawn_shutdown_test: SkipSlow
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 11c5abc..943119a 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1548,7 +1548,7 @@
       builder_->ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      builder_->ReadDouble();  // read value.
+      builder_->SkipStringReference();  // read index into string table.
       return;
     case kTrueLiteral:
       return;
@@ -1807,7 +1807,7 @@
       ++depth_.catch_;
       AddCatchVariables();
 
-      builder_->ReadBool();  // read any_catch_needs_stack_trace.
+      builder_->ReadByte();  // read flags
       intptr_t catch_count =
           builder_->ReadListLength();  // read number of catches.
       for (intptr_t i = 0; i < catch_count; ++i) {
@@ -3542,7 +3542,8 @@
 }
 
 void StreamingConstantEvaluator::EvaluateDoubleLiteral() {
-  result_ = Double::New(builder_->ReadDouble(), Heap::kOld);  // read value.
+  result_ = Double::New(H.DartString(builder_->ReadStringReference()),
+                        Heap::kOld);  // read string reference.
   result_ = H.Canonicalize(result_);
 }
 
@@ -4354,7 +4355,7 @@
     }
     case kTryCatch: {
       CalculateStatementFingerprint();  // read body.
-      BuildHash(ReadBool());            // read any_catch_needs_stack_trace.
+      BuildHash(ReadByte());            // read flags
       intptr_t catch_count = ReadListLength();  // read number of catches.
       for (intptr_t i = 0; i < catch_count; ++i) {
         ReadPosition();                  // read position.
@@ -6021,10 +6022,6 @@
   return reader_.ReadUInt();
 }
 
-double KernelReaderHelper::ReadDouble() {
-  return reader_.ReadDouble();
-}
-
 uint32_t KernelReaderHelper::PeekListLength() {
   AlternativeReadingScope alt(&reader_);
   return reader_.ReadListLength();
@@ -6492,7 +6489,7 @@
       ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      ReadDouble();  // read value.
+      SkipStringReference();  // read index into string table.
       return;
     case kTrueLiteral:
       return;
@@ -6606,7 +6603,7 @@
     }
     case kTryCatch: {
       SkipStatement();  // read body.
-      ReadBool();       // read any_catch_needs_stack_trace.
+      ReadByte();       // read flags
       intptr_t catch_count = ReadListLength();  // read number of catches.
       for (intptr_t i = 0; i < catch_count; ++i) {
         ReadPosition();   // read position.
@@ -7166,9 +7163,10 @@
 
 Fragment StreamingFlowGraphBuilder::CatchBlockEntry(const Array& handler_types,
                                                     intptr_t handler_index,
-                                                    bool needs_stacktrace) {
+                                                    bool needs_stacktrace,
+                                                    bool is_synthesized) {
   return flow_graph_builder_->CatchBlockEntry(handler_types, handler_index,
-                                              needs_stacktrace);
+                                              needs_stacktrace, is_synthesized);
 }
 
 Fragment StreamingFlowGraphBuilder::TryCatch(int try_handler_index) {
@@ -8985,7 +8983,8 @@
   if (position != NULL) *position = TokenPosition::kNoSource;
 
   Double& constant = Double::ZoneHandle(
-      Z, Double::NewCanonical(ReadDouble()));  // read double.
+      Z, Double::NewCanonical(
+             H.DartString(ReadStringReference())));  // read string reference.
   return Constant(constant);
 }
 
@@ -9853,14 +9852,21 @@
   }
   try_depth_dec();
 
-  bool needs_stacktrace = ReadBool();  // read any_catch_needs_stack_trace
+  const int kNeedsStracktraceBit = 1 << 0;
+  const int kIsSyntheticBit = 1 << 1;
+
+  uint8_t flags = ReadByte();
+  bool needs_stacktrace =
+      (flags & kNeedsStracktraceBit) == kNeedsStracktraceBit;
+  bool is_synthetic = (flags & kIsSyntheticBit) == kIsSyntheticBit;
 
   catch_depth_inc();
   intptr_t catch_count = ReadListLength();  // read number of catches.
   const Array& handler_types =
       Array::ZoneHandle(Z, Array::New(catch_count, Heap::kOld));
-  Fragment catch_body =
-      CatchBlockEntry(handler_types, try_handler_index, needs_stacktrace);
+
+  Fragment catch_body = CatchBlockEntry(handler_types, try_handler_index,
+                                        needs_stacktrace, is_synthetic);
   // Fill in the body of the catch.
   for (intptr_t i = 0; i < catch_count; ++i) {
     intptr_t catch_offset = ReaderOffset();   // Catch has no tag.
@@ -10031,7 +10037,8 @@
   handler_types.SetAt(0, Object::dynamic_type());
   // Note: rethrow will actually force mark the handler as needing a stacktrace.
   Fragment finally_body = CatchBlockEntry(handler_types, try_handler_index,
-                                          /* needs_stacktrace = */ false);
+                                          /* needs_stacktrace = */ false,
+                                          /* is_synthesized = */ true);
   SetOffset(finalizer_offset);
   finally_body += BuildStatement();  // read finalizer
   if (finally_body.is_open()) {
@@ -10819,7 +10826,8 @@
         break;
       }
       case kDoubleConstant: {
-        temp_instance_ = Double::New(builder_.ReadDouble(), Heap::kOld);
+        temp_instance_ = Double::New(
+            H.DartString(builder_.ReadStringReference()), Heap::kOld);
         temp_instance_ = H.Canonicalize(temp_instance_);
         break;
       }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index a572a7d..82ebe8a 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -1043,7 +1043,6 @@
   uint32_t ReadUInt();
   uint32_t ReadUInt32();
   uint32_t PeekUInt();
-  double ReadDouble();
   uint32_t PeekListLength();
   StringIndex ReadStringReference();
   NameIndex ReadCanonicalNameReference();
@@ -1425,7 +1424,8 @@
                         bool negate = false);
   Fragment CatchBlockEntry(const Array& handler_types,
                            intptr_t handler_index,
-                           bool needs_stacktrace);
+                           bool needs_stacktrace,
+                           bool is_synthesized);
   Fragment TryCatch(int try_handler_index);
   Fragment Drop();
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 93ce810..aa1cb20 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1176,14 +1176,15 @@
 
 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types,
                                            intptr_t handler_index,
-                                           bool needs_stacktrace) {
+                                           bool needs_stacktrace,
+                                           bool is_synthesized) {
   ASSERT(CurrentException()->is_captured() ==
          CurrentStackTrace()->is_captured());
   const bool should_restore_closure_context =
       CurrentException()->is_captured() || CurrentCatchContext()->is_captured();
   CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
       TokenPosition::kNoSource,  // Token position of catch block.
-      false,                     // Not an artifact of compilation.
+      is_synthesized,  // whether catch block was synthesized by FE compiler
       AllocateBlockId(), CurrentTryIndex(), graph_entry_, handler_types,
       handler_index, *CurrentException(), *CurrentStackTrace(),
       needs_stacktrace, GetNextDeoptId(), should_restore_closure_context);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 1aa740d..817633f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -731,7 +731,8 @@
   Fragment BooleanNegate();
   Fragment CatchBlockEntry(const Array& handler_types,
                            intptr_t handler_index,
-                           bool needs_stacktrace);
+                           bool needs_stacktrace,
+                           bool is_synthesized);
   Fragment TryCatch(int try_handler_index);
   Fragment CheckStackOverflowInPrologue(TokenPosition position);
   Fragment CheckStackOverflow(TokenPosition position);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7398646..26bb097 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "include/dart_api.h"
-#include "include/dart_mirrors_api.h"
 #include "include/dart_native_api.h"
 
 #include "lib/stacktrace.h"
@@ -1051,7 +1050,7 @@
   return NULL;
 }
 
-DART_EXPORT bool Dart_SetVMFlags(int argc, const char** argv) {
+DART_EXPORT char* Dart_SetVMFlags(int argc, const char** argv) {
   return Flags::ProcessCommandLineFlags(argc, argv);
 }
 
@@ -1605,7 +1604,7 @@
   return false;
 }
 
-DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate) {
+DART_EXPORT char* Dart_IsolateMakeRunnable(Dart_Isolate isolate) {
   CHECK_NO_ISOLATE(Isolate::Current());
   API_TIMELINE_DURATION(Thread::Current());
   if (isolate == NULL) {
@@ -1613,11 +1612,17 @@
   }
   // TODO(16615): Validate isolate parameter.
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
+  const char* error;
   if (iso->object_store()->root_library() == Library::null()) {
     // The embedder should have called Dart_LoadScript by now.
-    return false;
+    error = "Missing root library";
+  } else {
+    error = iso->MakeRunnable();
   }
-  return iso->MakeRunnable();
+  if (error != NULL) {
+    return strdup(error);
+  }
+  return NULL;
 }
 
 // --- Messages and Ports ---
@@ -6005,7 +6010,9 @@
 DART_EXPORT Dart_KernelCompilationResult
 Dart_CompileToKernel(const char* script_uri,
                      const uint8_t* platform_kernel,
-                     intptr_t platform_kernel_size) {
+                     intptr_t platform_kernel_size,
+                     bool incremental_compile,
+                     const char* package_config) {
   Dart_KernelCompilationResult result;
 #if defined(DART_PRECOMPILED_RUNTIME)
   result.status = Dart_KernelCompilationStatus_Unknown;
@@ -6013,7 +6020,8 @@
   return result;
 #else
   result = KernelIsolate::CompileToKernel(script_uri, platform_kernel,
-                                          platform_kernel_size, 0, NULL, true);
+                                          platform_kernel_size, 0, NULL,
+                                          incremental_compile, package_config);
   if (result.status == Dart_KernelCompilationStatus_Ok) {
     if (KernelIsolate::AcceptCompilation().status !=
         Dart_KernelCompilationStatus_Ok) {
@@ -6032,7 +6040,8 @@
                             intptr_t platform_kernel_size,
                             int source_files_count,
                             Dart_SourceFile sources[],
-                            bool incremental_compile) {
+                            bool incremental_compile,
+                            const char* package_config) {
   Dart_KernelCompilationResult result;
 #if defined(DART_PRECOMPILED_RUNTIME)
   result.status = Dart_KernelCompilationStatus_Unknown;
@@ -6041,7 +6050,7 @@
 #else
   result = KernelIsolate::CompileToKernel(
       script_uri, platform_kernel, platform_kernel_size, source_files_count,
-      sources, incremental_compile);
+      sources, incremental_compile, package_config);
   if (result.status == Dart_KernelCompilationStatus_Ok) {
     if (KernelIsolate::AcceptCompilation().status !=
         Dart_KernelCompilationStatus_Ok) {
@@ -6562,6 +6571,8 @@
   return Api::NewError("AOT compilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
   return Api::NewError("AOT compilation is not supported on DBC.");
+#elif defined(TARGET_OS_WINDOWS)
+  return Api::NewError("Assembly generation is not implemented for Windows.");
 #elif !defined(DART_PRECOMPILER)
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
@@ -6600,6 +6611,8 @@
   return Api::NewError("AOT compilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
   return Api::NewError("AOT compilation is not supported on DBC.");
+#elif defined(TARGET_OS_WINDOWS)
+  return Api::NewError("Assembly generation is not implemented for Windows.");
 #elif !defined(DART_PRECOMPILER)
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 7e7b9d7..6cc86f0 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -5,7 +5,6 @@
 #include "vm/dart_api_impl.h"
 #include "bin/builtin.h"
 #include "include/dart_api.h"
-#include "include/dart_mirrors_api.h"
 #include "include/dart_native_api.h"
 #include "include/dart_tools_api.h"
 #include "platform/assert.h"
@@ -775,18 +774,6 @@
   const Type& bool_type_obj = Api::UnwrapTypeHandle(zone, type);
   EXPECT(bool_type_obj.raw() == Type::BoolType());
 
-  Dart_Handle cls_name = Dart_TypeName(type);
-  EXPECT_VALID(cls_name);
-  const char* cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  EXPECT_STREQ("bool", cls_name_cstr);
-
-  Dart_Handle qual_cls_name = Dart_QualifiedTypeName(type);
-  EXPECT_VALID(qual_cls_name);
-  const char* qual_cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(qual_cls_name, &qual_cls_name_cstr));
-  EXPECT_STREQ("Library:'dart:core' Class: bool", qual_cls_name_cstr);
-
   // Errors propagate.
   Dart_Handle error = Dart_NewApiError("MyError");
   Dart_Handle error_type = Dart_InstanceGetType(error);
@@ -5672,11 +5659,12 @@
   }
 
   // Load a script successfully.
-  result = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle root_lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(root_lib);
+  result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
-  Dart_FinalizeLoading(false);
 
-  result = Dart_Invoke(result, NewString("main"), 0, NULL);
+  result = Dart_Invoke(root_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -5705,13 +5693,6 @@
   EXPECT_VALID(LoadScript(TestCase::url(), kScriptChars));
 
   root_lib = Dart_RootLibrary();
-  Dart_Handle lib_name = Dart_LibraryName(root_lib);
-  EXPECT_VALID(lib_name);
-  EXPECT(!Dart_IsNull(root_lib));
-  const char* name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(lib_name, &name_cstr));
-  EXPECT_STREQ("testlib", name_cstr);
-
   Dart_Handle lib_uri = Dart_LibraryUrl(root_lib);
   EXPECT_VALID(lib_uri);
   EXPECT(!Dart_IsNull(lib_uri));
@@ -5851,72 +5832,6 @@
                Dart_GetError(result));
 }
 
-TEST_CASE(DartAPI_LibraryName) {
-  const char* kLibrary1Chars = "library library1_name;";
-  Dart_Handle lib = TestCase::LoadTestLibrary("library1_url", kLibrary1Chars);
-  Dart_Handle error = Dart_NewApiError("incoming error");
-  EXPECT_VALID(lib);
-
-  Dart_Handle result = Dart_LibraryName(Dart_Null());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LibraryName expects argument 'library' to be non-null.",
-               Dart_GetError(result));
-
-  result = Dart_LibraryName(Dart_True());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_LibraryName expects argument 'library' to be of type Library.",
-      Dart_GetError(result));
-
-  result = Dart_LibraryName(error);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("incoming error", Dart_GetError(result));
-
-  result = Dart_LibraryName(lib);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsString(result));
-  const char* cstr = NULL;
-  EXPECT_VALID(Dart_StringToCString(result, &cstr));
-  EXPECT_STREQ("library1_name", cstr);
-}
-
-#ifndef PRODUCT
-
-TEST_CASE(DartAPI_LibraryId) {
-  const char* kLibrary1Chars = "library library1_name;";
-  Dart_Handle lib = TestCase::LoadTestLibrary("library1_url", kLibrary1Chars);
-  Dart_Handle error = Dart_NewApiError("incoming error");
-  EXPECT_VALID(lib);
-  intptr_t libraryId = -1;
-
-  Dart_Handle result = Dart_LibraryId(Dart_Null(), &libraryId);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LibraryId expects argument 'library' to be non-null.",
-               Dart_GetError(result));
-
-  result = Dart_LibraryId(Dart_True(), &libraryId);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_LibraryId expects argument 'library' to be of type Library.",
-      Dart_GetError(result));
-
-  result = Dart_LibraryId(error, &libraryId);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("incoming error", Dart_GetError(result));
-
-  result = Dart_LibraryId(lib, &libraryId);
-  EXPECT_VALID(result);
-  Dart_Handle libFromId = Dart_GetLibraryFromId(libraryId);
-  EXPECT(Dart_IsLibrary(libFromId));
-  result = Dart_LibraryName(libFromId);
-  EXPECT(Dart_IsString(result));
-  const char* cstr = NULL;
-  EXPECT_VALID(Dart_StringToCString(result, &cstr));
-  EXPECT_STREQ("library1_name", cstr);
-}
-
-#endif  // !PRODUCT
-
 TEST_CASE(DartAPI_LibraryUrl) {
   const char* kLibrary1Chars = "library library1_name;";
   Dart_Handle lib = TestCase::LoadTestLibrary("library1_url", kLibrary1Chars);
@@ -5946,111 +5861,6 @@
   EXPECT_SUBSTRING("library1_url", cstr);
 }
 
-TEST_CASE(DartAPI_LibraryGetClassNames) {
-  const char* kLibraryChars =
-      "library library_name;\n"
-      "\n"
-      "class A {}\n"
-      "class B {}\n"
-      "abstract class C {}\n"
-      "class _A {}\n"
-      "class _B {}\n"
-      "abstract class _C {}\n"
-      "\n"
-      "int _compare(dynamic a, dynamic b) => a.compareTo(b);\n"
-      "sort(list) => list.sort(_compare);\n";
-
-  Dart_Handle lib = TestCase::LoadTestLibrary("library_url", kLibraryChars);
-  EXPECT_VALID(lib);
-  Dart_Handle result = Dart_FinalizeLoading(false);
-  EXPECT_VALID(result);
-
-  Dart_Handle list = Dart_LibraryGetClassNames(lib);
-  EXPECT_VALID(list);
-  EXPECT(Dart_IsList(list));
-
-  // Sort the list.
-  const int kNumArgs = 1;
-  Dart_Handle args[1];
-  args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
-
-  Dart_Handle list_string = Dart_ToString(list);
-  EXPECT_VALID(list_string);
-  const char* list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
-  EXPECT_STREQ("[A, B, C, _A, _B, _C]", list_cstr);
-}
-
-TEST_CASE(DartAPI_GetFunctionNames) {
-  const char* kLibraryChars =
-      "library library_name;\n"
-      "\n"
-      "void A() {}\n"
-      "get B => 11;\n"
-      "set C(x) { }\n"
-      "var D;\n"
-      "void _A() {}\n"
-      "get _B => 11;\n"
-      "set _C(x) { }\n"
-      "var _D;\n"
-      "\n"
-      "class MyClass {\n"
-      "  void A2() {}\n"
-      "  get B2 => 11;\n"
-      "  set C2(x) { }\n"
-      "  var D2;\n"
-      "  void _A2() {}\n"
-      "  get _B2 => 11;\n"
-      "  set _C2(x) { }\n"
-      "  var _D2;\n"
-      "}\n"
-      "\n"
-      "int _compare(dynamic a, dynamic b) => a.compareTo(b);\n"
-      "sort(list) => list.sort(_compare);\n";
-
-  // Get the functions from a library.
-  Dart_Handle lib = TestCase::LoadTestScript(kLibraryChars, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle result = Dart_FinalizeLoading(false);
-  EXPECT_VALID(result);
-
-  Dart_Handle list = Dart_GetFunctionNames(lib);
-  EXPECT_VALID(list);
-  EXPECT(Dart_IsList(list));
-
-  // Sort the list.
-  const int kNumArgs = 1;
-  Dart_Handle args[1];
-  args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
-
-  Dart_Handle list_string = Dart_ToString(list);
-  EXPECT_VALID(list_string);
-  const char* list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
-  EXPECT_STREQ("[A, B, C=, _A, _B, _C=, _compare, sort]", list_cstr);
-
-  // Get the functions from a class.
-  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
-  EXPECT_VALID(cls);
-
-  list = Dart_GetFunctionNames(cls);
-  EXPECT_VALID(list);
-  EXPECT(Dart_IsList(list));
-
-  // Sort the list.
-  args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
-
-  // Check list contents.
-  list_string = Dart_ToString(list);
-  EXPECT_VALID(list_string);
-  list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
-  EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr);
-}
-
 TEST_CASE(DartAPI_LibraryImportLibrary) {
   const char* kLibrary1Chars = "library library1_name;";
   const char* kLibrary2Chars = "library library2_name;";
@@ -7203,8 +7013,8 @@
   EXPECT_VALID(result);
   Dart_ExitScope();
   Dart_ExitIsolate();
-  bool retval = Dart_IsolateMakeRunnable(isolate);
-  EXPECT(retval);
+  char* err_msg = Dart_IsolateMakeRunnable(isolate);
+  EXPECT(err_msg == NULL);
   return isolate;
 }
 
@@ -8214,7 +8024,8 @@
 
   Dart_Handle source = NewString(kLoadSecond);
   Dart_Handle url = NewString(TestCase::url());
-  Dart_LoadSource(TestCase::lib(), url, Dart_Null(), source, 0, 0);
+  result = Dart_LoadSource(TestCase::lib(), url, Dart_Null(), source, 0, 0);
+  EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
 
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index dbee5f1..9120a8e 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -414,10 +414,10 @@
   return strcmp(left_flag->name_, right_flag->name_);
 }
 
-bool Flags::ProcessCommandLineFlags(int number_of_vm_flags,
-                                    const char** vm_flags) {
+char* Flags::ProcessCommandLineFlags(int number_of_vm_flags,
+                                     const char** vm_flags) {
   if (initialized_) {
-    return false;
+    return strdup("Flags already set");
   }
 
   qsort(flags_, num_flags_, sizeof flags_[0], CompareFlagNames);
@@ -435,20 +435,20 @@
 
   if (!FLAG_ignore_unrecognized_flags) {
     int unrecognized_count = 0;
+    TextBuffer error(64);
     for (intptr_t j = 0; j < num_flags_; j++) {
       Flag* flag = flags_[j];
       if (flag->IsUnrecognized()) {
         if (unrecognized_count == 0) {
-          OS::PrintErr("Unrecognized flags: %s", flag->name_);
+          error.Printf("Unrecognized flags: %s", flag->name_);
         } else {
-          OS::PrintErr(", %s", flag->name_);
+          error.Printf(", %s", flag->name_);
         }
         unrecognized_count++;
       }
     }
     if (unrecognized_count > 0) {
-      OS::PrintErr("\n");
-      exit(255);
+      return error.Steal();
     }
   }
   if (FLAG_print_flags) {
@@ -456,7 +456,7 @@
   }
 
   initialized_ = true;
-  return true;
+  return NULL;
 }
 
 bool Flags::SetFlag(const char* name, const char* value, const char** error) {
diff --git a/runtime/vm/flags.h b/runtime/vm/flags.h
index a83e2e0..e72b33f 100644
--- a/runtime/vm/flags.h
+++ b/runtime/vm/flags.h
@@ -63,7 +63,7 @@
                                     const char* name,
                                     const char* comment);
 
-  static bool ProcessCommandLineFlags(int argc, const char** argv);
+  static char* ProcessCommandLineFlags(int argc, const char** argv);
 
   static Flag* Lookup(const char* name);
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b444072..c3dcbe0 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1244,13 +1244,13 @@
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 }
 
-bool Isolate::MakeRunnable() {
+const char* Isolate::MakeRunnable() {
   ASSERT(Isolate::Current() == NULL);
 
   MutexLocker ml(mutex_);
   // Check if we are in a valid state to make the isolate runnable.
   if (is_runnable() == true) {
-    return false;  // Already runnable.
+    return "Isolate is already runnable";
   }
   // Set the isolate as runnable and if we are being spawned schedule
   // isolate on thread pool for execution.
@@ -1294,7 +1294,7 @@
     GetRunnableHeapSizeMetric()->set_value(heap_size);
   }
 #endif  // !PRODUCT
-  return true;
+  return NULL;
 }
 
 bool Isolate::VerifyPauseCapability(const Object& capability) const {
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 0febbfe..66f75f9 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -302,7 +302,7 @@
                      bool dont_delete_reload_context = false);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
-  bool MakeRunnable();
+  const char* MakeRunnable();
   void Run();
 
   MessageHandler* message_handler() const { return message_handler_; }
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 8dcf7d8..984de86 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -601,7 +601,7 @@
 
       Dart_KernelCompilationResult retval = KernelIsolate::CompileToKernel(
           root_lib_url.ToCString(), NULL, 0, modified_scripts_count,
-          modified_scripts, true);
+          modified_scripts, true, NULL);
 
       if (retval.status != Dart_KernelCompilationStatus_Ok) {
         TIR_Print("---- LOAD FAILED, ABORTING RELOAD\n");
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index daee540..1106d45 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -213,14 +213,6 @@
     return value;
   }
 
-  double ReadDouble() {
-    ASSERT((size_ >= 8) && (offset_ >= 0) && (offset_ <= size_ - 8));
-    double value = ReadUnaligned(
-        reinterpret_cast<const double*>(&this->buffer()[offset_]));
-    offset_ += 8;
-    return value;
-  }
-
   uint32_t ReadUInt() {
     ASSERT((size_ >= 1) && (offset_ >= 0) && (offset_ <= size_ - 1));
 
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index a8a9a1f..cf12542 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -348,7 +348,8 @@
       intptr_t platform_kernel_size,
       int source_files_count,
       Dart_SourceFile source_files[],
-      bool incremental_compile) {
+      bool incremental_compile,
+      const char* package_config) {
     // Build the [null, send_port, script_uri, platform_kernel,
     // incremental_compile, isolate_id, [files]] message for the Kernel isolate.
     // tag is used to specify which operation the frontend should perform.
@@ -422,6 +423,14 @@
     dart_sync_async.type = Dart_CObject_kBool;
     dart_sync_async.value.as_bool = FLAG_sync_async;
 
+    Dart_CObject package_config_uri;
+    if (package_config != NULL) {
+      package_config_uri.type = Dart_CObject_kString;
+      package_config_uri.value.as_string = const_cast<char*>(package_config);
+    } else {
+      package_config_uri.type = Dart_CObject_kNull;
+    }
+
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &uri,
@@ -431,7 +440,8 @@
                                    &isolate_id,
                                    &files,
                                    &suppress_warnings,
-                                   &dart_sync_async};
+                                   &dart_sync_async,
+                                   &package_config_uri};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
     // Send the message.
@@ -557,7 +567,8 @@
     intptr_t platform_kernel_size,
     int source_file_count,
     Dart_SourceFile source_files[],
-    bool incremental_compile) {
+    bool incremental_compile,
+    const char* package_config) {
   // This must be the main script to be loaded. Wait for Kernel isolate
   // to finish initialization.
   Dart_Port kernel_port = WaitForKernelPort();
@@ -572,7 +583,7 @@
   return request.SendAndWaitForResponse(kCompileTag, kernel_port, script_uri,
                                         platform_kernel, platform_kernel_size,
                                         source_file_count, source_files,
-                                        incremental_compile);
+                                        incremental_compile, package_config);
 }
 
 Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -588,7 +599,7 @@
 
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kAcceptTag, kernel_port, NULL, NULL, 0,
-                                        0, NULL, true);
+                                        0, NULL, true, NULL);
 }
 
 Dart_KernelCompilationResult KernelIsolate::UpdateInMemorySources(
@@ -607,7 +618,7 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kUpdateSourcesTag, kernel_port, NULL,
                                         NULL, 0, source_files_count,
-                                        source_files, true);
+                                        source_files, true, NULL);
 }
 #endif  // DART_PRECOMPILED_RUNTIME
 
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 001aa41..f9084cf 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -38,7 +38,8 @@
       intptr_t platform_kernel_size,
       int source_files_count = 0,
       Dart_SourceFile source_files[] = NULL,
-      bool incremental_compile = true);
+      bool incremental_compile = true,
+      const char* package_config = NULL);
 
   static Dart_KernelCompilationResult AcceptCompilation();
   static Dart_KernelCompilationResult UpdateInMemorySources(
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 6a3358c..4b83212 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -82,7 +82,8 @@
         return true;
       case kDoubleLiteral:
         simple_value_ = &Double::ZoneHandle(
-            Z, Double::New(builder_->ReadDouble(), Heap::kOld));  // read value.
+            Z, Double::New(H.DartString(builder_->ReadStringReference()),
+                           Heap::kOld));  // read string reference.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kTrueLiteral:
diff --git a/runtime/vm/mirrors_api_impl.cc b/runtime/vm/mirrors_api_impl.cc
deleted file mode 100644
index fdbad30..0000000
--- a/runtime/vm/mirrors_api_impl.cc
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright (c) 2013, 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 "include/dart_mirrors_api.h"
-
-#include "platform/assert.h"
-#include "vm/class_finalizer.h"
-#include "vm/dart.h"
-#include "vm/dart_api_impl.h"
-#include "vm/dart_api_state.h"
-#include "vm/dart_entry.h"
-#include "vm/exceptions.h"
-#include "vm/growable_array.h"
-#include "vm/object.h"
-#include "vm/resolver.h"
-#include "vm/stack_frame.h"
-#include "vm/symbols.h"
-
-namespace dart {
-
-// Facilitate quick access to the current zone once we have the current thread.
-#define Z (T->zone())
-
-// --- Classes and Interfaces Reflection ---
-
-DART_EXPORT Dart_Handle Dart_TypeName(Dart_Handle object) {
-  DARTSCOPE(Thread::Current());
-  const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
-  if (obj.IsType()) {
-    const Class& cls = Class::Handle(Type::Cast(obj).type_class());
-    return Api::NewHandle(T, cls.UserVisibleName());
-  } else {
-    RETURN_TYPE_ERROR(Z, object, Class / Type);
-  }
-}
-
-DART_EXPORT Dart_Handle Dart_QualifiedTypeName(Dart_Handle object) {
-  DARTSCOPE(Thread::Current());
-  const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
-  if (obj.IsType() || obj.IsClass()) {
-    const Class& cls = (obj.IsType())
-                           ? Class::Handle(Z, Type::Cast(obj).type_class())
-                           : Class::Cast(obj);
-    const char* str = cls.ToCString();
-    if (str == NULL) {
-      RETURN_NULL_ERROR(str);
-    }
-    CHECK_CALLBACK_STATE(T);
-    return Api::NewHandle(T, String::New(str));
-  } else {
-    RETURN_TYPE_ERROR(Z, object, Class / Type);
-  }
-}
-
-// --- Function and Variable Reflection ---
-
-// Outside of the vm, we expose setter names with a trailing '='.
-static bool HasExternalSetterSuffix(const String& name) {
-  return name.CharAt(name.Length() - 1) == '=';
-}
-
-static RawString* RemoveExternalSetterSuffix(const String& name) {
-  ASSERT(HasExternalSetterSuffix(name));
-  return String::SubString(name, 0, name.Length() - 1);
-}
-
-DART_EXPORT Dart_Handle Dart_GetFunctionNames(Dart_Handle target) {
-  DARTSCOPE(Thread::Current());
-  const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target));
-  if (obj.IsError()) {
-    return target;
-  }
-
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-  Function& func = Function::Handle(Z);
-  String& name = String::Handle(Z);
-
-  if (obj.IsType()) {
-    const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
-    const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T));
-    if (!error.IsNull()) {
-      return Api::NewHandle(T, error.raw());
-    }
-    const Array& func_array = Array::Handle(Z, cls.functions());
-
-    // Some special types like 'dynamic' have a null functions list.
-    if (!func_array.IsNull()) {
-      for (intptr_t i = 0; i < func_array.Length(); ++i) {
-        func ^= func_array.At(i);
-
-        // Skip implicit getters and setters.
-        if (func.kind() == RawFunction::kImplicitGetter ||
-            func.kind() == RawFunction::kImplicitSetter ||
-            func.kind() == RawFunction::kImplicitStaticFinalGetter ||
-            func.kind() == RawFunction::kMethodExtractor ||
-            func.kind() == RawFunction::kNoSuchMethodDispatcher) {
-          continue;
-        }
-
-        name = func.UserVisibleName();
-        names.Add(name);
-      }
-    }
-  } else if (obj.IsLibrary()) {
-    const Library& lib = Library::Cast(obj);
-    DictionaryIterator it(lib);
-    Object& obj = Object::Handle();
-    while (it.HasNext()) {
-      obj = it.GetNext();
-      if (obj.IsFunction()) {
-        func ^= obj.raw();
-        name = func.UserVisibleName();
-        names.Add(name);
-      }
-    }
-  } else {
-    return Api::NewError(
-        "%s expects argument 'target' to be a class or library.", CURRENT_FUNC);
-  }
-  return Api::NewHandle(T, Array::MakeFixedLength(names));
-}
-
-DART_EXPORT Dart_Handle Dart_LookupFunction(Dart_Handle target,
-                                            Dart_Handle function_name) {
-  DARTSCOPE(Thread::Current());
-  const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target));
-  if (obj.IsError()) {
-    return target;
-  }
-  const String& func_name = Api::UnwrapStringHandle(Z, function_name);
-  if (func_name.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function_name, String);
-  }
-
-  Function& func = Function::Handle(Z);
-  String& tmp_name = String::Handle(Z);
-  if (obj.IsType()) {
-    const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
-
-    // Case 1.  Lookup the unmodified function name.
-    func = cls.LookupFunctionAllowPrivate(func_name);
-
-    // Case 2.  Lookup the function without the external setter suffix
-    // '='.  Make sure to do this check after the regular lookup, so
-    // that we don't interfere with operator lookups (like ==).
-    if (func.IsNull() && HasExternalSetterSuffix(func_name)) {
-      tmp_name = RemoveExternalSetterSuffix(func_name);
-      tmp_name = Field::SetterName(tmp_name);
-      func = cls.LookupFunctionAllowPrivate(tmp_name);
-    }
-
-    // Case 3.  Lookup the function with the getter prefix prepended.
-    if (func.IsNull()) {
-      tmp_name = Field::GetterName(func_name);
-      func = cls.LookupFunctionAllowPrivate(tmp_name);
-    }
-
-    // Case 4.  Lookup the function with a . appended to find the
-    // unnamed constructor.
-    if (func.IsNull()) {
-      tmp_name = String::Concat(func_name, Symbols::Dot());
-      func = cls.LookupFunctionAllowPrivate(tmp_name);
-    }
-  } else if (obj.IsLibrary()) {
-    const Library& lib = Library::Cast(obj);
-
-    // Case 1.  Lookup the unmodified function name.
-    func = lib.LookupFunctionAllowPrivate(func_name);
-
-    // Case 2.  Lookup the function without the external setter suffix
-    // '='.  Make sure to do this check after the regular lookup, so
-    // that we don't interfere with operator lookups (like ==).
-    if (func.IsNull() && HasExternalSetterSuffix(func_name)) {
-      tmp_name = RemoveExternalSetterSuffix(func_name);
-      tmp_name = Field::SetterName(tmp_name);
-      func = lib.LookupFunctionAllowPrivate(tmp_name);
-    }
-
-    // Case 3.  Lookup the function with the getter prefix prepended.
-    if (func.IsNull()) {
-      tmp_name = Field::GetterName(func_name);
-      func = lib.LookupFunctionAllowPrivate(tmp_name);
-    }
-  } else {
-    return Api::NewError(
-        "%s expects argument 'target' to be a class or library.", CURRENT_FUNC);
-  }
-
-#if defined(DEBUG)
-  if (!func.IsNull()) {
-    // We only provide access to a subset of function kinds.
-    RawFunction::Kind func_kind = func.kind();
-    ASSERT(func_kind == RawFunction::kRegularFunction ||
-           func_kind == RawFunction::kGetterFunction ||
-           func_kind == RawFunction::kSetterFunction ||
-           func_kind == RawFunction::kConstructor);
-  }
-#endif
-  return Api::NewHandle(T, func.raw());
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionName(Dart_Handle function) {
-  DARTSCOPE(Thread::Current());
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  return Api::NewHandle(T, func.UserVisibleName());
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionOwner(Dart_Handle function) {
-  DARTSCOPE(Thread::Current());
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  if (func.IsNonImplicitClosureFunction()) {
-    RawFunction* parent_function = func.parent_function();
-    return Api::NewHandle(T, parent_function);
-  }
-  const Class& owner = Class::Handle(Z, func.Owner());
-  ASSERT(!owner.IsNull());
-  if (owner.IsTopLevel()) {
-// Top-level functions are implemented as members of a hidden class. We hide
-// that class here and instead answer the library.
-#if defined(DEBUG)
-    const Library& lib = Library::Handle(Z, owner.library());
-    if (lib.IsNull()) {
-      ASSERT(owner.IsDynamicClass() || owner.IsVoidClass());
-    }
-#endif
-    return Api::NewHandle(T, owner.library());
-  } else {
-    return Api::NewHandle(T, owner.RareType());
-  }
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionIsStatic(Dart_Handle function,
-                                              bool* is_static) {
-  DARTSCOPE(Thread::Current());
-  if (is_static == NULL) {
-    RETURN_NULL_ERROR(is_static);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  *is_static = func.is_static();
-  return Api::Success();
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionIsConstructor(Dart_Handle function,
-                                                   bool* is_constructor) {
-  DARTSCOPE(Thread::Current());
-  if (is_constructor == NULL) {
-    RETURN_NULL_ERROR(is_constructor);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  *is_constructor = func.kind() == RawFunction::kConstructor;
-  return Api::Success();
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionIsGetter(Dart_Handle function,
-                                              bool* is_getter) {
-  DARTSCOPE(Thread::Current());
-  if (is_getter == NULL) {
-    RETURN_NULL_ERROR(is_getter);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  *is_getter = func.IsGetterFunction();
-  return Api::Success();
-}
-
-DART_EXPORT Dart_Handle Dart_FunctionIsSetter(Dart_Handle function,
-                                              bool* is_setter) {
-  DARTSCOPE(Thread::Current());
-  if (is_setter == NULL) {
-    RETURN_NULL_ERROR(is_setter);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(Z, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(Z, function, Function);
-  }
-  *is_setter = (func.kind() == RawFunction::kSetterFunction);
-  return Api::Success();
-}
-
-// --- Libraries Reflection ---
-
-DART_EXPORT Dart_Handle Dart_LibraryName(Dart_Handle library) {
-  DARTSCOPE(Thread::Current());
-  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
-  if (lib.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-  const String& name = String::Handle(Z, lib.name());
-  ASSERT(!name.IsNull());
-  return Api::NewHandle(T, name.raw());
-}
-
-DART_EXPORT Dart_Handle Dart_LibraryGetClassNames(Dart_Handle library) {
-  DARTSCOPE(Thread::Current());
-  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
-  if (lib.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-  ClassDictionaryIterator it(lib);
-  Class& cls = Class::Handle(Z);
-  String& name = String::Handle(Z);
-  while (it.HasNext()) {
-    cls = it.GetNextClass();
-    name = cls.UserVisibleName();
-    names.Add(name);
-  }
-  return Api::NewHandle(T, Array::MakeFixedLength(names));
-}
-
-// --- Closures Reflection ---
-
-DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure) {
-  DARTSCOPE(Thread::Current());
-  const Instance& closure_obj = Api::UnwrapInstanceHandle(Z, closure);
-  if (closure_obj.IsNull() || !closure_obj.IsClosure()) {
-    RETURN_TYPE_ERROR(Z, closure, Instance);
-  }
-
-  ASSERT(ClassFinalizer::AllClassesFinalized());
-
-  RawFunction* rf = Closure::Cast(closure_obj).function();
-  return Api::NewHandle(T, rf);
-}
-
-}  // namespace dart
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 92e1838..10795eb 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -266,7 +266,7 @@
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
       FLAG_strong ? platform_strong_dill_size : platform_dill_size,
-      sourcefiles_count, sourcefiles, incrementally);
+      sourcefiles_count, sourcefiles, incrementally, NULL);
 
   if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
     char* result =
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart b/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
index 0a841b7..dc12c0e 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
@@ -359,4 +359,12 @@
   /*InputDevice*/ get sourceDevice {
     throw new UnimplementedError();
   }
+
+  bool get composed {
+    throw new UnimplementedError();
+  }
+
+  List<EventTarget> composedPath() {
+    throw new UnimplementedError();
+  }
 }
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 766a114..40dfafb 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -53,7 +53,6 @@
 #.............templates/
 # ....include/
 # ......dart_api.h
-# ......dart_mirrors_api.h
 # ......dart_native_api.h
 # ......dart_tools_api.h
 # ....lib/
@@ -761,7 +760,6 @@
   visibility = [ ":create_common_sdk" ]
   sources = [
     "../runtime/include/dart_api.h",
-    "../runtime/include/dart_mirrors_api.h",
     "../runtime/include/dart_native_api.h",
     "../runtime/include/dart_tools_api.h",
   ]
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 6fe6853..9a0627c 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -630,11 +630,16 @@
 }
 
 /// Checks that the type represented by [subtype] is a subtype of [supertype].
-/// If not a type error with [message] is thrown.
+/// If not a type error is thrown using [prefix], [infix], [suffix] and the
+/// runtime types [subtype] and [supertype] to generate the error message.
 ///
 /// Called from generated code.
-assertIsSubtype(var subtype, var supertype, String message) {
+assertIsSubtype(
+    var subtype, var supertype, String prefix, String infix, String suffix) {
   if (!isSubtype(subtype, supertype)) {
+    String message = "TypeError: "
+        "$prefix${runtimeTypeToString(subtype)}$infix"
+        "${runtimeTypeToString(supertype)}$suffix";
     throwTypeError(message);
   }
 }
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index a8cc728..6296cde 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -1487,14 +1487,10 @@
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: Fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
 
-[ $compiler == dart2js && $runtime == d8 && $system == windows ]
-LibTest/async/DeferredLibrary/*: Skip # Issue 17458
-
 [ $compiler == dart2js && $runtime == d8 && $checked && $fast_startup && $minified ]
 Language/Classes/Constructors/Factories/function_type_t02: RuntimeError
 Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: RuntimeError
 Language/Generics/malformed_t02: Crash
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: RuntimeError
 
 [ $compiler == dart2js && $runtime == d8 && $fast_startup ]
 LibTest/isolate/Isolate/spawn_A04_t04: Pass # Technically fails, but since sync-async was turned on, this test completes before it fails. Underlying issue: #27558
@@ -6939,15 +6935,10 @@
 LibTest/core/Uri/Uri_A06_t03: Slow, Pass # Please triage this failure
 LibTest/math/Point/operator_mult_A02_t01: RuntimeError # Issue 1533
 
-[ $compiler == dart2js && $checked && $fast_startup && $fasta && $minified ]
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError
-
 [ $compiler == dart2js && $checked && $fasta && $host_checked ]
 Language/Classes/Constructors/Factories/function_type_t02: RuntimeError
 Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: RuntimeError
 Language/Generics/malformed_t02: Crash
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: RuntimeError
 
 [ $compiler == dart2js && !$checked && $enable_asserts ]
 Language/Statements/Assert/execution_t01: SkipByDesign # Unspec'd feature.
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index 1574ab9..14ccaa6 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -113,6 +113,8 @@
   new Class2().method5<int>(0);
   new Class3().method6<int>(0);
   dynamic c3 = args != null ? new Class3() : new Class2();
+  // TODO(johnniwinther): Expected bounds should be `dynamic` when CFE supports
+  // instantiate-to-bound.
   c3.method6(0); // Missing type arguments.
   try {
     dynamic c2 = args == null ? new Class3() : new Class2();
@@ -160,8 +162,8 @@
 "foo" is int = false
 
 Class3.method6:
-0 is dynamic = true
-"foo" is dynamic = true
+0 is Object = true
+"foo" is Object = true
 
 Class2.method6:
 0 is int = true
diff --git a/tests/compiler/dart2js/kernel/compiler_helper.dart b/tests/compiler/dart2js/kernel/compiler_helper.dart
index d59c303..7c5101a 100644
--- a/tests/compiler/dart2js/kernel/compiler_helper.dart
+++ b/tests/compiler/dart2js/kernel/compiler_helper.dart
@@ -123,8 +123,8 @@
   print(out);
   if (expectedOutput != null) {
     Expect.equals(0, runResult.exitCode);
-    Expect.stringEquals(
-        expectedOutput, runResult.stdout.replaceAll('\r\n', '\n'));
+    Expect.stringEquals(expectedOutput.trim(),
+        runResult.stdout.replaceAll('\r\n', '\n').trim());
   }
   return result.compiler;
 }
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
new file mode 100644
index 0000000..74cf201
--- /dev/null
+++ b/tests/compiler/dart2js/rti/bound_check_test.dart
@@ -0,0 +1,89 @@
+// 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import '../kernel/compiler_helper.dart';
+
+const String SOURCE1 = r'''
+import 'package:expect/expect.dart';
+
+class A {}
+class B {}
+
+method1<T extends A>() {}
+
+class C {
+  method2<T, S extends T>() {}
+}
+
+main() {
+  bool printError(e) {
+     print(e); return true;
+  }
+
+  method3<T extends B>() {}
+
+  dynamic m1 = method1;
+  dynamic m2 = new C().method2;
+  dynamic m3 = method3;
+
+  m1<A>();
+  Expect.throws(() => m1<B>(), printError);
+  m2<A, A>();
+  Expect.throws(() => m2<B, A>(), printError);
+  m3<B>();
+  Expect.throws(() => m3<A>(), printError);
+}
+
+''';
+
+const String OUTPUT1 = r'''
+TypeError: The type argument 'B' is not a subtype of the type variable bound 'A' of type variable 'T' in 'method1'.
+TypeError: The type argument 'A' is not a subtype of the type variable bound 'B' of type variable 'S' in 'method2'.
+TypeError: The type argument 'A' is not a subtype of the type variable bound 'B' of type variable 'T' in 'call'.
+''';
+
+const String SOURCE2 = r'''
+import 'package:expect/expect.dart';
+
+class A {}
+class B {}
+
+class C<T extends A>{
+}
+
+class D<T> extends C<T> {}
+
+main() {
+  bool printError(e) {
+     print(e); return true;
+  }
+
+  new C<A>();
+  Expect.throws(() => new C<B>(), printError);
+  new D<A>();
+  Expect.throws(() => new D<B>(), printError);
+}
+''';
+
+const String OUTPUT2 = r'''
+TypeError: Can't create an instance of malbounded type 'C<B>': 'B' is not a subtype of bound 'A' type variable 'C.T' of type 'C<C.T>'.
+TypeError: Can't create an instance of malbounded type 'D<B>': 'B' is not a subtype of bound 'A' type variable 'C.T' of type 'C<C.T>' on the supertype 'C<B>' of 'D<B>'.
+''';
+
+main(List<String> args) {
+  asyncTest(() async {
+    await runWithD8(memorySourceFiles: {
+      'main.dart': SOURCE1
+    }, options: [
+      Flags.strongMode,
+    ], expectedOutput: OUTPUT1, printJs: args.contains('-v'));
+    await runWithD8(
+        memorySourceFiles: {'main.dart': SOURCE2},
+        options: [Flags.enableCheckedMode],
+        expectedOutput: OUTPUT2,
+        printJs: args.contains('-v'));
+  });
+}
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart
index 55caaec..10a4018 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not2_strong.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.
 
-/*!strong.class: A:*/
 /*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[B.instanceMethod]*/
@@ -10,6 +9,7 @@
 }
 
 class B {
+  /*element: B.instanceMethod:*/
   instanceMethod<T>(A a, t) => a.instanceMethod<T>(t);
 }
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart
index 601a0d6..03451cd 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class A {
+  /*element: A.instanceMethod:*/
   instanceMethod<T>(t) => t;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not_strong.dart
index 5e81376..9a5b7d3 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_strong.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class A {
+  /*element: A.instanceMethod:*/
   instanceMethod<T>(t) => t;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart b/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
new file mode 100644
index 0000000..e26c0a2
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
@@ -0,0 +1,78 @@
+// 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:expect/expect.dart';
+
+/*strong.class: Class1a:explicit=[Class1a]*/
+class Class1a {}
+
+class Class1b extends Class1a {}
+
+/*strong.class: Class2a:explicit=[Class2a<num>],needsArgs*/
+class Class2a<T> {}
+
+class Class2b<T> extends Class2a<T> {}
+
+/*strong.element: method1:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+method1<T extends Class1a>() => null;
+
+/*strong.element: method2:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+method2<T extends Class2a<num>>() => null;
+
+method3<T>() => null;
+
+class Class3 {
+  /*strong.element: Class3.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  method4<T extends Class1a>() => null;
+
+  /*strong.element: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
+  method5<T extends Class2a<num>>() => null;
+
+  method6<T>() => null;
+}
+
+main() {
+  /*strong.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+  method7<T extends Class1a>() => null;
+
+  /*strong.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+  method8<T extends Class2a<num>>() => null;
+
+  /**/
+  method9<T>() => null;
+
+  dynamic f1 = method1;
+  dynamic f2 = method2;
+  dynamic f3 = method3;
+  dynamic c3 = new Class3();
+  dynamic f7 = method7;
+  dynamic f8 = method8;
+  dynamic f9 = method9;
+
+  f1<Class1b>();
+  f2<Class2b<int>>();
+  f3<int>();
+  c3.method4<Class1b>();
+  c3.method5<Class2b<int>>();
+  c3.method6<int>();
+  f7<Class1b>();
+  f8<Class2b<int>>();
+  f9<int>();
+
+  if (typeAssertionsEnabled) {
+    Expect.throws(/*needsSignature*/ () => f1<Class2a<num>>());
+    Expect.throws(/*needsSignature*/ () => f2<Class2b<String>>());
+    Expect.throws(/*needsSignature*/ () => c3.method4<Class2a<num>>());
+    Expect.throws(/*needsSignature*/ () => c3.method5<Class2b<String>>());
+    Expect.throws(/*needsSignature*/ () => f7<Class2a<num>>());
+    Expect.throws(/*needsSignature*/ () => f8<Class2b<String>>());
+  } else {
+    f1<Class2a<num>>();
+    f2<Class2b<String>>();
+    c3.method4<Class2a<num>>();
+    c3.method5<Class2b<String>>();
+    f7<Class2a<num>>();
+    f8<Class2b<String>>();
+  }
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
new file mode 100644
index 0000000..b4ffec3
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -0,0 +1,15 @@
+// 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:expect/expect.dart';
+
+main() {
+  // This call is on the stack when the error is thrown.
+  /*1:main*/ test();
+}
+
+@NoInline()
+test() async /*2:test*/ {
+  /*3:test*/ throw '>ExceptionMarker<';
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
new file mode 100644
index 0000000..424a063
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -0,0 +1,21 @@
+// 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:expect/expect.dart';
+
+main() {
+  // This call is on the stack when the error is thrown.
+  /*1:main*/ test1();
+}
+
+@NoInline()
+test1() async /*2:test1*/ {
+  // This call is on the stack when the error is thrown.
+  await /*3:test1*/ test2();
+}
+
+@NoInline()
+test2() async /*4:test2*/ {
+  /*5:test2*/ throw '>ExceptionMarker<';
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
new file mode 100644
index 0000000..50035b4
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -0,0 +1,23 @@
+// 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:expect/expect.dart';
+
+main() {
+  /*1:main*/ test();
+}
+
+test() async /*ast.2:test*/ {
+  // TODO(johnniwinther): Investigate why kernel doesn't point to the body
+  // start brace.
+  // ignore: UNUSED_LOCAL_VARIABLE
+  var /*kernel.2:test*/ c = new /*3:test*/ Class();
+}
+
+class Class {
+  @NoInline()
+  /*4:Class*/ Class() {
+    /*5:Class*/ throw '>ExceptionMarker<';
+  }
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
new file mode 100644
index 0000000..120b60c
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -0,0 +1,19 @@
+// 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:expect/expect.dart';
+
+main() {
+  /*1:main*/ test1();
+}
+
+@NoInline()
+test1() async /*2:test1*/ {
+  /*3:test1*/ test2();
+}
+
+@NoInline()
+test2() {
+  /*4:test2*/ throw '>ExceptionMarker<';
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index bf86d5d..1a815d9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -108,6 +108,7 @@
 /// Lines allowed after the intended stack trace. Typically from the event
 /// queue.
 const List<LineException> afterExceptions = const [
+  const LineException('_asyncStartSync', 'async_patch.dart'),
   const LineException('_wrapJsFunctionForAsync', 'async_patch.dart'),
   const LineException(
       '_wrapJsFunctionForAsync.<anonymous function>', 'async_patch.dart'),
@@ -130,6 +131,7 @@
   const LineException('invokeClosure.<anonymous function>', 'js_helper.dart'),
   const LineException('_IsolateContext.eval', 'isolate_helper.dart'),
   const LineException('_callInIsolate', 'isolate_helper.dart'),
+  const LineException('startRootIsolate', 'isolate_helper.dart'),
   const LineException('invokeClosure', 'js_helper.dart'),
   const LineException('convertDartClosureToJS', 'js_helper.dart'),
 ];
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 1dc91cd..5dce5f5 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -58,9 +58,6 @@
 [ $compiler == dart2js && $checked ]
 variable_type_test/01: Fail, OK
 variable_type_test/03: Fail, OK
-32997a_test: SkipByDesign # --omit-implicit-checks shouldn't be used together
-32997b_test/none: SkipByDesign # --omit-implicit-checks shouldn't be used together
-32997b_test/01: SkipByDesign # --omit-implicit-checks shouldn't be used together
 
 [ $compiler == dart2js && $checked && $fasta ]
 deferred/deferred_mirrors1_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
diff --git a/tests/compiler/dart2js_extra/generic_bounds_test.dart b/tests/compiler/dart2js_extra/generic_bounds_test.dart
new file mode 100644
index 0000000..0b9cacb
--- /dev/null
+++ b/tests/compiler/dart2js_extra/generic_bounds_test.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class A {}
+
+class B extends A {}
+
+class C {}
+
+class D<T> {}
+
+class E<T> extends D<T> {}
+
+class F<T> {}
+
+void f1<T extends A>() {
+  print('f1<$T>');
+}
+
+void f2<S, T extends D<S>>() {
+  print('f2<$S,$T>');
+}
+
+main() {
+  dynamic f = f1;
+  f<A>();
+  f<B>();
+  Expect.throws(() => f<C>(), (e) {
+    print(e);
+    return true;
+  });
+  f();
+  f = f2;
+  f<A, D<A>>();
+  f<A, E<A>>();
+  Expect.throws(() => f<A, F<A>>(), (e) {
+    print(e);
+    return true;
+  });
+  f();
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 6641868..6c66c0c 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -16,6 +16,7 @@
 date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
 iterable_where_type_test: RuntimeError # issue 31718
 list_unmodifiable_test: Pass, RuntimeError # Issue 28712
+apply_generic_function_test: RuntimeError # Issue 32691
 
 [ $compiler != dartdevc ]
 error_stack_trace_test/static: MissingCompileTimeError
@@ -328,6 +329,9 @@
 [ $compiler != dartk && $runtime == vm && $checked ]
 apply_test/01: RuntimeError
 
+[ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
+growable_list_test: Crash
+
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 apply_generic_function_test: RuntimeError
 iterable_fold_test/02: RuntimeError
diff --git a/tests/language_2/function_call_generic_test.dart b/tests/language_2/function_call_generic_test.dart
index 0d90f52..b98584e 100644
--- a/tests/language_2/function_call_generic_test.dart
+++ b/tests/language_2/function_call_generic_test.dart
@@ -1,7 +1,6 @@
 // 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.
-// dart2jsOptions=-Ddart.isdart2js=true
 
 import "package:expect/expect.dart";
 
@@ -22,10 +21,11 @@
   print('a:  $expected');
   print('b:  $actual');
   if (((actual[0] == Object && expected[0] == dynamic) ||
-          (actual[0] == dynamic && expected[0] == Object)) &&
-      !const bool.fromEnvironment('dart.isdart2js')) {
+      (actual[0] == dynamic && expected[0] == Object))) {
     // TODO(32483): dartdevk sometimes defaults type to 'Object' when 'dynamic'
     // is required. Remove this hack when fixed.
+    // TODO(31581): dart2js needs instantiate-to-bound to generic 'dynamic'
+    // instead of 'Object'.
     actual = actual.toList()..[0] = expected[0];
     print('b*: $actual');
   }
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 7bf5e3c..790afc0 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -100,15 +100,7 @@
 parameter_initializer4_negative_test: CompileTimeError
 parameter_initializer6_negative_test: CompileTimeError
 part_refers_to_core_library_test/01: MissingCompileTimeError # Issue 29709
-prefix11_negative_test: Fail # Issue 11964
-prefix12_negative_test: Fail # Issue 11962
-prefix1_negative_test: Fail # Issue 11962
-prefix2_negative_test: Fail # Issue 11962
-prefix3_negative_test: Fail # Issue 12191
-prefix4_negative_test: Fail # Issue 11962
-prefix5_negative_test: Fail # Issue 11962
-prefix7_negative_test: CompileTimeError
-prefix8_negative_test: Fail # Issue 11964
+prefix_shadow_test/01: MissingCompileTimeError # Issue 33005
 private_member1_negative_test: Fail # Issue 14021
 private_member2_negative_test: Fail # Issue 14021
 private_member3_negative_test: Fail # Issue 14021
@@ -1161,10 +1153,6 @@
 override_inheritance_method_test/29: CompileTimeError
 parameter_initializer_test: CompileTimeError
 parser_quirks_test: CompileTimeError
-prefix13_negative_test: CompileTimeError, OK
-prefix15_negative_test: CompileTimeError, OK
-prefix18_negative_test: CompileTimeError, OK
-prefix6_negative_test: CompileTimeError, OK
 regress_22976_test/01: CompileTimeError
 regress_22976_test/02: CompileTimeError
 regress_22976_test/none: CompileTimeError
@@ -1566,13 +1554,17 @@
 partial_tearoff_instantiation_test/08: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
-prefix13_negative_test: CompileTimeError, OK
-prefix15_negative_test: CompileTimeError, OK
 prefix16_test/00: MissingCompileTimeError
 prefix16_test/01: MissingCompileTimeError
-prefix18_negative_test: CompileTimeError, OK
 prefix22_test/00: MissingCompileTimeError
 prefix23_test/00: MissingCompileTimeError
+prefix_import_collision_test/01: MissingCompileTimeError
+prefix_shadow_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/01: MissingCompileTimeError
+prefix_transitive_import_prefix_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/03: MissingCompileTimeError
+prefix_transitive_import_test/01: MissingCompileTimeError
+prefix_transitive_import_test/02: MissingCompileTimeError
 private_access_test/01: MissingCompileTimeError
 private_access_test/02: MissingCompileTimeError
 private_access_test/03: MissingCompileTimeError
@@ -1733,4 +1725,5 @@
 unresolved_default_constructor_test/01: MissingCompileTimeError
 unresolved_top_level_method_test: MissingCompileTimeError
 unresolved_top_level_var_test: MissingCompileTimeError
+variable_shadow_class_test/01: MissingCompileTimeError
 vm/type_vm_test: StaticWarning
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 646ea75..9a340bb 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -278,9 +278,7 @@
 constructor_redirect2_negative_test: Crash # Stack Overflow
 constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
-covariance_type_parameter_test/01: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariance_type_parameter_test/02: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
-covariance_type_parameter_test/03: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariant_override/runtime_check_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
@@ -633,9 +631,7 @@
 constructor_redirect1_negative_test/01: Crash # Stack Overflow
 constructor_redirect2_negative_test: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
-covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
-covariance_type_parameter_test/03: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 cyclic_constructor_test/01: Crash # Stack Overflow
@@ -1053,9 +1049,7 @@
 constructor_redirect1_negative_test/01: Crash # Stack Overflow
 constructor_redirect2_negative_test: Crash # Issue 30856
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
-covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
-covariance_type_parameter_test/03: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
@@ -1640,9 +1634,7 @@
 constructor_redirect1_negative_test/01: Crash # Stack Overflow
 constructor_redirect2_negative_test: Crash # Issue 30856
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
-covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
-covariance_type_parameter_test/03: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index c407314..ed5dedb 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -98,9 +98,6 @@
 issue32353_test: RuntimeError
 label_test: RuntimeError
 left_shift_test: RuntimeError # Ints and doubles are unified.
-library_env_test/has_io_support: RuntimeError # Intended to fail, bool.fromEnvironment("dart.library.async") is false
-library_env_test/has_mirror_support: RuntimeError # Intended to fail, bool.fromEnvironment("dart.library.async") is false
-library_env_test/has_no_html_support: RuntimeError # Intended to fail, bool.fromEnvironment("dart.library.async") is false
 method_override_test: CompileTimeError # Negative test
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -143,7 +140,7 @@
 override_inheritance_method_test/29: CompileTimeError
 parameter_initializer_test: CompileTimeError
 part_refers_to_core_library_test/01: Crash
-prefix10_negative_test: Fail # Issue 29920
+prefix_shadow_test/01: MissingCompileTimeError # Issue 33005
 regress_23089_test: MissingCompileTimeError
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # Intended to fail, requires 64-bit numbers.
@@ -424,9 +421,6 @@
 issue31596_super_test/03: CompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-library_env_test/has_mirror_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-library_env_test/has_no_html_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 malbounded_instantiation_test/01: MissingCompileTimeError
 malbounded_instantiation_test/02: MissingCompileTimeError
 malbounded_instantiation_test/03: MissingCompileTimeError
@@ -716,10 +710,9 @@
 issue23244_test: RuntimeError # Issue 29920; Uncaught Unsupported operation: only top-level functions can be spawned.
 least_upper_bound_expansive_test/none: RuntimeError # 30908; Uncaught RangeError: Maximum call stack size exceeded
 left_shift_test: RuntimeError # Ints and doubles are unified.; Expect.equals(expected: <1>, actual: <-4294967295>) fails.
-library_env_test/has_html_support: RuntimeError # Issue 30907; Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-library_env_test/has_no_io_support: RuntimeError # Issue 30907; Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-library_env_test/has_no_mirror_support: RuntimeError # Issue 30907; Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-library_env_test/none: RuntimeError # Issue 30907; Unsupported operation: bool.fromEnvironment can only be used as a const constructor
+library_env_test/has_io_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
+library_env_test/has_mirror_support: RuntimeError, OK  # Intended to fail, bool.fromEnvironment("dart.library.async") is false
+library_env_test/has_no_html_support: RuntimeError, OK  # Intended to fail, bool.fromEnvironment("dart.library.async") is false
 local_function2_test/none: RuntimeError # ReferenceError: TToNull is not defined
 local_function3_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
 local_function_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 611f8e8..b58c2c8 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -727,6 +727,7 @@
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 const_instance_field_test/01: Crash # Issue 32326.
 external_test/13: Crash
+extract_type_arguments_test: Crash # Issue 33029
 type_promotion_functions_test/05: Pass
 type_promotion_functions_test/06: Pass
 type_promotion_functions_test/07: Pass
@@ -1308,6 +1309,15 @@
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/10: MissingCompileTimeError
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
+prefix_import_collision_test/01: MissingCompileTimeError
+prefix_shadow_test/01: MissingCompileTimeError
+prefix_shadow_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/01: MissingCompileTimeError
+prefix_transitive_import_prefix_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/03: MissingCompileTimeError
+prefix_transitive_import_test/01: MissingCompileTimeError
+prefix_transitive_import_test/02: MissingCompileTimeError
+variable_shadow_class_test/01: MissingCompileTimeError
 
 [ $fasta && $strong ]
 compile_time_constant_k_test/01: MissingCompileTimeError
@@ -1938,20 +1948,10 @@
 partial_tearoff_instantiation_test/03: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
-prefix10_negative_test: Fail
-prefix11_negative_test: Fail
-prefix12_negative_test: Fail
 prefix16_test/00: MissingCompileTimeError
 prefix16_test/01: MissingCompileTimeError
-prefix1_negative_test: Fail
 prefix22_test/00: MissingCompileTimeError
 prefix23_test/00: MissingCompileTimeError
-prefix2_negative_test: Fail
-prefix3_negative_test: Fail
-prefix4_negative_test: Fail
-prefix5_negative_test: Fail
-prefix6_negative_test: Fail
-prefix8_negative_test: Fail
 private_access_test/01: MissingCompileTimeError
 private_access_test/02: MissingCompileTimeError
 private_access_test/03: MissingCompileTimeError
diff --git a/tests/language_2/language_2_spec_parser.status b/tests/language_2/language_2_spec_parser.status
index 7788992..1504f8f 100644
--- a/tests/language_2/language_2_spec_parser.status
+++ b/tests/language_2/language_2_spec_parser.status
@@ -55,20 +55,6 @@
 parameter_initializer3_negative_test: Skip # Negative, not syntax.
 parameter_initializer4_negative_test: Skip # Negative, not syntax.
 parameter_initializer6_negative_test: Skip # Negative, not syntax.
-prefix10_negative_test: Skip # Negative, not syntax.
-prefix11_negative_test: Skip # Negative, not syntax.
-prefix12_negative_test: Skip # Negative, not syntax.
-prefix13_negative_test: Skip # Negative, not syntax.
-prefix15_negative_test: Skip # Negative, not syntax.
-prefix18_negative_test: Fail # Negative, uses `lib1.invalid` as library prefix.
-prefix1_negative_test: Skip # Negative, not syntax.
-prefix2_negative_test: Skip # Negative, not syntax.
-prefix3_negative_test: Skip # Negative, not syntax.
-prefix4_negative_test: Skip # Negative, not syntax.
-prefix5_negative_test: Skip # Negative, not syntax.
-prefix6_negative_test: Skip # Negative, not syntax.
-prefix7_negative_test: Skip # Negative, not syntax.
-prefix8_negative_test: Skip # Negative, not syntax.
 private_member1_negative_test: Skip # Negative, not syntax.
 private_member2_negative_test: Skip # Negative, not syntax.
 private_member3_negative_test: Skip # Negative, not syntax.
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 8b95fdf9..b86d7b2 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -847,6 +847,14 @@
 prefix16_test/01: MissingCompileTimeError
 prefix22_test/00: MissingCompileTimeError
 prefix23_test/00: MissingCompileTimeError
+prefix_import_collision_test/01: MissingCompileTimeError
+prefix_shadow_test/01: MissingCompileTimeError
+prefix_shadow_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/01: MissingCompileTimeError
+prefix_transitive_import_prefix_test/02: MissingCompileTimeError
+prefix_transitive_import_prefix_test/03: MissingCompileTimeError
+prefix_transitive_import_test/01: MissingCompileTimeError
+prefix_transitive_import_test/02: MissingCompileTimeError
 private_access_test/01: MissingCompileTimeError
 private_access_test/02: MissingCompileTimeError
 private_access_test/03: MissingCompileTimeError
@@ -1031,6 +1039,7 @@
 unresolved_in_factory_test: MissingCompileTimeError
 unresolved_top_level_method_test: MissingCompileTimeError
 unresolved_top_level_var_test: MissingCompileTimeError
+variable_shadow_class_test/01: MissingCompileTimeError
 
 [ $compiler != dartk && $runtime == vm && $checked ]
 call_method_as_cast_test/06: RuntimeError
diff --git a/tests/language_2/library2.dart b/tests/language_2/library2.dart
index 5bdf267..219303f 100644
--- a/tests/language_2/library2.dart
+++ b/tests/language_2/library2.dart
@@ -1,9 +1,6 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-
-library library2.dart;
 
 var foo;
 var foo1 = 0;
diff --git a/tests/language_2/prefix10_negative_test.dart b/tests/language_2/prefix10_negative_test.dart
deleted file mode 100644
index c660513..0000000
--- a/tests/language_2/prefix10_negative_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2011, 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.
-//
-
-// Type parameters can shadow a library prefix.
-
-library Prefix10NegativeTest.dart;
-
-import "package:expect/expect.dart";
-import "library10.dart" as T;
-
-class P<T> {
-  P.named(T this.fld);
-  T fld;
-  main() {
-    var i = new T.Library10(10); // This should be an error.
-    Expect.equals(10, i.fld);
-  }
-}
-
-main() {
-  var i = new P<int>.named(10);
-  i.main();
-}
diff --git a/tests/language_2/prefix12_negative_test.dart b/tests/language_2/prefix12_negative_test.dart
deleted file mode 100644
index 8c2ba21..0000000
--- a/tests/language_2/prefix12_negative_test.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2011, 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.
-//
-// Symbols in libraries imported by the prefixed library should not be visible
-
-library Prefix12NegativeTest.dart;
-
-import "library12.dart" as lib12;
-
-main() {
-  var obj = lib12.top_level11; // Error, variable should not be visible
-}
diff --git a/tests/language_2/prefix15_negative_test.dart b/tests/language_2/prefix15_negative_test.dart
deleted file mode 100644
index 156c512..0000000
--- a/tests/language_2/prefix15_negative_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2011, 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.
-//
-// Unresolved symbols should be reported as an error.
-
-library Prefix15NegativeTest.dart;
-
-import "library12.dart" as lib12;
-
-class myClass implements lib12.Library13 {
-  myClass(int this.fld) : super(0);
-  int fld;
-}
-
-main() {
-  new myClass(1);
-}
diff --git a/tests/language_2/prefix1_negative_test.dart b/tests/language_2/prefix1_negative_test.dart
deleted file mode 100644
index ea6ae23..0000000
--- a/tests/language_2/prefix1_negative_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library Prefix1NegativeTest.dart;
-
-import "library1.dart";
-
-class Prefix1NegativeTest {
-  static Main() {
-    // This is a syntax error as library1 was not imported with a prefix.
-    return library1.foo;
-  }
-}
-
-main() {
-  Prefix1NegativeTest.Main();
-}
diff --git a/tests/language_2/prefix2_negative_test.dart b/tests/language_2/prefix2_negative_test.dart
deleted file mode 100644
index 05cf8c3..0000000
--- a/tests/language_2/prefix2_negative_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library Prefix2NegativeTest.dart;
-
-import "library2.dart" as lib2;
-
-class Prefix2NegativeTest {
-  static Main() {
-    // This is a syntax error as multiple prefixes are not possible.
-    return lib2.Library2.main() + lib2.lib1.foo;
-  }
-}
-
-main() {
-  Prefix2NegativeTest.Main();
-}
diff --git a/tests/language_2/prefix4_negative_test.dart b/tests/language_2/prefix4_negative_test.dart
deleted file mode 100644
index 5063274..0000000
--- a/tests/language_2/prefix4_negative_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library Prefix4NegativeTest.dart;
-
-import "package:expect/expect.dart";
-import "library10.dart";
-
-class Prefix4NegativeTest {
-  static Test1() {
-    // Library prefixes in the imported libraries should not be visible here.
-    var result = 0;
-    var obj = new lib11.Library11(1);
-    result = obj.fld;
-    Expect.equals(1, result);
-    result += obj.func();
-    Expect.equals(3, result);
-  }
-}
-
-main() {
-  Prefix4NegativeTest.Test1();
-}
diff --git a/tests/language_2/prefix5_negative_test.dart b/tests/language_2/prefix5_negative_test.dart
deleted file mode 100644
index 930a66b..0000000
--- a/tests/language_2/prefix5_negative_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library Prefix5NegativeTest.dart;
-
-import "package:expect/expect.dart";
-import "library10.dart";
-
-class Prefix5NegativeTest {
-  static Test1() {
-    // Library prefixes in the imported libraries should not be visible here.
-    var result = 0;
-    result += lib11.Library11.static_func();
-    Expect.equals(6, result);
-    result += lib11.Library11.static_fld;
-    Expect.equals(10, result);
-  }
-}
-
-main() {
-  Prefix5NegativeTest.Test1();
-}
diff --git a/tests/language_2/prefix6_negative_test.dart b/tests/language_2/prefix6_negative_test.dart
deleted file mode 100644
index d0ee640..0000000
--- a/tests/language_2/prefix6_negative_test.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library Prefix6NegativeTest.dart;
-
-import "library10.dart" as lib10;
-
-class Prefix6NegativeTest {
-  static Test1() {
-    // Variables in the local scope hide the library prefix.
-    var lib10 = 0;
-    var result = 0;
-    result += lib10.Library10.static_func(); // This should fail.
-  }
-}
-
-main() {
-  Prefix6NegativeTest.Test1();
-}
diff --git a/tests/language_2/prefix8_negative_test.dart b/tests/language_2/prefix8_negative_test.dart
deleted file mode 100644
index 321bf91..0000000
--- a/tests/language_2/prefix8_negative_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2011, 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";
-
-// Local variables can shadow class names and hence should result in an
-// error.
-
-class Test {
-  Test.named(int this.fld);
-  int fld;
-}
-
-main() {
-  var Test;
-  var i = new Test.named(10); // This should be an error.
-  Expect.equals(10, i.fld);
-}
diff --git a/tests/language_2/prefix3_negative_test.dart b/tests/language_2/prefix_import_collision_test.dart
similarity index 90%
rename from tests/language_2/prefix3_negative_test.dart
rename to tests/language_2/prefix_import_collision_test.dart
index 2308f7c..5540dde 100644
--- a/tests/language_2/prefix3_negative_test.dart
+++ b/tests/language_2/prefix_import_collision_test.dart
@@ -1,17 +1,13 @@
 // Copyright (c) 2011, 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.
-//
 
 // Using the same prefix name while importing two different libraries is
 // not an error but both library1.dart and library2.dart define 'foo' which
 // results in a duplicate definition error.
-
-library Prefix3NegativeTest.dart;
-
 import "library1.dart" as lib2; // defines 'foo'.
 import "library2.dart" as lib2; // also defines 'foo'.
 
 main() {
-  lib2.foo = 1;
+  lib2.foo = 1; //# 01: compile-time error
 }
diff --git a/tests/language_2/prefix18_negative_test.dart b/tests/language_2/prefix_invalid_name_test.dart
similarity index 63%
rename from tests/language_2/prefix18_negative_test.dart
rename to tests/language_2/prefix_invalid_name_test.dart
index 0131538..6b10189 100644
--- a/tests/language_2/prefix18_negative_test.dart
+++ b/tests/language_2/prefix_invalid_name_test.dart
@@ -1,11 +1,10 @@
 // Copyright (c) 2011, 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.
-//
-// prefix must be a valid identifier
 
-library Prefix18NegativeTest.dart;
-import "library1.dart" as lib1.invalid;
+// Prefix must be a valid identifier.
+import "library1.dart"
+    as lib1.invalid //# 01: compile-time error
+    ;
 
-main() {
-}
+main() {}
diff --git a/tests/language_2/prefix_shadow_test.dart b/tests/language_2/prefix_shadow_test.dart
new file mode 100644
index 0000000..e385baf
--- /dev/null
+++ b/tests/language_2/prefix_shadow_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2011, 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.
+
+// Type parameters can shadow a library prefix.
+
+import "package:expect/expect.dart";
+import "library10.dart" as T;
+import "library10.dart" as lib10;
+
+class P<T> {
+  test() {
+    new T.Library10(10); //# 01: compile-time error
+  }
+}
+
+main() {
+  new P<int>().test();
+
+  {
+    // Variables in the local scope hide the library prefix.
+    var lib10 = 0; //# 02: compile-time error
+    var result = 0;
+    result = lib10.Library10.static_fld;
+    Expect.equals(4, result);
+  }
+
+  {
+    // Shadowing is not an error.
+    var lib10 = 1;
+    Expect.equals(2, lib10 + 1);
+  }
+}
diff --git a/tests/language_2/prefix_transitive_import_prefix_test.dart b/tests/language_2/prefix_transitive_import_prefix_test.dart
new file mode 100644
index 0000000..ec1767a
--- /dev/null
+++ b/tests/language_2/prefix_transitive_import_prefix_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2011, 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 "library10.dart";
+
+main() {
+  // Library prefixes in the imported libraries should not be visible here.
+  new lib11.Library11(1); //# 01: compile-time error
+  lib11.Library11.static_func(); //# 02: compile-time error
+  lib11.Library11.static_fld; //# 03: compile-time error
+}
diff --git a/tests/language_2/prefix11_negative_test.dart b/tests/language_2/prefix_transitive_import_test.dart
similarity index 63%
rename from tests/language_2/prefix11_negative_test.dart
rename to tests/language_2/prefix_transitive_import_test.dart
index 40df3d1..d71654d 100644
--- a/tests/language_2/prefix11_negative_test.dart
+++ b/tests/language_2/prefix_transitive_import_test.dart
@@ -1,13 +1,15 @@
 // Copyright (c) 2011, 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.
-//
-// Symbols in libraries imported by the prefixed library should not be visible
 
-library Prefix11NegativeTest.dart;
+// Symbols in libraries imported by the prefixed library should not be visible.
 
 import "library12.dart" as lib12;
 
 main() {
-  var obj = new lib12.Library11(1); // Error, method should not be visible
+  // Class should not be visible.
+  new lib12.Library11(1); //# 01: compile-time error
+
+  // Variable should not be visible.
+  lib12.top_level11; //# 02: compile-time error
 }
diff --git a/tests/language_2/prefix13_negative_test.dart b/tests/language_2/prefix_unresolved_class_test.dart
similarity index 62%
rename from tests/language_2/prefix13_negative_test.dart
rename to tests/language_2/prefix_unresolved_class_test.dart
index 63b74b1..38f3914 100644
--- a/tests/language_2/prefix13_negative_test.dart
+++ b/tests/language_2/prefix_unresolved_class_test.dart
@@ -1,18 +1,19 @@
 // Copyright (c) 2011, 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.
-//
+
 // Unresolved symbols should be reported as an error.
-
-library Prefix13NegativeTest.dart;
-
 import "library12.dart" as lib12;
 
-class myClass extends lib12.Library13 {
-  myClass(int this.fld) : super(0);
-  int fld;
-}
+class Subclass
+    extends lib12.Library13 //# 01: compile-time error
+{}
+
+class Implementer
+    implements lib12.Library13 //# 02: compile-time error
+{}
 
 main() {
-  new myClass(1);
+  new Subclass();
+  new Implementer();
 }
diff --git a/tests/language_2/prefix7_negative_test.dart b/tests/language_2/prefix_variable_collision_test.dart
similarity index 86%
rename from tests/language_2/prefix7_negative_test.dart
rename to tests/language_2/prefix_variable_collision_test.dart
index 21e313d..9333fd0 100644
--- a/tests/language_2/prefix7_negative_test.dart
+++ b/tests/language_2/prefix_variable_collision_test.dart
@@ -1,14 +1,9 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-
-library Prefix7NegativeTest.dart;
-
 import "library10.dart" as lib10;
 
 // Top level variables cannot shadow library prefixes, they should collide.
-
-var lib10;
+var lib10; //# 01: compile-time error
 
 main() {}
diff --git a/tests/language_2/variable_shadow_class_test.dart b/tests/language_2/variable_shadow_class_test.dart
new file mode 100644
index 0000000..628819b
--- /dev/null
+++ b/tests/language_2/variable_shadow_class_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2011, 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";
+
+// Local variables can shadow class names.
+
+class Test {
+  final int field;
+  Test.named(this.field);
+}
+
+main() {
+  {
+    var Test; //# 01: compile-time error
+    // Now this refers to the variable.
+    var i = new Test.named(10);
+    Expect.equals(10, i.field);
+  }
+
+  {
+    // Shadowing is allowed.
+    var Test = 1;
+    Expect.equals(2, Test + 1);
+  }
+}
diff --git a/tools/VERSION b/tools/VERSION
index 9095694..0e39300 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 52
+PRERELEASE 53
 PRERELEASE_PATCH 0
diff --git a/tools/gardening/bin/results_list.dart b/tools/gardening/bin/results_list.dart
index ea19914..2e9322c 100644
--- a/tools/gardening/bin/results_list.dart
+++ b/tools/gardening/bin/results_list.dart
@@ -59,7 +59,6 @@
       argResults["enable-asserts"],
       argResults["hot-reload"],
       argResults["hot-reload-rollback"],
-      argResults["no-preview-dart-2"],
       argResults["preview-dart-2"],
       argResults.rest);
 }
diff --git a/tools/gardening/lib/src/results/configuration_environment.dart b/tools/gardening/lib/src/results/configuration_environment.dart
index 2e27e60..667a772 100644
--- a/tools/gardening/lib/src/results/configuration_environment.dart
+++ b/tools/gardening/lib/src/results/configuration_environment.dart
@@ -46,7 +46,6 @@
   }),
   "minified": new _Variable.bool((c) => c.minified),
   "mode": new _Variable((c) => c.mode, Mode.names),
-  "no_preview_dart_2": new _Variable.bool((c) => c.noPreviewDart2),
   "preview_dart_2": new _Variable.bool((c) => c.previewDart2),
   "runtime": new _Variable(_runtimeName, Runtime.names),
   "spec_parser": new _Variable.bool((c) => c.compiler == Compiler.specParser),
diff --git a/tools/gardening/lib/src/results/result_json_models.dart b/tools/gardening/lib/src/results/result_json_models.dart
index 020859d..9f96d48 100644
--- a/tools/gardening/lib/src/results/result_json_models.dart
+++ b/tools/gardening/lib/src/results/result_json_models.dart
@@ -28,7 +28,6 @@
   final bool enableAsserts;
   final bool hotReload;
   final bool hotReloadRollback;
-  final bool noPreviewDart2;
   final bool previewDart2;
   final List<String> selectors;
 
@@ -54,7 +53,6 @@
       this.enableAsserts,
       this.hotReload,
       this.hotReloadRollback,
-      this.noPreviewDart2,
       this.previewDart2,
       this.selectors);
 
@@ -81,7 +79,6 @@
         json["enable_asserts"] ?? false,
         json["hot_reload"] ?? false,
         json["hot_reload_rollback"] ?? false,
-        json["no_preview_dart_2"] ?? false,
         json["preview_dart_2"] ?? false,
         json["selectors"] ?? []);
   }
@@ -110,7 +107,6 @@
       _boolToArg("enable-asserts", enableAsserts),
       _boolToArg("hot-reload", hotReload),
       _boolToArg("hot-reload-rollback", hotReloadRollback),
-      _boolToArg("no-preview-dart-2", noPreviewDart2),
       _boolToArg("preview-dart-2", previewDart2)
     ].where((x) => x != null).toList();
     if (includeSelectors && selectors != null && selectors.length > 0) {
@@ -123,7 +119,7 @@
     return "$mode;$arch;$compiler;$runtime;$checked;$strong;$hostChecked;"
         "$minified;$csp;$fasta;$system;$vmOptions;$useSdk;$builderTag;$fastStartup;"
         "$dart2JsWithKernel;$dart2JsOldFrontend;$enableAsserts;$hotReload;"
-        "$hotReloadRollback;$noPreviewDart2;$previewDart2;$selectors";
+        "$hotReloadRollback;$previewDart2;$selectors";
   }
 
   String _stringToArg(String name, String value) {
diff --git a/tools/sdks/README b/tools/sdks/README
index 9bfd810..44c00f2 100644
--- a/tools/sdks/README
+++ b/tools/sdks/README
@@ -14,9 +14,6 @@
 using the 32-bit ia32 build as the default on windows, and the 64-bit x64
 build as the default on linux and macos.
 
-To upload new versions of these tar files, use the "upload_to_google_storage"
-tool in depot_tools, and download the new stable SDKs from the dartlang.org
-web page. The arm executables must be copied from the machines that
-build them, and stripped. Because these SDKs are used for the presubmit
-dartfmt check on changed files, they may need to be updated often when
-dartfmt is changing rapidly.
+To upload new versions of these tar files, run "./update.sh" in this directory.
+Because these SDKs are used for the presubmit dartfmt check on changed files,
+they may need to be updated often when dartfmt is changing rapidly.
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index 69598a2..d3e10bd 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-7e1de2bcab2ea482aa9b4d955cab201913878c78
+bcfe42edaebd8c1a13a78590aab6235769160858
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 60dba1a..a34fc3f 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-2329404025ecfec4b51319427100e55bc14fd96f
\ No newline at end of file
+f1c33b5acdf0a3a4bd7838f98d71cf6199d38aa1
\ No newline at end of file
diff --git a/tools/sdks/update.sh b/tools/sdks/update.sh
new file mode 100755
index 0000000..95a5ebc
--- /dev/null
+++ b/tools/sdks/update.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+# Updates the checked in SDKs
+set -e
+set -x
+
+if [ -z "$1" ]; then
+  echo "Usage: update.sh version"
+  exit 1
+fi
+
+channel="stable"
+case "$1" in
+*-dev.*) channel="dev";;
+esac
+
+tmpdir=$(mktemp -d)
+cleanup() {
+  rm -rf "$tmpdir"
+}
+trap cleanup EXIT HUP INT QUIT TERM PIPE
+pushd "$tmpdir"
+
+gsutil cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-linux-x64-release.zip" .
+gsutil cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-linux-arm-release.zip" .
+gsutil cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-linux-arm64-release.zip" .
+gsutil cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-macos-x64-release.zip" .
+gsutil cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-windows-ia32-release.zip" .
+
+unzip -q dartsdk-linux-arm-release.zip dart-sdk/bin/dart
+mv dart-sdk/bin/dart dart-sdk/bin/dart-arm
+unzip -q dartsdk-linux-arm64-release.zip dart-sdk/bin/dart
+mv dart-sdk/bin/dart dart-sdk/bin/dart-arm64
+unzip -q dartsdk-linux-x64-release.zip
+tar -czf dart-sdk.tar.gz dart-sdk
+upload_to_google_storage.py -b dart-dependencies dart-sdk.tar.gz
+mv dart-sdk.tar.gz.sha1 dart-sdk.tar.gz.sha1-linux
+rm -rf dart-sdk
+
+unzip -q dartsdk-macos-x64-release.zip
+tar -czf dart-sdk.tar.gz dart-sdk
+upload_to_google_storage.py -b dart-dependencies dart-sdk.tar.gz
+mv dart-sdk.tar.gz.sha1 dart-sdk.tar.gz.sha1-mac
+rm -rf dart-sdk
+
+unzip -q dartsdk-windows-ia32-release.zip
+tar -czf dart-sdk.tar.gz dart-sdk
+upload_to_google_storage.py -b dart-dependencies dart-sdk.tar.gz
+mv dart-sdk.tar.gz.sha1 dart-sdk.tar.gz.sha1-win
+rm -rf dart-sdk
+
+popd
+
+mv $tmpdir/dart-sdk.tar.gz.sha1-linux linux/dart-sdk.tar.gz.sha1
+mv $tmpdir/dart-sdk.tar.gz.sha1-mac mac/dart-sdk.tar.gz.sha1
+mv $tmpdir/dart-sdk.tar.gz.sha1-win win/dart-sdk.tar.gz.sha1
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 952fc08..cc0bdcf 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-552657620bcb08d2c45b32af33c2b3d988494b4b
\ No newline at end of file
+0a1a4fbd27281366e873ab5135260583286a2190
\ No newline at end of file
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index 9619512..3a9f0ee 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -29,20 +29,22 @@
   name = "dartanalyzer"
 }
 
-aot_assembly("dartanalyzer_aot_assembly") {
-  main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
-  name = "dartanalyzer"
-}
+if (current_os == "linux") {
+  aot_assembly("dartanalyzer_aot_assembly") {
+    main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
+    name = "dartanalyzer"
+  }
 
-# This target is for Goma. It should not be used in the SDK.
-executable("dartanalyzer_aot") {
-  deps = [
-    "../../runtime/bin:dart_precompiled_runtime_for_linking",
-    ":dartanalyzer_aot_assembly",
-  ]
-  sources = [
-    "$root_gen_dir/dartanalyzer.dart.S"
-  ]
+  # This target is for Goma. It should not be used in the SDK.
+  executable("dartanalyzer_aot") {
+    deps = [
+      "../../runtime/bin:dart_precompiled_runtime_for_linking",
+      ":dartanalyzer_aot_assembly",
+    ]
+    sources = [
+      "$root_gen_dir/dartanalyzer.dart.S"
+    ]
+  }
 }
 
 sdk_lib_files = exec_script("../../tools/list_dart_files.py",