diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee303e8..37ef962 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 2.2.0-dev.1.0
+## 2.2.0-dev.1.1
 
 ### Tool Changes
 
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 11958a0..3c7e212 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -125,8 +125,30 @@
   var summaryModules = Map.fromIterables(
       summaryPaths.map(sourcePathToUri), options.summaryModules.values);
   var useAnalyzer = summaryPaths.any((s) => !s.endsWith('.dill'));
-  var sdkSummaryPath = argResults['dart-sdk-summary'] as String ??
-      (useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath);
+  var sdkSummaryPath = argResults['dart-sdk-summary'] as String;
+  String librarySpecPath;
+  if (sdkSummaryPath == null) {
+    sdkSummaryPath =
+        useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath;
+    librarySpecPath = defaultLibrarySpecPath;
+  } else {
+    // TODO(jmesserly): the `isSupported` bit should be included in the SDK
+    // summary, but front_end requires a separate file, so we have to work
+    // around that, while avoiding yet another command line option.
+    //
+    // Right now we search two locations: one level above the SDK summary
+    // (this works for the build and SDK layouts) or next to the SDK summary
+    // (if the user is doing something custom).
+    //
+    // Another option: we could make an in-memory file with the relevant info.
+    librarySpecPath =
+        path.join(path.dirname(path.dirname(sdkSummaryPath)), "libraries.json");
+    if (!File(librarySpecPath).existsSync()) {
+      librarySpecPath =
+          path.join(path.dirname(sdkSummaryPath), "libraries.json");
+    }
+  }
+
   useAnalyzer = useAnalyzer || !sdkSummaryPath.endsWith('.dill');
 
   /// The .packages file path provided by the user.
@@ -158,6 +180,7 @@
       oldCompilerState,
       sourcePathToUri(sdkSummaryPath),
       sourcePathToUri(packageFile),
+      sourcePathToUri(librarySpecPath),
       summaryModules.keys.toList(),
       DevCompilerTarget(),
       fileSystem: fileSystem);
@@ -332,6 +355,8 @@
 final defaultSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
 
+final defaultLibrarySpecPath = path.join(getSdkPath(), 'lib', 'libraries.json');
+
 final defaultAnalyzerSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
 
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 3a1c819..517e6599 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -573,7 +573,7 @@
   var mainUri = Uri.file('/memory/test.dart');
   _fileSystem.entityForUri(mainUri).writeAsStringSync(code);
   _compilerState = await fe.initializeCompiler(
-      _compilerState, sdkUri, packagesUri, [], DevCompilerTarget(),
+      _compilerState, sdkUri, packagesUri, null, [], DevCompilerTarget(),
       fileSystem: _fileSystem);
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json b/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
deleted file mode 100644
index 49b904f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
-  "dartdevc": {
-    "libraries": {
-      "_runtime": {
-        "uri": "../private/ddc_runtime/runtime.dart"
-      },
-      "_debugger": {
-        "uri": "../private/debugger.dart"
-      },
-      "_foreign_helper": {
-        "uri": "../private/foreign_helper.dart"
-      },
-      "_http": {
-        "uri": "../../../../../sdk/lib/_http/http.dart"
-      },
-      "_interceptors": {
-        "uri": "../private/interceptors.dart"
-      },
-      "_internal": {
-        "uri": "../../../../../sdk/lib/internal/internal.dart",
-        "patches": "../patch/internal_patch.dart"
-      },
-      "_isolate_helper": {
-        "uri": "../private/isolate_helper.dart"
-      },
-      "_js_helper": {
-        "uri": "../private/js_helper.dart"
-      },
-      "_js_mirrors": {
-        "uri": "../private/js_mirrors.dart"
-      },
-      "_js_primitives": {
-        "uri": "../private/js_primitives.dart"
-      },
-      "_metadata": {
-        "uri": "../../../../../sdk/lib/html/html_common/metadata.dart"
-      },
-      "_native_typed_data": {
-        "uri": "../private/native_typed_data.dart"
-      },
-      "async": {
-        "uri": "../../../../../sdk/lib/async/async.dart",
-        "patches": "../patch/async_patch.dart"
-      },
-      "collection": {
-        "uri": "../../../../../sdk/lib/collection/collection.dart",
-        "patches": "../patch/collection_patch.dart"
-      },
-      "convert": {
-        "uri": "../../../../../sdk/lib/convert/convert.dart",
-        "patches": "../patch/convert_patch.dart"
-      },
-      "core": {
-        "uri": "../../../../../sdk/lib/core/core.dart",
-        "patches": "../patch/core_patch.dart"
-      },
-      "developer": {
-        "uri": "../../../../../sdk/lib/developer/developer.dart",
-        "patches": "../patch/developer_patch.dart"
-      },
-      "io": {
-        "uri": "../../../../../sdk/lib/io/io.dart",
-        "patches": "../patch/io_patch.dart"
-      },
-      "isolate": {
-        "uri": "../../../../../sdk/lib/isolate/isolate.dart",
-        "patches": "../patch/isolate_patch.dart"
-      },
-      "mirrors": {
-        "uri": "../../../../../sdk/lib/mirrors/mirrors.dart",
-        "patches": "../patch/mirrors_patch.dart"
-      },
-      "math": {
-        "uri": "../../../../../sdk/lib/math/math.dart",
-        "patches": "../patch/math_patch.dart"
-      },
-      "typed_data": {
-        "uri": "../../../../../sdk/lib/typed_data/typed_data.dart",
-        "patches": "../patch/typed_data_patch.dart"
-      },
-      "html": {
-        "uri": "../../../../../sdk/lib/html/dart2js/html_dart2js.dart"
-      },
-      "html_common": {
-        "uri": "../../../../../sdk/lib/html/html_common/html_common_dart2js.dart"
-      },
-      "indexed_db": {
-        "uri": "../../../../../sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart"
-      },
-      "js": {
-        "uri": "js/dart2js/js_dart2js.dart"
-      },
-      "js_util": {
-        "uri": "js_util/dart2js/js_util_dart2js.dart"
-      },
-      "svg": {
-        "uri": "../../../../../sdk/lib/svg/dart2js/svg_dart2js.dart"
-      },
-      "web_audio": {
-        "uri": "../../../../../sdk/lib/web_audio/dart2js/web_audio_dart2js.dart"
-      },
-      "web_gl": {
-        "uri": "../../../../../sdk/lib/web_gl/dart2js/web_gl_dart2js.dart"
-      },
-      "web_sql": {
-        "uri": "../../../../../sdk/lib/web_sql/dart2js/web_sql_dart2js.dart"
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index feacbc7..2827fbe 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -36,13 +36,14 @@
     outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill');
   }
 
+  var librarySpecPath = parserOptions['libraries'] as String;
+
   var target = DevCompilerTarget();
   var options = CompilerOptions()
     ..compileSdk = true
     // TODO(sigmund): remove this unnecessary option when possible.
     ..sdkRoot = Uri.base
-    ..librariesSpecificationUri =
-        Uri.base.resolveUri(Uri.file(parserOptions['libraries']))
+    ..librariesSpecificationUri = Uri.base.resolveUri(Uri.file(librarySpecPath))
     ..target = target;
 
   var inputs = target.extraRequiredLibraries.map(Uri.parse).toList();
@@ -51,6 +52,8 @@
   var outputDir = path.dirname(outputPath);
   await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
+  File(librarySpecPath).copySync(
+      path.join(path.dirname(outputDir), path.basename(librarySpecPath)));
 
   var jsModule = ProgramCompiler(
       component,
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index dcc4c43..1a85b55 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -56,6 +56,7 @@
     InitializedCompilerState oldState,
     Uri sdkSummary,
     Uri packagesFile,
+    Uri librariesSpecificationUri,
     List<Uri> inputSummaries,
     Target target,
     {FileSystem fileSystem}) async {
@@ -71,6 +72,7 @@
   if (oldState != null &&
       oldState.options.sdkSummary == sdkSummary &&
       oldState.options.packagesFileUri == packagesFile &&
+      oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       listEqual(oldState.options.inputSummaries, inputSummaries)) {
     // Reuse old state.
 
@@ -91,6 +93,7 @@
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
     ..inputSummaries = inputSummaries
+    ..librariesSpecificationUri = librariesSpecificationUri
     ..target = target
     ..fileSystem = fileSystem ?? StandardFileSystem.instance;
 
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 1c33aeb..2d663e0 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -246,30 +246,6 @@
   return scriptUri.toString();
 }
 
-// Embedder Entrypoint (gen_snapshot):
-// Resolve relative paths relative to working directory.
-@pragma("vm:entry-point")
-String _resolveInWorkingDirectory(String fileName) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  if (_workingDirectory == null) {
-    throw 'No current working directory set.';
-  }
-  var name = _sanitizeWindowsPath(fileName);
-
-  var uri = Uri.parse(name);
-  if (uri.scheme != '') {
-    throw 'Schemes are not supported when resolving filenames.';
-  }
-  uri = _workingDirectory.resolveUri(uri);
-
-  if (_traceLoading) {
-    _log('Resolved in working directory: $fileName -> $uri');
-  }
-  return uri.toString();
-}
-
 // Only used by vm/cc unit tests.
 Uri _resolvePackageUri(Uri uri) {
   assert(_packageRoot != null);
@@ -304,22 +280,6 @@
   }
 }
 
-// Embedder Entrypoint.
-@pragma("vm:entry-point")
-_libraryFilePath(String libraryUri) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  int index = libraryUri.lastIndexOf('/');
-  var path;
-  if (index == -1) {
-    path = './';
-  } else {
-    path = libraryUri.substring(0, index + 1);
-  }
-  return _filePathFromUri(path);
-}
-
 // Register callbacks and hooks with the rest of the core libraries.
 @pragma("vm:entry-point")
 _setupHooks() {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index cf75b68..9252508 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -35,7 +35,6 @@
 namespace bin {
 
 const char* DartUtils::original_working_directory = NULL;
-CommandLineOptions* DartUtils::url_mapping = NULL;
 const char* const DartUtils::kDartScheme = "dart:";
 const char* const DartUtils::kDartExtensionScheme = "dart-ext:";
 const char* const DartUtils::kAsyncLibURL = "dart:async";
@@ -69,23 +68,6 @@
 #endif  // defined(HOST_OS_WINDOWS)
 }
 
-const char* DartUtils::MapLibraryUrl(const char* url_string) {
-  ASSERT(url_mapping != NULL);
-  // We need to check if the passed in url is found in the url_mapping array,
-  // in that case use the mapped entry.
-  intptr_t len = strlen(url_string);
-  for (intptr_t idx = 0; idx < url_mapping->count(); idx++) {
-    const char* url_name = url_mapping->GetArgument(idx);
-    if (!strncmp(url_string, url_name, len) && (url_name[len] == ',')) {
-      const char* url_mapped_name = url_name + len + 1;
-      if (strlen(url_mapped_name) != 0) {
-        return url_mapped_name;  // Found a mapping for this URL.
-      }
-    }
-  }
-  return NULL;  // Did not find a mapping for this URL.
-}
-
 int64_t DartUtils::GetIntegerValue(Dart_Handle value_obj) {
   int64_t value = 0;
   Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
@@ -394,23 +376,6 @@
                               directory);
 }
 
-Dart_Handle DartUtils::ResolveUriInWorkingDirectory(Dart_Handle script_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = script_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_resolveInWorkingDirectory"), kNumArgs,
-                     dart_args);
-}
-
-Dart_Handle DartUtils::LibraryFilePath(Dart_Handle library_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = library_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_libraryFilePath"), kNumArgs, dart_args);
-}
-
 Dart_Handle DartUtils::ResolveScript(Dart_Handle url) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
@@ -792,17 +757,6 @@
   return original_working_directory != nullptr;
 }
 
-Dart_Handle DartUtils::GetCanonicalizableWorkingDirectory() {
-  const char* str = DartUtils::original_working_directory;
-  intptr_t len = strlen(str);
-  if ((str[len] == '/') || (IsWindowsHost() && str[len] == '\\')) {
-    return Dart_NewStringFromCString(str);
-  }
-  char* new_str = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 2));
-  snprintf(new_str, (len + 2), "%s%s", str, File::PathSeparator());
-  return Dart_NewStringFromCString(new_str);
-}
-
 void DartUtils::SetEnvironment(dart::SimpleHashMap* environment) {
   environment_ = environment;
 }
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 666d248..6dd1c5b 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -214,11 +214,7 @@
   }
 
   static bool SetOriginalWorkingDirectory();
-  static Dart_Handle GetCanonicalizableWorkingDirectory();
 
-  static const char* MapLibraryUrl(const char* url_string);
-
-  static Dart_Handle ResolveUriInWorkingDirectory(Dart_Handle script_uri);
   static Dart_Handle ResolveScript(Dart_Handle url);
 
   enum MagicNumber {
@@ -239,9 +235,6 @@
   // Global state that stores the original working directory..
   static const char* original_working_directory;
 
-  // Global state that captures the URL mappings specified on the command line.
-  static CommandLineOptions* url_mapping;
-
   static const char* const kDartScheme;
   static const char* const kDartExtensionScheme;
   static const char* const kAsyncLibURL;
@@ -258,8 +251,6 @@
   static const char* const kHttpScheme;
   static const char* const kVMServiceLibURL;
 
-  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
-
   static void SetEnvironment(dart::SimpleHashMap* environment);
   static Dart_Handle EnvironmentCallback(Dart_Handle name);
 
@@ -585,61 +576,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedBlockingCall);
 };
 
-// Where the argument to the constructor is the handle for an object
-// implementing List<int>, this class creates a scope in which the memory
-// backing the list can be accessed.
-//
-// Do not make Dart_ API calls while in a ScopedMemBuffer.
-// Do not call Dart_PropagateError while in a ScopedMemBuffer.
-class ScopedMemBuffer {
- public:
-  explicit ScopedMemBuffer(Dart_Handle object) {
-    if (!Dart_IsTypedData(object) && !Dart_IsList(object)) {
-      Dart_ThrowException(
-          DartUtils::NewDartArgumentError("Argument is not a List<int>"));
-    }
-
-    uint8_t* bytes = NULL;
-    intptr_t bytes_len = 0;
-    bool is_typed_data = false;
-    if (Dart_IsTypedData(object)) {
-      is_typed_data = true;
-      Dart_TypedData_Type typ;
-      ThrowIfError(Dart_TypedDataAcquireData(
-          object, &typ, reinterpret_cast<void**>(&bytes), &bytes_len));
-    } else {
-      ASSERT(Dart_IsList(object));
-      ThrowIfError(Dart_ListLength(object, &bytes_len));
-      bytes = Dart_ScopeAllocate(bytes_len);
-      ASSERT(bytes != NULL);
-      ThrowIfError(Dart_ListGetAsBytes(object, 0, bytes, bytes_len));
-    }
-
-    object_ = object;
-    bytes_ = bytes;
-    bytes_len_ = bytes_len;
-    is_typed_data_ = is_typed_data;
-  }
-
-  ~ScopedMemBuffer() {
-    if (is_typed_data_) {
-      ThrowIfError(Dart_TypedDataReleaseData(object_));
-    }
-  }
-
-  uint8_t* get() const { return bytes_; }
-  intptr_t length() const { return bytes_len_; }
-
- private:
-  Dart_Handle object_;
-  uint8_t* bytes_;
-  intptr_t bytes_len_;
-  bool is_typed_data_;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(ScopedMemBuffer);
-};
-
 struct MagicNumberData {
   static const intptr_t kMaxLength = 8;
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index bbda5dc..98654fe 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -147,14 +147,6 @@
 #undef BOOL_OPTION_DEFINITION
 
 DEFINE_ENUM_OPTION(snapshot_kind, SnapshotKind, snapshot_kind);
-DEFINE_STRING_OPTION_CB(embedder_entry_points_manifest, {
-  Log::PrintErr(
-      "Option --embedder_entry_points_manifest is no longer supported."
-      " Use @pragma(\'vm:entry-point\') instead.\n");
-  exit(kErrorExitCode);
-});
-DEFINE_STRING_OPTION_CB(url_mapping,
-                        { DartUtils::url_mapping->AddArgument(value); });
 DEFINE_CB_OPTION(ProcessEnvironmentOption);
 
 static bool IsSnapshottingForPrecompilation() {
@@ -173,9 +165,6 @@
 "  Where to find packages, that is, package:...  imports.                    \n"
 "--packages=<packages_file>                                                  \n"
 "  Where to find a package spec file                                         \n"
-"--url_mapping=<mapping>                                                     \n"
-"  Uses the URL mapping(s) specified on the command line to load the         \n"
-"  libraries.                                                                \n"
 "--dependencies=<output-file>                                                \n"
 "  Generates a Makefile with snapshot output files as targets and all        \n"
 "  transitive imports as sources.                                            \n"
@@ -940,10 +929,6 @@
   const int EXTRA_VM_ARGUMENTS = 7;
   CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
 
-  // Initialize the URL mapping array.
-  CommandLineOptions cmdline_url_mapping(argc);
-  DartUtils::url_mapping = &cmdline_url_mapping;
-
   // When running from the command line we assume that we are optimizing for
   // throughput, and therefore use a larger new gen semi space size and a faster
   // new gen growth factor unless others have been specified.
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 599d17c..88da22e 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -54,11 +54,6 @@
   result.add_option("--packages",
       action="store", type="string",
       help="package config file used to reasolve package: imports.")
-  result.add_option("--url_mapping",
-      default=[],
-      action="append",
-      help=("mapping from url to file name, used when generating snapshots " +
-            "E.g.: --url_mapping=fileUri,/path/to/file.dart"))
   result.add_option("-v", "--verbose",
       help='Verbose output.',
       default=False, action="store_true")
@@ -143,11 +138,6 @@
     script_args.append(''.join([ "--isolate_snapshot_instructions=",
                                  options.isolate_instructions_output_bin ]))
 
-  # Next setup all url mapping options specified.
-  for url_arg in options.url_mapping:
-    url_mapping_argument = ''.join(["--url_mapping=", url_arg ])
-    script_args.append(url_mapping_argument)
-
   # Finally append the script name if one is specified.
   if options.script:
     script_args.append(options.script)
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index b4909ed..3545739 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -57,6 +57,7 @@
         jit-[opt-][debug-]dbc   = Dart JIT (simdbc)
         jit-[opt-][debug-]dbc64 = Dart JIT (simdbc64)
         aot-[debug-]x64         = Dart AOT (x64)
+        aot-[debug-]arm32       = Dart AOT (simarm)
         aot-[debug-]arm64       = Dart AOT (simarm64)
         kbc-int-[debug-]x64     = Dart KBC (interpreted bytecode)
         kbc-mix-[debug-]x64     = Dart KBC (mixed-mode bytecode)
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index d92cd8a..35d9a56 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -38,7 +38,7 @@
   if (res.exitCode == -sigkill) {
     return new TestResult(ResultCode.timeout, res.stdout);
   } else if (res.exitCode != 0) {
-    return new TestResult(ResultCode.error, res.stdout);
+    return new TestResult(ResultCode.error, res.stderr);
   }
   return new TestResult(ResultCode.success, res.stdout);
 }
@@ -336,8 +336,20 @@
     numDivergences++;
     print(
         '\n${isolate}: !DIVERGENCE! $version:$seed (output=${outputDivergence})');
-    if (showStats && outputDivergence) {
-      print('out1:\n${result1.output}\nout2:\n${result2.output}\n');
+    if (outputDivergence) {
+      // Only report the actual output divergence details when requested,
+      // since this output may be lengthy and should be reproducable anyway.
+      if (showStats) {
+        print('\nout1:\n${result1.output}\nout2:\n${result2.output}\n');
+      }
+    } else {
+      // For any other divergence, always report what went wrong.
+      if (result1.code != ResultCode.success) {
+        print('\nfail1:\n${result1.output}\n');
+      }
+      if (result2.code != ResultCode.success) {
+        print('\nfail2:\n${result2.output}\n');
+      }
     }
   }
 
@@ -452,7 +464,7 @@
     // Random when not set.
     if (mode == null || mode == '') {
       // Pick a mode at random (cluster), different from other.
-      int cluster_modes = modes.length - 15;
+      int cluster_modes = modes.indexOf('aot-debug-arm32');
       Random rand = new Random();
       do {
         mode = modes[rand.nextInt(cluster_modes)];
@@ -502,7 +514,9 @@
     'kbc-cmp-x64',
     'kbc-mix-x64',
     // Times out often:
+    'aot-debug-arm32',
     'aot-debug-arm64',
+    'aot-arm32',
     'aot-arm64',
     // Too many divergences (due to arithmetic):
     'js',
@@ -519,6 +533,9 @@
     'jit-opt-arm64',
     'jit-opt-dbc',
     'jit-opt-dbc64',
+    // Not supported:
+    'aot-debug-ia32',
+    'aot-ia32',
   ];
 }
 
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 3929ba0..50b2691c 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -150,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 39dd081..afb751c 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -150,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
index ce24a25..2ddd3e0 100644
--- a/runtime/vm/v8_snapshot_writer.cc
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -75,7 +75,9 @@
 
   ASSERT(reference.offset_or_name >= 0);
   info->edges->Add({
-      reference.reference_type == Reference::kElement ? kElement : kProperty,
+      static_cast<intptr_t>(reference.reference_type == Reference::kElement
+                                ? kElement
+                                : kProperty),
       reference.offset_or_name,
       reference.to_object_id,
   });
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index a178398..3265de2 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -342,7 +342,8 @@
       },
       "isolate": {
         "patches": "../../pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart",
-        "uri": "isolate/isolate.dart"
+        "uri": "isolate/isolate.dart",
+        "supported": false
       },
       "web_gl": {
         "uri": "web_gl/dart2js/web_gl_dart2js.dart"
diff --git a/tests/language_2/async_star/async_star_await_for_test.dart b/tests/language_2/async_star/async_star_await_for_test.dart
deleted file mode 100644
index 0493a1f..0000000
--- a/tests/language_2/async_star/async_star_await_for_test.dart
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that `await for` and `async*` interact correctly.
-
-// An `await for` must pause its subscription immediately
-// if the `await for` body does anything asynchronous
-// (any `await`, `await for`, or pausing at a `yield`/`yield*`)
-// A pause happening synchronously in an event delivery
-// must pause the `sync*` method at the `yield` sending the event.
-// A break happening synchronously in an event delivery,
-// or while paused at a `yield`, must exit at that `yield`.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-Stream<int> stream(List<String> log) async* {
-  log.add("^");
-  try {
-    log.add("?1");
-    yield 1;
-    log.add("?2");
-    yield 2;
-    log.add("?3");
-    yield 3;
-  } finally {
-    log.add(r"$");
-  }
-}
-
-Stream<int> consume(List<String> log,
-    {int breakAt = -1,
-    int yieldAt = -1,
-    int yieldStarAt = -1,
-    int pauseAt = -1}) async* {
-  // Create stream.
-  var s = stream(log);
-  log.add("(");
-  // The "consume loop".
-  await for (var event in s) {
-    // Should be acting synchronously wrt. the delivery of the event.
-    // The source stream should be at the yield now.
-    log.add("!$event");
-    if (event == pauseAt) {
-      log.add("p$event[");
-      // Async operation causes subscription to pause.
-      // Nothing should happen in the source stream
-      // until the end of the loop body where the subscription is resumed.
-      await Future.delayed(Duration(microseconds: 1));
-      log.add("]");
-    }
-    if (event == yieldAt) {
-      log.add("y$event[");
-      // Yield may cause subscription to pause or cancel.
-      // This loop should stay at the yield until the event has been delieverd.
-      // If the receiver pauses or cancels, we delay or break the loop here.
-      yield event;
-      log.add("]");
-    }
-    if (event == yieldStarAt) {
-      log.add("Y$event[");
-      // Yield* will always cause the subscription for this loop to pause.
-      // If the listener pauses, this stream is paused. If the listener cancels,
-      // this stream is cancelled, and the yield* acts like return, cancelling
-      // the loop subscription and waiting for the cancel future.
-      yield* Stream<int>.fromIterable([event]);
-      log.add("]");
-    }
-    if (event == breakAt) {
-      log.add("b$event");
-      // Breaks the loop. This cancels the loop subscription and waits for the
-      // cancel future.
-      break;
-    }
-  }
-  // Done event from stream or cancel future has completed.
-  log.add(")");
-}
-
-main() async {
-  asyncStart();
-
-  // Just run the loop over the stream. The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 1));
-    var trace = log.join("");
-    Expects.equals(r"(^?1!1?2!2?3!3$)", trace, "straight through");
-  }
-
-  // Pause at 1, then resume.
-  // Consume loop forces a pause when it receives the 1 event.
-  // Nothing should happen until that pause is resumed.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, pauseAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "pause at 1";
-    if (trace.contains("p1[?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1p1[]?2!2?3!3$)", trace, message);
-  }
-
-  // Break at 1.
-  // Consume loop breaks after receiving the 1 event.
-  // The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, breakAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "break at 1";
-    if (trace.contains("b1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1b1$)", trace, message);
-  }
-
-  // Pause then break at 1.
-  // Consume loop pauses after receiving the 1 event,
-  // then breaks before resuming. It should still be at the yield.
-  // The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, pauseAt: 1, breakAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "pause then break at 1";
-    if (trace.contains("p1[?2")) {
-      message += " (did not pause in time)";
-    }
-    if (trace.contains("b1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1p1[]b1$)", trace, message);
-  }
-
-  // Yield at 1.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The consume loop may or may not pause, it should make no difference.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1y1[e1]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield at 1, then pause at yield.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The test loop then pauses.
-  // Nothing should happen in either the original yield
-  // or the consume-function yield until the test loop ends.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e$s<");
-      // Force pause at yield.
-      await Future.delayed(Duration(milliseconds: 1));
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1, pause at yield";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("e1<?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1y1[e1<>]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield at 1, then break at yield.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The test loop then breaks. That makes the consume loop yield return,
-  // breaking the consume loop, which makes the source yield return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e${s}B$s");
-      break; // Force break at yield*.
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1, break at yield";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("B1?2")) {
-      message += " (did not break in time)";
-    }
-    Expects.equals(r"(^?1!1y1[e1B1$)", trace, message);
-  }
-
-  // Yield* at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`, which again happens before the source
-  // stream continues from its `yield`.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then force a pause.
-  // Nothing further should happen during that pause.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("e1<?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1<>]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield* at 1, then break at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`.
-  // When the consume loop continues, it breaks,
-  // forcing the waiting source yield to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1]b1$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield, then break at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. After the `yield*`, the consume loop breaks.
-  // This forces the waiting source yield to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    Expects.equals(r"(^?1!1Y1[e1<>]b1$)", trace, message);
-  }
-
-  // Yield* at 1, break at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then breaks,
-  // forcing the two waiting yields to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e${s}B$s");
-      break;
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then break at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not deliver event in time)";
-    }
-    if (trace.contains("e1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1B1$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield, then break at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then forces a pause,
-  // and then breaks before that pause is resumed.
-  // This forces the two waiting yields to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">B$s");
-      break; // And break.
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause then break at 1";
-    Expects.equals(r"(^?1!1Y1[e1<>B1$)", trace, message);
-  }
-
-  Expects.summarize();
-  asyncEnd();
-}
-
-class Expects {
-  static var _errors = [];
-  static int _tests = 0;
-  static void summarize() {
-    if (_errors.isNotEmpty) {
-      var buffer = StringBuffer();
-      for (var es in _errors) {
-        buffer.writeln("FAILURE:");
-        buffer.writeln(es[0]); // error
-        buffer.writeln(es[1]); // stack trace
-      }
-      ;
-      buffer.writeln("Expectations failed: ${_errors.length}"
-          ", succeeded: ${_tests - _errors.length}");
-      throw ExpectException(buffer.toString());
-    }
-  }
-
-  static void equals(o1, o2, String message) {
-    _tests++;
-    try {
-      Expect.equals(o1, o2, message);
-    } on ExpectException catch (e) {
-      var stack = StackTrace.current;
-      _errors.add([e, stack]);
-    }
-  }
-}
diff --git a/tests/language_2/async_star/async_star_cancel_test.dart b/tests/language_2/async_star/async_star_cancel_test.dart
deleted file mode 100644
index c23c6ba..0000000
--- a/tests/language_2/async_star/async_star_cancel_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that stream cancellation is checked immediately after delivering the
-// event, and before continuing after the yield.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-main() async {
-  asyncStart();
-  var log = [];
-  Stream<int> f() async* {
-    try {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    } finally {
-      log.add("x");
-    }
-  }
-
-  var completer = Completer();
-  var s;
-  s = f().listen((e) {
-    log.add("+$e");
-    // The `cancel` operation makes all `yield` operations act as returns.
-    // It should make the `finally` block in `f` log an "x",
-    // and nothing else.
-    completer.complete(s.cancel());
-  }, onError: (e) {
-    // Should never be reached, but if it does, we'll make the await
-    // below terminate.
-    completer.complete(new Future.sync(() {
-      Expect.fail("$e");
-    }));
-  }, onDone: () {
-    completer.complete(null);
-  });
-  await completer.future;
-  Expect.listEquals(["-1", "+1", "x"], log, "cancel");
-  asyncEnd();
-}
diff --git a/tests/language_2/async_star/async_star_invalid_test.dart b/tests/language_2/async_star/async_star_invalid_test.dart
deleted file mode 100644
index 529cf25..0000000
--- a/tests/language_2/async_star/async_star_invalid_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that various invalid uses of `yield` are disallowed.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-var yield = 42;
-
-main() async {
-  asyncStart();
-  Stream<String> f() async* {
-    // Invalid syntax.
-    yield ("a", "b"); //# 01: compile-time error
-    yield yield "twice"; //# 02: compile-time error
-
-    // Valid but curious syntax.
-    yield throw "throw"; //# 03: runtime error
-
-    // Type error.
-    yield* "one"; //# 04: compile-time error
-
-    label: yield "ok";
-  }
-  var completer = Completer();
-  f().listen(completer.complete, onError: completer.completeError,
-      onDone: () {
-        if (!completer.isCompleted) completer.completeError("not ok?");
-      });
-  Expect.equals("ok", await completer.future);
-  asyncEnd();
-}
diff --git a/tests/language_2/async_star/async_star_test.dart b/tests/language_2/async_star/async_star_test.dart
deleted file mode 100644
index 819039e..0000000
--- a/tests/language_2/async_star/async_star_test.dart
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-main() async {
-  asyncStart();
-  // Normal operations.
-  {
-    Stream<int> f() async* {
-      yield 1;
-      yield 2;
-      yield 3;
-    }
-
-    Expect.listEquals([1, 2, 3], await f().toList(), "basic1");
-  }
-
-  {
-    Stream<int> f() async* {
-      yield 1;
-      yield 2;
-      yield 3;
-    }
-
-    var log = [];
-    var completer = Completer();
-    f().listen(log.add,
-        onError: (e) {
-          // Shouldn't be reached.
-          completer.complete(new Future.sync(() {
-            Expect.fail("$e");
-          }));
-        },
-        onDone: () => completer.complete(null));
-    await completer.future;
-    Expect.listEquals([1, 2, 3], log, "basic2");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await f().forEach((e) {
-      log.add("+$e");
-    });
-    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic3");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-    }
-    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic4");
-  }
-
-  // async
-  {
-    Stream<int> f() async* {
-      yield 1;
-      await Future(() {});
-      yield 2;
-      await Future(() {});
-      yield 3;
-    }
-
-    Expect.listEquals([1, 2, 3], await f().toList(), "async");
-  }
-
-  // Yield*
-  {
-    Stream<int> f(n) async* {
-      yield n;
-      if (n == 0) return;
-      yield* f(n - 1);
-      yield n;
-    }
-
-    Expect.listEquals([3, 2, 1, 0, 1, 2, 3], await f(3).toList(), "yield*");
-  }
-
-  // Errors
-  {
-    var log = [];
-    Stream<int> f() async* {
-      yield 1;
-      throw "error";
-    }
-
-    await f().handleError((e) {
-      log.add(e);
-    }).forEach(log.add);
-    Expect.listEquals([1, "error"], log, "error");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      yield 1;
-      yield* Future<int>.error("error").asStream(); // Emits error as error.
-      yield 3;
-    }
-
-    await f().handleError((e) {
-      log.add(e);
-    }).forEach(log.add);
-    Expect.listEquals([1, "error", 3], log, "error2");
-  }
-
-  // Pause is checked after delivering event.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    var completer = Completer();
-    var s;
-    s = f().listen((e) {
-      log.add("+$e");
-      s.pause(Future(() {}));
-      log.add("++$e");
-    }, onError: (e) {
-      completer.complete(new Future.sync(() {
-        Expect.fail("$e");
-      }));
-    }, onDone: () => completer.complete(null));
-    await completer.future;
-    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "pause");
-  }
-
-  // Await for-loop pauses between events.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-      await Future(() {}); // One timer tick.
-      log.add("++$e");
-    }
-    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "looppause");
-  }
-
-  // Await for-loop break works immediately.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      try {
-        log.add("-1");
-        yield 1;
-        log.add("-2");
-        yield 2;
-        log.add("-3");
-        yield 3;
-      } finally {
-        log.add("x");
-      }
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-      await Future(() {}); // One timer tick, pauses function at yield.
-      log.add("++$e");
-      if (e == 2) break;
-    }
-    Expect.listEquals(
-        ["-1", "+1", "++1", "-2", "+2", "++2", "x"], log, "loop-pause-break");
-  }
-  asyncEnd();
-}
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 1edba47..a2102b3 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -5,8 +5,6 @@
 
 [ $compiler == dart2js ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 22853
 bit_operations_test: RuntimeError, OK # non JS number semantics
 bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 9e924cf..f8c2bfc 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -12,9 +12,6 @@
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
 assertion_test: RuntimeError # Issue 30326; Expect.equals(expected: <1>, actual: <0>) fails.
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 async_star_test/01: RuntimeError
 async_star_test/03: RuntimeError
 async_star_test/04: RuntimeError
@@ -161,8 +158,6 @@
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -183,8 +178,6 @@
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31537
-conditional_import_string_test: CompileTimeError # Test is broken
-conditional_import_test: CompileTimeError # Test is broken
 config_import_test: RuntimeError
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
@@ -322,7 +315,6 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_covariant_type_test: RuntimeError # Check too late
-async_star/async_star_await_for_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
 async_star_test/02: RuntimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index bd08604..b514980 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -359,10 +359,6 @@
 vm/precompiled_static_initializer_test: Pass, Slow
 
 [ $compiler == dartkp && $mode == product && $runtime == dart_precompiled && $strong ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_invalid_test/none: RuntimeError
-async_star/async_star_test: RuntimeError
 vm/type_vm_test/28: MissingRuntimeError
 vm/type_vm_test/29: MissingRuntimeError
 vm/type_vm_test/30: MissingRuntimeError
@@ -410,13 +406,6 @@
 assertion_initializer_const_error2_test/cc11: Crash
 async_await_test: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_star/async_star_cancel_test: DartkCrash
-async_star/async_star_invalid_test/01: DartkCrash
-async_star/async_star_invalid_test/02: DartkCrash
-async_star/async_star_invalid_test/03: DartkCrash
-async_star/async_star_invalid_test/04: DartkCrash
-async_star/async_star_invalid_test/none: DartkCrash
-async_star/async_star_test: DartkCrash
 compile_time_constant_checked_test/02: MissingCompileTimeError
 covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 6b7afa9..858a0572 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -36,13 +36,4 @@
 vm/no_such_args_error_message_vm_test: Skip
 vm/no_such_method_error_message_callable_vm_test: Skip
 vm/no_such_method_error_message_vm_test: Skip
-vm/regress_28325_test: Skip
-
-[ $runtime == dart_precompiled && ($compiler == dartkp || $compiler == precompiler) ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_invalid_test/01: MissingCompileTimeError
-async_star/async_star_invalid_test/02: MissingCompileTimeError
-async_star/async_star_invalid_test/04: MissingCompileTimeError
-async_star/async_star_invalid_test/none: RuntimeError
-async_star/async_star_test: RuntimeError
+vm/regress_28325_test: Skip
\ No newline at end of file
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 47d27f2..b696b0f 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -18,9 +18,6 @@
 set_literals/*: Skip
 
 [ $runtime == vm ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 set_literals/*: Skip
 
 [ $arch == arm64 && $runtime == vm ]
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 2935167..081a84f 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -215,7 +215,7 @@
 io/http_advanced_test: Skip # Timeout
 io/http_auth_digest_test: Crash
 io/http_auth_test: Skip # Timeout
-io/http_basic_test: Pass, Crash # Sporadic crash, issue 33824
+io/http_basic_test: Pass, Timeout # Issue 28046
 io/http_proxy_advanced_test: Skip # Timeout
 io/http_read_test: Skip # Timeout
 io/non_utf8_directory_test: Pass, Timeout
diff --git a/tools/VERSION b/tools/VERSION
index e1cbe2b..146c6cc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 2
 PATCH 0
 PRERELEASE 1
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 04dd2fc..13ccd28 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -9,6 +9,7 @@
 patched_sdk_dir = "$target_gen_dir/patched_sdk"
 sdk_summary = "$target_gen_dir/ddc_sdk.sum"
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
+sdk_libraries_json = "$target_gen_dir/libraries.json"
 
 application_snapshot("dartdevc") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
@@ -48,7 +49,7 @@
     ":dartdevk_sdk",
   ]
 
-  inputs = [ sdk_dill ]
+  inputs = [ sdk_dill, sdk_libraries_json ]
 }
 
 sdk_lib_files = exec_script("../../tools/list_dart_files.py",
@@ -269,6 +270,7 @@
 
   inputs = [
     sdk_dill,
+    sdk_libraries_json,
     sdk_summary,
     "$target_gen_dir/dartdevc_files.stamp",
     "$root_gen_dir/pkg_files.stamp",
@@ -348,6 +350,7 @@
 
   outputs = [
     sdk_dill,
+    sdk_libraries_json,
     "$target_gen_dir/kernel/amd/dart_sdk.js",
     "$target_gen_dir/kernel/amd/dart_sdk.js.map",
     "$target_gen_dir/kernel/common/dart_sdk.js",
