diff --git a/CHANGELOG.md b/CHANGELOG.md
index ca849bd..637e978 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 1.17.0
+## 1.17.0 - 2016-06-06
 
 ### Core library changes
 * `dart:convert`
@@ -34,6 +34,13 @@
 * Dartium and content shell
   * Debugging Dart code inside iframes improved, was broken.
 
+## 1.16.1 - 2016-05-24
+
+Patch release, resolves one issue:
+
+* VM: Fixes a bug that caused intermittent hangs on Windows.
+(SDK issue [26400](https://github.com/dart-lang/sdk/issues/26400))
+
 ## 1.16.0 - 2016-04-26
 
 ### Core library changes
diff --git a/DEPS b/DEPS
index 1b74da6..7264d41 100644
--- a/DEPS
+++ b/DEPS
@@ -25,7 +25,7 @@
   "github_dartlang": "https://github.com/dart-lang/%s.git",
 
   "gyp_rev": "@6ee91ad8659871916f9aa840d42e1513befdf638",
-  "co19_rev": "@3ed795ea02e022ef19c77cf1b6095b7c8f5584d0",
+  "co19_rev": "@3f0a4bc9a080a792cdf5f093147a900f99ea301f",
   "chromium_git": "https://chromium.googlesource.com",
 
   # Revisions of /third_party/* dependencies.
@@ -41,15 +41,16 @@
   "charcode_tag": "@1.1.0",
   "chrome_rev" : "@19997",
   "cli_util_tag" : "@0.0.1+2",
+  "code_transformers_rev": "@bfe9799e88d9c231747435e1c1d2495ef5ecd966",
   "collection_tag": "@1.6.0",
   "convert_tag": "@1.0.0",
-  "crypto_tag" : "@1.1.0",
+  "crypto_tag" : "@1.1.1",
   "csslib_tag" : "@0.12.0",
   "dart2js_info_rev" : "@0a221eaf16aec3879c45719de656680ccb80d8a1",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
   "dart_style_tag": "@0.2.4",
   "dartdoc_tag" : "@v0.9.0",
-  "dev_compiler_rev": "@adda29b31dc8fe2f8d1a5c1304384988503384c8",
+  "dev_compiler_rev": "@7f68e5ef424dd26344572daf02595ab23fb16941",
   "fixnum_tag": "@0.10.5",
   "func_rev": "@8d4aea75c21be2179cb00dc2b94a71414653094e",
   "glob_rev": "@704cf75e4f26b417505c5c611bdaacd8808467dd",
@@ -59,7 +60,8 @@
   "http_tag" : "@0.11.3+3",
   "http_throttle_rev" : "@a81f08be942cdd608883c7b67795c12226abc235",
   "idl_parser_rev": "@7fbe68cab90c38147dee4f48c30ad0d496c17915",
-  "intl_rev": "@a8b480b9c436f6c0ec16730804c914bdb4e30d53",
+  "initialize_rev": "@595d501a92c3716395ad2d81f9aabdb9f90879b6",
+  "intl_tag": "@0.13.0",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@2.0.0",
   "linter_rev": "@ccd8dbf7562b7645dc8c54a578b78b38970c71d6",
@@ -98,7 +100,7 @@
   "string_scanner_tag": "@0.1.4",
   "sunflower_rev": "@879b704933413414679396b129f5dfa96f7a0b1e",
   "test_reflective_loader_tag": "@0.0.3",
-  "test_tag": "@0.12.12",
+  "test_tag": "@0.12.13+1",
   "typed_data_tag": "@1.1.2",
   "usage_rev": "@b5080dac0d26a5609b266f8fdb0d053bc4c1c638",
   "utf_rev": "@1f55027068759e2d52f2c12de6a57cce5f3c5ee6",
@@ -170,6 +172,9 @@
       (Var("github_mirror") % "crypto") + Var("crypto_tag"),
   Var("dart_root") + "/third_party/pkg/csslib":
       (Var("github_mirror") % "csslib") + Var("csslib_tag"),
+  Var("dart_root") + "/third_party/pkg/code_transformers":
+      (Var("github_dartlang") % "code_transformers") +
+      Var("code_transformers_rev"),
   Var("dart_root") + "/third_party/dart-services":
       (Var("github_mirror") % "dart-services") +
       Var("dart_services_rev"),
@@ -199,8 +204,10 @@
   Var("dart_root") + "/third_party/pkg/http_throttle":
       (Var("github_mirror") % "http_throttle") +
       Var("http_throttle_rev"),
+  Var("dart_root") + "/third_party/pkg/initialize":
+      (Var("github_dartlang") % "initialize") + Var("initialize_rev"),
   Var("dart_root") + "/third_party/pkg/intl":
-      (Var("github_mirror") % "intl") + Var("intl_rev"),
+      (Var("github_mirror") % "intl") + Var("intl_tag"),
   Var("dart_root") + "/third_party/pkg/json_rpc_2":
       (Var("github_mirror") % "json_rpc_2") + Var("json_rpc_2_tag"),
   Var("dart_root") + "/third_party/pkg/linter":
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 6b328b2..5a8d8cb 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -77,6 +77,16 @@
   }
 
   @override
+  visitAsExpression(AsExpression node) {
+    if (identical(entity, node.asOperator) &&
+        node.expression is ParenthesizedExpression) {
+      _addSuggestion2(ASYNC, relevance: DART_RELEVANCE_HIGH);
+      _addSuggestion2(ASYNC_STAR, relevance: DART_RELEVANCE_HIGH);
+      _addSuggestion2(SYNC_STAR, relevance: DART_RELEVANCE_HIGH);
+    }
+  }
+
+  @override
   visitBlock(Block node) {
     if (entity is ExpressionStatement) {
       Expression expression = (entity as ExpressionStatement).expression;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/optype.dart b/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
index 3a5608c..995ec27 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
@@ -211,8 +211,9 @@
       optype.includeTypeNameSuggestions = true;
       optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
         DartType staticType = node.expression.staticType;
-        if (staticType.isDynamic ||
-            (dartType.isSubtypeOf(staticType) && dartType != staticType)) {
+        if (staticType != null &&
+            (staticType.isDynamic ||
+                (dartType.isSubtypeOf(staticType) && dartType != staticType))) {
           return relevance;
         } else {
           return null;
@@ -592,8 +593,9 @@
       optype.includeTypeNameSuggestions = true;
       optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
         DartType staticType = node.expression.staticType;
-        if (staticType.isDynamic ||
-            (dartType.isSubtypeOf(staticType) && dartType != staticType)) {
+        if (staticType != null &&
+            (staticType.isDynamic ||
+                (dartType.isSubtypeOf(staticType) && dartType != staticType))) {
           return relevance;
         } else {
           return null;
@@ -770,6 +772,10 @@
     if (identical(entity, node.expression)) {
       optype.includeReturnValueSuggestions = true;
       optype.includeTypeNameSuggestions = true;
+    } else if (node.statements.contains(entity)) {
+      optype.includeReturnValueSuggestions = true;
+      optype.includeTypeNameSuggestions = true;
+      optype.includeVoidReturnSuggestions = true;
     }
   }
 
@@ -875,14 +881,6 @@
     }
   }
 
-  bool _isEntityPrevToken(TokenType expectedType) {
-    Object entity = this.entity;
-    if (entity is SimpleIdentifier && entity.token.isSynthetic) {
-      return entity.token.previous.type == expectedType;
-    }
-    return false;
-  }
-
   bool _isEntityPrevTokenSynthetic() {
     Object entity = this.entity;
     if (entity is AstNode && entity.beginToken.previous?.isSynthetic ?? false) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 244fb3d..f58469d 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -338,7 +338,7 @@
     }
     // add edit
     Token keyword = declarationList.keyword;
-    if (keyword.keyword == Keyword.VAR) {
+    if (keyword?.keyword == Keyword.VAR) {
       SourceRange range = rangeToken(keyword);
       _addReplaceEdit(range, typeSource);
     } else {
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
index 7303f69..424132e 100644
--- a/pkg/analysis_server/lib/src/status/ast_writer.dart
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/status/tree_writer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 
 /**
  * A visitor that will produce an HTML representation of an AST structure.
@@ -41,34 +42,75 @@
     Map<String, Object> properties = new HashMap<String, Object>();
 
     properties['name'] = _getName(node);
-    if (node is BinaryExpression) {
+    if (node is ArgumentListImpl) {
+      properties['static parameter types'] = node.correspondingStaticParameters;
+      properties['propagated parameter types'] =
+          node.correspondingPropagatedParameters;
+    } else if (node is Annotation) {
+      properties['element'] = node.element;
+      properties['element annotation'] = node.elementAnnotation;
+    } else if (node is BinaryExpression) {
       properties['static element'] = node.staticElement;
       properties['static type'] = node.staticType;
       properties['propagated element'] = node.propagatedElement;
       properties['propagated type'] = node.propagatedType;
+    } else if (node is ClassDeclaration) {
+      properties['element'] = node.element;
+      properties['abstract keyword'] = node.abstractKeyword;
+    } else if (node is ClassTypeAlias) {
+      properties['element'] = node.element;
+      properties['abstract keyword'] = node.abstractKeyword;
     } else if (node is CompilationUnit) {
       properties['element'] = node.element;
+    } else if (node is ConstructorName) {
+      properties['static element'] = node.staticElement;
+    } else if (node is DeclaredIdentifier) {
+      properties['element'] = node.element;
+      properties['keyword'] = node.keyword;
     } else if (node is ExportDirective) {
       properties['element'] = node.element;
       properties['source'] = node.source;
+    } else if (node is FieldDeclaration) {
+      properties['static keyword'] = node.staticKeyword;
+    } else if (node is FormalParameter) {
+      properties['element'] = node.element;
+      properties['kind'] = node.kind;
     } else if (node is FunctionDeclaration) {
+      properties['element'] = node.element;
       properties['external keyword'] = node.externalKeyword;
       properties['property keyword'] = node.propertyKeyword;
     } else if (node is FunctionExpressionInvocation) {
       properties['static element'] = node.staticElement;
+      properties['static invoke type'] = node.staticInvokeType;
       properties['static type'] = node.staticType;
       properties['propagated element'] = node.propagatedElement;
+      properties['propagated invoke type'] = node.propagatedInvokeType;
       properties['propagated type'] = node.propagatedType;
     } else if (node is ImportDirective) {
       properties['element'] = node.element;
       properties['source'] = node.source;
+    } else if (node is IndexExpression) {
+      properties['static element'] = node.staticElement;
+      properties['static type'] = node.staticType;
+      properties['propagated element'] = node.propagatedElement;
+      properties['propagated type'] = node.propagatedType;
+    } else if (node is InstanceCreationExpression) {
+      properties['static element'] = node.staticElement;
+      properties['static type'] = node.staticType;
+      properties['propagated type'] = node.propagatedType;
     } else if (node is LibraryDirective) {
       properties['element'] = node.element;
     } else if (node is MethodDeclaration) {
+      properties['element'] = node.element;
       properties['external keyword'] = node.externalKeyword;
       properties['modifier keyword'] = node.modifierKeyword;
       properties['operator keyword'] = node.operatorKeyword;
       properties['property keyword'] = node.propertyKeyword;
+    } else if (node is MethodInvocation) {
+      properties['static invoke type'] = node.staticInvokeType;
+      properties['static type'] = node.staticType;
+      properties['propagated invoke type'] = node.propagatedInvokeType;
+      properties['propagated type'] = node.propagatedType;
     } else if (node is PartDirective) {
       properties['element'] = node.element;
       properties['source'] = node.source;
@@ -84,6 +126,8 @@
       properties['static type'] = node.staticType;
       properties['propagated element'] = node.propagatedElement;
       properties['propagated type'] = node.propagatedType;
+    } else if (node is RedirectingConstructorInvocation) {
+      properties['static element'] = node.staticElement;
     } else if (node is SimpleIdentifier) {
       properties['static element'] = node.staticElement;
       properties['static type'] = node.staticType;
@@ -91,9 +135,25 @@
       properties['propagated type'] = node.propagatedType;
     } else if (node is SimpleStringLiteral) {
       properties['value'] = node.value;
+    } else if (node is SuperConstructorInvocation) {
+      properties['static element'] = node.staticElement;
+    } else if (node is TypeName) {
+      properties['type'] = node.type;
+    } else if (node is VariableDeclarationList) {
+      properties['keyword'] = node.keyword;
+    } else if (node is Declaration) {
+      properties['element'] = node.element;
     } else if (node is Expression) {
       properties['static type'] = node.staticType;
       properties['propagated type'] = node.propagatedType;
+    } else if (node is FunctionBody) {
+      properties['isAsynchronous'] = node.isAsynchronous;
+      properties['isGenerator'] = node.isGenerator;
+    } else if (node is Identifier) {
+      properties['static element'] = node.staticElement;
+      properties['static type'] = node.staticType;
+      properties['propagated element'] = node.propagatedElement;
+      properties['propagated type'] = node.propagatedType;
     }
 
     return properties;
@@ -169,10 +229,11 @@
     buffer.write(node.offset);
     buffer.write('..');
     buffer.write(node.offset + node.length - 1);
-    buffer.write(']</span>');
+    buffer.write(']');
     if (node.isSynthetic) {
       buffer.write(' (synthetic)');
     }
+    buffer.write('</span>');
     buffer.write('<br>');
   }
 }
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index c3e4bc2..6f5649b 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -42,8 +42,6 @@
   Map<String, Object> _computeProperties(Element element) {
     Map<String, Object> properties = new HashMap<String, Object>();
 
-    properties['isDeprecated'] = element.isDeprecated;
-    properties['isOverride'] = element.isOverride;
     properties['metadata'] = element.metadata;
     properties['nameOffset'] = element.nameOffset;
     if (element is ClassElement) {
@@ -53,16 +51,18 @@
       properties['interfaces'] = element.interfaces;
       properties['isAbstract'] = element.isAbstract;
       properties['isEnum'] = element.isEnum;
+      properties['isMixinApplication'] = element.isMixinApplication;
       properties['isOrInheritsProxy'] = element.isOrInheritsProxy;
       properties['isProxy'] = element.isProxy;
-      properties['isTypedef'] = element.isMixinApplication;
       properties['isValidMixin'] = element.isValidMixin;
       properties['mixins'] = element.mixins;
       properties['supertype'] = element.supertype;
-      properties['type'] = element.type;
+    }
+    if (element is ClassMemberElement) {
+      properties['isStatic'] = element.isStatic;
     }
     if (element is CompilationUnitElement) {
-      properties['isEnumConstant'] = element.hasLoadLibraryFunction;
+      properties['hasLoadLibraryFunction'] = element.hasLoadLibraryFunction;
       properties['source'] = element.source;
     }
     if (element is ConstFieldElementImpl) {
@@ -81,7 +81,10 @@
       properties['redirectedConstructor'] = element.redirectedConstructor;
     }
     if (element is ExecutableElement) {
+      properties['hasImplicitReturnType'] = element.hasImplicitReturnType;
+      properties['isAbstract'] = element.isAbstract;
       properties['isAsynchronous'] = element.isAsynchronous;
+      properties['isExternal'] = element.isExternal;
       properties['isGenerator'] = element.isGenerator;
       properties['isOperator'] = element.isOperator;
       properties['isStatic'] = element.isStatic;
@@ -99,12 +102,16 @@
     if (element is FieldFormalParameterElement) {
       properties['field'] = element.field;
     }
-    if (element is FunctionTypeAliasElement) {
+    if (element is FunctionElement) {
+      properties['isEntryPoint'] = element.isEntryPoint;
+    }
+    if (element is FunctionTypedElement) {
       properties['returnType'] = element.returnType;
       properties['type'] = element.type;
     }
     if (element is ImportElement) {
       properties['combinators'] = element.combinators;
+      properties['isDeferred'] = element.isDeferred;
       properties['library'] = element.library;
     }
     if (element is LibraryElement) {
@@ -113,20 +120,19 @@
       properties['hasExtUri'] = element.hasExtUri;
       properties['hasLoadLibraryFunction'] = element.hasLoadLibraryFunction;
       properties['isBrowserApplication'] = element.isBrowserApplication;
+      properties['isDartAsync'] = element.isDartAsync;
+      properties['isDartCore'] = element.isDartCore;
+      properties['isInSdk'] = element.isInSdk;
     }
     if (element is LocalElement) {
       properties['visibleRange'] = element.visibleRange;
     }
-    if (element is MethodElement) {
-      properties['isAbstract'] = element.isAbstract;
-    }
     if (element is ParameterElement) {
       properties['defaultValueCode'] = element.defaultValueCode;
       properties['isInitializingFormal'] = element.isInitializingFormal;
       properties['parameterKind'] = element.parameterKind;
     }
     if (element is PropertyAccessorElement) {
-      properties['isAbstract'] = element.isAbstract;
       properties['isGetter'] = element.isGetter;
       properties['isSetter'] = element.isSetter;
     }
@@ -134,15 +140,24 @@
       properties['isStatic'] = element.isStatic;
       properties['propagatedType'] = element.propagatedType;
     }
+    if (element is TypeDefiningElement) {
+      properties['type'] = element.type;
+    }
     if (element is TypeParameterElement) {
       properties['bound'] = element.bound;
     }
+    if (element is TypeParameterizedElement) {
+      properties['typeParameters'] = element.typeParameters;
+    }
     if (element is UriReferencedElement) {
       properties['uri'] = element.uri;
     }
     if (element is VariableElement) {
+      properties['constantValue'] = element.constantValue;
+      properties['hasImplicitType'] = element.hasImplicitType;
       properties['isConst'] = element.isConst;
       properties['isFinal'] = element.isFinal;
+      properties['isStatic'] = element.isStatic;
       properties['type'] = element.type;
     }
 
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
index fccb189..2983b7d 100644
--- a/pkg/analysis_server/lib/src/status/get_handler.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart
@@ -27,7 +27,9 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/embedder.dart';
 import 'package:analyzer/source/error_processor.dart';
+import 'package:analyzer/source/sdk_ext.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
 import 'package:analyzer/src/context/source.dart';
@@ -35,6 +37,8 @@
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
@@ -1313,7 +1317,8 @@
         buffer.write('</table></p>');
       }
     }
-    void writeOptions(StringBuffer buffer, AnalysisOptionsImpl options) {
+    void writeOptions(StringBuffer buffer, AnalysisOptionsImpl options,
+        {void writeAdditionalOptions(StringBuffer buffer)}) {
       if (options == null) {
         buffer.write('<p>No option information available.</p>');
         return;
@@ -1339,8 +1344,10 @@
           options.incrementalApi);
       _writeOption(buffer, 'Preserve comments', options.preserveComments);
       _writeOption(buffer, 'Strong mode', options.strongMode);
-      _writeOption(buffer, 'Strong mode hints', options.strongModeHints,
-          last: true);
+      _writeOption(buffer, 'Strong mode hints', options.strongModeHints);
+      if (writeAdditionalOptions != null) {
+        writeAdditionalOptions(buffer);
+      }
       buffer.write('</p>');
     }
 
@@ -1357,8 +1364,13 @@
           },
           (StringBuffer buffer) {
             buffer.write('<p><b>SDK Context Options</b></p>');
-            writeOptions(buffer,
-                context?.sourceFactory?.dartSdk?.context?.analysisOptions);
+            DartSdk sdk = context?.sourceFactory?.dartSdk;
+            writeOptions(buffer, sdk?.context?.analysisOptions,
+                writeAdditionalOptions: (StringBuffer buffer) {
+              if (sdk is DirectoryBasedDartSdk) {
+                _writeOption(buffer, 'Use summaries', sdk.useSummary);
+              }
+            });
           },
           (StringBuffer buffer) {
             List<Linter> lints =
@@ -1388,6 +1400,25 @@
           for (UriResolver resolver in sourceFactory.resolvers) {
             buffer.write('<p>');
             buffer.write(resolver.runtimeType);
+            if (resolver is DartUriResolver) {
+              DartSdk sdk = resolver.dartSdk;
+              buffer.write(' (sdk = ');
+              buffer.write(sdk.runtimeType);
+              if (sdk is DirectoryBasedDartSdk) {
+                buffer.write(' (path = ');
+                buffer.write(sdk.directory.getAbsolutePath());
+                buffer.write(')');
+              } else if (sdk is EmbedderSdk) {
+                buffer.write(' (map = ');
+                _writeMapOfStringToString(buffer, sdk.urlMappings);
+                buffer.write(')');
+              }
+              buffer.write(')');
+            } else if (resolver is SdkExtUriResolver) {
+              buffer.write(' (map = ');
+              _writeMapOfStringToString(buffer, resolver.urlMappings);
+              buffer.write(')');
+            }
             buffer.write('</p>');
           }
         }
@@ -2075,6 +2106,27 @@
   }
 
   /**
+   * Write to the given [buffer] a representation of the given [map] of strings
+   * to strings.
+   */
+  void _writeMapOfStringToString(StringBuffer buffer, Map<String, String> map) {
+    List<String> keys = map.keys.toList();
+    keys.sort();
+    int length = keys.length;
+    buffer.write('{');
+    for (int i = 0; i < length; i++) {
+      String key = keys[i];
+      if (i > 0) {
+        buffer.write(', ');
+      }
+      buffer.write(key);
+      buffer.write(' = ');
+      buffer.write(map[key]);
+    }
+    buffer.write('}');
+  }
+
+  /**
    * Write a representation of an analysis option with the given [name] and
    * [value] to the given [buffer]. The option should be separated from other
    * options unless the [last] flag is true, indicating that this is the last
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index c238d59..2fcb049 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -338,12 +338,12 @@
       subscriptions[service] = <String>[bar.path].toSet();
     }
     server.setAnalysisSubscriptions(subscriptions);
-    await pumpEventQueue(1000);
+    await server.onAnalysisComplete;
     expect(server.statusAnalyzing, isFalse);
     channel.notificationsReceived.clear();
     server.updateContent(
         '0', {bar.path: new AddContentOverlay('library bar; void f() {}')});
-    await pumpEventQueue(1000);
+    await server.onAnalysisComplete;
     expect(server.statusAnalyzing, isFalse);
     expect(channel.notificationsReceived, isNotEmpty);
     Set<String> notificationTypesReceived = new Set<String>();
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 04d3d0e..3d719e3 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -249,9 +249,6 @@
 
   Future<Response> waitForResponse(Request request) {
     String id = request.id;
-    pumpEventQueue().then((_) {
-      responseController.addError(new NoResponseException(request));
-    });
     return new Future<Response>(() =>
         responseController.stream.firstWhere((response) => response.id == id));
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index e51ed5f..2081aab 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -371,6 +371,22 @@
         pseudoKeywords: ['async', 'async*', 'sync*']);
   }
 
+  test_anonymous_function_async6() async {
+    addTestSource('main() {foo("bar", () as^{}}');
+    await computeSuggestions();
+    assertSuggestKeywords([],
+        pseudoKeywords: ['async', 'async*', 'sync*'],
+        relevance: DART_RELEVANCE_HIGH);
+  }
+
+  test_anonymous_function_async7() async {
+    addTestSource('main() {foo("bar", () as^ => null');
+    await computeSuggestions();
+    assertSuggestKeywords([],
+        pseudoKeywords: ['async', 'async*', 'sync*'],
+        relevance: DART_RELEVANCE_HIGH);
+  }
+
   test_argument() async {
     addTestSource('main() {foo(^);}');
     await computeSuggestions();
@@ -1179,6 +1195,12 @@
     assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
   }
 
+  test_is_expression_partial() async {
+    addTestSource('main() {if (x i^)}');
+    await computeSuggestions();
+    assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH);
+  }
+
   test_library() async {
     addTestSource('library foo;^');
     await computeSuggestions();
@@ -1340,6 +1362,18 @@
     assertSuggestKeywords(EXPRESSION_START_INSTANCE);
   }
 
+  test_method_invocation() async {
+    addTestSource('class A { foo() {bar.^}}');
+    await computeSuggestions();
+    assertNoSuggestions();
+  }
+
+  test_method_invocation2() async {
+    addTestSource('class A { foo() {bar.as^}}');
+    await computeSuggestions();
+    assertNoSuggestions();
+  }
+
   test_method_param() async {
     addTestSource('class A { foo(^) {});}');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/optype_test.dart b/pkg/analysis_server/test/services/completion/dart/optype_test.dart
index 9a6982b6..eeada57 100644
--- a/pkg/analysis_server/test/services/completion/dart/optype_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/optype_test.dart
@@ -142,6 +142,16 @@
     assertOpType(typeNames: true);
   }
 
+  test_AsIdentifier() {
+    addTestSource('class A {var asdf; foo() {as^}');
+    assertOpType(returnValue: true, typeNames: true, voidReturn: true);
+  }
+
+  test_AsIdentifier2() {
+    addTestSource('class A {var asdf; foo() {A as^}');
+    assertOpType();
+  }
+
   test_Assert() {
     addTestSource('main() {assert(^)}');
     assertOpType(returnValue: true, typeNames: true);
@@ -1359,6 +1369,11 @@
     assertOpType(returnValue: true, typeNames: true, voidReturn: true);
   }
 
+  test_SwitchStatement_body_end2() {
+    addTestSource('main() {switch(k) {case 1:as^}}');
+    assertOpType(returnValue: true, typeNames: true, voidReturn: true);
+  }
+
   test_SwitchStatement_expression1() {
     // SimpleIdentifier  SwitchStatement  Block
     addTestSource('main() {switch(^k) {case 1:{}}}');
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index b67ce1a..4bf728d 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -287,7 +287,7 @@
   }
 }
 ''');
-    FieldElement element = findElement('field');
+    FieldElement element = findElement('field', ElementKind.FIELD);
     Element main = findElement('main');
     Element fieldParameter = findElement('field', ElementKind.PARAMETER);
     var expected = [
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index f02706f..07f8a30 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,6 +1,10 @@
-## 0.27.4-alpha.7.1
+## 0.27.4-alpha.9
 * Restore EmbedderUriResolver API.
 
+## 0.27.4-alpha.8
+* Ignore processing performance improvements.
+* EmbedderUriResolver API updates.
+
 ## 0.27.4
 
 * Added support for 'analysis_options.yaml' files as an alternative to '.analysis_options' files.
diff --git a/pkg/analyzer/doc/tasks.html b/pkg/analyzer/doc/tasks.html
index b8b2e568..10147f7 100644
--- a/pkg/analyzer/doc/tasks.html
+++ b/pkg/analyzer/doc/tasks.html
@@ -104,6 +104,8 @@
   GenerateLintsTask -> LINTS
   HINTS -> LibraryUnitErrorsTask
   HINTS [shape=box]
+  IGNORE_INFO -> DartErrorsTask
+  IGNORE_INFO [shape=box]
   IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
   IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
   IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
@@ -194,7 +196,6 @@
   MODIFICATION_TIME -> VerifyUnitTask
   MODIFICATION_TIME [shape=box]
   PARSED_UNIT -> BuildCompilationUnitElementTask
-  PARSED_UNIT -> DartErrorsTask
   PARSED_UNIT [shape=box]
   PARSE_ERRORS -> dartErrorsForSource
   PARSE_ERRORS [shape=box]
@@ -327,6 +328,7 @@
   SOURCE_KIND [shape=box]
   STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
   STRONG_MODE_ERRORS [shape=box]
+  ScanDartTask -> IGNORE_INFO
   ScanDartTask -> LINE_INFO
   ScanDartTask -> SCAN_ERRORS
   ScanDartTask -> TOKEN_STREAM
diff --git a/pkg/analyzer/lib/source/sdk_ext.dart b/pkg/analyzer/lib/source/sdk_ext.dart
index f4bcdb9..3e833df 100644
--- a/pkg/analyzer/lib/source/sdk_ext.dart
+++ b/pkg/analyzer/lib/source/sdk_ext.dart
@@ -43,6 +43,13 @@
   /// Number of sdk extensions.
   int get length => _urlMappings.length;
 
+  /**
+   * Return a table mapping the names of extensions to the paths where those
+   * extensions can be found.
+   */
+  Map<String, String> get urlMappings =>
+      new Map<String, String>.from(_urlMappings);
+
   /// Return the path mapping for [libName] or null if there is none.
   String operator [](String libName) => _urlMappings[libName];
 
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 23cae4a..6ad3363 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -466,13 +466,19 @@
 
   @override
   TypeProvider get typeProvider {
+    // The `AnalysisContextTarget.request` results go into the SDK partition,
+    // and the TYPE_PROVIDER result is computed and put into the SDK partition
+    // only by the first non-SDK analysis context. So, in order to reuse it
+    // in other analysis contexts, we need to ask for it from the cache.
+    _typeProvider ??= getResult(AnalysisContextTarget.request, TYPE_PROVIDER);
+    if (_typeProvider != null) {
+      return _typeProvider;
+    }
+
     // Make sure a task didn't accidentally try to call back into the context
     // to retrieve the type provider.
     assert(!driver.isTaskRunning);
 
-    if (_typeProvider != null) {
-      return _typeProvider;
-    }
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
     if (coreSource == null) {
       throw new AnalysisException("Could not create a source for dart:core");
@@ -726,8 +732,6 @@
       ClassElementImpl element =
           new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
       element.supertype = objType;
-      InterfaceTypeImpl type = new InterfaceTypeImpl(element);
-      element.type = type;
       if (parameterNames != null) {
         int count = parameterNames.length;
         if (count > 0) {
@@ -744,7 +748,6 @@
             typeParameter.type = typeArguments[i];
           }
           element.typeParameters = typeParameters;
-          type.typeArguments = typeArguments;
         }
       }
       return element;
diff --git a/pkg/analyzer/lib/src/context/context_factory.dart b/pkg/analyzer/lib/src/context/context_factory.dart
new file mode 100644
index 0000000..b96100d
--- /dev/null
+++ b/pkg/analyzer/lib/src/context/context_factory.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.context_factory;
+
+import 'dart:convert';
+import 'dart:core' hide Resource;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:yaml/yaml.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'dart:io' as io;
+
+/// (Placeholder)
+abstract class ContextFactory {
+  /// Create an analysis context for the given [source] directory or file, with
+  /// the given [defaultOptions].
+  AnalysisContext createContext(
+      io.FileSystemEntity source, AnalysisOptions defaultOptions);
+}
+
+/// Processes package maps, extracting SDK embedders and extenders, creating a
+/// consolidated [libraryMap].
+class PackageMapProcessor {
+  static const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs';
+  static const String _EMBEDDER_FILE_NAME = '_embedder.yaml';
+  static const String _SDK_EXT_NAME = '_sdkext';
+
+  /// Map of processed embedder libraries.
+  final LibraryMap embeddedLibraries = new LibraryMap();
+
+  /// Map of processed SDK extension libraries.
+  final LibraryMap extendedLibraries = new LibraryMap();
+
+  /// Combined map of processed libraries.
+  LibraryMap get libraryMap {
+    LibraryMap libraryMap = new LibraryMap();
+
+    // Add extenders first, allowing for overwrite by embedders who take precedence.
+    for (String uri in extendedLibraries.uris) {
+      libraryMap.setLibrary(uri, extendedLibraries.getLibrary(uri));
+    }
+    for (String uri in embeddedLibraries.uris) {
+      libraryMap.setLibrary(uri, embeddedLibraries.getLibrary(uri));
+    }
+    return libraryMap;
+  }
+
+  /// Create a processor for the given [packageMap].
+  PackageMapProcessor(Map<String, List<Folder>> packageMap) {
+    packageMap?.forEach(_processPackage);
+  }
+
+  /// Whether the package map contains an SDK embedder.
+  bool get hasEmbedder => embeddedLibraries.size() > 0;
+
+  /// Whether the package map contains an SDK extension.
+  bool get hasSdkExtension => extendedLibraries.size() > 0;
+
+  void _processEmbedderYaml(String embedderYaml, Folder libDir) {
+    try {
+      YamlNode map = loadYaml(embedderYaml);
+      if (map is YamlMap) {
+        YamlNode embedded_libs = map[_EMBEDDED_LIB_MAP_KEY];
+        if (embedded_libs is YamlMap) {
+          embedded_libs.forEach(
+              (k, v) => _processMapping(embeddedLibraries, k, v, libDir));
+        }
+      }
+    } catch (_) {
+      // Ignored.
+    }
+  }
+
+  void _processMapping(
+      LibraryMap libraryMap, String name, String file, Folder libDir) {
+    if (!_hasDartPrefix(name)) {
+      // SDK libraries must begin with 'dart:'.
+      return;
+    }
+    if (libraryMap.getLibrary(name) != null) {
+      // Libraries can't be redefined.
+      return;
+    }
+    String libPath = libDir.canonicalizePath(file);
+    SdkLibraryImpl library = new SdkLibraryImpl(name)..path = libPath;
+    libraryMap.setLibrary(name, library);
+  }
+
+  void _processPackage(String name, List<Folder> libDirs) {
+    for (Folder libDir in libDirs) {
+      String embedderYaml = _readEmbedderYaml(libDir);
+      if (embedderYaml != null) {
+        _processEmbedderYaml(embedderYaml, libDir);
+      }
+      String sdkExt = _readDotSdkExt(libDir);
+      if (sdkExt != null) {
+        _processSdkExt(sdkExt, libDir);
+      }
+    }
+  }
+
+  void _processSdkExt(String sdkExtJSON, Folder libDir) {
+    try {
+      var sdkExt = JSON.decode(sdkExtJSON);
+      if (sdkExt is Map) {
+        sdkExt.forEach(
+            (k, v) => _processMapping(extendedLibraries, k, v, libDir));
+      }
+    } catch (_) {
+      // Ignored.
+    }
+  }
+
+  static bool _hasDartPrefix(String uri) =>
+      uri.startsWith(DartSdk.DART_LIBRARY_PREFIX);
+
+  static String _readDotSdkExt(Folder libDir) =>
+      _safeRead(libDir.getChild(_SDK_EXT_NAME));
+
+  static String _readEmbedderYaml(Folder libDir) =>
+      _safeRead(libDir.getChild(_EMBEDDER_FILE_NAME));
+
+  static String _safeRead(Resource file) {
+    try {
+      if (file is File) {
+        return file.readAsStringSync();
+      }
+    } on FileSystemException {
+      // File can't be read.
+    }
+    return null;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 5e2b646..97defa6 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -392,6 +392,9 @@
     ..addAll(_arguments)
     ..add(rightParenthesis);
 
+  List<ParameterElement> get correspondingPropagatedParameters =>
+      _correspondingPropagatedParameters;
+
   @override
   void set correspondingPropagatedParameters(
       List<ParameterElement> parameters) {
@@ -402,6 +405,9 @@
     _correspondingPropagatedParameters = parameters;
   }
 
+  List<ParameterElement> get correspondingStaticParameters =>
+      _correspondingStaticParameters;
+
   @override
   void set correspondingStaticParameters(List<ParameterElement> parameters) {
     if (parameters.length != _arguments.length) {
@@ -9037,6 +9043,10 @@
         return false;
       }
     }
+    if (parent is ConstructorFieldInitializer &&
+        identical(parent.fieldName, target)) {
+      return false;
+    }
     if (parent is ForEachStatement) {
       if (identical(parent.identifier, target)) {
         return false;
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index fb59f7b..e531a68 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -421,12 +421,7 @@
     ClassElementImpl element = new ClassElementImpl.forNode(className);
     _setCodeRange(element, node);
     element.metadata = _createElementAnnotations(node.metadata);
-    List<TypeParameterElement> typeParameters = holder.typeParameters;
-    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
-    InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
-    interfaceType.typeArguments = typeArguments;
-    element.type = interfaceType;
-    element.typeParameters = typeParameters;
+    element.typeParameters = holder.typeParameters;
     setElementDocumentationComment(element, node);
     element.abstract = node.isAbstract;
     element.accessors = holder.accessors;
@@ -473,12 +468,7 @@
     element.metadata = _createElementAnnotations(node.metadata);
     element.abstract = node.abstractKeyword != null;
     element.mixinApplication = true;
-    List<TypeParameterElement> typeParameters = holder.typeParameters;
-    element.typeParameters = typeParameters;
-    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
-    InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
-    interfaceType.typeArguments = typeArguments;
-    element.type = interfaceType;
+    element.typeParameters = holder.typeParameters;
     setElementDocumentationComment(element, node);
     _currentHolder.addType(element);
     className.staticElement = element;
@@ -617,18 +607,11 @@
   @override
   Object visitEnumDeclaration(EnumDeclaration node) {
     SimpleIdentifier enumName = node.name;
-    ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
+    EnumElementImpl enumElement = new EnumElementImpl.forNode(enumName);
     _setCodeRange(enumElement, node);
     enumElement.metadata = _createElementAnnotations(node.metadata);
-    enumElement.enum2 = true;
     setElementDocumentationComment(enumElement, node);
-    InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
-    enumElement.type = enumType;
-    // The equivalent code for enums in the spec shows a single constructor,
-    // but that constructor is not callable (since it is a compile-time error
-    // to subclass, mix-in, implement, or explicitly instantiate an enum).  So
-    // we represent this as having no constructors.
-    enumElement.constructors = ConstructorElement.EMPTY_LIST;
+    InterfaceTypeImpl enumType = enumElement.type;
     //
     // Build the elements for the constants. These are minimal elements; the
     // rest of the constant elements (and elements for other fields) must be
@@ -645,7 +628,7 @@
       constantField.type = enumType;
       setElementDocumentationComment(constantField, constant);
       fields.add(constantField);
-      _createGetter(constantField);
+      new PropertyAccessorElementImpl_ImplicitGetter(constantField);
       constantName.staticElement = constantField;
     }
     enumElement.fields = fields;
@@ -1247,25 +1230,13 @@
       holder.validate();
     }
     if (element is PropertyInducingElementImpl) {
-      PropertyAccessorElementImpl getter =
-          new PropertyAccessorElementImpl.forVariable(element);
-      getter.getter = true;
-      if (element.hasImplicitType) {
-        getter.hasImplicitReturnType = true;
-      }
+      PropertyAccessorElementImpl_ImplicitGetter getter =
+          new PropertyAccessorElementImpl_ImplicitGetter(element);
       _currentHolder.addAccessor(getter);
-      element.getter = getter;
       if (!isConst && !isFinal) {
-        PropertyAccessorElementImpl setter =
-            new PropertyAccessorElementImpl.forVariable(element);
-        setter.setter = true;
-        ParameterElementImpl parameter =
-            new ParameterElementImpl("_${element.name}", element.nameOffset);
-        parameter.synthetic = true;
-        parameter.parameterKind = ParameterKind.REQUIRED;
-        setter.parameters = <ParameterElement>[parameter];
+        PropertyAccessorElementImpl_ImplicitSetter setter =
+            new PropertyAccessorElementImpl_ImplicitSetter(element);
         _currentHolder.addAccessor(setter);
-        element.setter = setter;
       }
     }
     return null;
@@ -1318,9 +1289,7 @@
     ConstructorElementImpl constructor =
         new ConstructorElementImpl.forNode(null);
     constructor.synthetic = true;
-    constructor.returnType = definingClass.type;
     constructor.enclosingElement = definingClass;
-    constructor.type = new FunctionTypeImpl(constructor);
     return <ConstructorElement>[constructor];
   }
 
@@ -1342,18 +1311,6 @@
   }
 
   /**
-   * Create a getter that corresponds to the given [field].
-   */
-  void _createGetter(FieldElementImpl field) {
-    PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl.forVariable(field);
-    getter.getter = true;
-    getter.returnType = field.type;
-    getter.type = new FunctionTypeImpl(getter);
-    field.getter = getter;
-  }
-
-  /**
    * Create the types associated with the given type parameters, setting the type of each type
    * parameter, and return an array of types corresponding to the given parameters.
    *
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5e72951..0eb96cf 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl;
@@ -25,6 +26,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
@@ -32,140 +34,43 @@
 import 'package:analyzer/src/task/dart.dart';
 
 /**
- * For AST nodes that could be in both the getter and setter contexts
- * ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved
- * elements are stored in the AST node, in an [AuxiliaryElements]. Because
- * resolved elements are either statically resolved or resolved using propagated
- * type information, this class is a wrapper for a pair of [ExecutableElement]s,
- * not just a single [ExecutableElement].
- */
-class AuxiliaryElements {
-  /**
-   * The element based on propagated type information, or `null` if the AST
-   * structure has not been resolved or if the node could not be resolved.
-   */
-  final ExecutableElement propagatedElement;
-
-  /**
-   * The element based on static type information, or `null` if the AST
-   * structure has not been resolved or if the node could not be resolved.
-   */
-  final ExecutableElement staticElement;
-
-  /**
-   * Initialize a newly created pair to have both the [staticElement] and the
-   * [propagatedElement].
-   */
-  AuxiliaryElements(this.staticElement, this.propagatedElement);
-}
-
-/**
  * A concrete implementation of a [ClassElement].
  */
-class ClassElementImpl extends ElementImpl
-    with TypeParameterizedElementMixin
+abstract class AbstractClassElementImpl extends ElementImpl
     implements ClassElement {
   /**
-   * The unlinked representation of the class in the summary.
-   */
-  final UnlinkedClass _unlinkedClass;
-
-  /**
    * A list containing all of the accessors (getters and setters) contained in
    * this class.
    */
-  List<PropertyAccessorElement> _accessors = PropertyAccessorElement.EMPTY_LIST;
-
-  /**
-   * For classes which are not mixin applications, a list containing all of the
-   * constructors contained in this class, or `null` if the list of
-   * constructors has not yet been built.
-   *
-   * For classes which are mixin applications, the list of constructors is
-   * computed on the fly by the [constructors] getter, and this field is
-   * `null`.
-   */
-  List<ConstructorElement> _constructors;
+  List<PropertyAccessorElement> _accessors;
 
   /**
    * A list containing all of the fields contained in this class.
    */
-  List<FieldElement> _fields = FieldElement.EMPTY_LIST;
-
-  /**
-   * A list containing all of the mixins that are applied to the class being
-   * extended in order to derive the superclass of this class.
-   */
-  @override
-  List<InterfaceType> mixins = InterfaceType.EMPTY_LIST;
-
-  /**
-   * A list containing all of the interfaces that are implemented by this class.
-   */
-  @override
-  List<InterfaceType> interfaces = InterfaceType.EMPTY_LIST;
-
-  /**
-   * A list containing all of the methods contained in this class.
-   */
-  List<MethodElement> _methods = MethodElement.EMPTY_LIST;
-
-  /**
-   * The superclass of the class, or `null` if the class does not have an
-   * explicit superclass.
-   */
-  @override
-  InterfaceType supertype;
-
-  /**
-   * The type defined by the class.
-   */
-  @override
-  InterfaceType type;
-
-  /**
-   * A list containing all of the type parameters defined for this class.
-   */
-  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
-
-  /**
-   * A flag indicating whether the types associated with the instance members of
-   * this class have been inferred.
-   */
-  bool hasBeenInferred = false;
+  List<FieldElement> _fields;
 
   /**
    * Initialize a newly created class element to have the given [name] at the
    * given [offset] in the file that contains the declaration of this element.
    */
-  ClassElementImpl(String name, int offset)
-      : _unlinkedClass = null,
-        super(name, offset);
+  AbstractClassElementImpl(String name, int offset) : super(name, offset);
 
   /**
    * Initialize a newly created class element to have the given [name].
    */
-  ClassElementImpl.forNode(Identifier name)
-      : _unlinkedClass = null,
-        super.forNode(name);
+  AbstractClassElementImpl.forNode(Identifier name) : super.forNode(name);
 
   /**
    * Initialize using the given serialized information.
    */
-  ClassElementImpl.forSerialized(
-      this._unlinkedClass, CompilationUnitElementImpl enclosingUnit)
+  AbstractClassElementImpl.forSerialized(
+      CompilationUnitElementImpl enclosingUnit)
       : super.forSerialized(enclosingUnit);
 
-  /**
-   * Set whether this class is abstract.
-   */
-  void set abstract(bool isAbstract) {
-    assert(_unlinkedClass == null);
-    setModifier(Modifier.ABSTRACT, isAbstract);
-  }
-
   @override
-  List<PropertyAccessorElement> get accessors => _accessors;
+  List<PropertyAccessorElement> get accessors {
+    return _accessors ?? const <PropertyAccessorElement>[];
+  }
 
   /**
    * Set the accessors contained in this class to the given [accessors].
@@ -178,129 +83,10 @@
   }
 
   @override
-  List<InterfaceType> get allSupertypes {
-    List<InterfaceType> list = new List<InterfaceType>();
-    _collectAllSupertypes(list);
-    return list;
-  }
-
-  @override
-  int get codeLength {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.codeRange?.length;
-    }
-    return super.codeLength;
-  }
-
-  @override
-  int get codeOffset {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.codeRange?.offset;
-    }
-    return super.codeOffset;
-  }
-
-  @override
-  List<ConstructorElement> get constructors {
-    if (!isMixinApplication) {
-      assert(_constructors != null);
-      return _constructors ?? ConstructorElement.EMPTY_LIST;
-    }
-    return _computeMixinAppConstructors();
-  }
-
-  /**
-   * Set the constructors contained in this class to the given [constructors].
-   *
-   * Should only be used for class elements that are not mixin applications.
-   */
-  void set constructors(List<ConstructorElement> constructors) {
-    assert(!isMixinApplication);
-    for (ConstructorElement constructor in constructors) {
-      (constructor as ConstructorElementImpl).enclosingElement = this;
-    }
-    this._constructors = constructors;
-  }
-
-  @override
   String get displayName => name;
 
   @override
-  SourceRange get docRange {
-    if (_unlinkedClass != null) {
-      UnlinkedDocumentationComment comment =
-          _unlinkedClass.documentationComment;
-      return comment != null
-          ? new SourceRange(comment.offset, comment.length)
-          : null;
-    }
-    return super.docRange;
-  }
-
-  @override
-  String get documentationComment {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass?.documentationComment?.text;
-    }
-    return super.documentationComment;
-  }
-
-  /**
-   * Return `true` if [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] should
-   * be reported for this class.
-   */
-  bool get doesMixinLackConstructors {
-    if (!isMixinApplication && mixins.isEmpty) {
-      // This class is not a mixin application and it doesn't have a "with"
-      // clause, so CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS is
-      // inapplicable.
-      return false;
-    }
-    if (supertype == null) {
-      // Should never happen, since Object is the only class that has no
-      // supertype, and it should have been caught by the test above.
-      assert(false);
-      return false;
-    }
-    // Find the nearest class in the supertype chain that is not a mixin
-    // application.
-    ClassElement nearestNonMixinClass = supertype.element;
-    if (nearestNonMixinClass.isMixinApplication) {
-      // Use a list to keep track of the classes we've seen, so that we won't
-      // go into an infinite loop in the event of a non-trivial loop in the
-      // class hierarchy.
-      List<ClassElement> classesSeen = <ClassElement>[this];
-      while (nearestNonMixinClass.isMixinApplication) {
-        if (classesSeen.contains(nearestNonMixinClass)) {
-          // Loop in the class hierarchy (which is reported elsewhere).  Don't
-          // confuse the user with further errors.
-          return false;
-        }
-        classesSeen.add(nearestNonMixinClass);
-        if (nearestNonMixinClass.supertype == null) {
-          // Should never happen, since Object is the only class that has no
-          // supertype, and it is not a mixin application.
-          assert(false);
-          return false;
-        }
-        nearestNonMixinClass = nearestNonMixinClass.supertype.element;
-      }
-    }
-    return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible);
-  }
-
-  @override
-  TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
-
-  /**
-   * Set whether this class is defined by an enum declaration.
-   */
-  void set enum2(bool isEnum) {
-    setModifier(Modifier.ENUM, isEnum);
-  }
-
-  @override
-  List<FieldElement> get fields => _fields;
+  List<FieldElement> get fields => _fields ?? const <FieldElement>[];
 
   /**
    * Set the fields contained in this class to the given [fields].
@@ -313,249 +99,15 @@
   }
 
   @override
-  bool get hasNonFinalField {
-    List<ClassElement> classesToVisit = new List<ClassElement>();
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
-    classesToVisit.add(this);
-    while (!classesToVisit.isEmpty) {
-      ClassElement currentElement = classesToVisit.removeAt(0);
-      if (visitedClasses.add(currentElement)) {
-        // check fields
-        for (FieldElement field in currentElement.fields) {
-          if (!field.isFinal &&
-              !field.isConst &&
-              !field.isStatic &&
-              !field.isSynthetic) {
-            return true;
-          }
-        }
-        // check mixins
-        for (InterfaceType mixinType in currentElement.mixins) {
-          ClassElement mixinElement = mixinType.element;
-          classesToVisit.add(mixinElement);
-        }
-        // check super
-        InterfaceType supertype = currentElement.supertype;
-        if (supertype != null) {
-          ClassElement superElement = supertype.element;
-          if (superElement != null) {
-            classesToVisit.add(superElement);
-          }
-        }
-      }
-    }
-    // not found
-    return false;
-  }
-
-  @override
-  bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
-
-  /**
-   * Set whether this class references 'super'.
-   */
-  void set hasReferenceToSuper(bool isReferencedSuper) {
-    setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
-  }
-
-  @override
-  bool get hasStaticMember {
-    for (MethodElement method in _methods) {
-      if (method.isStatic) {
-        return true;
-      }
-    }
-    for (PropertyAccessorElement accessor in _accessors) {
-      if (accessor.isStatic) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  bool get isAbstract {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.isAbstract;
-    }
-    return hasModifier(Modifier.ABSTRACT);
-  }
-
-  @override
-  bool get isEnum => hasModifier(Modifier.ENUM);
-
-  @override
-  bool get isMixinApplication {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.isMixinApplication;
-    }
-    return hasModifier(Modifier.MIXIN_APPLICATION);
-  }
-
-  @override
-  bool get isOrInheritsProxy =>
-      _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
-
-  @override
-  bool get isProxy {
-    for (ElementAnnotation annotation in metadata) {
-      if (annotation.isProxy) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  bool get isValidMixin {
-    if (!context.analysisOptions.enableSuperMixins) {
-      if (hasReferenceToSuper) {
-        return false;
-      }
-      if (!supertype.isObject) {
-        return false;
-      }
-    }
-    for (ConstructorElement constructor in constructors) {
-      if (!constructor.isSynthetic && !constructor.isFactory) {
-        return false;
-      }
-    }
-    return true;
-  }
+  bool get isEnum;
 
   @override
   ElementKind get kind => ElementKind.CLASS;
 
   @override
-  List<ElementAnnotation> get metadata {
-    if (_unlinkedClass != null) {
-      return _metadata ??=
-          _buildAnnotations(enclosingUnit, _unlinkedClass.annotations);
-    }
-    return super.metadata;
-  }
-
-  @override
-  List<MethodElement> get methods => _methods;
-
-  /**
-   * Set the methods contained in this class to the given [methods].
-   */
-  void set methods(List<MethodElement> methods) {
-    for (MethodElement method in methods) {
-      (method as MethodElementImpl).enclosingElement = this;
-    }
-    this._methods = methods;
-  }
-
-  /**
-   * Set whether this class is a mixin application.
-   */
-  void set mixinApplication(bool isMixinApplication) {
-    assert(_unlinkedClass == null);
-    setModifier(Modifier.MIXIN_APPLICATION, isMixinApplication);
-  }
-
-  @override
-  String get name {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.name;
-    }
-    return super.name;
-  }
-
-  @override
-  int get nameOffset {
-    if (_unlinkedClass != null) {
-      return _unlinkedClass.nameOffset;
-    }
-    return super.nameOffset;
-  }
-
-  @override
-  TypeParameterizedElementMixin get typeParameterContext => this;
-
-  @override
-  List<TypeParameterElement> get typeParameters {
-    if (_unlinkedClass != null) {
-      return super.typeParameters;
-    }
-    return _typeParameters;
-  }
-
-  /**
-   * Set the type parameters defined for this class to the given
-   * [typeParameters].
-   */
-  void set typeParameters(List<TypeParameterElement> typeParameters) {
-    assert(_unlinkedClass == null);
-    for (TypeParameterElement typeParameter in typeParameters) {
-      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
-    }
-    this._typeParameters = typeParameters;
-  }
-
-  @override
-  List<UnlinkedTypeParam> get unlinkedTypeParams =>
-      _unlinkedClass.typeParameters;
-
-  @override
-  ConstructorElement get unnamedConstructor {
-    for (ConstructorElement element in constructors) {
-      String name = element.displayName;
-      if (name == null || name.isEmpty) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  @override
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
 
   @override
-  void appendTo(StringBuffer buffer) {
-    if (isAbstract) {
-      buffer.write('abstract ');
-    }
-    if (isEnum) {
-      buffer.write('enum ');
-    } else {
-      buffer.write('class ');
-    }
-    String name = displayName;
-    if (name == null) {
-      buffer.write("{unnamed class}");
-    } else {
-      buffer.write(name);
-    }
-    int variableCount = _typeParameters.length;
-    if (variableCount > 0) {
-      buffer.write("<");
-      for (int i = 0; i < variableCount; i++) {
-        if (i > 0) {
-          buffer.write(", ");
-        }
-        (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
-      }
-      buffer.write(">");
-    }
-    if (supertype != null && !supertype.isObject) {
-      buffer.write(' extends ');
-      buffer.write(supertype.displayName);
-    }
-    if (mixins.isNotEmpty) {
-      buffer.write(' with ');
-      buffer.write(mixins.map((t) => t.displayName).join(', '));
-    }
-    if (interfaces.isNotEmpty) {
-      buffer.write(' implements ');
-      buffer.write(interfaces.map((t) => t.displayName).join(', '));
-    }
-  }
-
-  @override
   NamedCompilationUnitMember computeNode() {
     if (isEnum) {
       return getNodeMatching((node) => node is EnumDeclaration);
@@ -572,42 +124,24 @@
     // thrown a CCE if any of the elements in the arrays were not of the
     // expected types.
     //
-    for (PropertyAccessorElement accessor in _accessors) {
+    for (PropertyAccessorElement accessor in accessors) {
       PropertyAccessorElementImpl accessorImpl = accessor;
       if (accessorImpl.identifier == identifier) {
         return accessorImpl;
       }
     }
-    for (ConstructorElement constructor in _constructors) {
-      ConstructorElementImpl constructorImpl = constructor;
-      if (constructorImpl.identifier == identifier) {
-        return constructorImpl;
-      }
-    }
-    for (FieldElement field in _fields) {
+    for (FieldElement field in fields) {
       FieldElementImpl fieldImpl = field;
       if (fieldImpl.identifier == identifier) {
         return fieldImpl;
       }
     }
-    for (MethodElement method in _methods) {
-      MethodElementImpl methodImpl = method;
-      if (methodImpl.identifier == identifier) {
-        return methodImpl;
-      }
-    }
-    for (TypeParameterElement typeParameter in _typeParameters) {
-      TypeParameterElementImpl typeParameterImpl = typeParameter;
-      if (typeParameterImpl.identifier == identifier) {
-        return typeParameterImpl;
-      }
-    }
     return null;
   }
 
   @override
   FieldElement getField(String name) {
-    for (FieldElement fieldElement in _fields) {
+    for (FieldElement fieldElement in fields) {
       if (name == fieldElement.name) {
         return fieldElement;
       }
@@ -617,9 +151,9 @@
 
   @override
   PropertyAccessorElement getGetter(String getterName) {
-    int length = _accessors.length;
+    int length = accessors.length;
     for (int i = 0; i < length; i++) {
-      PropertyAccessorElement accessor = _accessors[i];
+      PropertyAccessorElement accessor = accessors[i];
       if (accessor.isGetter && accessor.name == getterName) {
         return accessor;
       }
@@ -628,29 +162,6 @@
   }
 
   @override
-  MethodElement getMethod(String methodName) {
-    int length = _methods.length;
-    for (int i = 0; i < length; i++) {
-      MethodElement method = _methods[i];
-      if (method.name == methodName) {
-        return method;
-      }
-    }
-    return null;
-  }
-
-  @override
-  ConstructorElement getNamedConstructor(String name) {
-    for (ConstructorElement element in constructors) {
-      String elementName = element.name;
-      if (elementName != null && elementName == name) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  @override
   PropertyAccessorElement getSetter(String setterName) {
     // TODO (jwren) revisit- should we append '=' here or require clients to
     // include it?
@@ -658,7 +169,7 @@
     if (!StringUtilities.endsWithChar(setterName, 0x3D)) {
       setterName += '=';
     }
-    for (PropertyAccessorElement accessor in _accessors) {
+    for (PropertyAccessorElement accessor in accessors) {
       if (accessor.isSetter && accessor.name == setterName) {
         return accessor;
       }
@@ -667,23 +178,6 @@
   }
 
   @override
-  bool isSuperConstructorAccessible(ConstructorElement constructor) {
-    // If this class has no mixins, then all superclass constructors are
-    // accessible.
-    if (mixins.isEmpty) {
-      return true;
-    }
-    // Otherwise only constructors that lack optional parameters are
-    // accessible (see dartbug.com/19576).
-    for (ParameterElement parameter in constructor.parameters) {
-      if (parameter.parameterKind != ParameterKind.REQUIRED) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @override
   MethodElement lookUpConcreteMethod(
           String methodName, LibraryElement library) =>
       _internalLookUpConcreteMethod(
@@ -729,132 +223,8 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    safelyVisitChildren(_accessors, visitor);
-    safelyVisitChildren(_constructors, visitor);
-    safelyVisitChildren(_fields, visitor);
-    safelyVisitChildren(_methods, visitor);
-    safelyVisitChildren(_typeParameters, visitor);
-  }
-
-  void _collectAllSupertypes(List<InterfaceType> supertypes) {
-    List<InterfaceType> typesToVisit = new List<InterfaceType>();
-    List<ClassElement> visitedClasses = new List<ClassElement>();
-    typesToVisit.add(this.type);
-    while (!typesToVisit.isEmpty) {
-      InterfaceType currentType = typesToVisit.removeAt(0);
-      ClassElement currentElement = currentType.element;
-      if (!visitedClasses.contains(currentElement)) {
-        visitedClasses.add(currentElement);
-        if (!identical(currentType, this.type)) {
-          supertypes.add(currentType);
-        }
-        InterfaceType supertype = currentType.superclass;
-        if (supertype != null) {
-          typesToVisit.add(supertype);
-        }
-        for (InterfaceType type in currentElement.interfaces) {
-          typesToVisit.add(type);
-        }
-        for (InterfaceType type in currentElement.mixins) {
-          ClassElement element = type.element;
-          if (!visitedClasses.contains(element)) {
-            supertypes.add(type);
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Compute a list of constructors for this class, which is a mixin
-   * application.  If specified, [visitedClasses] is a list of the other mixin
-   * application classes which have been visited on the way to reaching this
-   * one (this is used to detect circularities).
-   */
-  List<ConstructorElement> _computeMixinAppConstructors(
-      [List<ClassElementImpl> visitedClasses = null]) {
-    // First get the list of constructors of the superclass which need to be
-    // forwarded to this class.
-    Iterable<ConstructorElement> constructorsToForward;
-    if (supertype == null) {
-      // Shouldn't ever happen, since the only class with no supertype is
-      // Object, and it isn't a mixin application.  But for safety's sake just
-      // assume an empty list.
-      assert(false);
-      constructorsToForward = <ConstructorElement>[];
-    } else if (!supertype.element.isMixinApplication) {
-      List<ConstructorElement> superclassConstructors =
-          supertype.element.constructors;
-      // Filter out any constructors with optional parameters (see
-      // dartbug.com/15101).
-      constructorsToForward =
-          superclassConstructors.where(isSuperConstructorAccessible);
-    } else {
-      if (visitedClasses == null) {
-        visitedClasses = <ClassElementImpl>[this];
-      } else {
-        if (visitedClasses.contains(this)) {
-          // Loop in the class hierarchy.  Don't try to forward any
-          // constructors.
-          return <ConstructorElement>[];
-        }
-        visitedClasses.add(this);
-      }
-      try {
-        constructorsToForward = getImpl(supertype.element)
-            ._computeMixinAppConstructors(visitedClasses);
-      } finally {
-        visitedClasses.removeLast();
-      }
-    }
-
-    // Figure out the type parameter substitution we need to perform in order
-    // to produce constructors for this class.  We want to be robust in the
-    // face of errors, so drop any extra type arguments and fill in any missing
-    // ones with `dynamic`.
-    List<DartType> parameterTypes =
-        TypeParameterTypeImpl.getTypes(supertype.typeParameters);
-    List<DartType> argumentTypes = new List<DartType>.filled(
-        parameterTypes.length, DynamicTypeImpl.instance);
-    for (int i = 0; i < supertype.typeArguments.length; i++) {
-      if (i >= argumentTypes.length) {
-        break;
-      }
-      argumentTypes[i] = supertype.typeArguments[i];
-    }
-
-    // Now create an implicit constructor for every constructor found above,
-    // substituting type parameters as appropriate.
-    return constructorsToForward
-        .map((ConstructorElement superclassConstructor) {
-      ConstructorElementImpl implicitConstructor =
-          new ConstructorElementImpl(superclassConstructor.name, -1);
-      implicitConstructor.synthetic = true;
-      implicitConstructor.redirectedConstructor = superclassConstructor;
-      implicitConstructor.returnType = type;
-      List<ParameterElement> superParameters = superclassConstructor.parameters;
-      int count = superParameters.length;
-      if (count > 0) {
-        List<ParameterElement> implicitParameters =
-            new List<ParameterElement>(count);
-        for (int i = 0; i < count; i++) {
-          ParameterElement superParameter = superParameters[i];
-          ParameterElementImpl implicitParameter =
-              new ParameterElementImpl(superParameter.name, -1);
-          implicitParameter.const3 = superParameter.isConst;
-          implicitParameter.final2 = superParameter.isFinal;
-          implicitParameter.parameterKind = superParameter.parameterKind;
-          implicitParameter.synthetic = true;
-          implicitParameter.type =
-              superParameter.type.substitute2(argumentTypes, parameterTypes);
-          implicitParameters[i] = implicitParameter;
-        }
-        implicitConstructor.parameters = implicitParameters;
-      }
-      implicitConstructor.enclosingElement = this;
-      implicitConstructor.type = new FunctionTypeImpl(implicitConstructor);
-      return implicitConstructor;
-    }).toList();
+    safelyVisitChildren(accessors, visitor);
+    safelyVisitChildren(fields, visitor);
   }
 
   PropertyAccessorElement _internalLookUpConcreteGetter(
@@ -1004,6 +374,875 @@
     return null;
   }
 
+  /**
+   * Return the [AbstractClassElementImpl] of the given [classElement].  May
+   * throw an exception if the [AbstractClassElementImpl] cannot be provided
+   * (should not happen though).
+   */
+  static AbstractClassElementImpl getImpl(ClassElement classElement) {
+    if (classElement is ClassElementHandle) {
+      return getImpl(classElement.actualElement);
+    }
+    return classElement as AbstractClassElementImpl;
+  }
+}
+
+/**
+ * For AST nodes that could be in both the getter and setter contexts
+ * ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved
+ * elements are stored in the AST node, in an [AuxiliaryElements]. Because
+ * resolved elements are either statically resolved or resolved using propagated
+ * type information, this class is a wrapper for a pair of [ExecutableElement]s,
+ * not just a single [ExecutableElement].
+ */
+class AuxiliaryElements {
+  /**
+   * The element based on propagated type information, or `null` if the AST
+   * structure has not been resolved or if the node could not be resolved.
+   */
+  final ExecutableElement propagatedElement;
+
+  /**
+   * The element based on static type information, or `null` if the AST
+   * structure has not been resolved or if the node could not be resolved.
+   */
+  final ExecutableElement staticElement;
+
+  /**
+   * Initialize a newly created pair to have both the [staticElement] and the
+   * [propagatedElement].
+   */
+  AuxiliaryElements(this.staticElement, this.propagatedElement);
+}
+
+/**
+ * An [AbstractClassElementImpl] which is a class.
+ */
+class ClassElementImpl extends AbstractClassElementImpl
+    with TypeParameterizedElementMixin {
+  /**
+   * The unlinked representation of the class in the summary.
+   */
+  final UnlinkedClass _unlinkedClass;
+
+  /**
+   * A list containing all of the type parameters defined for this class.
+   */
+  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+
+  /**
+   * The superclass of the class, or `null` for [Object].
+   */
+  InterfaceType _supertype;
+
+  /**
+   * The type defined by the class.
+   */
+  InterfaceType _type;
+
+  /**
+   * A list containing all of the mixins that are applied to the class being
+   * extended in order to derive the superclass of this class.
+   */
+  List<InterfaceType> _mixins;
+
+  /**
+   * A list containing all of the interfaces that are implemented by this class.
+   */
+  List<InterfaceType> _interfaces;
+
+  /**
+   * For classes which are not mixin applications, a list containing all of the
+   * constructors contained in this class, or `null` if the list of
+   * constructors has not yet been built.
+   *
+   * For classes which are mixin applications, the list of constructors is
+   * computed on the fly by the [constructors] getter, and this field is
+   * `null`.
+   */
+  List<ConstructorElement> _constructors;
+
+  /**
+   * A list containing all of the methods contained in this class.
+   */
+  List<MethodElement> _methods;
+
+  /**
+   * A flag indicating whether the types associated with the instance members of
+   * this class have been inferred.
+   */
+  bool _hasBeenInferred = false;
+
+  /**
+   * Initialize a newly created class element to have the given [name] at the
+   * given [offset] in the file that contains the declaration of this element.
+   */
+  ClassElementImpl(String name, int offset)
+      : _unlinkedClass = null,
+        super(name, offset);
+
+  /**
+   * Initialize a newly created class element to have the given [name].
+   */
+  ClassElementImpl.forNode(Identifier name)
+      : _unlinkedClass = null,
+        super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ClassElementImpl.forSerialized(
+      this._unlinkedClass, CompilationUnitElementImpl enclosingUnit)
+      : super.forSerialized(enclosingUnit);
+
+  /**
+   * Set whether this class is abstract.
+   */
+  void set abstract(bool isAbstract) {
+    assert(_unlinkedClass == null);
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  @override
+  List<PropertyAccessorElement> get accessors {
+    if (_unlinkedClass != null && _accessors == null) {
+      _resynthesizeFieldsAndPropertyAccessors();
+    }
+    return _accessors ?? const <PropertyAccessorElement>[];
+  }
+
+  @override
+  void set accessors(List<PropertyAccessorElement> accessors) {
+    assert(_unlinkedClass == null);
+    super.accessors = accessors;
+  }
+
+  @override
+  List<InterfaceType> get allSupertypes {
+    List<InterfaceType> list = new List<InterfaceType>();
+    _collectAllSupertypes(list);
+    return list;
+  }
+
+  @override
+  int get codeLength {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.codeRange?.length;
+    }
+    return super.codeLength;
+  }
+
+  @override
+  int get codeOffset {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.codeRange?.offset;
+    }
+    return super.codeOffset;
+  }
+
+  @override
+  List<ConstructorElement> get constructors {
+    if (isMixinApplication) {
+      return _computeMixinAppConstructors();
+    }
+    if (_unlinkedClass != null && _constructors == null) {
+      _constructors = _unlinkedClass.executables
+          .where((e) => e.kind == UnlinkedExecutableKind.constructor)
+          .map((e) => new ConstructorElementImpl.forSerialized(e, this))
+          .toList(growable: false);
+      // Ensure at least implicit default constructor.
+      if (_constructors.isEmpty) {
+        ConstructorElementImpl constructor = new ConstructorElementImpl('', -1);
+        constructor.synthetic = true;
+        constructor.enclosingElement = this;
+        _constructors = <ConstructorElement>[constructor];
+      }
+    }
+    assert(_constructors != null);
+    return _constructors ?? const <ConstructorElement>[];
+  }
+
+  /**
+   * Set the constructors contained in this class to the given [constructors].
+   *
+   * Should only be used for class elements that are not mixin applications.
+   */
+  void set constructors(List<ConstructorElement> constructors) {
+    assert(_unlinkedClass == null);
+    assert(!isMixinApplication);
+    for (ConstructorElement constructor in constructors) {
+      (constructor as ConstructorElementImpl).enclosingElement = this;
+    }
+    this._constructors = constructors;
+  }
+
+  @override
+  SourceRange get docRange {
+    if (_unlinkedClass != null) {
+      UnlinkedDocumentationComment comment =
+          _unlinkedClass.documentationComment;
+      return comment != null
+          ? new SourceRange(comment.offset, comment.length)
+          : null;
+    }
+    return super.docRange;
+  }
+
+  @override
+  String get documentationComment {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass?.documentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  /**
+   * Return `true` if [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] should
+   * be reported for this class.
+   */
+  bool get doesMixinLackConstructors {
+    if (!isMixinApplication && mixins.isEmpty) {
+      // This class is not a mixin application and it doesn't have a "with"
+      // clause, so CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS is
+      // inapplicable.
+      return false;
+    }
+    if (supertype == null) {
+      // Should never happen, since Object is the only class that has no
+      // supertype, and it should have been caught by the test above.
+      assert(false);
+      return false;
+    }
+    // Find the nearest class in the supertype chain that is not a mixin
+    // application.
+    ClassElement nearestNonMixinClass = supertype.element;
+    if (nearestNonMixinClass.isMixinApplication) {
+      // Use a list to keep track of the classes we've seen, so that we won't
+      // go into an infinite loop in the event of a non-trivial loop in the
+      // class hierarchy.
+      List<ClassElement> classesSeen = <ClassElement>[this];
+      while (nearestNonMixinClass.isMixinApplication) {
+        if (classesSeen.contains(nearestNonMixinClass)) {
+          // Loop in the class hierarchy (which is reported elsewhere).  Don't
+          // confuse the user with further errors.
+          return false;
+        }
+        classesSeen.add(nearestNonMixinClass);
+        if (nearestNonMixinClass.supertype == null) {
+          // Should never happen, since Object is the only class that has no
+          // supertype, and it is not a mixin application.
+          assert(false);
+          return false;
+        }
+        nearestNonMixinClass = nearestNonMixinClass.supertype.element;
+      }
+    }
+    return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible);
+  }
+
+  @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
+
+  @override
+  List<FieldElement> get fields {
+    if (_unlinkedClass != null && _fields == null) {
+      _resynthesizeFieldsAndPropertyAccessors();
+    }
+    return _fields ?? const <FieldElement>[];
+  }
+
+  @override
+  void set fields(List<FieldElement> fields) {
+    assert(_unlinkedClass == null);
+    super.fields = fields;
+  }
+
+  bool get hasBeenInferred {
+    if (_unlinkedClass != null) {
+      return context.analysisOptions.strongMode;
+    }
+    return _hasBeenInferred;
+  }
+
+  void set hasBeenInferred(bool hasBeenInferred) {
+    assert(_unlinkedClass == null);
+    _hasBeenInferred = hasBeenInferred;
+  }
+
+  @override
+  bool get hasNonFinalField {
+    List<ClassElement> classesToVisit = new List<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    classesToVisit.add(this);
+    while (!classesToVisit.isEmpty) {
+      ClassElement currentElement = classesToVisit.removeAt(0);
+      if (visitedClasses.add(currentElement)) {
+        // check fields
+        for (FieldElement field in currentElement.fields) {
+          if (!field.isFinal &&
+              !field.isConst &&
+              !field.isStatic &&
+              !field.isSynthetic) {
+            return true;
+          }
+        }
+        // check mixins
+        for (InterfaceType mixinType in currentElement.mixins) {
+          ClassElement mixinElement = mixinType.element;
+          classesToVisit.add(mixinElement);
+        }
+        // check super
+        InterfaceType supertype = currentElement.supertype;
+        if (supertype != null) {
+          ClassElement superElement = supertype.element;
+          if (superElement != null) {
+            classesToVisit.add(superElement);
+          }
+        }
+      }
+    }
+    // not found
+    return false;
+  }
+
+  @override
+  bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
+
+  /**
+   * Set whether this class references 'super'.
+   */
+  void set hasReferenceToSuper(bool isReferencedSuper) {
+    setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
+  }
+
+  @override
+  bool get hasStaticMember {
+    for (MethodElement method in methods) {
+      if (method.isStatic) {
+        return true;
+      }
+    }
+    for (PropertyAccessorElement accessor in accessors) {
+      if (accessor.isStatic) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  List<InterfaceType> get interfaces {
+    if (_unlinkedClass != null && _interfaces == null) {
+      ResynthesizerContext context = enclosingUnit.resynthesizerContext;
+      _interfaces = _unlinkedClass.interfaces
+          .map((EntityRef t) => context.resolveTypeRef(t, this))
+          .toList(growable: false);
+    }
+    return _interfaces ?? const <InterfaceType>[];
+  }
+
+  void set interfaces(List<InterfaceType> interfaces) {
+    assert(_unlinkedClass == null);
+    _interfaces = interfaces;
+  }
+
+  @override
+  bool get isAbstract {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.isAbstract;
+    }
+    return hasModifier(Modifier.ABSTRACT);
+  }
+
+  @override
+  bool get isEnum => false;
+
+  @override
+  bool get isMixinApplication {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.isMixinApplication;
+    }
+    return hasModifier(Modifier.MIXIN_APPLICATION);
+  }
+
+  @override
+  bool get isOrInheritsProxy =>
+      _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
+
+  @override
+  bool get isProxy {
+    for (ElementAnnotation annotation in metadata) {
+      if (annotation.isProxy) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isValidMixin {
+    if (!context.analysisOptions.enableSuperMixins) {
+      if (hasReferenceToSuper) {
+        return false;
+      }
+      if (!supertype.isObject) {
+        return false;
+      }
+    }
+    for (ConstructorElement constructor in constructors) {
+      if (!constructor.isSynthetic && !constructor.isFactory) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  List<ElementAnnotation> get metadata {
+    if (_unlinkedClass != null) {
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedClass.annotations);
+    }
+    return super.metadata;
+  }
+
+  @override
+  List<MethodElement> get methods {
+    if (_unlinkedClass != null) {
+      _methods ??= _unlinkedClass.executables
+          .where((e) => e.kind == UnlinkedExecutableKind.functionOrMethod)
+          .map((e) => new MethodElementImpl.forSerialized(e, this))
+          .toList(growable: false);
+    }
+    return _methods ?? const <MethodElement>[];
+  }
+
+  /**
+   * Set the methods contained in this class to the given [methods].
+   */
+  void set methods(List<MethodElement> methods) {
+    assert(_unlinkedClass == null);
+    for (MethodElement method in methods) {
+      (method as MethodElementImpl).enclosingElement = this;
+    }
+    _methods = methods;
+  }
+
+  /**
+   * Set whether this class is a mixin application.
+   */
+  void set mixinApplication(bool isMixinApplication) {
+    assert(_unlinkedClass == null);
+    setModifier(Modifier.MIXIN_APPLICATION, isMixinApplication);
+  }
+
+  @override
+  List<InterfaceType> get mixins {
+    if (_unlinkedClass != null && _mixins == null) {
+      ResynthesizerContext context = enclosingUnit.resynthesizerContext;
+      _mixins = _unlinkedClass.mixins
+          .map((EntityRef t) => context.resolveTypeRef(t, this))
+          .toList(growable: false);
+    }
+    return _mixins ?? const <InterfaceType>[];
+  }
+
+  void set mixins(List<InterfaceType> mixins) {
+    assert(_unlinkedClass == null);
+    _mixins = mixins;
+  }
+
+  @override
+  String get name {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.name;
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedClass != null) {
+      return _unlinkedClass.nameOffset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
+  InterfaceType get supertype {
+    if (_unlinkedClass != null && _supertype == null) {
+      if (_unlinkedClass.supertype != null) {
+        _supertype = enclosingUnit.resynthesizerContext
+            .resolveTypeRef(_unlinkedClass.supertype, this);
+      } else if (_unlinkedClass.hasNoSupertype) {
+        return null;
+      } else {
+        _supertype = context.typeProvider.objectType;
+      }
+    }
+    return _supertype;
+  }
+
+  void set supertype(InterfaceType supertype) {
+    assert(_unlinkedClass == null);
+    _supertype = supertype;
+  }
+
+  @override
+  InterfaceType get type {
+    if (_type == null) {
+      InterfaceTypeImpl type = new InterfaceTypeImpl(this);
+      type.typeArguments = typeParameterTypes;
+      _type = type;
+    }
+    return _type;
+  }
+
+  @override
+  TypeParameterizedElementMixin get typeParameterContext => this;
+
+  @override
+  List<TypeParameterElement> get typeParameters {
+    if (_unlinkedClass != null) {
+      return super.typeParameters;
+    }
+    return _typeParameters;
+  }
+
+  /**
+   * Set the type parameters defined for this class to the given
+   * [typeParameters].
+   */
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    assert(_unlinkedClass == null);
+    for (TypeParameterElement typeParameter in typeParameters) {
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  List<UnlinkedTypeParam> get unlinkedTypeParams =>
+      _unlinkedClass.typeParameters;
+
+  @override
+  ConstructorElement get unnamedConstructor {
+    for (ConstructorElement element in constructors) {
+      String name = element.displayName;
+      if (name == null || name.isEmpty) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    if (isAbstract) {
+      buffer.write('abstract ');
+    }
+    buffer.write('class ');
+    String name = displayName;
+    if (name == null) {
+      buffer.write("{unnamed class}");
+    } else {
+      buffer.write(name);
+    }
+    int variableCount = typeParameters.length;
+    if (variableCount > 0) {
+      buffer.write("<");
+      for (int i = 0; i < variableCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+      }
+      buffer.write(">");
+    }
+    if (supertype != null && !supertype.isObject) {
+      buffer.write(' extends ');
+      buffer.write(supertype.displayName);
+    }
+    if (mixins.isNotEmpty) {
+      buffer.write(' with ');
+      buffer.write(mixins.map((t) => t.displayName).join(', '));
+    }
+    if (interfaces.isNotEmpty) {
+      buffer.write(' implements ');
+      buffer.write(interfaces.map((t) => t.displayName).join(', '));
+    }
+  }
+
+  @override
+  ElementImpl getChild(String identifier) {
+    ElementImpl child = super.getChild(identifier);
+    if (child != null) {
+      return child;
+    }
+    //
+    // The casts in this method are safe because the set methods would have
+    // thrown a CCE if any of the elements in the arrays were not of the
+    // expected types.
+    //
+    for (ConstructorElement constructor in _constructors) {
+      ConstructorElementImpl constructorImpl = constructor;
+      if (constructorImpl.identifier == identifier) {
+        return constructorImpl;
+      }
+    }
+    for (MethodElement method in methods) {
+      MethodElementImpl methodImpl = method;
+      if (methodImpl.identifier == identifier) {
+        return methodImpl;
+      }
+    }
+    for (TypeParameterElement typeParameter in typeParameters) {
+      TypeParameterElementImpl typeParameterImpl = typeParameter;
+      if (typeParameterImpl.identifier == identifier) {
+        return typeParameterImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  MethodElement getMethod(String methodName) {
+    int length = methods.length;
+    for (int i = 0; i < length; i++) {
+      MethodElement method = methods[i];
+      if (method.name == methodName) {
+        return method;
+      }
+    }
+    return null;
+  }
+
+  @override
+  ConstructorElement getNamedConstructor(String name) {
+    for (ConstructorElement element in constructors) {
+      String elementName = element.name;
+      if (elementName != null && elementName == name) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  @override
+  bool isSuperConstructorAccessible(ConstructorElement constructor) {
+    // If this class has no mixins, then all superclass constructors are
+    // accessible.
+    if (mixins.isEmpty) {
+      return true;
+    }
+    // Otherwise only constructors that lack optional parameters are
+    // accessible (see dartbug.com/19576).
+    for (ParameterElement parameter in constructor.parameters) {
+      if (parameter.parameterKind != ParameterKind.REQUIRED) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_constructors, visitor);
+    safelyVisitChildren(methods, visitor);
+    safelyVisitChildren(_typeParameters, visitor);
+  }
+
+  void _collectAllSupertypes(List<InterfaceType> supertypes) {
+    List<InterfaceType> typesToVisit = new List<InterfaceType>();
+    List<ClassElement> visitedClasses = new List<ClassElement>();
+    typesToVisit.add(this.type);
+    while (!typesToVisit.isEmpty) {
+      InterfaceType currentType = typesToVisit.removeAt(0);
+      ClassElement currentElement = currentType.element;
+      if (!visitedClasses.contains(currentElement)) {
+        visitedClasses.add(currentElement);
+        if (!identical(currentType, this.type)) {
+          supertypes.add(currentType);
+        }
+        InterfaceType supertype = currentType.superclass;
+        if (supertype != null) {
+          typesToVisit.add(supertype);
+        }
+        for (InterfaceType type in currentElement.interfaces) {
+          typesToVisit.add(type);
+        }
+        for (InterfaceType type in currentElement.mixins) {
+          ClassElement element = type.element;
+          if (!visitedClasses.contains(element)) {
+            supertypes.add(type);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Compute a list of constructors for this class, which is a mixin
+   * application.  If specified, [visitedClasses] is a list of the other mixin
+   * application classes which have been visited on the way to reaching this
+   * one (this is used to detect circularities).
+   */
+  List<ConstructorElement> _computeMixinAppConstructors(
+      [List<ClassElementImpl> visitedClasses = null]) {
+    // First get the list of constructors of the superclass which need to be
+    // forwarded to this class.
+    Iterable<ConstructorElement> constructorsToForward;
+    if (supertype == null) {
+      // Shouldn't ever happen, since the only class with no supertype is
+      // Object, and it isn't a mixin application.  But for safety's sake just
+      // assume an empty list.
+      assert(false);
+      constructorsToForward = <ConstructorElement>[];
+    } else if (!supertype.element.isMixinApplication) {
+      List<ConstructorElement> superclassConstructors =
+          supertype.element.constructors;
+      // Filter out any constructors with optional parameters (see
+      // dartbug.com/15101).
+      constructorsToForward =
+          superclassConstructors.where(isSuperConstructorAccessible);
+    } else {
+      if (visitedClasses == null) {
+        visitedClasses = <ClassElementImpl>[this];
+      } else {
+        if (visitedClasses.contains(this)) {
+          // Loop in the class hierarchy.  Don't try to forward any
+          // constructors.
+          return <ConstructorElement>[];
+        }
+        visitedClasses.add(this);
+      }
+      try {
+        ClassElementImpl superElement = AbstractClassElementImpl
+            .getImpl(supertype.element) as ClassElementImpl;
+        constructorsToForward =
+            superElement._computeMixinAppConstructors(visitedClasses);
+      } finally {
+        visitedClasses.removeLast();
+      }
+    }
+
+    // Figure out the type parameter substitution we need to perform in order
+    // to produce constructors for this class.  We want to be robust in the
+    // face of errors, so drop any extra type arguments and fill in any missing
+    // ones with `dynamic`.
+    List<DartType> parameterTypes =
+        TypeParameterTypeImpl.getTypes(supertype.typeParameters);
+    List<DartType> argumentTypes = new List<DartType>.filled(
+        parameterTypes.length, DynamicTypeImpl.instance);
+    for (int i = 0; i < supertype.typeArguments.length; i++) {
+      if (i >= argumentTypes.length) {
+        break;
+      }
+      argumentTypes[i] = supertype.typeArguments[i];
+    }
+
+    // Now create an implicit constructor for every constructor found above,
+    // substituting type parameters as appropriate.
+    return constructorsToForward
+        .map((ConstructorElement superclassConstructor) {
+      ConstructorElementImpl implicitConstructor =
+          new ConstructorElementImpl(superclassConstructor.name, -1);
+      implicitConstructor.synthetic = true;
+      implicitConstructor.redirectedConstructor = superclassConstructor;
+      List<ParameterElement> superParameters = superclassConstructor.parameters;
+      int count = superParameters.length;
+      if (count > 0) {
+        List<ParameterElement> implicitParameters =
+            new List<ParameterElement>(count);
+        for (int i = 0; i < count; i++) {
+          ParameterElement superParameter = superParameters[i];
+          ParameterElementImpl implicitParameter =
+              new ParameterElementImpl(superParameter.name, -1);
+          implicitParameter.const3 = superParameter.isConst;
+          implicitParameter.final2 = superParameter.isFinal;
+          implicitParameter.parameterKind = superParameter.parameterKind;
+          implicitParameter.synthetic = true;
+          implicitParameter.type =
+              superParameter.type.substitute2(argumentTypes, parameterTypes);
+          implicitParameters[i] = implicitParameter;
+        }
+        implicitConstructor.parameters = implicitParameters;
+      }
+      implicitConstructor.enclosingElement = this;
+      return implicitConstructor;
+    }).toList(growable: false);
+  }
+
+  /**
+   * Resynthesize explicit fields and property accessors and fill [_fields] and
+   * [_accessors] with explicit and implicit elements.
+   */
+  void _resynthesizeFieldsAndPropertyAccessors() {
+    assert(_fields == null);
+    assert(_accessors == null);
+    // Build explicit fields and implicit property accessors.
+    var explicitFields = <FieldElement>[];
+    var implicitAccessors = <PropertyAccessorElement>[];
+    for (UnlinkedVariable v in _unlinkedClass.fields) {
+      FieldElementImpl field =
+          new FieldElementImpl.forSerializedFactory(v, this);
+      explicitFields.add(field);
+      implicitAccessors.add(
+          new PropertyAccessorElementImpl_ImplicitGetter(field)
+            ..enclosingElement = this);
+      if (!field.isConst && !field.isFinal) {
+        implicitAccessors.add(
+            new PropertyAccessorElementImpl_ImplicitSetter(field)
+              ..enclosingElement = this);
+      }
+    }
+    // Build explicit property accessors and implicit fields.
+    var explicitAccessors = <PropertyAccessorElement>[];
+    var implicitFields = <String, FieldElementImpl>{};
+    for (UnlinkedExecutable e in _unlinkedClass.executables) {
+      if (e.kind == UnlinkedExecutableKind.getter ||
+          e.kind == UnlinkedExecutableKind.setter) {
+        PropertyAccessorElementImpl accessor =
+            new PropertyAccessorElementImpl.forSerialized(e, this);
+        explicitAccessors.add(accessor);
+        // Prepare the field type.
+        DartType fieldType;
+        if (e.kind == UnlinkedExecutableKind.getter) {
+          fieldType = accessor.returnType;
+        } else {
+          fieldType = accessor.parameters[0].type;
+        }
+        // Create or update the implicit field.
+        String fieldName = accessor.displayName;
+        FieldElementImpl field = implicitFields[fieldName];
+        if (field == null) {
+          field = new FieldElementImpl(fieldName, -1);
+          implicitFields[fieldName] = field;
+          field.enclosingElement = this;
+          field.synthetic = true;
+          field.final2 = e.kind == UnlinkedExecutableKind.getter;
+          field.type = fieldType;
+        } else {
+          field.final2 = false;
+        }
+        accessor.variable = field;
+        if (e.kind == UnlinkedExecutableKind.getter) {
+          field.getter = accessor;
+        } else {
+          field.setter = accessor;
+        }
+      }
+    }
+    // Combine explicit and implicit fields and property accessors.
+    _fields = <FieldElement>[]
+      ..addAll(explicitFields)
+      ..addAll(implicitFields.values);
+    _accessors = <PropertyAccessorElement>[]
+      ..addAll(explicitAccessors)
+      ..addAll(implicitAccessors);
+  }
+
   bool _safeIsOrInheritsProxy(
       ClassElement classElt, HashSet<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
@@ -1030,19 +1269,6 @@
     }
     return false;
   }
-
-  /**
-   * Return the [ClassElementImpl] of the given [classElement].  May throw an
-   * exception if the [ClassElementImpl] cannot be provided (should not happen
-   * though).
-   */
-  static ClassElementImpl getImpl(ClassElement classElement) {
-    if (classElement is ClassElementHandle) {
-      classElement.ensureActualElementComplete();
-      return getImpl(classElement.actualElement);
-    }
-    return classElement as ClassElementImpl;
-  }
 }
 
 /**
@@ -1097,7 +1323,7 @@
   /**
    * A list containing all of the enums contained in this compilation unit.
    */
-  List<ClassElement> _enums = ClassElement.EMPTY_LIST;
+  List<ClassElement> _enums;
 
   /**
    * A list containing all of the top-level functions contained in this
@@ -1109,13 +1335,12 @@
    * A list containing all of the function type aliases contained in this
    * compilation unit.
    */
-  List<FunctionTypeAliasElement> _typeAliases =
-      FunctionTypeAliasElement.EMPTY_LIST;
+  List<FunctionTypeAliasElement> _typeAliases;
 
   /**
    * A list containing all of the types contained in this compilation unit.
    */
-  List<ClassElement> _types = ClassElement.EMPTY_LIST;
+  List<ClassElement> _types;
 
   /**
    * A list containing all of the variables contained in this compilation unit.
@@ -1225,14 +1450,22 @@
   }
 
   @override
-  List<ClassElement> get enums => _enums;
+  List<ClassElement> get enums {
+    if (_unlinkedUnit != null) {
+      _enums ??= _unlinkedUnit.enums
+          .map((e) => new EnumElementImpl.forSerialized(e, this))
+          .toList(growable: false);
+    }
+    return _enums ?? const <ClassElement>[];
+  }
 
   /**
    * Set the enums contained in this compilation unit to the given [enums].
    */
   void set enums(List<ClassElement> enums) {
+    assert(_unlinkedUnit == null);
     for (ClassElement enumDeclaration in enums) {
-      (enumDeclaration as ClassElementImpl).enclosingElement = this;
+      (enumDeclaration as EnumElementImpl).enclosingElement = this;
     }
     this._enums = enums;
   }
@@ -1240,9 +1473,12 @@
   @override
   List<FunctionElement> get functions {
     if (_unlinkedUnit != null) {
-      _functions ??= resynthesizerContext.buildTopLevelFunctions();
+      _functions ??= _unlinkedUnit.executables
+          .where((e) => e.kind == UnlinkedExecutableKind.functionOrMethod)
+          .map((e) => new FunctionElementImpl.forSerialized(e, this))
+          .toList(growable: false);
     }
-    return _functions ?? FunctionElement.EMPTY_LIST;
+    return _functions ?? const <FunctionElement>[];
   }
 
   /**
@@ -1257,7 +1493,14 @@
   }
 
   @override
-  List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases;
+  List<FunctionTypeAliasElement> get functionTypeAliases {
+    if (_unlinkedUnit != null) {
+      _typeAliases ??= _unlinkedUnit.typedefs
+          .map((t) => new FunctionTypeAliasElementImpl.forSerialized(t, this))
+          .toList(growable: false);
+    }
+    return _typeAliases ?? const <FunctionTypeAliasElement>[];
+  }
 
   @override
   int get hashCode => source.hashCode;
@@ -1334,6 +1577,7 @@
    * given [typeAliases].
    */
   void set typeAliases(List<FunctionTypeAliasElement> typeAliases) {
+    assert(_unlinkedUnit == null);
     for (FunctionTypeAliasElement typeAlias in typeAliases) {
       (typeAlias as FunctionTypeAliasElementImpl).enclosingElement = this;
     }
@@ -1344,12 +1588,20 @@
   TypeParameterizedElementMixin get typeParameterContext => null;
 
   @override
-  List<ClassElement> get types => _types;
+  List<ClassElement> get types {
+    if (_unlinkedUnit != null) {
+      _types ??= _unlinkedUnit.classes
+          .map((c) => new ClassElementImpl.forSerialized(c, this))
+          .toList(growable: false);
+    }
+    return _types ?? const <ClassElement>[];
+  }
 
   /**
    * Set the types contained in this compilation unit to the given [types].
    */
   void set types(List<ClassElement> types) {
+    assert(_unlinkedUnit == null);
     for (ClassElement type in types) {
       // Another implementation of ClassElement is _DeferredClassElement,
       // which is used to resynthesize classes lazily. We cannot cast it
@@ -1425,20 +1677,20 @@
         return functionImpl;
       }
     }
-    for (FunctionTypeAliasElement typeAlias in _typeAliases) {
+    for (FunctionTypeAliasElement typeAlias in functionTypeAliases) {
       FunctionTypeAliasElementImpl typeAliasImpl = typeAlias;
       if (typeAliasImpl.identifier == identifier) {
         return typeAliasImpl;
       }
     }
-    for (ClassElement type in _types) {
+    for (ClassElement type in types) {
       ClassElementImpl typeImpl = type;
       if (typeImpl.name == identifier) {
         return typeImpl;
       }
     }
     for (ClassElement type in _enums) {
-      ClassElementImpl typeImpl = type;
+      EnumElementImpl typeImpl = type;
       if (typeImpl.identifier == identifier) {
         return typeImpl;
       }
@@ -1466,7 +1718,7 @@
 
   @override
   ClassElement getType(String className) {
-    for (ClassElement type in _types) {
+    for (ClassElement type in types) {
       if (type.name == className) {
         return type;
       }
@@ -1507,8 +1759,8 @@
     safelyVisitChildren(accessors, visitor);
     safelyVisitChildren(_enums, visitor);
     safelyVisitChildren(functions, visitor);
-    safelyVisitChildren(_typeAliases, visitor);
-    safelyVisitChildren(_types, visitor);
+    safelyVisitChildren(functionTypeAliases, visitor);
+    safelyVisitChildren(types, visitor);
     safelyVisitChildren(topLevelVariables, visitor);
   }
 }
@@ -1544,6 +1796,149 @@
 }
 
 /**
+ * A field element representing an enum constant.
+ */
+class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum {
+  final UnlinkedEnumValue _unlinkedEnumValue;
+  final int _index;
+
+  ConstFieldElementImpl_EnumValue(
+      EnumElementImpl enumElement, this._unlinkedEnumValue, this._index)
+      : super(enumElement);
+
+  @override
+  SourceRange get docRange {
+    if (_unlinkedEnumValue != null) {
+      UnlinkedDocumentationComment comment =
+          _unlinkedEnumValue.documentationComment;
+      return comment != null
+          ? new SourceRange(comment.offset, comment.length)
+          : null;
+    }
+    return super.docRange;
+  }
+
+  @override
+  String get documentationComment {
+    if (_unlinkedEnumValue != null) {
+      return _unlinkedEnumValue?.documentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  @override
+  EvaluationResultImpl get evaluationResult {
+    if (_evaluationResult == null) {
+      Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{
+        name: new DartObjectImpl(
+            context.typeProvider.intType, new IntState(_index))
+      };
+      DartObjectImpl value =
+          new DartObjectImpl(type, new GenericState(fieldMap));
+      _evaluationResult = new EvaluationResultImpl(value);
+    }
+    return _evaluationResult;
+  }
+
+  @override
+  String get name {
+    if (_unlinkedEnumValue != null) {
+      return _unlinkedEnumValue.name;
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedEnumValue != null) {
+      return _unlinkedEnumValue.nameOffset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
+  InterfaceType get type => _enum.type;
+}
+
+/**
+ * The synthetic `values` field of an enum.
+ */
+class ConstFieldElementImpl_EnumValues extends ConstFieldElementImpl_ofEnum {
+  ConstFieldElementImpl_EnumValues(EnumElementImpl enumElement)
+      : super(enumElement) {
+    synthetic = true;
+  }
+
+  @override
+  EvaluationResultImpl get evaluationResult {
+    if (_evaluationResult == null) {
+      List<DartObjectImpl> constantValues = <DartObjectImpl>[];
+      for (FieldElement field in _enum.fields) {
+        if (field is ConstFieldElementImpl_EnumValue) {
+          constantValues.add(field.evaluationResult.value);
+        }
+      }
+      _evaluationResult = new EvaluationResultImpl(
+          new DartObjectImpl(type, new ListState(constantValues)));
+    }
+    return _evaluationResult;
+  }
+
+  @override
+  String get name => 'values';
+
+  @override
+  InterfaceType get type {
+    if (_type == null) {
+      InterfaceType listType = context.typeProvider.listType;
+      return _type = listType.instantiate(<DartType>[_enum.type]);
+    }
+    return _type;
+  }
+}
+
+/**
+ * An abstract constant field of an enum.
+ */
+abstract class ConstFieldElementImpl_ofEnum extends ConstFieldElementImpl {
+  final EnumElementImpl _enum;
+
+  ConstFieldElementImpl_ofEnum(this._enum) : super(null, -1) {
+    enclosingElement = _enum;
+  }
+
+  @override
+  void set const3(bool isConst) {
+    assert(false);
+  }
+
+  @override
+  void set evaluationResult(_) {
+    assert(false);
+  }
+
+  @override
+  void set final2(bool isFinal) {
+    assert(false);
+  }
+
+  @override
+  bool get isConst => true;
+
+  @override
+  bool get isStatic => true;
+
+  @override
+  void set static(bool isStatic) {
+    assert(false);
+  }
+
+  void set type(DartType type) {
+    assert(false);
+  }
+}
+
+/**
  * A [LocalVariableElement] for a local 'const' variable that has an
  * initializer.
  */
@@ -1576,30 +1971,30 @@
   /**
    * The constructor to which this constructor is redirecting.
    */
-  ConstructorElement redirectedConstructor;
+  ConstructorElement _redirectedConstructor;
 
   /**
    * The initializers for this constructor (used for evaluating constant
    * instance creation expressions).
    */
-  List<ConstructorInitializer> constantInitializers;
+  List<ConstructorInitializer> _constantInitializers;
 
   /**
    * The offset of the `.` before this constructor name or `null` if not named.
    */
-  int periodOffset;
+  int _periodOffset;
 
   /**
    * Return the offset of the character immediately following the last character
    * of this constructor's name, or `null` if not named.
    */
-  int nameEnd;
+  int _nameEnd;
 
   /**
    * True if this constructor has been found by constant evaluation to be free
    * of redirect cycles, and is thus safe to evaluate.
    */
-  bool isCycleFree = false;
+  bool _isCycleFree = false;
 
   /**
    * Initialize a newly created constructor element to have the given [name] and
@@ -1627,8 +2022,24 @@
     setModifier(Modifier.CONST, isConst);
   }
 
+  List<ConstructorInitializer> get constantInitializers {
+    if (serializedExecutable != null && _constantInitializers == null) {
+      _constantInitializers ??= serializedExecutable.constantInitializers
+          .map((i) => _buildConstructorInitializer(i))
+          .toList(growable: false);
+    }
+    return _constantInitializers;
+  }
+
+  void set constantInitializers(
+      List<ConstructorInitializer> constantInitializers) {
+    assert(serializedExecutable == null);
+    _constantInitializers = constantInitializers;
+  }
+
   @override
-  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+  ClassElementImpl get enclosingElement =>
+      super.enclosingElement as ClassElementImpl;
 
   @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext =>
@@ -1650,6 +2061,21 @@
     return hasModifier(Modifier.CONST);
   }
 
+  bool get isCycleFree {
+    if (serializedExecutable != null) {
+      return serializedExecutable.isConst &&
+          !enclosingUnit.resynthesizerContext
+              .isInConstCycle(serializedExecutable.constCycleSlot);
+    }
+    return _isCycleFree;
+  }
+
+  void set isCycleFree(bool isCycleFree) {
+    // This property is updated in ConstantEvaluationEngine even for
+    // resynthesized constructors, so we don't have the usual assert here.
+    _isCycleFree = isCycleFree;
+  }
+
   @override
   bool get isDefaultConstructor {
     // unnamed
@@ -1682,8 +2108,77 @@
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
   @override
+  int get nameEnd {
+    if (serializedExecutable != null) {
+      if (serializedExecutable.name.isNotEmpty) {
+        return serializedExecutable.nameEnd;
+      } else {
+        return serializedExecutable.nameOffset + enclosingElement.name.length;
+      }
+    }
+    return _nameEnd;
+  }
+
+  void set nameEnd(int nameEnd) {
+    assert(serializedExecutable == null);
+    _nameEnd = nameEnd;
+  }
+
+  @override
+  int get periodOffset {
+    if (serializedExecutable != null) {
+      if (serializedExecutable.name.isNotEmpty) {
+        return serializedExecutable.periodOffset;
+      }
+    }
+    return _periodOffset;
+  }
+
+  void set periodOffset(int periodOffset) {
+    assert(serializedExecutable == null);
+    _periodOffset = periodOffset;
+  }
+
+  @override
+  ConstructorElement get redirectedConstructor {
+    if (serializedExecutable != null && _redirectedConstructor == null) {
+      if (serializedExecutable.isRedirectedConstructor) {
+        if (serializedExecutable.isFactory) {
+          _redirectedConstructor = enclosingUnit.resynthesizerContext
+              .resolveConstructorRef(
+                  enclosingElement, serializedExecutable.redirectedConstructor);
+        } else {
+          _redirectedConstructor = enclosingElement.getNamedConstructor(
+              serializedExecutable.redirectedConstructorName);
+        }
+      } else {
+        return null;
+      }
+    }
+    return _redirectedConstructor;
+  }
+
+  void set redirectedConstructor(ConstructorElement redirectedConstructor) {
+    assert(serializedExecutable == null);
+    _redirectedConstructor = redirectedConstructor;
+  }
+
+  @override
   DartType get returnType => enclosingElement.type;
 
+  void set returnType(DartType returnType) {
+    assert(false);
+  }
+
+  @override
+  FunctionType get type {
+    return _type ??= new FunctionTypeImpl(this);
+  }
+
+  void set type(FunctionType type) {
+    assert(false);
+  }
+
   @override
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
 
@@ -1714,6 +2209,62 @@
   @override
   ConstructorDeclaration computeNode() =>
       getNodeMatching((node) => node is ConstructorDeclaration);
+
+  /**
+   * Resynthesize the AST for the given serialized constructor initializer.
+   */
+  ConstructorInitializer _buildConstructorInitializer(
+      UnlinkedConstructorInitializer serialized) {
+    UnlinkedConstructorInitializerKind kind = serialized.kind;
+    String name = serialized.name;
+    List<Expression> arguments = <Expression>[];
+    {
+      int numArguments = serialized.arguments.length;
+      int numNames = serialized.argumentNames.length;
+      for (int i = 0; i < numArguments; i++) {
+        Expression expression = enclosingUnit.resynthesizerContext
+            .buildExpression(this, serialized.arguments[i]);
+        int nameIndex = numNames + i - numArguments;
+        if (nameIndex >= 0) {
+          expression = AstFactory.namedExpression2(
+              serialized.argumentNames[nameIndex], expression);
+        }
+        arguments.add(expression);
+      }
+    }
+    switch (kind) {
+      case UnlinkedConstructorInitializerKind.field:
+        ConstructorFieldInitializer initializer =
+            AstFactory.constructorFieldInitializer(
+                false,
+                name,
+                enclosingUnit.resynthesizerContext
+                    .buildExpression(this, serialized.expression));
+        initializer.fieldName.staticElement = enclosingElement.getField(name);
+        return initializer;
+      case UnlinkedConstructorInitializerKind.superInvocation:
+        SuperConstructorInvocation initializer =
+            AstFactory.superConstructorInvocation2(
+                name.isNotEmpty ? name : null, arguments);
+        ClassElement superElement = enclosingElement.supertype.element;
+        ConstructorElement element = name.isEmpty
+            ? superElement.unnamedConstructor
+            : superElement.getNamedConstructor(name);
+        initializer.staticElement = element;
+        initializer.constructorName?.staticElement = element;
+        return initializer;
+      case UnlinkedConstructorInitializerKind.thisInvocation:
+        RedirectingConstructorInvocation initializer =
+            AstFactory.redirectingConstructorInvocation2(
+                name.isNotEmpty ? name : null, arguments);
+        ConstructorElement element = name.isEmpty
+            ? enclosingElement.unnamedConstructor
+            : enclosingElement.getNamedConstructor(name);
+        initializer.staticElement = element;
+        initializer.constructorName?.staticElement = element;
+        return initializer;
+    }
+  }
 }
 
 /**
@@ -1755,7 +2306,8 @@
  *
  * This class is not intended to be part of the public API for analyzer.
  */
-abstract class ConstVariableElement implements ConstantEvaluationTarget {
+abstract class ConstVariableElement
+    implements ElementImpl, ConstantEvaluationTarget {
   /**
    * If this element represents a constant variable, and it has an initializer,
    * a copy of the initializer for the constant.  Otherwise `null`.
@@ -1765,10 +2317,34 @@
    * in which case there might be some constant variables that lack
    * initializers.
    */
-  Expression constantInitializer;
+  Expression _constantInitializer;
 
-  @override
-  EvaluationResultImpl evaluationResult;
+  EvaluationResultImpl _evaluationResult;
+
+  Expression get constantInitializer {
+    if (_constantInitializer == null && _unlinkedConst != null) {
+      _constantInitializer = enclosingUnit.resynthesizerContext
+          .buildExpression(this, _unlinkedConst);
+    }
+    return _constantInitializer;
+  }
+
+  void set constantInitializer(Expression constantInitializer) {
+    assert(_unlinkedConst == null);
+    _constantInitializer = constantInitializer;
+  }
+
+  EvaluationResultImpl get evaluationResult => _evaluationResult;
+
+  void set evaluationResult(EvaluationResultImpl evaluationResult) {
+    _evaluationResult = evaluationResult;
+  }
+
+  /**
+   * If this element is resynthesized from the summary, return the unlinked
+   * initializer, otherwise return `null`.
+   */
+  UnlinkedConst get _unlinkedConst;
 
   /**
    * Return a representation of the value of this variable, forcing the value
@@ -1808,25 +2384,6 @@
   DefaultFieldFormalParameterElementImpl.forSerialized(
       UnlinkedParam unlinkedParam, ElementImpl enclosingElement)
       : super.forSerialized(unlinkedParam, enclosingElement);
-
-  @override
-  Expression get constantInitializer {
-    if (_unlinkedParam != null) {
-      UnlinkedConst defaultValue = _unlinkedParam.initializer?.bodyExpr;
-      if (defaultValue == null) {
-        return null;
-      }
-      return super.constantInitializer ??= enclosingUnit.resynthesizerContext
-          .buildExpression(this, defaultValue);
-    }
-    return super.constantInitializer;
-  }
-
-  @override
-  void set constantInitializer(Expression initializer) {
-    assert(_unlinkedParam == null);
-    super.constantInitializer = initializer;
-  }
 }
 
 /**
@@ -1854,25 +2411,6 @@
       : super.forSerialized(unlinkedParam, enclosingElement);
 
   @override
-  Expression get constantInitializer {
-    if (_unlinkedParam != null) {
-      UnlinkedConst defaultValue = _unlinkedParam.initializer?.bodyExpr;
-      if (defaultValue == null) {
-        return null;
-      }
-      return super.constantInitializer ??= enclosingUnit.resynthesizerContext
-          .buildExpression(this, defaultValue);
-    }
-    return super.constantInitializer;
-  }
-
-  @override
-  void set constantInitializer(Expression initializer) {
-    assert(_unlinkedParam == null);
-    super.constantInitializer = initializer;
-  }
-
-  @override
   DefaultFormalParameter computeNode() =>
       getNodeMatching((node) => node is DefaultFormalParameter);
 }
@@ -2768,6 +3306,252 @@
 }
 
 /**
+ * An [AbstractClassElementImpl] which is an enum.
+ */
+class EnumElementImpl extends AbstractClassElementImpl {
+  /**
+   * The unlinked representation of the enum in the summary.
+   */
+  final UnlinkedEnum _unlinkedEnum;
+
+  /**
+   * The type defined by the enum.
+   */
+  InterfaceType _type;
+
+  /**
+   * Initialize a newly created class element to have the given [name] at the
+   * given [offset] in the file that contains the declaration of this element.
+   */
+  EnumElementImpl(String name, int offset)
+      : _unlinkedEnum = null,
+        super(name, offset);
+
+  /**
+   * Initialize a newly created class element to have the given [name].
+   */
+  EnumElementImpl.forNode(Identifier name)
+      : _unlinkedEnum = null,
+        super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  EnumElementImpl.forSerialized(
+      this._unlinkedEnum, CompilationUnitElementImpl enclosingUnit)
+      : super.forSerialized(enclosingUnit);
+
+  /**
+   * Set whether this class is abstract.
+   */
+  void set abstract(bool isAbstract) {
+    assert(_unlinkedEnum == null);
+  }
+
+  @override
+  List<PropertyAccessorElement> get accessors {
+    if (_unlinkedEnum != null && _accessors == null) {
+      _resynthesizeFieldsAndPropertyAccessors();
+    }
+    return _accessors ?? const <PropertyAccessorElement>[];
+  }
+
+  @override
+  void set accessors(List<PropertyAccessorElement> accessors) {
+    assert(_unlinkedEnum == null);
+    super.accessors = accessors;
+  }
+
+  @override
+  List<InterfaceType> get allSupertypes => <InterfaceType>[supertype];
+
+  @override
+  int get codeLength {
+    if (_unlinkedEnum != null) {
+      return _unlinkedEnum.codeRange?.length;
+    }
+    return super.codeLength;
+  }
+
+  @override
+  int get codeOffset {
+    if (_unlinkedEnum != null) {
+      return _unlinkedEnum.codeRange?.offset;
+    }
+    return super.codeOffset;
+  }
+
+  @override
+  List<ConstructorElement> get constructors {
+    // The equivalent code for enums in the spec shows a single constructor,
+    // but that constructor is not callable (since it is a compile-time error
+    // to subclass, mix-in, implement, or explicitly instantiate an enum).
+    // So we represent this as having no constructors.
+    return const <ConstructorElement>[];
+  }
+
+  @override
+  SourceRange get docRange {
+    if (_unlinkedEnum != null) {
+      UnlinkedDocumentationComment comment = _unlinkedEnum.documentationComment;
+      return comment != null
+          ? new SourceRange(comment.offset, comment.length)
+          : null;
+    }
+    return super.docRange;
+  }
+
+  @override
+  String get documentationComment {
+    if (_unlinkedEnum != null) {
+      return _unlinkedEnum?.documentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  @override
+  List<FieldElement> get fields {
+    if (_unlinkedEnum != null && _fields == null) {
+      _resynthesizeFieldsAndPropertyAccessors();
+    }
+    return _fields ?? const <FieldElement>[];
+  }
+
+  @override
+  void set fields(List<FieldElement> fields) {
+    assert(_unlinkedEnum == null);
+    super.fields = fields;
+  }
+
+  @override
+  bool get hasNonFinalField => false;
+
+  @override
+  bool get hasReferenceToSuper => false;
+
+  @override
+  bool get hasStaticMember => true;
+
+  @override
+  List<InterfaceType> get interfaces => const <InterfaceType>[];
+
+  @override
+  bool get isAbstract => false;
+
+  @override
+  bool get isEnum => true;
+
+  @override
+  bool get isMixinApplication => false;
+
+  @override
+  bool get isOrInheritsProxy => false;
+
+  @override
+  bool get isProxy => false;
+
+  @override
+  bool get isValidMixin => false;
+
+  @override
+  List<ElementAnnotation> get metadata {
+    if (_unlinkedEnum != null) {
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedEnum.annotations);
+    }
+    return super.metadata;
+  }
+
+  @override
+  List<MethodElement> get methods => const <MethodElement>[];
+
+  @override
+  List<InterfaceType> get mixins => const <InterfaceType>[];
+
+  @override
+  String get name {
+    if (_unlinkedEnum != null) {
+      return _unlinkedEnum.name;
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedEnum != null) {
+      return _unlinkedEnum.nameOffset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
+  InterfaceType get supertype => context.typeProvider.objectType;
+
+  @override
+  InterfaceType get type {
+    if (_type == null) {
+      InterfaceTypeImpl type = new InterfaceTypeImpl(this);
+      type.typeArguments = const <DartType>[];
+      _type = type;
+    }
+    return _type;
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters =>
+      const <TypeParameterElement>[];
+
+  @override
+  ConstructorElement get unnamedConstructor => null;
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write('enum ');
+    String name = displayName;
+    if (name == null) {
+      buffer.write("{unnamed enum}");
+    } else {
+      buffer.write(name);
+    }
+  }
+
+  @override
+  MethodElement getMethod(String name) => null;
+
+  @override
+  ConstructorElement getNamedConstructor(String name) => null;
+
+  @override
+  bool isSuperConstructorAccessible(ConstructorElement constructor) => false;
+
+  void _resynthesizeFieldsAndPropertyAccessors() {
+    List<FieldElementImpl> fields = <FieldElementImpl>[];
+    // Build the 'index' field.
+    fields.add(new FieldElementImpl('index', -1)
+      ..enclosingElement = this
+      ..synthetic = true
+      ..final2 = true
+      ..type = context.typeProvider.intType);
+    // Build the 'values' field.
+    fields.add(new ConstFieldElementImpl_EnumValues(this));
+    // Build fields for all enum constants.
+    for (int i = 0; i < _unlinkedEnum.values.length; i++) {
+      UnlinkedEnumValue unlinkedValue = _unlinkedEnum.values[i];
+      ConstFieldElementImpl_EnumValue field =
+          new ConstFieldElementImpl_EnumValue(this, unlinkedValue, i);
+      fields.add(field);
+    }
+    // done
+    _fields = fields;
+    _accessors = fields
+        .map((FieldElementImpl field) =>
+            new PropertyAccessorElementImpl_ImplicitGetter(field)
+              ..enclosingElement = this)
+        .toList(growable: false);
+  }
+}
+
+/**
  * A base class for concrete implementations of an [ExecutableElement].
  */
 abstract class ExecutableElementImpl extends ElementImpl
@@ -2782,29 +3566,29 @@
    * A list containing all of the functions defined within this executable
    * element.
    */
-  List<FunctionElement> _functions = FunctionElement.EMPTY_LIST;
+  List<FunctionElement> _functions;
 
   /**
    * A list containing all of the labels defined within this executable element.
    */
-  List<LabelElement> _labels = LabelElement.EMPTY_LIST;
+  List<LabelElement> _labels;
 
   /**
    * A list containing all of the local variables defined within this executable
    * element.
    */
-  List<LocalVariableElement> _localVariables = LocalVariableElement.EMPTY_LIST;
+  List<LocalVariableElement> _localVariables;
 
   /**
    * A list containing all of the parameters defined by this executable element.
    */
-  List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST;
+  List<ParameterElement> _parameters;
 
   /**
    * A list containing all of the type parameters defined for this executable
    * element.
    */
-  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+  List<TypeParameterElement> _typeParameters;
 
   /**
    * The return type defined by this executable element.
@@ -2814,7 +3598,7 @@
   /**
    * The type of function defined by this executable element.
    */
-  FunctionType type;
+  FunctionType _type;
 
   /**
    * Initialize a newly created executable element to have the given [name] and
@@ -2899,13 +3683,20 @@
   }
 
   @override
-  List<FunctionElement> get functions => _functions;
+  List<FunctionElement> get functions {
+    if (serializedExecutable != null) {
+      _functions ??= FunctionElementImpl.resynthesizeList(
+          this, serializedExecutable.localFunctions);
+    }
+    return _functions ?? const <FunctionElement>[];
+  }
 
   /**
    * Set the functions defined within this executable element to the given
    * [functions].
    */
   void set functions(List<FunctionElement> functions) {
+    assert(serializedExecutable == null);
     for (FunctionElement function in functions) {
       (function as FunctionElementImpl).enclosingElement = this;
     }
@@ -2976,13 +3767,20 @@
   bool get isSynchronous => !isAsynchronous;
 
   @override
-  List<LabelElement> get labels => _labels;
+  List<LabelElement> get labels {
+    if (serializedExecutable != null) {
+      _labels ??= LabelElementImpl.resynthesizeList(
+          this, serializedExecutable.localLabels);
+    }
+    return _labels ?? const <LabelElement>[];
+  }
 
   /**
    * Set the labels defined within this executable element to the given
    * [labels].
    */
   void set labels(List<LabelElement> labels) {
+    assert(serializedExecutable == null);
     for (LabelElement label in labels) {
       (label as LabelElementImpl).enclosingElement = this;
     }
@@ -2990,13 +3788,32 @@
   }
 
   @override
-  List<LocalVariableElement> get localVariables => _localVariables;
+  List<LocalVariableElement> get localVariables {
+    if (serializedExecutable != null && _localVariables == null) {
+      List<UnlinkedVariable> unlinkedVariables =
+          serializedExecutable.localVariables;
+      int length = unlinkedVariables.length;
+      if (length != 0) {
+        List<LocalVariableElementImpl> localVariables =
+            new List<LocalVariableElementImpl>(length);
+        for (int i = 0; i < length; i++) {
+          localVariables[i] = new LocalVariableElementImpl.forSerializedFactory(
+              unlinkedVariables[i], this);
+        }
+        _localVariables = localVariables;
+      } else {
+        _localVariables = const <LocalVariableElement>[];
+      }
+    }
+    return _localVariables ?? const <LocalVariableElement>[];
+  }
 
   /**
    * Set the local variables defined within this executable element to the given
    * [variables].
    */
   void set localVariables(List<LocalVariableElement> variables) {
+    assert(serializedExecutable == null);
     for (LocalVariableElement variable in variables) {
       (variable as LocalVariableElementImpl).enclosingElement = this;
     }
@@ -3029,13 +3846,20 @@
   }
 
   @override
-  List<ParameterElement> get parameters => _parameters;
+  List<ParameterElement> get parameters {
+    if (serializedExecutable != null) {
+      _parameters ??= ParameterElementImpl.resynthesizeList(
+          serializedExecutable.parameters, this);
+    }
+    return _parameters ?? const <ParameterElement>[];
+  }
 
   /**
    * Set the parameters defined by this executable element to the given
    * [parameters].
    */
   void set parameters(List<ParameterElement> parameters) {
+    assert(serializedExecutable == null);
     for (ParameterElement parameter in parameters) {
       (parameter as ParameterElementImpl).enclosingElement = this;
     }
@@ -3063,16 +3887,36 @@
   }
 
   @override
+  FunctionType get type {
+    if (serializedExecutable != null) {
+      _type ??= new FunctionTypeImpl.elementWithNameAndArgs(
+          this, null, allEnclosingTypeParameterTypes, false);
+    }
+    return _type;
+  }
+
+  void set type(FunctionType type) {
+    assert(serializedExecutable == null);
+    _type = type;
+  }
+
+  @override
   TypeParameterizedElementMixin get typeParameterContext => this;
 
   @override
-  List<TypeParameterElement> get typeParameters => _typeParameters;
+  List<TypeParameterElement> get typeParameters {
+    if (serializedExecutable != null) {
+      return super.typeParameters;
+    }
+    return _typeParameters ?? const <TypeParameterElement>[];
+  }
 
   /**
    * Set the type parameters defined by this executable element to the given
    * [typeParameters].
    */
   void set typeParameters(List<TypeParameterElement> typeParameters) {
+    assert(serializedExecutable == null);
     for (TypeParameterElement parameter in typeParameters) {
       (parameter as TypeParameterElementImpl).enclosingElement = this;
     }
@@ -3086,26 +3930,26 @@
   @override
   void appendTo(StringBuffer buffer) {
     if (this.kind != ElementKind.GETTER) {
-      int typeParameterCount = _typeParameters.length;
+      int typeParameterCount = typeParameters.length;
       if (typeParameterCount > 0) {
         buffer.write('<');
         for (int i = 0; i < typeParameterCount; i++) {
           if (i > 0) {
             buffer.write(", ");
           }
-          (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+          (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
         }
         buffer.write('>');
       }
       buffer.write("(");
       String closing = null;
       ParameterKind kind = ParameterKind.REQUIRED;
-      int parameterCount = _parameters.length;
+      int parameterCount = parameters.length;
       for (int i = 0; i < parameterCount; i++) {
         if (i > 0) {
           buffer.write(", ");
         }
-        ParameterElement parameter = _parameters[i];
+        ParameterElement parameter = parameters[i];
         ParameterKind parameterKind = parameter.parameterKind;
         if (parameterKind != kind) {
           if (closing != null) {
@@ -3155,7 +3999,7 @@
         return variableImpl;
       }
     }
-    for (ParameterElement parameter in _parameters) {
+    for (ParameterElement parameter in parameters) {
       ParameterElementImpl parameterImpl = parameter;
       if (parameterImpl.identifier == identifier) {
         return parameterImpl;
@@ -3170,7 +4014,7 @@
     safelyVisitChildren(_functions, visitor);
     safelyVisitChildren(_labels, visitor);
     safelyVisitChildren(_localVariables, visitor);
-    safelyVisitChildren(_parameters, visitor);
+    safelyVisitChildren(parameters, visitor);
   }
 }
 
@@ -3348,6 +4192,22 @@
       UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
       : super.forSerialized(unlinkedVariable, enclosingElement);
 
+  /**
+   * Initialize using the given serialized information.
+   */
+  factory FieldElementImpl.forSerializedFactory(
+      UnlinkedVariable unlinkedVariable, ClassElementImpl enclosingClass) {
+    if (unlinkedVariable.initializer?.bodyExpr != null &&
+        (unlinkedVariable.isConst ||
+            unlinkedVariable.isFinal && !unlinkedVariable.isStatic)) {
+      return new ConstFieldElementImpl.forSerialized(
+          unlinkedVariable, enclosingClass);
+    } else {
+      return new FieldElementImpl.forSerialized(
+          unlinkedVariable, enclosingClass);
+    }
+  }
+
   @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
@@ -3356,12 +4216,21 @@
       enclosingElement != null ? enclosingElement.isEnum : false;
 
   @override
+  bool get isStatic {
+    if (_unlinkedVariable != null) {
+      return _unlinkedVariable.isStatic;
+    }
+    return hasModifier(Modifier.STATIC);
+  }
+
+  @override
   ElementKind get kind => ElementKind.FIELD;
 
   /**
    * Set whether this field is static.
    */
   void set static(bool isStatic) {
+    assert(_unlinkedVariable == null);
     setModifier(Modifier.STATIC, isStatic);
   }
 
@@ -3540,6 +4409,13 @@
 
   @override
   SourceRange get visibleRange {
+    if (serializedExecutable != null) {
+      if (serializedExecutable.visibleLength == 0) {
+        return null;
+      }
+      return new SourceRange(serializedExecutable.visibleOffset,
+          serializedExecutable.visibleLength);
+    }
     if (_visibleRangeLength < 0) {
       return null;
     }
@@ -3567,6 +4443,7 @@
    * [offset] with the given [length].
    */
   void setVisibleRange(int offset, int length) {
+    assert(serializedExecutable == null);
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
@@ -3589,6 +4466,25 @@
   void shareTypeParameters(List<TypeParameterElement> typeParameters) {
     this._typeParameters = typeParameters;
   }
+
+  /**
+   * Create and return [FunctionElement]s for the given [unlinkedFunctions].
+   */
+  static List<FunctionElement> resynthesizeList(
+      ExecutableElementImpl executableElement,
+      List<UnlinkedExecutable> unlinkedFunctions) {
+    int length = unlinkedFunctions.length;
+    if (length != 0) {
+      List<FunctionElement> elements = new List<FunctionElement>(length);
+      for (int i = 0; i < length; i++) {
+        elements[i] = new FunctionElementImpl.forSerialized(
+            unlinkedFunctions[i], executableElement);
+      }
+      return elements;
+    } else {
+      return const <FunctionElement>[];
+    }
+  }
 }
 
 /**
@@ -3627,12 +4523,47 @@
   @override
   final TypeParameterizedElementMixin enclosingTypeParameterContext;
 
+  final EntityRef _entityRef;
+
   FunctionElementImpl_forLUB(
-      this.enclosingUnit, this.enclosingTypeParameterContext)
+      this.enclosingUnit, this.enclosingTypeParameterContext, this._entityRef)
       : super('', -1);
 
   @override
   bool get isSynthetic => true;
+
+  @override
+  List<ParameterElement> get parameters {
+    return _parameters ??= ParameterElementImpl
+        .resynthesizeList(_entityRef.syntheticParams, this, synthetic: true);
+  }
+
+  @override
+  void set parameters(List<ParameterElement> parameters) {
+    assert(false);
+  }
+
+  @override
+  DartType get returnType {
+    return _returnType ??= enclosingUnit.resynthesizerContext
+        .resolveTypeRef(_entityRef.syntheticReturnType, typeParameterContext);
+  }
+
+  @override
+  void set returnType(DartType returnType) {
+    assert(false);
+  }
+
+  @override
+  FunctionType get type {
+    return _type ??=
+        new FunctionTypeImpl.elementWithNameAndArgs(this, null, null, false);
+  }
+
+  @override
+  void set type(FunctionType type) {
+    assert(false);
+  }
 }
 
 /**
@@ -3649,7 +4580,7 @@
   /**
    * A list containing all of the parameters defined by this type alias.
    */
-  List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST;
+  List<ParameterElement> _parameters;
 
   /**
    * The return type defined by this type alias.
@@ -3659,7 +4590,7 @@
   /**
    * The type of function defined by this type alias.
    */
-  FunctionType type;
+  FunctionType _type;
 
   /**
    * A list containing all of the type parameters defined for this type.
@@ -3770,12 +4701,19 @@
   }
 
   @override
-  List<ParameterElement> get parameters => _parameters;
+  List<ParameterElement> get parameters {
+    if (_unlinkedTypedef != null) {
+      _parameters ??= ParameterElementImpl.resynthesizeList(
+          _unlinkedTypedef.parameters, this);
+    }
+    return _parameters ?? const <ParameterElement>[];
+  }
 
   /**
    * Set the parameters defined by this type alias to the given [parameters].
    */
   void set parameters(List<ParameterElement> parameters) {
+    assert(_unlinkedTypedef == null);
     if (parameters != null) {
       for (ParameterElement parameter in parameters) {
         (parameter as ParameterElementImpl).enclosingElement = this;
@@ -3799,6 +4737,19 @@
   }
 
   @override
+  FunctionType get type {
+    if (_unlinkedTypedef != null && _type == null) {
+      _type = new FunctionTypeImpl.forTypedef(this);
+    }
+    return _type;
+  }
+
+  void set type(FunctionType type) {
+    assert(_unlinkedTypedef == null);
+    _type = type;
+  }
+
+  @override
   TypeParameterizedElementMixin get typeParameterContext => this;
 
   @override
@@ -3867,7 +4818,7 @@
 
   @override
   ElementImpl getChild(String identifier) {
-    for (ParameterElement parameter in _parameters) {
+    for (ParameterElement parameter in parameters) {
       ParameterElementImpl parameterImpl = parameter;
       if (parameterImpl.identifier == identifier) {
         return parameterImpl;
@@ -3885,7 +4836,7 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    safelyVisitChildren(_parameters, visitor);
+    safelyVisitChildren(parameters, visitor);
     safelyVisitChildren(_typeParameters, visitor);
   }
 }
@@ -4202,6 +5153,11 @@
  */
 class LabelElementImpl extends ElementImpl implements LabelElement {
   /**
+   * The unlinked representation of the label in the summary.
+   */
+  final UnlinkedLabel _unlinkedLabel;
+
+  /**
    * A flag indicating whether this label is associated with a `switch`
    * statement.
    */
@@ -4223,7 +5179,8 @@
    */
   LabelElementImpl(String name, int nameOffset, this._onSwitchStatement,
       this._onSwitchMember)
-      : super(name, nameOffset);
+      : _unlinkedLabel = null,
+        super(name, nameOffset);
 
   /**
    * Initialize a newly created label element to have the given [name].
@@ -4233,7 +5190,21 @@
    */
   LabelElementImpl.forNode(
       Identifier name, this._onSwitchStatement, this._onSwitchMember)
-      : super.forNode(name);
+      : _unlinkedLabel = null,
+        super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  LabelElementImpl.forSerialized(
+      UnlinkedLabel unlinkedLabel, ExecutableElementImpl enclosingExecutable)
+      : _unlinkedLabel = unlinkedLabel,
+        _onSwitchStatement = unlinkedLabel.isOnSwitchStatement,
+        _onSwitchMember = unlinkedLabel.isOnSwitchMember,
+        super.forSerialized(enclosingExecutable);
+
+  @override
+  String get displayName => name;
 
   @override
   ExecutableElement get enclosingElement =>
@@ -4254,7 +5225,42 @@
   ElementKind get kind => ElementKind.LABEL;
 
   @override
+  String get name {
+    if (_unlinkedLabel != null) {
+      return _unlinkedLabel.name;
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedLabel != null) {
+      return _unlinkedLabel.nameOffset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
+
+  /**
+   * Create and return [LabelElement]s for the given [unlinkedLabels].
+   */
+  static List<LabelElement> resynthesizeList(
+      ExecutableElementImpl enclosingExecutable,
+      List<UnlinkedLabel> unlinkedLabels) {
+    int length = unlinkedLabels.length;
+    if (length != 0) {
+      List<LabelElement> elements = new List<LabelElement>(length);
+      for (int i = 0; i < length; i++) {
+        elements[i] = new LabelElementImpl.forSerialized(
+            unlinkedLabels[i], enclosingExecutable);
+      }
+      return elements;
+    } else {
+      return const <LabelElement>[];
+    }
+  }
 }
 
 /**
@@ -4444,7 +5450,7 @@
         libraries.add(library);
       }
     }
-    return new List.from(libraries);
+    return libraries.toList(growable: false);
   }
 
   @override
@@ -4534,7 +5540,7 @@
         libraries.add(library);
       }
     }
-    return new List.from(libraries);
+    return libraries.toList(growable: false);
   }
 
   @override
@@ -4747,7 +5753,7 @@
           prefixes.add(prefix);
         }
       }
-      _prefixes = prefixes.toList();
+      _prefixes = prefixes.toList(growable: false);
     }
     return _prefixes;
   }
@@ -4782,9 +5788,9 @@
 
   @override
   List<LibraryElement> get visibleLibraries {
-    Set<LibraryElement> visibleLibraries = new Set();
+    HashSet<LibraryElement> visibleLibraries = new HashSet<LibraryElement>();
     _addVisibleLibraries(visibleLibraries, false);
-    return new List.from(visibleLibraries);
+    return visibleLibraries.toList(growable: false);
   }
 
   @override
@@ -5109,6 +6115,22 @@
       ExecutableElementImpl enclosingExecutable)
       : super.forSerialized(unlinkedVariable, enclosingExecutable);
 
+  /**
+   * Initialize using the given serialized information.
+   */
+  factory LocalVariableElementImpl.forSerializedFactory(
+      UnlinkedVariable unlinkedVariable,
+      ExecutableElementImpl enclosingExecutable) {
+    if (unlinkedVariable.isConst &&
+        unlinkedVariable.initializer?.bodyExpr != null) {
+      return new ConstLocalVariableElementImpl.forSerialized(
+          unlinkedVariable, enclosingExecutable);
+    } else {
+      return new LocalVariableElementImpl.forSerialized(
+          unlinkedVariable, enclosingExecutable);
+    }
+  }
+
   @override
   String get identifier {
     int enclosingOffset =
@@ -5128,6 +6150,13 @@
 
   @override
   SourceRange get visibleRange {
+    if (_unlinkedVariable != null) {
+      if (_unlinkedVariable.visibleLength == 0) {
+        return null;
+      }
+      return new SourceRange(
+          _unlinkedVariable.visibleOffset, _unlinkedVariable.visibleLength);
+    }
     if (_visibleRangeLength < 0) {
       return null;
     }
@@ -5153,6 +6182,7 @@
    * [offset] with the given [length].
    */
   void setVisibleRange(int offset, int length) {
+    assert(_unlinkedVariable == null);
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
@@ -5189,6 +6219,14 @@
   }
 
   @override
+  List<TypeParameterType> get allEnclosingTypeParameterTypes {
+    if (isStatic) {
+      return const <TypeParameterType>[];
+    }
+    return super.allEnclosingTypeParameterTypes;
+  }
+
+  @override
   String get displayName {
     String displayName = super.displayName;
     if ("unary-" == displayName) {
@@ -5595,7 +6633,7 @@
     HashSet<Element> elements = new HashSet<Element>();
     _add(elements, firstElement);
     _add(elements, secondElement);
-    return new List.from(elements);
+    return elements.toList(growable: false);
   }
 }
 
@@ -5746,6 +6784,29 @@
   }
 
   @override
+  FunctionElement get initializer {
+    if (_unlinkedVariable != null && _initializer == null) {
+      UnlinkedExecutable unlinkedInitializer = _unlinkedVariable.initializer;
+      if (unlinkedInitializer != null) {
+        _initializer = new FunctionElementImpl.forSerialized(
+            unlinkedInitializer, this)..synthetic = true;
+      } else {
+        return null;
+      }
+    }
+    return super.initializer;
+  }
+
+  /**
+   * Set the function representing this variable's initializer to the given
+   * [function].
+   */
+  void set initializer(FunctionElement function) {
+    assert(_unlinkedVariable == null);
+    super.initializer = function;
+  }
+
+  @override
   bool get isConst {
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.isConst;
@@ -5785,6 +6846,27 @@
     }
     return super.nameOffset;
   }
+
+  @override
+  DartType get type {
+    if (_unlinkedVariable != null && _type == null) {
+      _type = enclosingUnit.resynthesizerContext.resolveLinkedType(
+              _unlinkedVariable.inferredTypeSlot, typeParameterContext) ??
+          enclosingUnit.resynthesizerContext
+              .resolveTypeRef(_unlinkedVariable.type, typeParameterContext);
+    }
+    return super.type;
+  }
+
+  void set type(DartType type) {
+    assert(_unlinkedVariable == null);
+    _type = type;
+  }
+
+  /**
+   * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
+   */
+  UnlinkedConst get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr;
 }
 
 /**
@@ -5856,6 +6938,34 @@
       : super.forSerialized(enclosingElement);
 
   /**
+   * Initialize using the given serialized information.
+   */
+  factory ParameterElementImpl.forSerializedFactory(
+      UnlinkedParam unlinkedParameter, ElementImpl enclosingElement,
+      {bool synthetic: false}) {
+    ParameterElementImpl element;
+    if (unlinkedParameter.isInitializingFormal) {
+      if (unlinkedParameter.kind == UnlinkedParamKind.required) {
+        element = new FieldFormalParameterElementImpl.forSerialized(
+            unlinkedParameter, enclosingElement);
+      } else {
+        element = new DefaultFieldFormalParameterElementImpl.forSerialized(
+            unlinkedParameter, enclosingElement);
+      }
+    } else {
+      if (unlinkedParameter.kind == UnlinkedParamKind.required) {
+        element = new ParameterElementImpl.forSerialized(
+            unlinkedParameter, enclosingElement);
+      } else {
+        element = new DefaultParameterElementImpl.forSerialized(
+            unlinkedParameter, enclosingElement);
+      }
+    }
+    element.synthetic = synthetic;
+    return element;
+  }
+
+  /**
    * Creates a synthetic parameter with [name], [type] and [kind].
    */
   factory ParameterElementImpl.synthetic(
@@ -5929,6 +7039,29 @@
   }
 
   @override
+  FunctionElement get initializer {
+    if (_unlinkedParam != null && _initializer == null) {
+      UnlinkedExecutable unlinkedInitializer = _unlinkedParam.initializer;
+      if (unlinkedInitializer != null) {
+        _initializer = new FunctionElementImpl.forSerialized(
+            unlinkedInitializer, this)..synthetic = true;
+      } else {
+        return null;
+      }
+    }
+    return super.initializer;
+  }
+
+  /**
+   * Set the function representing this variable's initializer to the given
+   * [function].
+   */
+  void set initializer(FunctionElement function) {
+    assert(_unlinkedParam == null);
+    super.initializer = function;
+  }
+
+  @override
   bool get isConst {
     if (_unlinkedParam != null) {
       return false;
@@ -6008,7 +7141,10 @@
   }
 
   @override
-  List<ParameterElement> get parameters => _parameters;
+  List<ParameterElement> get parameters {
+    _resynthesizeTypeAndParameters();
+    return _parameters;
+  }
 
   /**
    * Set the parameters defined by this executable element to the given
@@ -6023,12 +7159,7 @@
 
   @override
   DartType get type {
-    if (_unlinkedParam != null && _type == null) {
-      _type = enclosingUnit.resynthesizerContext.resolveLinkedType(
-              _unlinkedParam.inferredTypeSlot, typeParameterContext) ??
-          enclosingUnit.resynthesizerContext
-              .resolveTypeRef(_unlinkedParam.type, typeParameterContext);
-    }
+    _resynthesizeTypeAndParameters();
     return super.type;
   }
 
@@ -6061,6 +7192,11 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
 
+  /**
+   * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
+   */
+  UnlinkedConst get _unlinkedConst => _unlinkedParam?.initializer?.bodyExpr;
+
   @override
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
 
@@ -6111,7 +7247,90 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    safelyVisitChildren(_parameters, visitor);
+    safelyVisitChildren(parameters, visitor);
+  }
+
+  /**
+   * If this element is resynthesized, and its type and parameters have not
+   * been build yet, build them and remember in the corresponding fields.
+   */
+  void _resynthesizeTypeAndParameters() {
+    if (_unlinkedParam != null && _type == null) {
+      if (_unlinkedParam.isFunctionTyped) {
+        CompilationUnitElementImpl enclosingUnit = this.enclosingUnit;
+        FunctionElementImpl parameterTypeElement =
+            new FunctionElementImpl_forFunctionTypedParameter(
+                enclosingUnit, this);
+        if (!isSynthetic) {
+          parameterTypeElement.enclosingElement = this;
+        }
+        List<ParameterElement> subParameters = ParameterElementImpl
+            .resynthesizeList(_unlinkedParam.parameters, this,
+                synthetic: isSynthetic);
+        if (isSynthetic) {
+          parameterTypeElement.parameters = subParameters;
+        } else {
+          _parameters = subParameters;
+          parameterTypeElement.shareParameters(subParameters);
+        }
+        parameterTypeElement.returnType = enclosingUnit.resynthesizerContext
+            .resolveTypeRef(_unlinkedParam.type, typeParameterContext);
+        FunctionTypeImpl parameterType =
+            new FunctionTypeImpl.elementWithNameAndArgs(parameterTypeElement,
+                null, typeParameterContext.allTypeParameterTypes, false);
+        parameterTypeElement.type = parameterType;
+        _type = parameterType;
+      } else {
+        _type = enclosingUnit.resynthesizerContext.resolveLinkedType(
+                _unlinkedParam.inferredTypeSlot, typeParameterContext) ??
+            enclosingUnit.resynthesizerContext
+                .resolveTypeRef(_unlinkedParam.type, typeParameterContext);
+      }
+    }
+  }
+
+  /**
+   * Create and return [ParameterElement]s for the given [unlinkedParameters].
+   */
+  static List<ParameterElement> resynthesizeList(
+      List<UnlinkedParam> unlinkedParameters, ElementImpl enclosingElement,
+      {bool synthetic: false}) {
+    int length = unlinkedParameters.length;
+    if (length != 0) {
+      List<ParameterElement> parameters = new List<ParameterElement>(length);
+      for (int i = 0; i < length; i++) {
+        parameters[i] = new ParameterElementImpl.forSerializedFactory(
+            unlinkedParameters[i], enclosingElement,
+            synthetic: synthetic);
+      }
+      return parameters;
+    } else {
+      return const <ParameterElement>[];
+    }
+  }
+}
+
+/**
+ * The parameter of an implicit setter.
+ */
+class ParameterElementImpl_ofImplicitSetter extends ParameterElementImpl {
+  final PropertyAccessorElementImpl_ImplicitSetter setter;
+
+  ParameterElementImpl_ofImplicitSetter(
+      PropertyAccessorElementImpl_ImplicitSetter setter)
+      : setter = setter,
+        super('_${setter.variable.name}', setter.variable.nameOffset) {
+    enclosingElement = setter;
+    synthetic = true;
+    parameterKind = ParameterKind.REQUIRED;
+  }
+
+  @override
+  DartType get type => setter.variable.type;
+
+  @override
+  void set type(FunctionType type) {
+    assert(false); // Should never be called.
   }
 }
 
@@ -6263,6 +7482,14 @@
   }
 
   @override
+  List<TypeParameterType> get allEnclosingTypeParameterTypes {
+    if (isStatic) {
+      return const <TypeParameterType>[];
+    }
+    return super.allEnclosingTypeParameterTypes;
+  }
+
+  @override
   PropertyAccessorElement get correspondingGetter {
     if (isGetter || variable == null) {
       return null;
@@ -6302,9 +7529,6 @@
   }
 
   @override
-  int get hashCode => JenkinsSmiHash.hash2(super.hashCode, isGetter ? 1 : 2);
-
-  @override
   String get identifier {
     String name = displayName;
     String suffix = isGetter ? "?" : "=";
@@ -6372,11 +7596,6 @@
   }
 
   @override
-  bool operator ==(Object object) =>
-      super == object &&
-      isGetter == (object as PropertyAccessorElement).isGetter;
-
-  @override
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
 
   @override
@@ -6401,6 +7620,89 @@
 }
 
 /**
+ * Implicit getter for a [PropertyInducingElementImpl].
+ */
+class PropertyAccessorElementImpl_ImplicitGetter
+    extends PropertyAccessorElementImpl {
+  /**
+   * Create the implicit getter and bind it to the [property].
+   */
+  PropertyAccessorElementImpl_ImplicitGetter(
+      PropertyInducingElementImpl property)
+      : super.forVariable(property) {
+    property.getter = this;
+    enclosingElement = property.enclosingElement;
+  }
+
+  @override
+  bool get hasImplicitReturnType => variable.hasImplicitType;
+
+  @override
+  bool get isGetter => true;
+
+  @override
+  DartType get returnType => variable.type;
+
+  @override
+  void set returnType(DartType returnType) {
+    assert(false); // Should never be called.
+  }
+
+  @override
+  DartType get type {
+    return _type ??= new FunctionTypeImpl(this);
+  }
+
+  @override
+  void set type(FunctionType type) {
+    assert(false); // Should never be called.
+  }
+}
+
+/**
+ * Implicit setter for a [PropertyInducingElementImpl].
+ */
+class PropertyAccessorElementImpl_ImplicitSetter
+    extends PropertyAccessorElementImpl {
+  /**
+   * Create the implicit setter and bind it to the [property].
+   */
+  PropertyAccessorElementImpl_ImplicitSetter(
+      PropertyInducingElementImpl property)
+      : super.forVariable(property) {
+    property.setter = this;
+  }
+
+  @override
+  bool get isSetter => true;
+
+  @override
+  List<ParameterElement> get parameters {
+    return _parameters ??= <ParameterElement>[
+      new ParameterElementImpl_ofImplicitSetter(this)
+    ];
+  }
+
+  @override
+  DartType get returnType => VoidTypeImpl.instance;
+
+  @override
+  void set returnType(DartType returnType) {
+    assert(false); // Should never be called.
+  }
+
+  @override
+  DartType get type {
+    return _type ??= new FunctionTypeImpl(this);
+  }
+
+  @override
+  void set type(FunctionType type) {
+    assert(false); // Should never be called.
+  }
+}
+
+/**
  * A concrete implementation of a [PropertyInducingElement].
  */
 abstract class PropertyInducingElementImpl
@@ -6421,7 +7723,7 @@
    * The propagated type of this variable, or `null` if type propagation has not
    * been performed.
    */
-  DartType propagatedType;
+  DartType _propagatedType;
 
   /**
    * Initialize a newly created synthetic element to have the given [name] and
@@ -6440,6 +7742,20 @@
   PropertyInducingElementImpl.forSerialized(
       UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
       : super.forSerialized(unlinkedVariable, enclosingElement);
+
+  @override
+  DartType get propagatedType {
+    if (_unlinkedVariable != null && _propagatedType == null) {
+      _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType(
+          _unlinkedVariable.propagatedTypeSlot, typeParameterContext);
+    }
+    return _propagatedType;
+  }
+
+  void set propagatedType(DartType propagatedType) {
+    assert(_unlinkedVariable == null);
+    _propagatedType = propagatedType;
+  }
 }
 
 /**
@@ -6462,16 +7778,23 @@
   UnitExplicitTopLevelAccessors buildTopLevelAccessors();
 
   /**
-   * Build top-level functions.
-   */
-  List<FunctionElementImpl> buildTopLevelFunctions();
-
-  /**
    * Build explicit top-level variables.
    */
   UnitExplicitTopLevelVariables buildTopLevelVariables();
 
   /**
+   * Return `true` if the given const constructor [slot] is a part of a cycle.
+   */
+  bool isInConstCycle(int slot);
+
+  /**
+   * Resolve an [EntityRef] into a constructor.  If the reference is
+   * unresolved, return `null`.
+   */
+  ConstructorElement resolveConstructorRef(
+      TypeParameterizedElementMixin typeParameterContext, EntityRef entry);
+
+  /**
    * Build the appropriate [DartType] object corresponding to a slot id in the
    * [LinkedUnit.types] table.
    */
@@ -6626,11 +7949,6 @@
   final UnlinkedTypeParam _unlinkedTypeParam;
 
   /**
-   * The [TypeParameterizedElement] enclosing this one.
-   */
-  final TypeParameterizedElementMixin _enclosingTypeParameterizedElement;
-
-  /**
    * The number of type parameters whose scope overlaps this one, and which are
    * declared earlier in the file.
    *
@@ -6656,7 +7974,6 @@
   TypeParameterElementImpl(String name, int offset)
       : _unlinkedTypeParam = null,
         nestingLevel = null,
-        _enclosingTypeParameterizedElement = null,
         super(name, offset);
 
   /**
@@ -6665,17 +7982,13 @@
   TypeParameterElementImpl.forNode(Identifier name)
       : _unlinkedTypeParam = null,
         nestingLevel = null,
-        _enclosingTypeParameterizedElement = null,
         super.forNode(name);
 
   /**
    * Initialize using the given serialized information.
    */
-  TypeParameterElementImpl.forSerialized(
-      this._unlinkedTypeParam,
-      ElementImpl enclosingElement,
-      this._enclosingTypeParameterizedElement,
-      this.nestingLevel)
+  TypeParameterElementImpl.forSerialized(this._unlinkedTypeParam,
+      TypeParameterizedElementMixin enclosingElement, this.nestingLevel)
       : super.forSerialized(enclosingElement);
 
   /**
@@ -6685,7 +7998,6 @@
   TypeParameterElementImpl.synthetic(String name)
       : _unlinkedTypeParam = null,
         nestingLevel = null,
-        _enclosingTypeParameterizedElement = null,
         super(name, -1) {
     synthetic = true;
   }
@@ -6727,14 +8039,6 @@
   String get displayName => name;
 
   @override
-  Element get enclosingElement {
-    if (_unlinkedTypeParam != null) {
-      return _enclosingTypeParameterizedElement;
-    }
-    return super.enclosingElement;
-  }
-
-  @override
   ElementKind get kind => ElementKind.TYPE_PARAMETER;
 
   @override
@@ -6791,9 +8095,34 @@
  */
 abstract class TypeParameterizedElementMixin
     implements TypeParameterizedElement, ElementImpl {
-  List<TypeParameterType> _typeParameterTypes;
-  List<TypeParameterElement> _typeParameterElements;
   int _nestingLevel;
+  List<TypeParameterElement> _typeParameterElements;
+  List<TypeParameterType> _typeParameterTypes;
+  List<TypeParameterType> _allTypeParameterTypes;
+
+  /**
+   * Return all type parameter types of the element that encloses element.
+   * Not `null`, but might be empty for top-level and static class members.
+   */
+  List<TypeParameterType> get allEnclosingTypeParameterTypes {
+    return enclosingTypeParameterContext?.allTypeParameterTypes ??
+        const <TypeParameterType>[];
+  }
+
+  /**
+   * Return all type parameter types of this element.
+   */
+  List<TypeParameterType> get allTypeParameterTypes {
+    if (_allTypeParameterTypes == null) {
+      _allTypeParameterTypes = <TypeParameterType>[];
+      // The most logical order would be (enclosing, this).
+      // But we have to have it like this to be consistent with (inconsistent
+      // by itself) element builder for generic functions.
+      _allTypeParameterTypes.addAll(typeParameterTypes);
+      _allTypeParameterTypes.addAll(allEnclosingTypeParameterTypes);
+    }
+    return _allTypeParameterTypes;
+  }
 
   /**
    * Get the type parameter context enclosing this one, if any.
@@ -6821,7 +8150,7 @@
           new List<TypeParameterElement>(numTypeParameters);
       for (int i = 0; i < numTypeParameters; i++) {
         _typeParameterElements[i] = new TypeParameterElementImpl.forSerialized(
-            unlinkedTypeParams[i], this, this, enclosingNestingLevel + i);
+            unlinkedTypeParams[i], this, enclosingNestingLevel + i);
       }
     }
     return _typeParameterElements;
@@ -6832,11 +8161,9 @@
    * element's type parameters.
    */
   List<TypeParameterType> get typeParameterTypes {
-    if (_typeParameterTypes == null) {
-      _typeParameterTypes =
-          typeParameters.map((TypeParameterElement e) => e.type).toList();
-    }
-    return _typeParameterTypes;
+    return _typeParameterTypes ??= typeParameters
+        .map((TypeParameterElement e) => e.type)
+        .toList(growable: false);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index 0e71499..633fcb0 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -98,67 +98,29 @@
   List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
 
   @override
-  ConstructorElement get unnamedConstructor {
-    ensureConstructorsReady();
-    return actualElement.unnamedConstructor;
-  }
+  ConstructorElement get unnamedConstructor => actualElement.unnamedConstructor;
 
   @override
   NamedCompilationUnitMember computeNode() => super.computeNode();
 
-  /**
-   * Ensure that [ClassElement.accessors] and [ClassElement.fields] are ready
-   * in [actualElement].
-   */
-  void ensureAccessorsReady() {}
-
-  /**
-   * The method is called by [ClassElementImpl.getImpl] before returning
-   * the [actualElement] as [ClassElementImpl]. At this moment we must ensure
-   * that [ClassElementImpl] is fully complete, we cannot continue filling it
-   * lazily.
-   */
-  void ensureActualElementComplete() {}
-
-  /**
-   * Ensure that [ClassElement.constructors] are ready in [actualElement].
-   */
-  void ensureConstructorsReady() {}
-
-  /**
-   * Ensure that [ClassElement.methods] are ready in [actualElement].
-   */
-  void ensureMethodsReady() {}
+  @override
+  FieldElement getField(String fieldName) => actualElement.getField(fieldName);
 
   @override
-  FieldElement getField(String fieldName) {
-    ensureAccessorsReady();
-    return actualElement.getField(fieldName);
-  }
+  PropertyAccessorElement getGetter(String getterName) =>
+      actualElement.getGetter(getterName);
 
   @override
-  PropertyAccessorElement getGetter(String getterName) {
-    ensureAccessorsReady();
-    return actualElement.getGetter(getterName);
-  }
+  MethodElement getMethod(String methodName) =>
+      actualElement.getMethod(methodName);
 
   @override
-  MethodElement getMethod(String methodName) {
-    ensureMethodsReady();
-    return actualElement.getMethod(methodName);
-  }
+  ConstructorElement getNamedConstructor(String name) =>
+      actualElement.getNamedConstructor(name);
 
   @override
-  ConstructorElement getNamedConstructor(String name) {
-    ensureConstructorsReady();
-    return actualElement.getNamedConstructor(name);
-  }
-
-  @override
-  PropertyAccessorElement getSetter(String setterName) {
-    ensureAccessorsReady();
-    return actualElement.getSetter(setterName);
-  }
+  PropertyAccessorElement getSetter(String setterName) =>
+      actualElement.getSetter(setterName);
 
   @override
   bool isSuperConstructorAccessible(ConstructorElement constructor) =>
@@ -166,10 +128,8 @@
 
   @override
   MethodElement lookUpConcreteMethod(
-      String methodName, LibraryElement library) {
-    ensureMethodsReady();
-    return actualElement.lookUpConcreteMethod(methodName, library);
-  }
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpConcreteMethod(methodName, library);
 
   @override
   PropertyAccessorElement lookUpGetter(
@@ -178,44 +138,33 @@
 
   @override
   PropertyAccessorElement lookUpInheritedConcreteGetter(
-      String methodName, LibraryElement library) {
-    ensureAccessorsReady();
-    return actualElement.lookUpInheritedConcreteGetter(methodName, library);
-  }
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteGetter(methodName, library);
 
   @override
   MethodElement lookUpInheritedConcreteMethod(
-      String methodName, LibraryElement library) {
-    ensureMethodsReady();
-    return actualElement.lookUpInheritedConcreteMethod(methodName, library);
-  }
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteMethod(methodName, library);
 
   @override
   PropertyAccessorElement lookUpInheritedConcreteSetter(
-      String methodName, LibraryElement library) {
-    ensureAccessorsReady();
-    return actualElement.lookUpInheritedConcreteSetter(methodName, library);
-  }
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteSetter(methodName, library);
 
   @override
   MethodElement lookUpInheritedMethod(
       String methodName, LibraryElement library) {
-    ensureMethodsReady();
     return actualElement.lookUpInheritedMethod(methodName, library);
   }
 
   @override
-  MethodElement lookUpMethod(String methodName, LibraryElement library) {
-    ensureMethodsReady();
-    return actualElement.lookUpMethod(methodName, library);
-  }
+  MethodElement lookUpMethod(String methodName, LibraryElement library) =>
+      actualElement.lookUpMethod(methodName, library);
 
   @override
   PropertyAccessorElement lookUpSetter(
-      String setterName, LibraryElement library) {
-    ensureAccessorsReady();
-    return actualElement.lookUpSetter(setterName, library);
-  }
+          String setterName, LibraryElement library) =>
+      actualElement.lookUpSetter(setterName, library);
 }
 
 /**
@@ -1022,10 +971,10 @@
       actualElement.correspondingSetter;
 
   @override
-  bool get isGetter => actualElement.isGetter;
+  bool get isGetter => !isSetter;
 
   @override
-  bool get isSetter => actualElement.isSetter;
+  bool get isSetter => location.components.last.endsWith('=');
 
   @override
   ElementKind get kind {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 0ee0b97..8d6aec0 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -774,7 +774,8 @@
     //
     // Now instantiate([V]), and the result should be:
     //     {U/T, V/S} T -> S.
-    List<DartType> newTypeArgs = typeArguments.toList();
+    List<DartType> newTypeArgs = <DartType>[];
+    newTypeArgs.addAll(typeArguments);
     newTypeArgs.addAll(argumentTypes);
 
     return new FunctionTypeImpl._(
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 724ddc5..2a49090 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1136,7 +1136,7 @@
   @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ClassElementImpl enclosingClass =
-        ClassElementImpl.getImpl(_resolver.enclosingClass);
+        AbstractClassElementImpl.getImpl(_resolver.enclosingClass);
     if (enclosingClass == null) {
       // TODO(brianwilkerson) Report this error.
       return null;
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 9fb06c5..633243a 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/error_processor.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart' show ScannerErrorCode;
 import 'package:analyzer/src/generated/generated/shared_messages.dart'
@@ -21,7 +22,6 @@
 import 'package:analyzer/src/task/model.dart';
 import 'package:analyzer/task/model.dart';
 import 'package:source_span/source_span.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 
 /**
  * The descriptor used to associate error processors with analysis contexts in
@@ -123,6 +123,12 @@
   }
 
   /**
+   * Initialize a newly created analysis error with given values.
+   */
+  AnalysisError.forValues(this.source, this.offset, this.length, this.errorCode,
+      this._message, this._correction);
+
+  /**
    * Return the template used to create the correction to be displayed for this
    * error, or `null` if there is no correction information for this error. The
    * correction should indicate how the user can fix the error.
@@ -3023,6 +3029,11 @@
   ];
 
   /**
+   * The lazy initialized map from [uniqueName] to the [ErrorCode] instance.
+   */
+  static HashMap<String, ErrorCode> _uniqueNameToCodeMap;
+
+  /**
    * An empty list of error codes.
    */
   static const List<ErrorCode> EMPTY_LIST = const <ErrorCode>[];
@@ -3070,6 +3081,20 @@
 
   @override
   String toString() => uniqueName;
+
+  /**
+   * Return the [ErrorCode] with the given [uniqueName], or `null` if not
+   * found.
+   */
+  static ErrorCode byUniqueName(String uniqueName) {
+    if (_uniqueNameToCodeMap == null) {
+      _uniqueNameToCodeMap = new HashMap<String, ErrorCode>();
+      for (ErrorCode errorCode in values) {
+        _uniqueNameToCodeMap[errorCode.uniqueName] = errorCode;
+      }
+    }
+    return _uniqueNameToCodeMap[uniqueName];
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 78b7cf3..4bf1d0e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -211,6 +211,12 @@
   ClassElementImpl _enclosingClass;
 
   /**
+   * The enum containing the AST nodes being visited, or `null` if we are not
+   * in the scope of an enum.
+   */
+  ClassElement _enclosingEnum;
+
+  /**
    * The method or function that we are currently visiting, or `null` if we are
    * not inside a method or function.
    */
@@ -435,7 +441,7 @@
     ClassElementImpl outerClass = _enclosingClass;
     try {
       _isInNativeClass = node.nativeClause != null;
-      _enclosingClass = ClassElementImpl.getImpl(node.element);
+      _enclosingClass = AbstractClassElementImpl.getImpl(node.element);
       ExtendsClause extendsClause = node.extendsClause;
       ImplementsClause implementsClause = node.implementsClause;
       WithClause withClause = node.withClause;
@@ -484,7 +490,7 @@
    */
   void visitClassDeclarationIncrementally(ClassDeclaration node) {
     _isInNativeClass = node.nativeClause != null;
-    _enclosingClass = ClassElementImpl.getImpl(node.element);
+    _enclosingClass = AbstractClassElementImpl.getImpl(node.element);
     // initialize initialFieldElementsMap
     if (_enclosingClass != null) {
       List<FieldElement> fieldElements = _enclosingClass.fields;
@@ -504,7 +510,7 @@
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     ClassElementImpl outerClassElement = _enclosingClass;
     try {
-      _enclosingClass = ClassElementImpl.getImpl(node.element);
+      _enclosingClass = AbstractClassElementImpl.getImpl(node.element);
       ImplementsClause implementsClause = node.implementsClause;
       // Only check for all of the inheritance logic around clauses if there
       // isn't an error code such as "Cannot extend double" already on the
@@ -622,13 +628,12 @@
 
   @override
   Object visitEnumDeclaration(EnumDeclaration node) {
-    ClassElementImpl outerClass = _enclosingClass;
+    ClassElement outerEnum = _enclosingEnum;
     try {
-      _isInNativeClass = false;
-      _enclosingClass = ClassElementImpl.getImpl(node.element);
+      _enclosingEnum = node.element;
       return super.visitEnumDeclaration(node);
     } finally {
-      _enclosingClass = outerClass;
+      _enclosingEnum = outerEnum;
     }
   }
 
@@ -5199,7 +5204,7 @@
       return;
     }
     Element element = type.element;
-    if (element is TypeParameterizedElement) {
+    if (element is ClassElement) {
       // prepare type parameters
       List<TypeParameterElement> parameterElements = element.typeParameters;
       List<DartType> parameterTypes = element.type.typeArguments;
@@ -5364,6 +5369,9 @@
     if (identical(enclosingElement, _enclosingClass)) {
       return;
     }
+    if (identical(enclosingElement, _enclosingEnum)) {
+      return;
+    }
     if (enclosingElement is! ClassElement) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 04f9153..b23d188 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -77,6 +77,12 @@
   ClassElementImpl _enclosingClass;
 
   /**
+   * The enum containing the AST nodes being visited, or `null` if we are not
+   * in the scope of an enum.
+   */
+  EnumElementImpl _enclosingEnum;
+
+  /**
    * The parameter containing the AST nodes being visited, or `null` if we are not in the
    * scope of a parameter.
    */
@@ -214,7 +220,7 @@
   @override
   visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     String name = node.name.name;
-    FieldElement element = _findElement(_enclosingClass.fields, name);
+    FieldElement element = _findElement(_enclosingEnum.fields, name);
     _processElement(element);
   }
 
@@ -222,7 +228,7 @@
   visitEnumDeclaration(EnumDeclaration node) {
     String name = node.name.name;
     ClassElement element = _findElement(_enclosingUnit.enums, name);
-    _enclosingClass = element;
+    _enclosingEnum = element;
     _processElement(element);
     _assertTrue(element.isEnum);
     super.visitEnumDeclaration(node);
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index f63edfa..c90928f 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -216,16 +216,19 @@
       8,
       (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => target
           ._parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
-  'parseConstructorFieldInitializer_0': new MethodTrampoline(
-      0, (Parser target) => target._parseConstructorFieldInitializer()),
+  'parseConstructorFieldInitializer_1': new MethodTrampoline(1,
+      (Parser target, arg0) => target._parseConstructorFieldInitializer(arg0)),
   'parseContinueStatement_0': new MethodTrampoline(
       0, (Parser target) => target._parseContinueStatement()),
   'parseDirective_1': new MethodTrampoline(
       1, (Parser target, arg0) => target._parseDirective(arg0)),
   'parseDirectives_0':
       new MethodTrampoline(0, (Parser target) => target._parseDirectives()),
-  'parseDocumentationComment_0': new MethodTrampoline(
-      0, (Parser target) => target._parseDocumentationComment()),
+  'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) {
+    List<DocumentationCommentToken> tokens =
+        target._parseDocumentationCommentTokens();
+    return target._parseDocumentationComment(tokens);
+  }),
   'parseDoStatement_0':
       new MethodTrampoline(0, (Parser target) => target._parseDoStatement()),
   'parseDottedName_0':
@@ -320,13 +323,15 @@
   'parseOptionalReturnType_0': new MethodTrampoline(
       0, (Parser target) => target._parseOptionalReturnType()),
   'parsePartDirective_1': new MethodTrampoline(
-      1, (Parser target, arg0) => target._parsePartDirective(arg0)),
+      1, (Parser target, arg0) => target._parsePartOrPartOfDirective(arg0)),
   'parsePostfixExpression_0': new MethodTrampoline(
       0, (Parser target) => target._parsePostfixExpression()),
   'parsePrimaryExpression_0': new MethodTrampoline(
       0, (Parser target) => target._parsePrimaryExpression()),
-  'parseRedirectingConstructorInvocation_0': new MethodTrampoline(
-      0, (Parser target) => target._parseRedirectingConstructorInvocation()),
+  'parseRedirectingConstructorInvocation_1': new MethodTrampoline(
+      1,
+      (Parser target, arg0) =>
+          target._parseRedirectingConstructorInvocation(arg0)),
   'parseRelationalExpression_0': new MethodTrampoline(
       0, (Parser target) => target._parseRelationalExpression()),
   'parseRethrowExpression_0': new MethodTrampoline(
@@ -493,7 +498,7 @@
   final Comment comment;
 
   /**
-   * The metadata that was parsed.
+   * The metadata that was parsed, or `null` if none was given.
    */
   final List<Annotation> metadata;
 
@@ -501,6 +506,11 @@
    * Initialize a newly created holder with the given [comment] and [metadata].
    */
   CommentAndMetadata(this.comment, this.metadata);
+
+  /**
+   * Return `true` if some metadata was parsed.
+   */
+  bool get hasMetadata => metadata != null && metadata.isNotEmpty;
 }
 
 /**
@@ -2147,7 +2157,7 @@
 
   /**
    * A flag indicating whether the parser is currently in a function body marked
-   * as being 'async'.
+   * (by a star) as being a generator.
    */
   bool _inGenerator = false;
 
@@ -2163,7 +2173,7 @@
 
   /**
    * A flag indicating whether the parser is currently in a constructor field
-   * initializer, with no intervening parens, braces, or brackets.
+   * initializer, with no intervening parentheses, braces, or brackets.
    */
   bool _inInitializer = false;
 
@@ -2179,14 +2189,16 @@
   bool parseGenericMethodComments = false;
 
   /**
-   * Initialize a newly created parser to parse the content of the given
-   * [_source] and to report any errors that are found to the given
-   * [_errorListener].
+   * Initialize a newly created parser to parse tokens in the given [_source]
+   * and to report any errors that are found to the given [_errorListener].
    */
   Parser(this._source, this._errorListener);
 
-  void set currentToken(Token currentToken) {
-    this._currentToken = currentToken;
+  /**
+   * Set the token with which the parse is to begin to the given [token].
+   */
+  void set currentToken(Token token) {
+    this._currentToken = token;
   }
 
   /**
@@ -2195,6 +2207,7 @@
    * parameters, followed by a left-parenthesis. This is used by
    * [_parseTypeAlias] to determine whether or not to parse a return type.
    */
+  @deprecated
   bool get hasReturnTypeInTypeAlias {
     Token next = _skipReturnType(_currentToken);
     if (next == null) {
@@ -2229,19 +2242,20 @@
    */
   Token getAndAdvance() {
     Token token = _currentToken;
-    _advance();
+    _currentToken = _currentToken.next;
     return token;
   }
 
   /**
    * Parse an annotation. Return the annotation that was parsed.
    *
+   * This method assumes that the current token matches [TokenType.AT].
+   *
    *     annotation ::=
    *         '@' qualified ('.' identifier)? arguments?
-   *
    */
   Annotation parseAnnotation() {
-    Token atSign = _expect(TokenType.AT);
+    Token atSign = getAndAdvance();
     Identifier name = parsePrefixedIdentifier();
     Token period = null;
     SimpleIdentifier constructorName = null;
@@ -2267,6 +2281,9 @@
    *         label expression
    */
   Expression parseArgument() {
+    // TODO(brianwilkerson) Consider returning a wrapper indicating whether the
+    // expression is a named expression in order to remove the 'is' check in
+    // 'parseArgumentList'.
     //
     // Both namedArgument and expression can start with an identifier, but only
     // namedArgument can have an identifier followed by a colon.
@@ -2281,6 +2298,8 @@
   /**
    * Parse a list of arguments. Return the argument list that was parsed.
    *
+   * This method assumes that the current token matches [TokenType.OPEN_PAREN].
+   *
    *     arguments ::=
    *         '(' argumentList? ')'
    *
@@ -2289,10 +2308,9 @@
    *       | expressionList (',' namedArgument)*
    */
   ArgumentList parseArgumentList() {
-    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
-    List<Expression> arguments = new List<Expression>();
+    Token leftParenthesis = getAndAdvance();
     if (_matches(TokenType.CLOSE_PAREN)) {
-      return new ArgumentList(leftParenthesis, arguments, getAndAdvance());
+      return new ArgumentList(leftParenthesis, null, getAndAdvance());
     }
     //
     // Even though unnamed arguments must all appear before any named arguments,
@@ -2302,30 +2320,30 @@
     _inInitializer = false;
     try {
       Expression argument = parseArgument();
-      arguments.add(argument);
+      List<Expression> arguments = <Expression>[argument];
       bool foundNamedArgument = argument is NamedExpression;
       bool generatedError = false;
       while (_optional(TokenType.COMMA)) {
         argument = parseArgument();
         arguments.add(argument);
-        if (foundNamedArgument) {
-          bool blankArgument =
-              argument is SimpleIdentifier && argument.name.isEmpty;
-          if (!generatedError &&
-              !(argument is NamedExpression && !blankArgument)) {
-            // Report the error, once, but allow the arguments to be in any
-            // order in the AST.
-            _reportErrorForCurrentToken(
-                ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT);
-            generatedError = true;
-          }
-        } else if (argument is NamedExpression) {
+        if (argument is NamedExpression) {
           foundNamedArgument = true;
+        } else if (foundNamedArgument) {
+          if (!generatedError) {
+            if (!argument.isSynthetic) {
+              // Report the error, once, but allow the arguments to be in any
+              // order in the AST.
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT);
+              generatedError = true;
+            }
+          }
         }
       }
-      // TODO(brianwilkerson) Recovery: Look at the left parenthesis to see
-      // whether there is a matching right parenthesis. If there is, then we're
-      // more likely missing a comma and should go back to parsing arguments.
+      // Recovery: If the next token is not a right parenthesis, look at the
+      // left parenthesis to see whether there is a matching right parenthesis.
+      // If there is, then we're more likely missing a comma and should go back
+      // to parsing arguments.
       Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       return new ArgumentList(leftParenthesis, arguments, rightParenthesis);
     } finally {
@@ -2343,16 +2361,15 @@
    */
   Expression parseBitwiseOrExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
-        _tokenMatches(_peek(), TokenType.BAR)) {
+    if (_currentToken.keyword == Keyword.SUPER &&
+        _currentToken.next.type == TokenType.BAR) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseBitwiseXorExpression();
     }
-    while (_matches(TokenType.BAR)) {
-      Token operator = getAndAdvance();
+    while (_currentToken.type == TokenType.BAR) {
       expression = new BinaryExpression(
-          expression, operator, _parseBitwiseXorExpression());
+          expression, getAndAdvance(), _parseBitwiseXorExpression());
     }
     return expression;
   }
@@ -2360,27 +2377,37 @@
   /**
    * Parse a block. Return the block that was parsed.
    *
+   * This method assumes that the current token matches
+   * [TokenType.OPEN_CURLY_BRACKET].
+   *
    *     block ::=
    *         '{' statements '}'
    */
   Block parseBlock() {
-    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
-    List<Statement> statements = new List<Statement>();
+    bool isEndOfBlock() {
+      TokenType type = _currentToken.type;
+      return type == TokenType.EOF || type == TokenType.CLOSE_CURLY_BRACKET;
+    }
+
+    Token leftBracket = getAndAdvance();
+    List<Statement> statements = <Statement>[];
     Token statementStart = _currentToken;
-    while (
-        !_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    while (!isEndOfBlock()) {
       Statement statement = parseStatement2();
-      if (statement != null) {
-        statements.add(statement);
-      }
       if (identical(_currentToken, statementStart)) {
         // Ensure that we are making progress and report an error if we're not.
         _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
             [_currentToken.lexeme]);
         _advance();
+      } else if (statement != null) {
+        statements.add(statement);
       }
       statementStart = _currentToken;
     }
+    // Recovery: If the next token is not a right curly bracket, look at the
+    // left curly bracket to see whether there is a matching right bracket. If
+    // there is, then we're more likely missing a semi-colon and should go back
+    // to parsing statements.
     Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
     return new Block(leftBracket, statements, rightBracket);
   }
@@ -2397,21 +2424,25 @@
   ClassMember parseClassMember(String className) {
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     Modifiers modifiers = _parseModifiers();
-    if (_matchesKeyword(Keyword.VOID)) {
-      TypeName returnType = parseReturnType();
-      if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.VOID) {
+      TypeName returnType =
+          new TypeName(new SimpleIdentifier(getAndAdvance()), null);
+      keyword = _currentToken.keyword;
+      Token next = _peek();
+      bool isFollowedByIdentifier = _tokenMatchesIdentifier(next);
+      if (keyword == Keyword.GET && isFollowedByIdentifier) {
         _validateModifiersForGetterOrSetterOrMethod(modifiers);
         return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
             modifiers.staticKeyword, returnType);
-      } else if (_matchesKeyword(Keyword.SET) &&
-          _tokenMatchesIdentifier(_peek())) {
+      } else if (keyword == Keyword.SET && isFollowedByIdentifier) {
         _validateModifiersForGetterOrSetterOrMethod(modifiers);
         return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
             modifiers.staticKeyword, returnType);
-      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
         _validateModifiersForOperator(modifiers);
-        return _parseOperator(
-            commentAndMetadata, modifiers.externalKeyword, returnType);
+        return _parseOperatorAfterKeyword(commentAndMetadata,
+            modifiers.externalKeyword, returnType, getAndAdvance());
       } else if (_matchesIdentifier() &&
           _peek().matchesAny(const <TokenType>[
             TokenType.OPEN_PAREN,
@@ -2456,20 +2487,21 @@
             ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
         return null;
       }
-    } else if (_matchesKeyword(Keyword.GET) &&
-        _tokenMatchesIdentifier(_peek())) {
+    }
+    Token next = _peek();
+    bool isFollowedByIdentifier = _tokenMatchesIdentifier(next);
+    if (keyword == Keyword.GET && isFollowedByIdentifier) {
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
       return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
           modifiers.staticKeyword, null);
-    } else if (_matchesKeyword(Keyword.SET) &&
-        _tokenMatchesIdentifier(_peek())) {
+    } else if (keyword == Keyword.SET && isFollowedByIdentifier) {
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
       return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
           modifiers.staticKeyword, null);
-    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+    } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
       _validateModifiersForOperator(modifiers);
-      return _parseOperator(
-          commentAndMetadata, modifiers.externalKeyword, null);
+      return _parseOperatorAfterKeyword(
+          commentAndMetadata, modifiers.externalKeyword, null, getAndAdvance());
     } else if (!_matchesIdentifier()) {
       //
       // Recover from an error.
@@ -2514,9 +2546,9 @@
         // We appear to have found an incomplete field declaration.
         //
         _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
-        List<VariableDeclaration> variables = new List<VariableDeclaration>();
-        variables.add(
-            new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+        VariableDeclaration variable =
+            new VariableDeclaration(_createSyntheticIdentifier(), null, null);
+        List<VariableDeclaration> variables = <VariableDeclaration>[variable];
         return new FieldDeclaration(
             commentAndMetadata.comment,
             commentAndMetadata.metadata,
@@ -2527,7 +2559,7 @@
       _reportErrorForToken(
           ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken);
       if (commentAndMetadata.comment != null ||
-          !commentAndMetadata.metadata.isEmpty) {
+          commentAndMetadata.hasMetadata) {
         //
         // We appear to have found an incomplete declaration at the end of the
         // class. At this point it consists of a metadata, which we don't want
@@ -2549,7 +2581,7 @@
             new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON)));
       }
       return null;
-    } else if (_tokenMatches(_peek(), TokenType.PERIOD) &&
+    } else if (_tokenMatches(next, TokenType.PERIOD) &&
         _tokenMatchesIdentifier(_peekAt(2)) &&
         _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
       return _parseConstructor(
@@ -2561,7 +2593,7 @@
           getAndAdvance(),
           parseSimpleIdentifier(isDeclaration: true),
           parseFormalParameterList());
-    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+    } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
       TypeName returnType = _parseOptionalTypeNameComment();
       SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
       TypeParameterList typeParameters = _parseGenericCommentTypeParameters();
@@ -2589,7 +2621,7 @@
           methodName,
           typeParameters,
           parameters);
-    } else if (_peek().matchesAny(const <TokenType>[
+    } else if (next.matchesAny(const <TokenType>[
       TokenType.EQ,
       TokenType.COMMA,
       TokenType.SEMICOLON
@@ -2602,7 +2634,7 @@
       }
       return _parseInitializedIdentifierList(commentAndMetadata,
           modifiers.staticKeyword, _validateModifiersForField(modifiers), null);
-    } else if (_matchesKeyword(Keyword.TYPEDEF)) {
+    } else if (keyword == Keyword.TYPEDEF) {
       _reportErrorForCurrentToken(ParserErrorCode.TYPEDEF_IN_CLASS);
       // TODO(brianwilkerson) We don't currently have any way to capture the
       // function type alias that was parsed.
@@ -2615,20 +2647,22 @@
             modifiers.externalKeyword, modifiers.staticKeyword, null);
       }
     }
-    TypeName type = parseTypeName();
-    if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+    TypeName type = _parseTypeNameAfterIdentifier();
+    keyword = _currentToken.keyword;
+    next = _peek();
+    isFollowedByIdentifier = _tokenMatchesIdentifier(next);
+    if (keyword == Keyword.GET && isFollowedByIdentifier) {
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
       return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
           modifiers.staticKeyword, type);
-    } else if (_matchesKeyword(Keyword.SET) &&
-        _tokenMatchesIdentifier(_peek())) {
+    } else if (keyword == Keyword.SET && isFollowedByIdentifier) {
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
       return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
           modifiers.staticKeyword, type);
-    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+    } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
       _validateModifiersForOperator(modifiers);
-      return _parseOperator(
-          commentAndMetadata, modifiers.externalKeyword, type);
+      return _parseOperatorAfterKeyword(
+          commentAndMetadata, modifiers.externalKeyword, type, getAndAdvance());
     } else if (!_matchesIdentifier()) {
       if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
         //
@@ -2668,8 +2702,9 @@
       } finally {
         _unlockErrorListener();
       }
-    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
+    } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName =
+          _parseSimpleIdentifierUnchecked(isDeclaration: true);
       TypeParameterList typeParameters = _parseGenericCommentTypeParameters();
       FormalParameterList parameters = parseFormalParameterList();
       if (methodName.name == className) {
@@ -2694,10 +2729,10 @@
           methodName,
           typeParameters,
           parameters);
-    } else if (parseGenericMethods && _tokenMatches(_peek(), TokenType.LT)) {
+    } else if (parseGenericMethods && _tokenMatches(next, TokenType.LT)) {
       return _parseMethodDeclarationAfterReturnType(commentAndMetadata,
           modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) {
+    } else if (_tokenMatches(next, TokenType.OPEN_CURLY_BRACKET)) {
       // We have found "TypeName identifier {", and are guessing that this is a
       // getter without the keyword 'get'.
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
@@ -2720,14 +2755,10 @@
    *       | 'hide' identifier (',' identifier)*
    */
   Combinator parseCombinator() {
-    if (_matchesString(_SHOW) || _matchesString(_HIDE)) {
-      Token keyword = getAndAdvance();
-      List<SimpleIdentifier> names = _parseIdentifierList();
-      if (keyword.lexeme == _SHOW) {
-        return new ShowCombinator(keyword, names);
-      } else {
-        return new HideCombinator(keyword, names);
-      }
+    if (_matchesString(_SHOW)) {
+      return new ShowCombinator(getAndAdvance(), _parseIdentifierList());
+    } else if (_matchesString(_HIDE)) {
+      return new HideCombinator(getAndAdvance(), _parseIdentifierList());
     }
     return null;
   }
@@ -2773,70 +2804,72 @@
     bool partOfDirectiveFound = false;
     bool partDirectiveFound = false;
     bool directiveFoundAfterDeclaration = false;
-    List<Directive> directives = new List<Directive>();
-    List<CompilationUnitMember> declarations =
-        new List<CompilationUnitMember>();
+    List<Directive> directives = <Directive>[];
+    List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
     Token memberStart = _currentToken;
-    while (!_matches(TokenType.EOF)) {
+    TokenType type = _currentToken.type;
+    while (type != TokenType.EOF) {
       CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
-      if ((_matchesKeyword(Keyword.IMPORT) ||
-              _matchesKeyword(Keyword.EXPORT) ||
-              _matchesKeyword(Keyword.LIBRARY) ||
-              _matchesKeyword(Keyword.PART)) &&
-          !_tokenMatches(_peek(), TokenType.PERIOD) &&
-          !_tokenMatches(_peek(), TokenType.LT) &&
-          !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-        Directive directive = _parseDirective(commentAndMetadata);
+      Keyword keyword = _currentToken.keyword;
+      TokenType nextType = _currentToken.next.type;
+      if ((keyword == Keyword.IMPORT ||
+              keyword == Keyword.EXPORT ||
+              keyword == Keyword.LIBRARY ||
+              keyword == Keyword.PART) &&
+          nextType != TokenType.PERIOD &&
+          nextType != TokenType.LT &&
+          nextType != TokenType.OPEN_PAREN) {
+        Directive parseDirective() {
+          if (keyword == Keyword.IMPORT) {
+            if (partDirectiveFound) {
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE);
+            }
+            return _parseImportDirective(commentAndMetadata);
+          } else if (keyword == Keyword.EXPORT) {
+            if (partDirectiveFound) {
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE);
+            }
+            return _parseExportDirective(commentAndMetadata);
+          } else if (keyword == Keyword.LIBRARY) {
+            if (libraryDirectiveFound) {
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES);
+            } else {
+              if (directives.length > 0) {
+                _reportErrorForCurrentToken(
+                    ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST);
+              }
+              libraryDirectiveFound = true;
+            }
+            return _parseLibraryDirective(commentAndMetadata);
+          } else if (keyword == Keyword.PART) {
+            if (_tokenMatchesString(_peek(), _OF)) {
+              partOfDirectiveFound = true;
+              return _parsePartOfDirective(commentAndMetadata);
+            } else {
+              partDirectiveFound = true;
+              return _parsePartDirective(commentAndMetadata);
+            }
+          } else {
+            // Internal error: this method should not have been invoked if the
+            // current token was something other than one of the above.
+            throw new IllegalStateException(
+                "parseDirective invoked in an invalid state (currentToken = $_currentToken)");
+          }
+        }
+        Directive directive = parseDirective();
         if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
           _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
               directive.beginToken);
           directiveFoundAfterDeclaration = true;
         }
-        if (directive is LibraryDirective) {
-          if (libraryDirectiveFound) {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES);
-          } else {
-            if (directives.length > 0) {
-              _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
-                  directive.libraryKeyword);
-            }
-            libraryDirectiveFound = true;
-          }
-        } else if (directive is PartDirective) {
-          partDirectiveFound = true;
-        } else if (partDirectiveFound) {
-          if (directive is ExportDirective) {
-            _reportErrorForToken(
-                ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-                directive.keyword);
-          } else if (directive is ImportDirective) {
-            _reportErrorForToken(
-                ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-                directive.keyword);
-          }
-        }
-        if (directive is PartOfDirective) {
-          if (partOfDirectiveFound) {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES);
-          } else {
-            int directiveCount = directives.length;
-            for (int i = 0; i < directiveCount; i++) {
-              _reportErrorForToken(
-                  ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
-                  directives[i].keyword);
-            }
-            partOfDirectiveFound = true;
-          }
-        } else {
-          if (partOfDirectiveFound) {
-            _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
-                directive.keyword);
-          }
-        }
         directives.add(directive);
-      } else if (_matches(TokenType.SEMICOLON)) {
+      } else if (type == TokenType.SEMICOLON) {
+        // TODO(brianwilkerson) Consider moving this error detection into
+        // _parseCompilationUnitMember (in the places where EXPECTED_EXECUTABLE
+        // is being generated).
         _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
             [_currentToken.lexeme]);
         _advance();
@@ -2857,6 +2890,38 @@
         }
       }
       memberStart = _currentToken;
+      type = _currentToken.type;
+    }
+    if (partOfDirectiveFound && directives.length > 1) {
+      // TODO(brianwilkerson) Improve error reporting when both a library and
+      // part-of directive are found.
+//      if (libraryDirectiveFound) {
+//        int directiveCount = directives.length;
+//        for (int i = 0; i < directiveCount; i++) {
+//          Directive directive = directives[i];
+//          if (directive is PartOfDirective) {
+//            _reportErrorForToken(
+//                ParserErrorCode.PART_OF_IN_LIBRARY, directive.partKeyword);
+//          }
+//        }
+//      } else {
+      bool firstPartOf = true;
+      int directiveCount = directives.length;
+      for (int i = 0; i < directiveCount; i++) {
+        Directive directive = directives[i];
+        if (directive is PartOfDirective) {
+          if (firstPartOf) {
+            firstPartOf = false;
+          } else {
+            _reportErrorForToken(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES,
+                directive.partKeyword);
+          }
+        } else {
+          _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
+              directives[i].keyword);
+        }
+//        }
+      }
     }
     return new CompilationUnit(
         firstToken, scriptTag, directives, declarations, _currentToken);
@@ -2871,7 +2936,7 @@
    */
   Expression parseConditionalExpression() {
     Expression condition = parseIfNullExpression();
-    if (!_matches(TokenType.QUESTION)) {
+    if (_currentToken.type != TokenType.QUESTION) {
       return condition;
     }
     Token question = getAndAdvance();
@@ -2932,9 +2997,10 @@
    *       | throwExpression
    */
   Expression parseExpression2() {
-    if (_matchesKeyword(Keyword.THROW)) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.THROW) {
       return _parseThrowExpression();
-    } else if (_matchesKeyword(Keyword.RETHROW)) {
+    } else if (keyword == Keyword.RETHROW) {
       // TODO(brianwilkerson) Rethrow is a statement again.
       return _parseRethrowExpression();
     }
@@ -2945,18 +3011,17 @@
     // grammar after making that determination.
     //
     Expression expression = parseConditionalExpression();
-    TokenType tokenType = _currentToken.type;
-    if (tokenType == TokenType.PERIOD_PERIOD) {
-      List<Expression> cascadeSections = new List<Expression>();
-      while (tokenType == TokenType.PERIOD_PERIOD) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.PERIOD_PERIOD) {
+      List<Expression> cascadeSections = <Expression>[];
+      do {
         Expression section = _parseCascadeSection();
         if (section != null) {
           cascadeSections.add(section);
         }
-        tokenType = _currentToken.type;
-      }
+      } while (_currentToken.type == TokenType.PERIOD_PERIOD);
       return new CascadeExpression(expression, cascadeSections);
-    } else if (tokenType.isAssignmentOperator) {
+    } else if (type.isAssignmentOperator) {
       Token operator = getAndAdvance();
       _ensureAssignable(expression);
       return new AssignmentExpression(expression, operator, parseExpression2());
@@ -2999,11 +3064,13 @@
    * Parse a class extends clause. Return the class extends clause that was
    * parsed.
    *
+   * This method assumes that the current token matches `Keyword.EXTENDS`.
+   *
    *     classExtendsClause ::=
    *         'extends' type
    */
   ExtendsClause parseExtendsClause() {
-    Token keyword = _expectKeyword(Keyword.EXTENDS);
+    Token keyword = getAndAdvance();
     TypeName superclass = parseTypeName();
     return new ExtendsClause(keyword, superclass);
   }
@@ -3031,145 +3098,16 @@
    *         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
    */
   FormalParameterList parseFormalParameterList() {
-    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
-    if (_matches(TokenType.CLOSE_PAREN)) {
-      return new FormalParameterList(
-          leftParenthesis, null, null, null, getAndAdvance());
+    if (_matches(TokenType.OPEN_PAREN)) {
+      return _parseFormalParameterListUnchecked();
     }
-    //
-    // Even though it is invalid to have default parameters outside of brackets,
-    // required parameters inside of brackets, or multiple groups of default and
-    // named parameters, we allow all of these cases so that we can recover
-    // better.
-    //
-    List<FormalParameter> parameters = new List<FormalParameter>();
-    Token leftSquareBracket = null;
-    Token rightSquareBracket = null;
-    Token leftCurlyBracket = null;
-    Token rightCurlyBracket = null;
-    ParameterKind kind = ParameterKind.REQUIRED;
-    bool firstParameter = true;
-    bool reportedMultiplePositionalGroups = false;
-    bool reportedMultipleNamedGroups = false;
-    bool reportedMixedGroups = false;
-    bool wasOptionalParameter = false;
-    Token initialToken = null;
-    do {
-      if (firstParameter) {
-        firstParameter = false;
-      } else if (!_optional(TokenType.COMMA)) {
-        // TODO(brianwilkerson) The token is wrong, we need to recover from this
-        // case.
-        if (_getEndToken(leftParenthesis) != null) {
-          _reportErrorForCurrentToken(
-              ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
-        } else {
-          _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
-              _currentToken.previous);
-          break;
-        }
-      }
-      initialToken = _currentToken;
-      //
-      // Handle the beginning of parameter groups.
-      //
-      if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftSquareBracket != null && !reportedMultiplePositionalGroups) {
-          _reportErrorForCurrentToken(
-              ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS);
-          reportedMultiplePositionalGroups = true;
-        }
-        if (leftCurlyBracket != null && !reportedMixedGroups) {
-          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
-          reportedMixedGroups = true;
-        }
-        leftSquareBracket = getAndAdvance();
-        kind = ParameterKind.POSITIONAL;
-      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftCurlyBracket != null && !reportedMultipleNamedGroups) {
-          _reportErrorForCurrentToken(
-              ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS);
-          reportedMultipleNamedGroups = true;
-        }
-        if (leftSquareBracket != null && !reportedMixedGroups) {
-          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
-          reportedMixedGroups = true;
-        }
-        leftCurlyBracket = getAndAdvance();
-        kind = ParameterKind.NAMED;
-      }
-      //
-      // Parse and record the parameter.
-      //
-      FormalParameter parameter = _parseFormalParameter(kind);
-      parameters.add(parameter);
-      if (kind == ParameterKind.REQUIRED && wasOptionalParameter) {
-        _reportErrorForNode(
-            ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter);
-      }
-      //
-      // Handle the end of parameter groups.
-      //
-      // TODO(brianwilkerson) Improve the detection and reporting of missing and
-      // mismatched delimiters.
-      if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
-        rightSquareBracket = getAndAdvance();
-        if (leftSquareBracket == null) {
-          if (leftCurlyBracket != null) {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-            rightCurlyBracket = rightSquareBracket;
-            rightSquareBracket = null;
-          } else {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
-                ["["]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
-        rightCurlyBracket = getAndAdvance();
-        if (leftCurlyBracket == null) {
-          if (leftSquareBracket != null) {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
-            rightSquareBracket = rightCurlyBracket;
-            rightCurlyBracket = null;
-          } else {
-            _reportErrorForCurrentToken(
-                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
-                ["{"]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      }
-    } while (!_matches(TokenType.CLOSE_PAREN) &&
-        !identical(initialToken, _currentToken));
-    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
-    //
-    // Check that the groups were closed correctly.
-    //
-    if (leftSquareBracket != null && rightSquareBracket == null) {
-      _reportErrorForCurrentToken(
-          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
-    }
-    if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      _reportErrorForCurrentToken(
-          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-    }
-    //
-    // Build the parameter list.
-    //
-    if (leftSquareBracket == null) {
-      leftSquareBracket = leftCurlyBracket;
-    }
-    if (rightSquareBracket == null) {
-      rightSquareBracket = rightCurlyBracket;
-    }
-    return new FormalParameterList(leftParenthesis, parameters,
-        leftSquareBracket, rightSquareBracket, rightParenthesis);
+    // TODO(brianwilkerson) Improve the error message.
+    _reportErrorForCurrentToken(
+        ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]);
+    // Recovery: Check for an unmatched closing paren and parse parameters until
+    // it is reached.
+    return _parseFormalParameterListAfterParen(
+        _createSyntheticToken(TokenType.OPEN_PAREN));
   }
 
   /**
@@ -3196,10 +3134,9 @@
    */
   Expression parseIfNullExpression() {
     Expression expression = parseLogicalOrExpression();
-    while (_matches(TokenType.QUESTION_QUESTION)) {
-      Token operator = getAndAdvance();
+    while (_currentToken.type == TokenType.QUESTION_QUESTION) {
       expression = new BinaryExpression(
-          expression, operator, parseLogicalOrExpression());
+          expression, getAndAdvance(), parseLogicalOrExpression());
     }
     return expression;
   }
@@ -3207,12 +3144,14 @@
   /**
    * Parse an implements clause. Return the implements clause that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.IMPLEMENTS`.
+   *
    *     implementsClause ::=
    *         'implements' type (',' type)*
    */
   ImplementsClause parseImplementsClause() {
-    Token keyword = _expectKeyword(Keyword.IMPLEMENTS);
-    List<TypeName> interfaces = new List<TypeName>();
+    Token keyword = getAndAdvance();
+    List<TypeName> interfaces = <TypeName>[];
     interfaces.add(parseTypeName());
     while (_optional(TokenType.COMMA)) {
       interfaces.add(parseTypeName());
@@ -3223,13 +3162,16 @@
   /**
    * Parse a label. Return the label that was parsed.
    *
+   * This method assumes that the current token matches an identifier and that
+   * the following token matches `TokenType.COLON`.
+   *
    *     label ::=
    *         identifier ':'
    */
   Label parseLabel({bool isDeclaration: false}) {
     SimpleIdentifier label =
-        parseSimpleIdentifier(isDeclaration: isDeclaration);
-    Token colon = _expect(TokenType.COLON);
+        _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration);
+    Token colon = getAndAdvance();
     return new Label(label, colon);
   }
 
@@ -3240,10 +3182,9 @@
    *         identifier ('.' identifier)*
    */
   LibraryIdentifier parseLibraryIdentifier() {
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    List<SimpleIdentifier> components = <SimpleIdentifier>[];
     components.add(parseSimpleIdentifier());
-    while (_matches(TokenType.PERIOD)) {
-      _advance();
+    while (_optional(TokenType.PERIOD)) {
       components.add(parseSimpleIdentifier());
     }
     return new LibraryIdentifier(components);
@@ -3258,10 +3199,9 @@
    */
   Expression parseLogicalOrExpression() {
     Expression expression = _parseLogicalAndExpression();
-    while (_matches(TokenType.BAR_BAR)) {
-      Token operator = getAndAdvance();
+    while (_currentToken.type == TokenType.BAR_BAR) {
       expression = new BinaryExpression(
-          expression, operator, _parseLogicalAndExpression());
+          expression, getAndAdvance(), _parseLogicalAndExpression());
     }
     return expression;
   }
@@ -3310,7 +3250,7 @@
     SimpleIdentifier identifier = parseSimpleIdentifier();
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     if (_matches(TokenType.OPEN_PAREN)) {
-      FormalParameterList parameters = parseFormalParameterList();
+      FormalParameterList parameters = _parseFormalParameterListUnchecked();
       if (thisKeyword == null) {
         if (holder.keyword != null) {
           _reportErrorForToken(
@@ -3381,13 +3321,7 @@
    *         identifier ('.' identifier)?
    */
   Identifier parsePrefixedIdentifier() {
-    SimpleIdentifier qualifier = parseSimpleIdentifier();
-    if (!_matches(TokenType.PERIOD) || _injectGenericCommentTypeList()) {
-      return qualifier;
-    }
-    Token period = getAndAdvance();
-    SimpleIdentifier qualified = parseSimpleIdentifier();
-    return new PrefixedIdentifier(qualifier, period, qualified);
+    return _parsePrefixedIdentifierAfterIdentifier(parseSimpleIdentifier());
   }
 
   /**
@@ -3398,7 +3332,7 @@
    *       | type
    */
   TypeName parseReturnType() {
-    if (_matchesKeyword(Keyword.VOID)) {
+    if (_currentToken.keyword == Keyword.VOID) {
       return new TypeName(new SimpleIdentifier(getAndAdvance()), null);
     } else {
       return parseTypeName();
@@ -3413,14 +3347,7 @@
    */
   SimpleIdentifier parseSimpleIdentifier({bool isDeclaration: false}) {
     if (_matchesIdentifier()) {
-      String lexeme = _currentToken.lexeme;
-      if ((_inAsync || _inGenerator) &&
-          (lexeme == 'async' || lexeme == 'await' || lexeme == 'yield')) {
-        _reportErrorForCurrentToken(
-            ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER);
-      }
-      return new SimpleIdentifier(getAndAdvance(),
-          isDeclaration: isDeclaration);
+      return _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration);
     }
     _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
     return _createSyntheticIdentifier(isDeclaration: isDeclaration);
@@ -3444,7 +3371,7 @@
    */
   Statement parseStatement2() {
     List<Label> labels = null;
-    while (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
+    while (_matchesIdentifier() && _currentToken.next.type == TokenType.COLON) {
       Label label = parseLabel(isDeclaration: true);
       if (labels == null) {
         labels = <Label>[label];
@@ -3477,31 +3404,19 @@
    *       | SINGLE_LINE_STRING+
    */
   StringLiteral parseStringLiteral() {
-    List<StringLiteral> strings = new List<StringLiteral>();
-    while (_matches(TokenType.STRING)) {
-      Token string = getAndAdvance();
-      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
-          _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-        strings.add(_parseStringInterpolation(string));
-      } else {
-        strings.add(new SimpleStringLiteral(
-            string, _computeStringValue(string.lexeme, true, true)));
-      }
+    if (_matches(TokenType.STRING)) {
+      return _parseStringLiteralUnchecked();
     }
-    if (strings.length < 1) {
-      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL);
-      return _createSyntheticStringLiteral();
-    } else if (strings.length == 1) {
-      return strings[0];
-    } else {
-      return new AdjacentStrings(strings);
-    }
+    _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL);
+    return _createSyntheticStringLiteral();
   }
 
   /**
    * Parse a list of type arguments. Return the type argument list that was
    * parsed.
    *
+   * This method assumes that the current token matches `TokenType.LT`.
+   *
    *     typeArguments ::=
    *         '<' typeList '>'
    *
@@ -3509,9 +3424,8 @@
    *         type (',' type)*
    */
   TypeArgumentList parseTypeArgumentList() {
-    Token leftBracket = _expect(TokenType.LT);
-    List<TypeName> arguments = new List<TypeName>();
-    arguments.add(parseTypeName());
+    Token leftBracket = getAndAdvance();
+    List<TypeName> arguments = <TypeName>[parseTypeName()];
     while (_optional(TokenType.COMMA)) {
       arguments.add(parseTypeName());
     }
@@ -3531,8 +3445,8 @@
     // type to replace the real type name.
     // TODO(jmesserly): this feels like a big hammer. Can we restrict it to
     // only work inside generic methods?
-    TypeName typeComment = _parseOptionalTypeNameComment();
-    return typeComment ?? realType;
+    TypeName typeFromComment = _parseOptionalTypeNameComment();
+    return typeFromComment ?? realType;
   }
 
   /**
@@ -3558,13 +3472,14 @@
    * Parse a list of type parameters. Return the list of type parameters that
    * were parsed.
    *
+   * This method assumes that the current token matches `TokenType.LT`.
+   *
    *     typeParameterList ::=
    *         '<' typeParameter (',' typeParameter)* '>'
    */
   TypeParameterList parseTypeParameterList() {
-    Token leftBracket = _expect(TokenType.LT);
-    List<TypeParameter> typeParameters = new List<TypeParameter>();
-    typeParameters.add(parseTypeParameter());
+    Token leftBracket = getAndAdvance();
+    List<TypeParameter> typeParameters = <TypeParameter>[parseTypeParameter()];
     while (_optional(TokenType.COMMA)) {
       typeParameters.add(parseTypeParameter());
     }
@@ -3575,17 +3490,18 @@
   /**
    * Parse a with clause. Return the with clause that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.WITH`.
+   *
    *     withClause ::=
    *         'with' typeName (',' typeName)*
    */
   WithClause parseWithClause() {
-    Token with2 = _expectKeyword(Keyword.WITH);
-    List<TypeName> types = new List<TypeName>();
-    types.add(parseTypeName());
+    Token withKeyword = getAndAdvance();
+    List<TypeName> types = <TypeName>[parseTypeName()];
     while (_optional(TokenType.COMMA)) {
       types.add(parseTypeName());
     }
-    return new WithClause(with2, types);
+    return new WithClause(withKeyword, types);
   }
 
   /**
@@ -3669,30 +3585,33 @@
    * member.
    */
   bool _couldBeStartOfCompilationUnitMember() {
-    if ((_matchesKeyword(Keyword.IMPORT) ||
-            _matchesKeyword(Keyword.EXPORT) ||
-            _matchesKeyword(Keyword.LIBRARY) ||
-            _matchesKeyword(Keyword.PART)) &&
-        !_tokenMatches(_peek(), TokenType.PERIOD) &&
-        !_tokenMatches(_peek(), TokenType.LT)) {
+    Keyword keyword = _currentToken.keyword;
+    Token next = _currentToken.next;
+    TokenType nextType = next.type;
+    if ((keyword == Keyword.IMPORT ||
+            keyword == Keyword.EXPORT ||
+            keyword == Keyword.LIBRARY ||
+            keyword == Keyword.PART) &&
+        nextType != TokenType.PERIOD &&
+        nextType != TokenType.LT) {
       // This looks like the start of a directive
       return true;
-    } else if (_matchesKeyword(Keyword.CLASS)) {
+    } else if (keyword == Keyword.CLASS) {
       // This looks like the start of a class definition
       return true;
-    } else if (_matchesKeyword(Keyword.TYPEDEF) &&
-        !_tokenMatches(_peek(), TokenType.PERIOD) &&
-        !_tokenMatches(_peek(), TokenType.LT)) {
+    } else if (keyword == Keyword.TYPEDEF &&
+        nextType != TokenType.PERIOD &&
+        nextType != TokenType.LT) {
       // This looks like the start of a typedef
       return true;
-    } else if (_matchesKeyword(Keyword.VOID) ||
-        ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
-            _tokenMatchesIdentifier(_peek())) ||
-        (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek()))) {
+    } else if (keyword == Keyword.VOID ||
+        ((keyword == Keyword.GET || keyword == Keyword.SET) &&
+            _tokenMatchesIdentifier(next)) ||
+        (keyword == Keyword.OPERATOR && _isOperator(next))) {
       // This looks like the start of a function
       return true;
     } else if (_matchesIdentifier()) {
-      if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      if (nextType == TokenType.OPEN_PAREN) {
         // This looks like the start of a function
         return true;
       }
@@ -3700,9 +3619,10 @@
       if (token == null) {
         return false;
       }
-      if (_matchesKeyword(Keyword.GET) ||
-          _matchesKeyword(Keyword.SET) ||
-          (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) ||
+      // TODO(brianwilkerson) This looks wrong; should we be checking 'token'?
+      if (keyword == Keyword.GET ||
+          keyword == Keyword.SET ||
+          (keyword == Keyword.OPERATOR && _isOperator(next)) ||
           _matchesIdentifier()) {
         return true;
       }
@@ -3872,7 +3792,7 @@
    * should be treated as code blocks.
    */
   List<List<int>> _getCodeBlockRanges(String comment) {
-    List<List<int>> ranges = new List<List<int>>();
+    List<List<int>> ranges = <List<int>>[];
     int length = comment.length;
     if (length < 3) {
       return ranges;
@@ -4015,7 +3935,8 @@
    * function declaration.
    */
   bool _isFunctionDeclaration() {
-    if (_matchesKeyword(Keyword.VOID)) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.VOID) {
       return true;
     }
     Token afterReturnType = _skipTypeName(_currentToken);
@@ -4038,20 +3959,20 @@
     }
     // It's possible that we have found a getter. While this isn't valid at this
     // point we test for it in order to recover better.
-    if (_matchesKeyword(Keyword.GET)) {
+    if (keyword == Keyword.GET) {
       Token afterName = _skipSimpleIdentifier(_currentToken.next);
       if (afterName == null) {
         return false;
       }
-      return _tokenMatches(afterName, TokenType.FUNCTION) ||
-          _tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
+      TokenType type = afterName.type;
+      return type == TokenType.FUNCTION || type == TokenType.OPEN_CURLY_BRACKET;
     } else if (_tokenMatchesKeyword(afterReturnType, Keyword.GET)) {
       Token afterName = _skipSimpleIdentifier(afterReturnType.next);
       if (afterName == null) {
         return false;
       }
-      return _tokenMatches(afterName, TokenType.FUNCTION) ||
-          _tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
+      TokenType type = afterName.type;
+      return type == TokenType.FUNCTION || type == TokenType.OPEN_CURLY_BRACKET;
     }
     return false;
   }
@@ -4114,12 +4035,13 @@
    *         identifier ('=' expression)?
    */
   bool _isInitializedVariableDeclaration() {
-    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.VAR)) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.FINAL || keyword == Keyword.VAR) {
       // An expression cannot start with a keyword other than 'const',
       // 'rethrow', or 'throw'.
       return true;
     }
-    if (_matchesKeyword(Keyword.CONST)) {
+    if (keyword == Keyword.CONST) {
       // Look to see whether we might be at the start of a list or map literal,
       // otherwise this should be the start of a variable declaration.
       return !_peek().matchesAny(const <TokenType>[
@@ -4156,7 +4078,7 @@
     if (type == TokenType.EQ ||
         type == TokenType.COMMA ||
         type == TokenType.SEMICOLON ||
-        _tokenMatchesKeyword(token, Keyword.IN)) {
+        token.keyword == Keyword.IN) {
       return true;
     }
     // It is OK to parse as a variable declaration in these cases:
@@ -4178,6 +4100,8 @@
   }
 
   bool _isLikelyArgumentList() {
+    // Try to reduce the amount of lookahead required here before enabling
+    // generic methods.
     if (_matches(TokenType.OPEN_PAREN)) {
       return true;
     }
@@ -4228,7 +4152,7 @@
     if (!startToken.isOperator) {
       return false;
     }
-    // Token "=" means that it is actually field initializer.
+    // Token "=" means that it is actually a field initializer.
     if (startToken.type == TokenType.EQ) {
       return false;
     }
@@ -4372,7 +4296,7 @@
    * should not be invoked with an argument value of [TokenType.GT].
    */
   bool _optional(TokenType type) {
-    if (_matches(type)) {
+    if (_currentToken.type == type) {
       _advance();
       return true;
     }
@@ -4389,28 +4313,45 @@
    */
   Expression _parseAdditiveExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
+    if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isAdditiveOperator) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseMultiplicativeExpression();
     }
     while (_currentToken.type.isAdditiveOperator) {
-      Token operator = getAndAdvance();
       expression = new BinaryExpression(
-          expression, operator, _parseMultiplicativeExpression());
+          expression, getAndAdvance(), _parseMultiplicativeExpression());
     }
     return expression;
   }
 
   /**
+   * Parse an argument list when we need to check for an open paren and recover
+   * when there isn't one. Return the argument list that was parsed.
+   */
+  ArgumentList _parseArgumentListChecked() {
+    if (_matches(TokenType.OPEN_PAREN)) {
+      return parseArgumentList();
+    }
+    _reportErrorForCurrentToken(
+        ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]);
+    // Recovery: Look to see whether there is a close paren that isn't matched
+    // to an open paren and if so parse the list of arguments as normal.
+    return new ArgumentList(_createSyntheticToken(TokenType.OPEN_PAREN), null,
+        _createSyntheticToken(TokenType.CLOSE_PAREN));
+  }
+
+  /**
    * Parse an assert statement. Return the assert statement.
    *
+   * This method assumes that the current token matches `Keyword.ASSERT`.
+   *
    *     assertStatement ::=
    *         'assert' '(' conditionalExpression ')' ';'
    */
   AssertStatement _parseAssertStatement() {
-    Token keyword = _expectKeyword(Keyword.ASSERT);
+    Token keyword = getAndAdvance();
     Token leftParen = _expect(TokenType.OPEN_PAREN);
     Expression expression = parseExpression2();
     if (expression is AssignmentExpression) {
@@ -4454,6 +4395,17 @@
           new SuperExpression(getAndAdvance()), false,
           allowConditional: false);
     }
+    return _parseAssignableExpressionNotStartingWithSuper(primaryAllowed);
+  }
+
+  /**
+   * Parse an assignable expression given that the current token is not 'super'.
+   * The [primaryAllowed] is `true` if the expression is allowed to be a primary
+   * without any assignable selector. Return the assignable expression that was
+   * parsed.
+   */
+  Expression _parseAssignableExpressionNotStartingWithSuper(
+      bool primaryAllowed) {
     //
     // A primary expression can start with an identifier. We resolve the
     // ambiguity by determining whether the primary consists of anything other
@@ -4523,7 +4475,8 @@
    */
   Expression _parseAssignableSelector(Expression prefix, bool optional,
       {bool allowConditional: true}) {
-    if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.OPEN_SQUARE_BRACKET) {
       Token leftBracket = getAndAdvance();
       bool wasInInitializer = _inInitializer;
       _inInitializer = false;
@@ -4535,27 +4488,32 @@
       } finally {
         _inInitializer = wasInInitializer;
       }
-    } else if (_matches(TokenType.PERIOD) ||
-        _matches(TokenType.QUESTION_PERIOD)) {
-      if (_matches(TokenType.QUESTION_PERIOD) && !allowConditional) {
-        _reportErrorForCurrentToken(
-            ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [_currentToken.lexeme]);
-      }
-      Token operator = getAndAdvance();
-      return new PropertyAccess(prefix, operator, parseSimpleIdentifier());
     } else {
-      if (!optional) {
-        // Report the missing selector.
-        _reportErrorForCurrentToken(
-            ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR);
+      bool isQuestionPeriod = type == TokenType.QUESTION_PERIOD;
+      if (type == TokenType.PERIOD || isQuestionPeriod) {
+        if (isQuestionPeriod && !allowConditional) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
+              [_currentToken.lexeme]);
+        }
+        Token operator = getAndAdvance();
+        return new PropertyAccess(prefix, operator, parseSimpleIdentifier());
+      } else {
+        if (!optional) {
+          // Report the missing selector.
+          _reportErrorForCurrentToken(
+              ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR);
+        }
+        return prefix;
       }
-      return prefix;
     }
   }
 
   /**
    * Parse a await expression. Return the await expression that was parsed.
    *
+   * This method assumes that the current token matches `_AWAIT`.
+   *
    *     awaitExpression ::=
    *         'await' unaryExpression
    */
@@ -4575,16 +4533,15 @@
    */
   Expression _parseBitwiseAndExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
-        _tokenMatches(_peek(), TokenType.AMPERSAND)) {
+    if (_currentToken.keyword == Keyword.SUPER &&
+        _currentToken.next.type == TokenType.AMPERSAND) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseShiftExpression();
     }
-    while (_matches(TokenType.AMPERSAND)) {
-      Token operator = getAndAdvance();
-      expression =
-          new BinaryExpression(expression, operator, _parseShiftExpression());
+    while (_currentToken.type == TokenType.AMPERSAND) {
+      expression = new BinaryExpression(
+          expression, getAndAdvance(), _parseShiftExpression());
     }
     return expression;
   }
@@ -4599,31 +4556,52 @@
    */
   Expression _parseBitwiseXorExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
-        _tokenMatches(_peek(), TokenType.CARET)) {
+    if (_currentToken.keyword == Keyword.SUPER &&
+        _currentToken.next.type == TokenType.CARET) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseBitwiseAndExpression();
     }
-    while (_matches(TokenType.CARET)) {
-      Token operator = getAndAdvance();
+    while (_currentToken.type == TokenType.CARET) {
       expression = new BinaryExpression(
-          expression, operator, _parseBitwiseAndExpression());
+          expression, getAndAdvance(), _parseBitwiseAndExpression());
     }
     return expression;
   }
 
   /**
+   * Parse a block when we need to check for an open curly brace and recover
+   * when there isn't one. Return the block that was parsed.
+   *
+   *     block ::=
+   *         '{' statements '}'
+   */
+  Block _parseBlockChecked() {
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return parseBlock();
+    }
+    // TODO(brianwilkerson) Improve the error message.
+    _reportErrorForCurrentToken(
+        ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_CURLY_BRACKET.lexeme]);
+    // Recovery: Check for an unmatched closing curly bracket and parse
+    // statements until it is reached.
+    return new Block(_createSyntheticToken(TokenType.OPEN_CURLY_BRACKET), null,
+        _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET));
+  }
+
+  /**
    * Parse a break statement. Return the break statement that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.BREAK`.
+   *
    *     breakStatement ::=
    *         'break' identifier? ';'
    */
   Statement _parseBreakStatement() {
-    Token breakKeyword = _expectKeyword(Keyword.BREAK);
+    Token breakKeyword = getAndAdvance();
     SimpleIdentifier label = null;
     if (_matchesIdentifier()) {
-      label = parseSimpleIdentifier();
+      label = _parseSimpleIdentifierUnchecked();
     }
     if (!_inLoop && !_inSwitch && label == null) {
       _reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword);
@@ -4636,6 +4614,9 @@
    * Parse a cascade section. Return the expression representing the cascaded
    * method invocation.
    *
+   * This method assumes that the current token matches
+   * `TokenType.PERIOD_PERIOD`.
+   *
    *     cascadeSection ::=
    *         '..' (cascadeSelector typeArguments? arguments*)
    *         (assignableSelector typeArguments? arguments*)* cascadeAssignment?
@@ -4648,11 +4629,11 @@
    *         assignmentOperator expressionWithoutCascade
    */
   Expression _parseCascadeSection() {
-    Token period = _expect(TokenType.PERIOD_PERIOD);
+    Token period = getAndAdvance();
     Expression expression = null;
     SimpleIdentifier functionName = null;
     if (_matchesIdentifier()) {
-      functionName = parseSimpleIdentifier();
+      functionName = _parseSimpleIdentifierUnchecked();
     } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) {
       Token leftBracket = getAndAdvance();
       bool wasInInitializer = _inInitializer;
@@ -4674,7 +4655,7 @@
     assert((expression == null && functionName != null) ||
         (expression != null && functionName == null));
     if (_isLikelyArgumentList()) {
-      while (_isLikelyArgumentList()) {
+      do {
         TypeArgumentList typeArguments = _parseOptionalTypeArguments();
         if (functionName != null) {
           expression = new MethodInvocation(expression, period, functionName,
@@ -4689,7 +4670,7 @@
           expression = new FunctionExpressionInvocation(
               expression, typeArguments, parseArgumentList());
         }
-      }
+      } while (_isLikelyArgumentList());
     } else if (functionName != null) {
       expression = new PropertyAccess(expression, period, functionName);
       period = null;
@@ -4734,31 +4715,33 @@
    * keyword 'abstract', or `null` if the keyword was not given. Return the
    * class declaration that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.CLASS`.
+   *
    *     classDeclaration ::=
    *         metadata 'abstract'? 'class' name typeParameterList? (extendsClause withClause?)? implementsClause? '{' classMembers '}' |
    *         metadata 'abstract'? 'class' mixinApplicationClass
    */
   CompilationUnitMember _parseClassDeclaration(
       CommentAndMetadata commentAndMetadata, Token abstractKeyword) {
-    Token keyword = _expectKeyword(Keyword.CLASS);
-    if (_matchesIdentifier()) {
-      Token next = _peek();
-      if (_tokenMatches(next, TokenType.LT)) {
-        next = _skipTypeParameterList(next);
-        if (next != null && _tokenMatches(next, TokenType.EQ)) {
-          return _parseClassTypeAlias(
-              commentAndMetadata, abstractKeyword, keyword);
-        }
-      } else if (_tokenMatches(next, TokenType.EQ)) {
-        return _parseClassTypeAlias(
-            commentAndMetadata, abstractKeyword, keyword);
-      }
-    }
+    //
+    // Parse the name and type parameters.
+    //
+    Token keyword = getAndAdvance();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     String className = name.name;
     TypeParameterList typeParameters = null;
-    if (_matches(TokenType.LT)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.LT) {
       typeParameters = parseTypeParameterList();
+      type = _currentToken.type;
+    }
+    //
+    // Check to see whether this might be a class type alias rather than a class
+    // declaration.
+    //
+    if (type == TokenType.EQ) {
+      return _parseClassTypeAliasAfterName(
+          commentAndMetadata, abstractKeyword, keyword, name, typeParameters);
     }
     //
     // Parse the clauses. The parser accepts clauses in any order, but will
@@ -4770,7 +4753,8 @@
     ImplementsClause implementsClause = null;
     bool foundClause = true;
     while (foundClause) {
-      if (_matchesKeyword(Keyword.EXTENDS)) {
+      Keyword keyword = _currentToken.keyword;
+      if (keyword == Keyword.EXTENDS) {
         if (extendsClause == null) {
           extendsClause = parseExtendsClause();
           if (withClause != null) {
@@ -4785,7 +4769,7 @@
               extendsClause.extendsKeyword);
           parseExtendsClause();
         }
-      } else if (_matchesKeyword(Keyword.WITH)) {
+      } else if (keyword == Keyword.WITH) {
         if (withClause == null) {
           withClause = parseWithClause();
           if (implementsClause != null) {
@@ -4799,7 +4783,7 @@
           // TODO(brianwilkerson) Should we merge the list of applied mixins
           // into a single list?
         }
-      } else if (_matchesKeyword(Keyword.IMPLEMENTS)) {
+      } else if (keyword == Keyword.IMPLEMENTS) {
         if (implementsClause == null) {
           implementsClause = parseImplementsClause();
         } else {
@@ -4831,10 +4815,12 @@
     List<ClassMember> members = null;
     Token rightBracket = null;
     if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
-      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      leftBracket = getAndAdvance();
       members = _parseClassMembers(className, _getEndToken(leftBracket));
       rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
     } else {
+      // Recovery: Check for an unmatched closing curly bracket and parse
+      // members until it is reached.
       leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
       rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY);
@@ -4866,14 +4852,15 @@
    *         (metadata memberDefinition)*
    */
   List<ClassMember> _parseClassMembers(String className, Token closingBracket) {
-    List<ClassMember> members = new List<ClassMember>();
+    List<ClassMember> members = <ClassMember>[];
     Token memberStart = _currentToken;
-    while (!_matches(TokenType.EOF) &&
-        !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
+    TokenType type = _currentToken.type;
+    Keyword keyword = _currentToken.keyword;
+    while (type != TokenType.EOF &&
+        type != TokenType.CLOSE_CURLY_BRACKET &&
         (closingBracket != null ||
-            (!_matchesKeyword(Keyword.CLASS) &&
-                !_matchesKeyword(Keyword.TYPEDEF)))) {
-      if (_matches(TokenType.SEMICOLON)) {
+            (keyword != Keyword.CLASS && keyword != Keyword.TYPEDEF))) {
+      if (type == TokenType.SEMICOLON) {
         _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
             [_currentToken.lexeme]);
         _advance();
@@ -4889,6 +4876,8 @@
         _advance();
       }
       memberStart = _currentToken;
+      type = _currentToken.type;
+      keyword = _currentToken.keyword;
     }
     return members;
   }
@@ -4899,6 +4888,8 @@
    * the 'abstract' keyword. The [classKeyword] is the token representing the
    * 'class' keyword. Return the class type alias that was parsed.
    *
+   * This method assumes that the current token matches an identifier.
+   *
    *     classTypeAlias ::=
    *         identifier typeParameters? '=' 'abstract'? mixinApplication
    *
@@ -4907,11 +4898,36 @@
    */
   ClassTypeAlias _parseClassTypeAlias(CommentAndMetadata commentAndMetadata,
       Token abstractKeyword, Token classKeyword) {
-    SimpleIdentifier className = parseSimpleIdentifier(isDeclaration: true);
+    SimpleIdentifier className =
+        _parseSimpleIdentifierUnchecked(isDeclaration: true);
     TypeParameterList typeParameters = null;
     if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
     }
+    return _parseClassTypeAliasAfterName(commentAndMetadata, abstractKeyword,
+        classKeyword, className, typeParameters);
+  }
+
+  /**
+   * Parse a class type alias. The [commentAndMetadata] is the metadata to be
+   * associated with the member. The [abstractKeyword] is the token representing
+   * the 'abstract' keyword. The [classKeyword] is the token representing the
+   * 'class' keyword. The [className] is the name of the alias, and the
+   * [typeParameters] are the type parameters following the name. Return the
+   * class type alias that was parsed.
+   *
+   *     classTypeAlias ::=
+   *         identifier typeParameters? '=' 'abstract'? mixinApplication
+   *
+   *     mixinApplication ::=
+   *         type withClause implementsClause? ';'
+   */
+  ClassTypeAlias _parseClassTypeAliasAfterName(
+      CommentAndMetadata commentAndMetadata,
+      Token abstractKeyword,
+      Token classKeyword,
+      SimpleIdentifier className,
+      TypeParameterList typeParameters) {
     Token equals = _expect(TokenType.EQ);
     TypeName superclass = parseTypeName();
     WithClause withClause = null;
@@ -4957,19 +4973,20 @@
 
   /**
    * Parse a list of combinators in a directive. Return the combinators that
-   * were parsed.
+   * were parsed, or `null` if there are no combinators.
    *
    *     combinator ::=
    *         'show' identifier (',' identifier)*
    *       | 'hide' identifier (',' identifier)*
    */
   List<Combinator> _parseCombinators() {
-    List<Combinator> combinators = new List<Combinator>();
+    List<Combinator> combinators = null;
     while (true) {
       Combinator combinator = parseCombinator();
       if (combinator == null) {
         break;
       }
+      combinators ??= <Combinator>[];
       combinators.add(combinator);
     }
     return combinators;
@@ -4986,18 +5003,20 @@
    *         annotation*
    */
   CommentAndMetadata _parseCommentAndMetadata() {
-    Comment comment = _parseDocumentationComment();
+    // TODO(brianwilkerson) Consider making the creation of documentation
+    // comments be lazy.
+    List<DocumentationCommentToken> tokens = _parseDocumentationCommentTokens();
     List<Annotation> metadata = null;
     while (_matches(TokenType.AT)) {
-      metadata ??= new List<Annotation>();
+      metadata ??= <Annotation>[];
       metadata.add(parseAnnotation());
-      Comment optionalComment = _parseDocumentationComment();
-      if (optionalComment != null) {
-        comment = optionalComment;
+      List<DocumentationCommentToken> optionalTokens =
+          _parseDocumentationCommentTokens();
+      if (optionalTokens != null) {
+        tokens = optionalTokens;
       }
     }
-    metadata ??= const <Annotation>[];
-    return new CommentAndMetadata(comment, metadata);
+    return new CommentAndMetadata(_parseDocumentationComment(tokens), metadata);
   }
 
   /**
@@ -5051,16 +5070,19 @@
           return null;
         }
         return new CommentReference(newKeyword, identifier);
-      } else if (_tokenMatchesKeyword(firstToken, Keyword.THIS) ||
-          _tokenMatchesKeyword(firstToken, Keyword.NULL) ||
-          _tokenMatchesKeyword(firstToken, Keyword.TRUE) ||
-          _tokenMatchesKeyword(firstToken, Keyword.FALSE)) {
-        // TODO(brianwilkerson) If we want to support this we will need to
-        // extend the definition of CommentReference to take an expression
-        // rather than an identifier. For now we just ignore it to reduce the
-        // number of errors produced, but that's probably not a valid long term
-        // approach.
-        return null;
+      } else {
+        Keyword keyword = firstToken.keyword;
+        if (keyword == Keyword.THIS ||
+            keyword == Keyword.NULL ||
+            keyword == Keyword.TRUE ||
+            keyword == Keyword.FALSE) {
+          // TODO(brianwilkerson) If we want to support this we will need to
+          // extend the definition of CommentReference to take an expression
+          // rather than an identifier. For now we just ignore it to reduce the
+          // number of errors produced, but that's probably not a valid long term
+          // approach.
+          return null;
+        }
       }
     } catch (exception) {
       // Ignored because we assume that it wasn't a real comment reference.
@@ -5082,7 +5104,7 @@
    */
   List<CommentReference> _parseCommentReferences(
       List<DocumentationCommentToken> tokens) {
-    List<CommentReference> references = new List<CommentReference>();
+    List<CommentReference> references = <CommentReference>[];
     for (DocumentationCommentToken token in tokens) {
       String comment = token.lexeme;
       comment = _removeCodeBlocksGitHub(comment);
@@ -5158,32 +5180,41 @@
   CompilationUnitMember _parseCompilationUnitMember(
       CommentAndMetadata commentAndMetadata) {
     Modifiers modifiers = _parseModifiers();
-    if (_matchesKeyword(Keyword.CLASS)) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.CLASS) {
       return _parseClassDeclaration(
           commentAndMetadata, _validateModifiersForClass(modifiers));
-    } else if (_matchesKeyword(Keyword.TYPEDEF) &&
-        !_tokenMatches(_peek(), TokenType.PERIOD) &&
-        !_tokenMatches(_peek(), TokenType.LT) &&
-        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+    }
+    Token next = _peek();
+    TokenType nextType = next.type;
+    if (keyword == Keyword.TYPEDEF &&
+        nextType != TokenType.PERIOD &&
+        nextType != TokenType.LT &&
+        nextType != TokenType.OPEN_PAREN) {
       _validateModifiersForTypedef(modifiers);
       return _parseTypeAlias(commentAndMetadata);
-    } else if (_matchesKeyword(Keyword.ENUM)) {
+    } else if (keyword == Keyword.ENUM) {
       _validateModifiersForEnum(modifiers);
       return _parseEnumDeclaration(commentAndMetadata);
-    }
-    if (_matchesKeyword(Keyword.VOID)) {
-      TypeName returnType = parseReturnType();
-      if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
-          _tokenMatchesIdentifier(_peek())) {
+    } else if (keyword == Keyword.VOID) {
+      TypeName returnType =
+          new TypeName(new SimpleIdentifier(getAndAdvance()), null);
+      keyword = _currentToken.keyword;
+      next = _peek();
+      if ((keyword == Keyword.GET || keyword == Keyword.SET) &&
+          _tokenMatchesIdentifier(next)) {
         _validateModifiersForTopLevelFunction(modifiers);
         return _parseFunctionDeclaration(
             commentAndMetadata, modifiers.externalKeyword, returnType);
-      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
         _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
-        return _convertToFunctionDeclaration(_parseOperator(
-            commentAndMetadata, modifiers.externalKeyword, returnType));
+        return _convertToFunctionDeclaration(_parseOperatorAfterKeyword(
+            commentAndMetadata,
+            modifiers.externalKeyword,
+            returnType,
+            getAndAdvance()));
       } else if (_matchesIdentifier() &&
-          _peek().matchesAny(const <TokenType>[
+          next.matchesAny(const <TokenType>[
             TokenType.OPEN_PAREN,
             TokenType.OPEN_CURLY_BRACKET,
             TokenType.FUNCTION,
@@ -5197,7 +5228,7 @@
         // We have found an error of some kind. Try to recover.
         //
         if (_matchesIdentifier()) {
-          if (_peek().matchesAny(const <TokenType>[
+          if (next.matchesAny(const <TokenType>[
             TokenType.EQ,
             TokenType.COMMA,
             TokenType.SEMICOLON
@@ -5218,15 +5249,18 @@
             ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
         return null;
       }
-    } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
-        _tokenMatchesIdentifier(_peek())) {
+    } else if ((keyword == Keyword.GET || keyword == Keyword.SET) &&
+        _tokenMatchesIdentifier(next)) {
       _validateModifiersForTopLevelFunction(modifiers);
       return _parseFunctionDeclaration(
           commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+    } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
       _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
-      return _convertToFunctionDeclaration(
-          _parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
+      return _convertToFunctionDeclaration(_parseOperatorAfterKeyword(
+          commentAndMetadata,
+          modifiers.externalKeyword,
+          null,
+          getAndAdvance()));
     } else if (!_matchesIdentifier()) {
       Token keyword = modifiers.varKeyword;
       if (keyword == null) {
@@ -5240,9 +5274,9 @@
         // We appear to have found an incomplete top-level variable declaration.
         //
         _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
-        List<VariableDeclaration> variables = new List<VariableDeclaration>();
-        variables.add(
-            new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+        VariableDeclaration variable =
+            new VariableDeclaration(_createSyntheticIdentifier(), null, null);
+        List<VariableDeclaration> variables = <VariableDeclaration>[variable];
         return new TopLevelVariableDeclaration(
             commentAndMetadata.comment,
             commentAndMetadata.metadata,
@@ -5254,12 +5288,12 @@
     } else if (_isPeekGenericTypeParametersAndOpenParen()) {
       return _parseFunctionDeclaration(
           commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+    } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
       TypeName returnType = _parseOptionalTypeNameComment();
       _validateModifiersForTopLevelFunction(modifiers);
       return _parseFunctionDeclaration(
           commentAndMetadata, modifiers.externalKeyword, returnType);
-    } else if (_peek().matchesAny(const <TokenType>[
+    } else if (next.matchesAny(const <TokenType>[
       TokenType.EQ,
       TokenType.COMMA,
       TokenType.SEMICOLON
@@ -5278,15 +5312,20 @@
           _expect(TokenType.SEMICOLON));
     }
     TypeName returnType = parseReturnType();
-    if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
-        _tokenMatchesIdentifier(_peek())) {
+    keyword = _currentToken.keyword;
+    next = _peek();
+    if ((keyword == Keyword.GET || keyword == Keyword.SET) &&
+        _tokenMatchesIdentifier(next)) {
       _validateModifiersForTopLevelFunction(modifiers);
       return _parseFunctionDeclaration(
           commentAndMetadata, modifiers.externalKeyword, returnType);
-    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+    } else if (keyword == Keyword.OPERATOR && _isOperator(next)) {
       _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
-      return _convertToFunctionDeclaration(_parseOperator(
-          commentAndMetadata, modifiers.externalKeyword, returnType));
+      return _convertToFunctionDeclaration(_parseOperatorAfterKeyword(
+          commentAndMetadata,
+          modifiers.externalKeyword,
+          returnType,
+          getAndAdvance()));
     } else if (_matches(TokenType.AT)) {
       return new TopLevelVariableDeclaration(
           commentAndMetadata.comment,
@@ -5304,16 +5343,15 @@
       } else {
         semicolon = _createSyntheticToken(TokenType.SEMICOLON);
       }
-      List<VariableDeclaration> variables = new List<VariableDeclaration>();
-      variables.add(
-          new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+      VariableDeclaration variable =
+          new VariableDeclaration(_createSyntheticIdentifier(), null, null);
+      List<VariableDeclaration> variables = <VariableDeclaration>[variable];
       return new TopLevelVariableDeclaration(
           commentAndMetadata.comment,
           commentAndMetadata.metadata,
           new VariableDeclarationList(null, null, null, returnType, variables),
           semicolon);
-    }
-    if (_peek().matchesAny(const <TokenType>[
+    } else if (next.matchesAny(const <TokenType>[
       TokenType.OPEN_PAREN,
       TokenType.FUNCTION,
       TokenType.OPEN_CURLY_BRACKET,
@@ -5334,6 +5372,8 @@
   /**
    * Parse a configuration in either an import or export directive.
    *
+   * This method assumes that the current token matches `Keyword.IF`.
+   *
    *     configuration ::=
    *         'if' '(' test ')' uri
    *
@@ -5344,7 +5384,7 @@
    *         identifier ('.' identifier)*
    */
   Configuration _parseConfiguration() {
-    Token ifKeyword = _expectKeyword(Keyword.IF);
+    Token ifKeyword = getAndAdvance();
     Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
     DottedName name = _parseDottedName();
     Token equalToken = null;
@@ -5364,12 +5404,13 @@
   }
 
   /**
-   * Parse a list of configurations. If conditional directives are not
-   * supported, return an empty list without attempting to parse anything.
+   * Parse a list of configurations. Return the configurations that were parsed,
+   * or `null` if there are no configurations.
    */
   List<Configuration> _parseConfigurations() {
-    List<Configuration> configurations = <Configuration>[];
+    List<Configuration> configurations = null;
     while (_matchesKeyword(Keyword.IF)) {
+      configurations ??= <Configuration>[];
       configurations.add(_parseConfiguration());
     }
     return configurations;
@@ -5378,19 +5419,22 @@
   /**
    * Parse a const expression. Return the const expression that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.CONST`.
+   *
    *     constExpression ::=
    *         instanceCreationExpression
    *       | listLiteral
    *       | mapLiteral
    */
   Expression _parseConstExpression() {
-    Token keyword = _expectKeyword(Keyword.CONST);
-    if (_matches(TokenType.LT) || _injectGenericCommentTypeList()) {
+    Token keyword = getAndAdvance();
+    TokenType type = _currentToken.type;
+    if (type == TokenType.LT || _injectGenericCommentTypeList()) {
       return _parseListOrMapLiteral(keyword);
-    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
-        _matches(TokenType.INDEX)) {
+    } else if (type == TokenType.OPEN_SQUARE_BRACKET ||
+        type == TokenType.INDEX) {
       return _parseListLiteral(keyword, null);
-    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+    } else if (type == TokenType.OPEN_CURLY_BRACKET) {
       return _parseMapLiteral(keyword, null);
     }
     return _parseInstanceCreationExpression(keyword);
@@ -5410,26 +5454,28 @@
     List<ConstructorInitializer> initializers = null;
     if (_matches(TokenType.COLON)) {
       separator = getAndAdvance();
-      initializers = new List<ConstructorInitializer>();
+      initializers = <ConstructorInitializer>[];
       do {
-        if (_matchesKeyword(Keyword.THIS)) {
-          if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        Keyword keyword = _currentToken.keyword;
+        if (keyword == Keyword.THIS) {
+          TokenType nextType = _peek().type;
+          if (nextType == TokenType.OPEN_PAREN) {
             bodyAllowed = false;
-            initializers.add(_parseRedirectingConstructorInvocation());
-          } else if (_tokenMatches(_peek(), TokenType.PERIOD) &&
+            initializers.add(_parseRedirectingConstructorInvocation(false));
+          } else if (nextType == TokenType.PERIOD &&
               _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
             bodyAllowed = false;
-            initializers.add(_parseRedirectingConstructorInvocation());
+            initializers.add(_parseRedirectingConstructorInvocation(true));
           } else {
-            initializers.add(_parseConstructorFieldInitializer());
+            initializers.add(_parseConstructorFieldInitializer(true));
           }
-        } else if (_matchesKeyword(Keyword.SUPER)) {
+        } else if (keyword == Keyword.SUPER) {
           initializers.add(_parseSuperConstructorInvocation());
         } else if (_matches(TokenType.OPEN_CURLY_BRACKET) ||
             _matches(TokenType.FUNCTION)) {
           _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER);
         } else {
-          initializers.add(_parseConstructorFieldInitializer());
+          initializers.add(_parseConstructorFieldInitializer(false));
         }
       } while (_optional(TokenType.COMMA));
       if (factoryKeyword != null) {
@@ -5492,54 +5538,55 @@
   }
 
   /**
-   * Parse a field initializer within a constructor. Return the field
-   * initializer that was parsed.
+   * Parse a field initializer within a constructor. The flag [hasThis] should
+   * be true if the current token is `this`. Return the field initializer that
+   * was parsed.
    *
    *     fieldInitializer:
    *         ('this' '.')? identifier '=' conditionalExpression cascadeSection*
    */
-  ConstructorFieldInitializer _parseConstructorFieldInitializer() {
-    Token keyword = null;
+  ConstructorFieldInitializer _parseConstructorFieldInitializer(bool hasThis) {
+    Token keywordToken = null;
     Token period = null;
-    if (_matchesKeyword(Keyword.THIS)) {
-      keyword = getAndAdvance();
+    if (hasThis) {
+      keywordToken = getAndAdvance();
       period = _expect(TokenType.PERIOD);
     }
     SimpleIdentifier fieldName = parseSimpleIdentifier();
     Token equals = null;
-    if (_matches(TokenType.EQ)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.EQ) {
       equals = getAndAdvance();
-    } else if (!_matchesKeyword(Keyword.THIS) &&
-        !_matchesKeyword(Keyword.SUPER) &&
-        !_matches(TokenType.OPEN_CURLY_BRACKET) &&
-        !_matches(TokenType.FUNCTION)) {
-      _reportErrorForCurrentToken(
-          ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER);
-      equals = _createSyntheticToken(TokenType.EQ);
     } else {
       _reportErrorForCurrentToken(
           ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER);
-      return new ConstructorFieldInitializer(keyword, period, fieldName,
-          _createSyntheticToken(TokenType.EQ), _createSyntheticIdentifier());
+      Keyword keyword = _currentToken.keyword;
+      if (keyword != Keyword.THIS &&
+          keyword != Keyword.SUPER &&
+          type != TokenType.OPEN_CURLY_BRACKET &&
+          type != TokenType.FUNCTION) {
+        equals = _createSyntheticToken(TokenType.EQ);
+      } else {
+        return new ConstructorFieldInitializer(keywordToken, period, fieldName,
+            _createSyntheticToken(TokenType.EQ), _createSyntheticIdentifier());
+      }
     }
     bool wasInInitializer = _inInitializer;
     _inInitializer = true;
     try {
       Expression expression = parseConditionalExpression();
-      TokenType tokenType = _currentToken.type;
-      if (tokenType == TokenType.PERIOD_PERIOD) {
-        List<Expression> cascadeSections = new List<Expression>();
-        while (tokenType == TokenType.PERIOD_PERIOD) {
+      if (_matches(TokenType.PERIOD_PERIOD)) {
+        List<Expression> cascadeSections = <Expression>[];
+        do {
           Expression section = _parseCascadeSection();
           if (section != null) {
             cascadeSections.add(section);
           }
-          tokenType = _currentToken.type;
-        }
+        } while (_matches(TokenType.PERIOD_PERIOD));
         expression = new CascadeExpression(expression, cascadeSections);
       }
       return new ConstructorFieldInitializer(
-          keyword, period, fieldName, equals, expression);
+          keywordToken, period, fieldName, equals, expression);
     } finally {
       _inInitializer = wasInInitializer;
     }
@@ -5548,18 +5595,20 @@
   /**
    * Parse a continue statement. Return the continue statement that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.CONTINUE`.
+   *
    *     continueStatement ::=
    *         'continue' identifier? ';'
    */
   Statement _parseContinueStatement() {
-    Token continueKeyword = _expectKeyword(Keyword.CONTINUE);
+    Token continueKeyword = getAndAdvance();
     if (!_inLoop && !_inSwitch) {
       _reportErrorForToken(
           ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword);
     }
     SimpleIdentifier label = null;
     if (_matchesIdentifier()) {
-      label = parseSimpleIdentifier();
+      label = _parseSimpleIdentifierUnchecked();
     }
     if (_inSwitch && !_inLoop && label == null) {
       _reportErrorForToken(
@@ -5587,7 +5636,7 @@
     } else if (_matchesKeyword(Keyword.LIBRARY)) {
       return _parseLibraryDirective(commentAndMetadata);
     } else if (_matchesKeyword(Keyword.PART)) {
-      return _parsePartDirective(commentAndMetadata);
+      return _parsePartOrPartOfDirective(commentAndMetadata);
     } else {
       // Internal error: this method should not have been invoked if the current
       // token was something other than one of the above.
@@ -5609,16 +5658,18 @@
     if (_matches(TokenType.SCRIPT_TAG)) {
       scriptTag = new ScriptTag(getAndAdvance());
     }
-    List<Directive> directives = new List<Directive>();
+    List<Directive> directives = <Directive>[];
     while (!_matches(TokenType.EOF)) {
       CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
-      if ((_matchesKeyword(Keyword.IMPORT) ||
-              _matchesKeyword(Keyword.EXPORT) ||
-              _matchesKeyword(Keyword.LIBRARY) ||
-              _matchesKeyword(Keyword.PART)) &&
-          !_tokenMatches(_peek(), TokenType.PERIOD) &&
-          !_tokenMatches(_peek(), TokenType.LT) &&
-          !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      Keyword keyword = _currentToken.keyword;
+      TokenType type = _peek().type;
+      if ((keyword == Keyword.IMPORT ||
+              keyword == Keyword.EXPORT ||
+              keyword == Keyword.LIBRARY ||
+              keyword == Keyword.PART) &&
+          type != TokenType.PERIOD &&
+          type != TokenType.LT &&
+          type != TokenType.OPEN_PAREN) {
         directives.add(_parseDirective(commentAndMetadata));
       } else if (_matches(TokenType.SEMICOLON)) {
         _advance();
@@ -5626,12 +5677,29 @@
         while (!_matches(TokenType.EOF)) {
           _advance();
         }
-        return new CompilationUnit(firstToken, scriptTag, directives,
-            new List<CompilationUnitMember>(), _currentToken);
+        return new CompilationUnit(
+            firstToken, scriptTag, directives, null, _currentToken);
       }
     }
-    return new CompilationUnit(firstToken, scriptTag, directives,
-        new List<CompilationUnitMember>(), _currentToken);
+    return new CompilationUnit(
+        firstToken, scriptTag, directives, null, _currentToken);
+  }
+
+  /**
+   * Parse a documentation comment based on the given list of documentation
+   * comment tokens. Return the documentation comment that was parsed, or `null`
+   * if there was no comment.
+   *
+   *     documentationComment ::=
+   *         multiLineComment?
+   *       | singleLineComment*
+   */
+  Comment _parseDocumentationComment(List<DocumentationCommentToken> tokens) {
+    if (tokens == null) {
+      return null;
+    }
+    List<CommentReference> references = _parseCommentReferences(tokens);
+    return Comment.createDocumentationCommentWithReferences(tokens, references);
   }
 
   /**
@@ -5642,37 +5710,32 @@
    *         multiLineComment?
    *       | singleLineComment*
    */
-  Comment _parseDocumentationComment() {
-    List<DocumentationCommentToken> documentationTokens =
-        <DocumentationCommentToken>[];
+  List<DocumentationCommentToken> _parseDocumentationCommentTokens() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[];
     CommentToken commentToken = _currentToken.precedingComments;
     while (commentToken != null) {
       if (commentToken is DocumentationCommentToken) {
-        if (documentationTokens.isNotEmpty) {
+        if (tokens.isNotEmpty) {
           if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
-            if (documentationTokens[0].type != TokenType.SINGLE_LINE_COMMENT) {
-              documentationTokens.clear();
+            if (tokens[0].type != TokenType.SINGLE_LINE_COMMENT) {
+              tokens.clear();
             }
           } else {
-            documentationTokens.clear();
+            tokens.clear();
           }
         }
-        documentationTokens.add(commentToken);
+        tokens.add(commentToken);
       }
       commentToken = commentToken.next;
     }
-    if (documentationTokens.isEmpty) {
-      return null;
-    }
-    List<CommentReference> references =
-        _parseCommentReferences(documentationTokens);
-    return Comment.createDocumentationCommentWithReferences(
-        documentationTokens, references);
+    return tokens.isEmpty ? null : tokens;
   }
 
   /**
    * Parse a do statement. Return the do statement that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.DO`.
+   *
    *     doStatement ::=
    *         'do' statement 'while' '(' expression ')' ';'
    */
@@ -5680,7 +5743,7 @@
     bool wasInLoop = _inLoop;
     _inLoop = true;
     try {
-      Token doKeyword = _expectKeyword(Keyword.DO);
+      Token doKeyword = getAndAdvance();
       Statement body = parseStatement2();
       Token whileKeyword = _expectKeyword(Keyword.WHILE);
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
@@ -5701,10 +5764,10 @@
    *         identifier ('.' identifier)*
    */
   DottedName _parseDottedName() {
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
-    components.add(parseSimpleIdentifier());
-    while (_matches(TokenType.PERIOD)) {
-      _advance();
+    List<SimpleIdentifier> components = <SimpleIdentifier>[
+      parseSimpleIdentifier()
+    ];
+    while (_optional(TokenType.PERIOD)) {
       components.add(parseSimpleIdentifier());
     }
     return new DottedName(components);
@@ -5713,20 +5776,36 @@
   /**
    * Parse an empty statement. Return the empty statement that was parsed.
    *
+   * This method assumes that the current token matches `TokenType.SEMICOLON`.
+   *
    *     emptyStatement ::=
    *         ';'
    */
   Statement _parseEmptyStatement() => new EmptyStatement(getAndAdvance());
 
+  /**
+   * Parse an enum constant declaration. Return the enum constant declaration
+   * that was parsed.
+   *
+   * Specified:
+   *
+   *     enumConstant ::=
+   *         id
+   *
+   * Actual:
+   *
+   *     enumConstant ::=
+   *         metadata id
+   */
   EnumConstantDeclaration _parseEnumConstantDeclaration() {
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     SimpleIdentifier name;
     if (_matchesIdentifier()) {
-      name = parseSimpleIdentifier(isDeclaration: true);
+      name = _parseSimpleIdentifierUnchecked(isDeclaration: true);
     } else {
       name = _createSyntheticIdentifier();
     }
-    if (commentAndMetadata.metadata.isNotEmpty) {
+    if (commentAndMetadata.hasMetadata) {
       _reportErrorForNode(ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT,
           commentAndMetadata.metadata[0]);
     }
@@ -5738,18 +5817,19 @@
    * Parse an enum declaration. The [commentAndMetadata] is the metadata to be
    * associated with the member. Return the enum declaration that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.ENUM`.
+   *
    *     enumType ::=
    *         metadata 'enum' id '{' id (',' id)* (',')? '}'
    */
   EnumDeclaration _parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
-    Token keyword = _expectKeyword(Keyword.ENUM);
+    Token keyword = getAndAdvance();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     Token leftBracket = null;
-    List<EnumConstantDeclaration> constants =
-        new List<EnumConstantDeclaration>();
+    List<EnumConstantDeclaration> constants = <EnumConstantDeclaration>[];
     Token rightBracket = null;
     if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
-      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      leftBracket = getAndAdvance();
       if (_matchesIdentifier() || _matches(TokenType.AT)) {
         constants.add(_parseEnumConstantDeclaration());
       } else if (_matches(TokenType.COMMA) &&
@@ -5792,7 +5872,7 @@
    */
   Expression _parseEqualityExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
+    if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isEqualityOperator) {
       expression = new SuperExpression(getAndAdvance());
     } else {
@@ -5800,13 +5880,12 @@
     }
     bool leftEqualityExpression = false;
     while (_currentToken.type.isEqualityOperator) {
-      Token operator = getAndAdvance();
       if (leftEqualityExpression) {
         _reportErrorForNode(
             ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, expression);
       }
       expression = new BinaryExpression(
-          expression, operator, _parseRelationalExpression());
+          expression, getAndAdvance(), _parseRelationalExpression());
       leftEqualityExpression = true;
     }
     return expression;
@@ -5816,11 +5895,13 @@
    * Parse an export directive. The [commentAndMetadata] is the metadata to be
    * associated with the directive. Return the export directive that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.EXPORT`.
+   *
    *     exportDirective ::=
    *         metadata 'export' stringLiteral configuration* combinator*';'
    */
   ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) {
-    Token exportKeyword = _expectKeyword(Keyword.EXPORT);
+    Token exportKeyword = getAndAdvance();
     StringLiteral libraryUri = _parseUri();
     List<Configuration> configurations = _parseConfigurations();
     List<Combinator> combinators = _parseCombinators();
@@ -5842,8 +5923,7 @@
    *         expression (',' expression)*
    */
   List<Expression> _parseExpressionList() {
-    List<Expression> expressions = new List<Expression>();
-    expressions.add(parseExpression2());
+    List<Expression> expressions = <Expression>[parseExpression2()];
     while (_optional(TokenType.COMMA)) {
       expressions.add(parseExpression2());
     }
@@ -5862,23 +5942,24 @@
    *       | type
    */
   FinalConstVarOrType _parseFinalConstVarOrType(bool optional) {
-    Token keyword = null;
+    Token keywordToken = null;
     TypeName type = null;
-    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.CONST)) {
-      keyword = getAndAdvance();
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.FINAL || keyword == Keyword.CONST) {
+      keywordToken = getAndAdvance();
       if (_isTypedIdentifier(_currentToken)) {
         type = parseTypeName();
       } else {
         // Support `final/*=T*/ x;`
         type = _parseOptionalTypeNameComment();
       }
-    } else if (_matchesKeyword(Keyword.VAR)) {
-      keyword = getAndAdvance();
+    } else if (keyword == Keyword.VAR) {
+      keywordToken = getAndAdvance();
       // Support `var/*=T*/ x;`
       type = _parseOptionalTypeNameComment();
       if (type != null) {
         // Clear the keyword to prevent an error.
-        keyword = null;
+        keywordToken = null;
       }
     } else if (_isTypedIdentifier(_currentToken)) {
       type = parseReturnType();
@@ -5890,7 +5971,7 @@
       // This is not supported if the type is required.
       type = _parseOptionalTypeNameComment();
     }
-    return new FinalConstVarOrType(keyword, type);
+    return new FinalConstVarOrType(keywordToken, type);
   }
 
   /**
@@ -5907,31 +5988,32 @@
    */
   FormalParameter _parseFormalParameter(ParameterKind kind) {
     NormalFormalParameter parameter = parseNormalFormalParameter();
-    if (_matches(TokenType.EQ)) {
-      Token seperator = getAndAdvance();
+    TokenType type = _currentToken.type;
+    if (type == TokenType.EQ) {
+      Token separator = getAndAdvance();
       Expression defaultValue = parseExpression2();
       if (kind == ParameterKind.NAMED) {
         _reportErrorForToken(
-            ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator);
+            ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, separator);
       } else if (kind == ParameterKind.REQUIRED) {
         _reportErrorForNode(
             ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter);
       }
       return new DefaultFormalParameter(
-          parameter, kind, seperator, defaultValue);
-    } else if (_matches(TokenType.COLON)) {
-      Token seperator = getAndAdvance();
+          parameter, kind, separator, defaultValue);
+    } else if (type == TokenType.COLON) {
+      Token separator = getAndAdvance();
       Expression defaultValue = parseExpression2();
       if (kind == ParameterKind.POSITIONAL) {
         _reportErrorForToken(
             ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
-            seperator);
+            separator);
       } else if (kind == ParameterKind.REQUIRED) {
         _reportErrorForNode(
             ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter);
       }
       return new DefaultFormalParameter(
-          parameter, kind, seperator, defaultValue);
+          parameter, kind, separator, defaultValue);
     } else if (kind != ParameterKind.REQUIRED) {
       return new DefaultFormalParameter(parameter, kind, null, null);
     }
@@ -5939,6 +6021,160 @@
   }
 
   /**
+   * Parse a list of formal parameters given that the list starts with the given
+   * [leftParenthesis]. Return the formal parameters that were parsed.
+   */
+  FormalParameterList _parseFormalParameterListAfterParen(
+      Token leftParenthesis) {
+    if (_matches(TokenType.CLOSE_PAREN)) {
+      return new FormalParameterList(
+          leftParenthesis, null, null, null, getAndAdvance());
+    }
+    //
+    // Even though it is invalid to have default parameters outside of brackets,
+    // required parameters inside of brackets, or multiple groups of default and
+    // named parameters, we allow all of these cases so that we can recover
+    // better.
+    //
+    List<FormalParameter> parameters = <FormalParameter>[];
+    Token leftSquareBracket = null;
+    Token rightSquareBracket = null;
+    Token leftCurlyBracket = null;
+    Token rightCurlyBracket = null;
+    ParameterKind kind = ParameterKind.REQUIRED;
+    bool firstParameter = true;
+    bool reportedMultiplePositionalGroups = false;
+    bool reportedMultipleNamedGroups = false;
+    bool reportedMixedGroups = false;
+    bool wasOptionalParameter = false;
+    Token initialToken = null;
+    do {
+      if (firstParameter) {
+        firstParameter = false;
+      } else if (!_optional(TokenType.COMMA)) {
+        // TODO(brianwilkerson) The token is wrong, we need to recover from this
+        // case.
+        if (_getEndToken(leftParenthesis) != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        } else {
+          _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
+              _currentToken.previous);
+          break;
+        }
+      }
+      initialToken = _currentToken;
+      //
+      // Handle the beginning of parameter groups.
+      //
+      TokenType type = _currentToken.type;
+      if (type == TokenType.OPEN_SQUARE_BRACKET) {
+        wasOptionalParameter = true;
+        if (leftSquareBracket != null && !reportedMultiplePositionalGroups) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS);
+          reportedMultiplePositionalGroups = true;
+        }
+        if (leftCurlyBracket != null && !reportedMixedGroups) {
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
+          reportedMixedGroups = true;
+        }
+        leftSquareBracket = getAndAdvance();
+        kind = ParameterKind.POSITIONAL;
+      } else if (type == TokenType.OPEN_CURLY_BRACKET) {
+        wasOptionalParameter = true;
+        if (leftCurlyBracket != null && !reportedMultipleNamedGroups) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS);
+          reportedMultipleNamedGroups = true;
+        }
+        if (leftSquareBracket != null && !reportedMixedGroups) {
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
+          reportedMixedGroups = true;
+        }
+        leftCurlyBracket = getAndAdvance();
+        kind = ParameterKind.NAMED;
+      }
+      //
+      // Parse and record the parameter.
+      //
+      FormalParameter parameter = _parseFormalParameter(kind);
+      parameters.add(parameter);
+      if (kind == ParameterKind.REQUIRED && wasOptionalParameter) {
+        _reportErrorForNode(
+            ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter);
+      }
+      //
+      // Handle the end of parameter groups.
+      //
+      // TODO(brianwilkerson) Improve the detection and reporting of missing and
+      // mismatched delimiters.
+      type = _currentToken.type;
+      if (type == TokenType.CLOSE_SQUARE_BRACKET) {
+        rightSquareBracket = getAndAdvance();
+        if (leftSquareBracket == null) {
+          if (leftCurlyBracket != null) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            rightCurlyBracket = rightSquareBracket;
+            rightSquareBracket = null;
+          } else {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+                ["["]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      } else if (type == TokenType.CLOSE_CURLY_BRACKET) {
+        rightCurlyBracket = getAndAdvance();
+        if (leftCurlyBracket == null) {
+          if (leftSquareBracket != null) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            rightSquareBracket = rightCurlyBracket;
+            rightCurlyBracket = null;
+          } else {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+                ["{"]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      }
+    } while (!_matches(TokenType.CLOSE_PAREN) &&
+        !identical(initialToken, _currentToken));
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+    //
+    // Check that the groups were closed correctly.
+    //
+    if (leftSquareBracket != null && rightSquareBracket == null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+    }
+    if (leftCurlyBracket != null && rightCurlyBracket == null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+    }
+    //
+    // Build the parameter list.
+    //
+    leftSquareBracket ??= leftCurlyBracket;
+    rightSquareBracket ??= rightCurlyBracket;
+    return new FormalParameterList(leftParenthesis, parameters,
+        leftSquareBracket, rightSquareBracket, rightParenthesis);
+  }
+
+  /**
+   * Parse a list of formal parameters. Return the formal parameters that were
+   * parsed.
+   *
+   * This method assumes that the current token matches `TokenType.OPEN_PAREN`.
+   */
+  FormalParameterList _parseFormalParameterListUnchecked() {
+    return _parseFormalParameterListAfterParen(getAndAdvance());
+  }
+
+  /**
    * Parse a for statement. Return the for statement that was parsed.
    *
    *     forStatement ::=
@@ -5970,19 +6206,20 @@
         if (_matchesIdentifier() &&
             (_tokenMatchesKeyword(_peek(), Keyword.IN) ||
                 _tokenMatches(_peek(), TokenType.COLON))) {
-          List<VariableDeclaration> variables = new List<VariableDeclaration>();
-          SimpleIdentifier variableName = parseSimpleIdentifier();
-          variables.add(new VariableDeclaration(variableName, null, null));
+          SimpleIdentifier variableName = _parseSimpleIdentifierUnchecked();
           variableList = new VariableDeclarationList(commentAndMetadata.comment,
-              commentAndMetadata.metadata, null, null, variables);
+              commentAndMetadata.metadata, null, null, <VariableDeclaration>[
+            new VariableDeclaration(variableName, null, null)
+          ]);
         } else if (_isInitializedVariableDeclaration()) {
           variableList =
               _parseVariableDeclarationListAfterMetadata(commentAndMetadata);
         } else {
           initialization = parseExpression2();
         }
-        if (_matchesKeyword(Keyword.IN) || _matches(TokenType.COLON)) {
-          if (_matches(TokenType.COLON)) {
+        TokenType type = _currentToken.type;
+        if (_matchesKeyword(Keyword.IN) || type == TokenType.COLON) {
+          if (type == TokenType.COLON) {
             _reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN);
           }
           DeclaredIdentifier loopVariable = null;
@@ -6014,7 +6251,7 @@
                   new SimpleIdentifier(variable.name.token,
                       isDeclaration: true));
             } else {
-              if (!commentAndMetadata.metadata.isEmpty) {
+              if (commentAndMetadata.hasMetadata) {
                 // TODO(jwren) metadata isn't allowed before the identifier in
                 // "identifier in expression", add warning if commentAndMetadata
                 // has content
@@ -6106,45 +6343,47 @@
     _inLoop = false;
     _inSwitch = false;
     try {
-      if (_matches(TokenType.SEMICOLON)) {
+      TokenType type = _currentToken.type;
+      if (type == TokenType.SEMICOLON) {
         if (!mayBeEmpty) {
           _reportErrorForCurrentToken(emptyErrorCode);
         }
         return new EmptyFunctionBody(getAndAdvance());
-      } else if (_matchesString(_NATIVE)) {
-        Token nativeToken = getAndAdvance();
-        StringLiteral stringLiteral = null;
-        if (_matches(TokenType.STRING)) {
-          stringLiteral = parseStringLiteral();
-        }
-        return new NativeFunctionBody(
-            nativeToken, stringLiteral, _expect(TokenType.SEMICOLON));
       }
       Token keyword = null;
       Token star = null;
-      if (_matchesString(ASYNC)) {
-        keyword = getAndAdvance();
-        if (!_parseAsync) {
-          _reportErrorForToken(ParserErrorCode.ASYNC_NOT_SUPPORTED, keyword);
-        }
-        if (_matches(TokenType.STAR)) {
-          star = getAndAdvance();
-          _inGenerator = true;
-        }
-        _inAsync = true;
-      } else if (_matchesString(SYNC)) {
-        keyword = getAndAdvance();
-        if (!_parseAsync) {
-          _reportErrorForToken(ParserErrorCode.ASYNC_NOT_SUPPORTED, keyword);
-        }
-        if (_matches(TokenType.STAR)) {
-          star = getAndAdvance();
-          _inGenerator = true;
+      bool foundAsync = false;
+      bool foundSync = false;
+      if (type == TokenType.IDENTIFIER) {
+        String lexeme = _currentToken.lexeme;
+        if (lexeme == ASYNC) {
+          foundAsync = true;
+          keyword = getAndAdvance();
+          if (!_parseAsync) {
+            _reportErrorForToken(ParserErrorCode.ASYNC_NOT_SUPPORTED, keyword);
+          }
+          if (_matches(TokenType.STAR)) {
+            star = getAndAdvance();
+            _inGenerator = true;
+          }
+          type = _currentToken.type;
+          _inAsync = true;
+        } else if (lexeme == SYNC) {
+          foundSync = true;
+          keyword = getAndAdvance();
+          if (!_parseAsync) {
+            _reportErrorForToken(ParserErrorCode.ASYNC_NOT_SUPPORTED, keyword);
+          }
+          if (_matches(TokenType.STAR)) {
+            star = getAndAdvance();
+            _inGenerator = true;
+          }
+          type = _currentToken.type;
         }
       }
-      if (_matches(TokenType.FUNCTION)) {
+      if (type == TokenType.FUNCTION) {
         if (keyword != null) {
-          if (!_tokenMatchesString(keyword, ASYNC)) {
+          if (!foundAsync) {
             _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword);
             keyword = null;
           } else if (star != null) {
@@ -6169,9 +6408,9 @@
         }
         return new ExpressionFunctionBody(
             keyword, functionDefinition, expression, semicolon);
-      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      } else if (type == TokenType.OPEN_CURLY_BRACKET) {
         if (keyword != null) {
-          if (_tokenMatchesString(keyword, SYNC) && star == null) {
+          if (foundSync && star == null) {
             _reportErrorForToken(
                 ParserErrorCode.MISSING_STAR_AFTER_SYNC, keyword);
           }
@@ -6182,6 +6421,14 @@
               _createSyntheticToken(TokenType.SEMICOLON));
         }
         return new BlockFunctionBody(keyword, star, parseBlock());
+      } else if (_matchesString(_NATIVE)) {
+        Token nativeToken = getAndAdvance();
+        StringLiteral stringLiteral = null;
+        if (_matches(TokenType.STRING)) {
+          stringLiteral = _parseStringLiteralUnchecked();
+        }
+        return new NativeFunctionBody(
+            nativeToken, stringLiteral, _expect(TokenType.SEMICOLON));
       } else {
         // Invalid function body
         _reportErrorForCurrentToken(emptyErrorCode);
@@ -6213,22 +6460,28 @@
       CommentAndMetadata commentAndMetadata,
       Token externalKeyword,
       TypeName returnType) {
-    Token keyword = null;
+    Token keywordToken = null;
     bool isGetter = false;
-    if (_matchesKeyword(Keyword.GET) &&
-        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      keyword = getAndAdvance();
+    Keyword keyword = _currentToken.keyword;
+    SimpleIdentifier name = null;
+    if (keyword == Keyword.GET) {
+      keywordToken = getAndAdvance();
       isGetter = true;
-    } else if (_matchesKeyword(Keyword.SET) &&
-        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      keyword = getAndAdvance();
+    } else if (keyword == Keyword.SET) {
+      keywordToken = getAndAdvance();
     }
-    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
+    if (keywordToken != null && _matches(TokenType.OPEN_PAREN)) {
+      name = new SimpleIdentifier(keywordToken, isDeclaration: true);
+      keywordToken = null;
+      isGetter = false;
+    } else {
+      name = parseSimpleIdentifier(isDeclaration: true);
+    }
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     FormalParameterList parameters = null;
     if (!isGetter) {
       if (_matches(TokenType.OPEN_PAREN)) {
-        parameters = parseFormalParameterList();
+        parameters = _parseFormalParameterListUnchecked();
         _validateFormalParameterList(parameters);
       } else {
         _reportErrorForCurrentToken(
@@ -6242,7 +6495,7 @@
       }
     } else if (_matches(TokenType.OPEN_PAREN)) {
       _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS);
-      parseFormalParameterList();
+      _parseFormalParameterListUnchecked();
     }
     FunctionBody body;
     if (externalKeyword == null) {
@@ -6261,7 +6514,7 @@
         commentAndMetadata.metadata,
         externalKeyword,
         returnType,
-        keyword,
+        keywordToken,
         name,
         new FunctionExpression(typeParameters, parameters, body));
   }
@@ -6328,7 +6581,8 @@
     if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
     }
-    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.SEMICOLON || type == TokenType.EOF) {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
       FormalParameterList parameters = new FormalParameterList(
           _createSyntheticToken(TokenType.OPEN_PAREN),
@@ -6346,12 +6600,24 @@
           typeParameters,
           parameters,
           semicolon);
-    } else if (!_matches(TokenType.OPEN_PAREN)) {
+    } else if (type == TokenType.OPEN_PAREN) {
+      FormalParameterList parameters = _parseFormalParameterListUnchecked();
+      _validateFormalParameterList(parameters);
+      Token semicolon = _expect(TokenType.SEMICOLON);
+      return new FunctionTypeAlias(
+          commentAndMetadata.comment,
+          commentAndMetadata.metadata,
+          keyword,
+          returnType,
+          name,
+          typeParameters,
+          parameters,
+          semicolon);
+    } else {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
-      // TODO(brianwilkerson) Recover from this error. At the very least we
-      // should skip to the start of the next valid compilation unit member,
-      // allowing for the possibility of finding the typedef parameters before
-      // that point.
+      // Recovery: At the very least we should skip to the start of the next
+      // valid compilation unit member, allowing for the possibility of finding
+      // the typedef parameters before that point.
       return new FunctionTypeAlias(
           commentAndMetadata.comment,
           commentAndMetadata.metadata,
@@ -6363,18 +6629,6 @@
               null, null, null, _createSyntheticToken(TokenType.CLOSE_PAREN)),
           _createSyntheticToken(TokenType.SEMICOLON));
     }
-    FormalParameterList parameters = parseFormalParameterList();
-    _validateFormalParameterList(parameters);
-    Token semicolon = _expect(TokenType.SEMICOLON);
-    return new FunctionTypeAlias(
-        commentAndMetadata.comment,
-        commentAndMetadata.metadata,
-        keyword,
-        returnType,
-        name,
-        typeParameters,
-        parameters,
-        semicolon);
   }
 
   /**
@@ -6416,6 +6670,8 @@
    * been parsed, or `null` if there was no return type. Return the getter that
    * was parsed.
    *
+   * This method assumes that the current token matches `Keyword.GET`.
+   *
    *     getter ::=
    *         getterSignature functionBody?
    *
@@ -6424,7 +6680,7 @@
    */
   MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeName returnType) {
-    Token propertyKeyword = _expectKeyword(Keyword.GET);
+    Token propertyKeyword = getAndAdvance();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     if (_matches(TokenType.OPEN_PAREN) &&
         _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) {
@@ -6461,10 +6717,10 @@
    *         identifier (',' identifier)*
    */
   List<SimpleIdentifier> _parseIdentifierList() {
-    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
-    identifiers.add(parseSimpleIdentifier());
-    while (_matches(TokenType.COMMA)) {
-      _advance();
+    List<SimpleIdentifier> identifiers = <SimpleIdentifier>[
+      parseSimpleIdentifier()
+    ];
+    while (_optional(TokenType.COMMA)) {
       identifiers.add(parseSimpleIdentifier());
     }
     return identifiers;
@@ -6473,11 +6729,13 @@
   /**
    * Parse an if statement. Return the if statement that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.IF`.
+   *
    *     ifStatement ::=
    *         'if' '(' expression ')' statement ('else' statement)?
    */
   Statement _parseIfStatement() {
-    Token ifKeyword = _expectKeyword(Keyword.IF);
+    Token ifKeyword = getAndAdvance();
     Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
     Expression condition = parseExpression2();
     Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
@@ -6496,11 +6754,13 @@
    * Parse an import directive. The [commentAndMetadata] is the metadata to be
    * associated with the directive. Return the import directive that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.IMPORT`.
+   *
    *     importDirective ::=
    *         metadata 'import' stringLiteral configuration* (deferred)? ('as' identifier)? combinator*';'
    */
   ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) {
-    Token importKeyword = _expectKeyword(Keyword.IMPORT);
+    Token importKeyword = getAndAdvance();
     StringLiteral libraryUri = _parseUri();
     List<Configuration> configurations = _parseConfigurations();
     Token deferredToken = null;
@@ -6590,7 +6850,7 @@
    */
   InstanceCreationExpression _parseInstanceCreationExpression(Token keyword) {
     ConstructorName constructorName = parseConstructorName();
-    ArgumentList argumentList = parseArgumentList();
+    ArgumentList argumentList = _parseArgumentListChecked();
     return new InstanceCreationExpression(
         keyword, constructorName, argumentList);
   }
@@ -6600,12 +6860,14 @@
    * associated with the directive. Return the library directive that was
    * parsed.
    *
+   * This method assumes that the current token matches `Keyword.LIBRARY`.
+   *
    *     libraryDirective ::=
    *         metadata 'library' identifier ';'
    */
   LibraryDirective _parseLibraryDirective(
       CommentAndMetadata commentAndMetadata) {
-    Token keyword = _expectKeyword(Keyword.LIBRARY);
+    Token keyword = getAndAdvance();
     LibraryIdentifier libraryName = _parseLibraryName(
         ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, keyword);
     Token semicolon = _expect(TokenType.SEMICOLON);
@@ -6627,17 +6889,15 @@
     if (_matchesIdentifier()) {
       return parseLibraryIdentifier();
     } else if (_matches(TokenType.STRING)) {
-      // TODO(brianwilkerson) Recovery: This should be extended to handle
-      // arbitrary tokens until we can find a token that can start a compilation
-      // unit member.
+      // Recovery: This should be extended to handle arbitrary tokens until we
+      // can find a token that can start a compilation unit member.
       StringLiteral string = parseStringLiteral();
       _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string);
     } else {
       _reportErrorForToken(missingNameError, missingNameToken);
     }
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
-    components.add(_createSyntheticIdentifier());
-    return new LibraryIdentifier(components);
+    return new LibraryIdentifier(
+        <SimpleIdentifier>[_createSyntheticIdentifier()]);
   }
 
   /**
@@ -6646,13 +6906,16 @@
    * is the type arguments appearing before the literal, or `null` if there are
    * no type arguments. Return the list literal that was parsed.
    *
+   * This method assumes that the current token matches either
+   * `TokenType.OPEN_SQUARE_BRACKET` or `TokenType.INDEX`.
+   *
    *     listLiteral ::=
    *         'const'? typeArguments? '[' (expressionList ','?)? ']'
    */
   ListLiteral _parseListLiteral(
       Token modifier, TypeArgumentList typeArguments) {
-    // may be empty list literal
     if (_matches(TokenType.INDEX)) {
+      // Split the token into two separate tokens.
       BeginToken leftBracket = _createToken(
           _currentToken, TokenType.OPEN_SQUARE_BRACKET,
           isBegin: true);
@@ -6666,8 +6929,7 @@
       return new ListLiteral(
           modifier, typeArguments, leftBracket, null, rightBracket);
     }
-    // open
-    Token leftBracket = _expect(TokenType.OPEN_SQUARE_BRACKET);
+    Token leftBracket = getAndAdvance();
     if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
       return new ListLiteral(
           modifier, typeArguments, leftBracket, null, getAndAdvance());
@@ -6675,8 +6937,7 @@
     bool wasInInitializer = _inInitializer;
     _inInitializer = false;
     try {
-      List<Expression> elements = new List<Expression>();
-      elements.add(parseExpression2());
+      List<Expression> elements = <Expression>[parseExpression2()];
       while (_optional(TokenType.COMMA)) {
         if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
           return new ListLiteral(
@@ -6727,10 +6988,9 @@
    */
   Expression _parseLogicalAndExpression() {
     Expression expression = _parseEqualityExpression();
-    while (_matches(TokenType.AMPERSAND_AMPERSAND)) {
-      Token operator = getAndAdvance();
+    while (_currentToken.type == TokenType.AMPERSAND_AMPERSAND) {
       expression = new BinaryExpression(
-          expression, operator, _parseEqualityExpression());
+          expression, getAndAdvance(), _parseEqualityExpression());
     }
     return expression;
   }
@@ -6741,20 +7001,22 @@
    * is the type arguments that were declared, or `null` if there are no type
    * arguments. Return the map literal that was parsed.
    *
+   * This method assumes that the current token matches
+   * `TokenType.OPEN_CURLY_BRACKET`.
+   *
    *     mapLiteral ::=
    *         'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
    */
   MapLiteral _parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
-    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
-    List<MapLiteralEntry> entries = new List<MapLiteralEntry>();
+    Token leftBracket = getAndAdvance();
     if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
       return new MapLiteral(
-          modifier, typeArguments, leftBracket, entries, getAndAdvance());
+          modifier, typeArguments, leftBracket, null, getAndAdvance());
     }
     bool wasInInitializer = _inInitializer;
     _inInitializer = false;
     try {
-      entries.add(parseMapLiteralEntry());
+      List<MapLiteralEntry> entries = <MapLiteralEntry>[parseMapLiteralEntry()];
       while (_optional(TokenType.COMMA)) {
         if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
           return new MapLiteral(
@@ -6838,9 +7100,11 @@
     SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     FormalParameterList parameters;
-    if (!_matches(TokenType.OPEN_PAREN) &&
-        (_matches(TokenType.OPEN_CURLY_BRACKET) ||
-            _matches(TokenType.FUNCTION))) {
+    TokenType type = _currentToken.type;
+    // TODO(brianwilkerson) Figure out why we care what the current token is if
+    // it isn't a paren.
+    if (type != TokenType.OPEN_PAREN &&
+        (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.FUNCTION)) {
       _reportErrorForToken(
           ParserErrorCode.MISSING_METHOD_PARAMETERS, _currentToken.previous);
       parameters = new FormalParameterList(
@@ -6878,12 +7142,14 @@
     Modifiers modifiers = new Modifiers();
     bool progress = true;
     while (progress) {
-      if (_tokenMatches(_peek(), TokenType.PERIOD) ||
-          _tokenMatches(_peek(), TokenType.LT) ||
-          _tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      TokenType nextType = _peek().type;
+      if (nextType == TokenType.PERIOD ||
+          nextType == TokenType.LT ||
+          nextType == TokenType.OPEN_PAREN) {
         return modifiers;
       }
-      if (_matchesKeyword(Keyword.ABSTRACT)) {
+      Keyword keyword = _currentToken.keyword;
+      if (keyword == Keyword.ABSTRACT) {
         if (modifiers.abstractKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6891,7 +7157,7 @@
         } else {
           modifiers.abstractKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.CONST)) {
+      } else if (keyword == Keyword.CONST) {
         if (modifiers.constKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6899,9 +7165,7 @@
         } else {
           modifiers.constKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.EXTERNAL) &&
-          !_tokenMatches(_peek(), TokenType.PERIOD) &&
-          !_tokenMatches(_peek(), TokenType.LT)) {
+      } else if (keyword == Keyword.EXTERNAL) {
         if (modifiers.externalKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6909,9 +7173,7 @@
         } else {
           modifiers.externalKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.FACTORY) &&
-          !_tokenMatches(_peek(), TokenType.PERIOD) &&
-          !_tokenMatches(_peek(), TokenType.LT)) {
+      } else if (keyword == Keyword.FACTORY) {
         if (modifiers.factoryKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6919,7 +7181,7 @@
         } else {
           modifiers.factoryKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.FINAL)) {
+      } else if (keyword == Keyword.FINAL) {
         if (modifiers.finalKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6927,9 +7189,7 @@
         } else {
           modifiers.finalKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.STATIC) &&
-          !_tokenMatches(_peek(), TokenType.PERIOD) &&
-          !_tokenMatches(_peek(), TokenType.LT)) {
+      } else if (keyword == Keyword.STATIC) {
         if (modifiers.staticKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6937,7 +7197,7 @@
         } else {
           modifiers.staticKeyword = getAndAdvance();
         }
-      } else if (_matchesKeyword(Keyword.VAR)) {
+      } else if (keyword == Keyword.VAR) {
         if (modifiers.varKeyword != null) {
           _reportErrorForCurrentToken(
               ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
@@ -6962,16 +7222,15 @@
    */
   Expression _parseMultiplicativeExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
+    if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isMultiplicativeOperator) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseUnaryExpression();
     }
     while (_currentToken.type.isMultiplicativeOperator) {
-      Token operator = getAndAdvance();
-      expression =
-          new BinaryExpression(expression, operator, _parseUnaryExpression());
+      expression = new BinaryExpression(
+          expression, getAndAdvance(), _parseUnaryExpression());
     }
     return expression;
   }
@@ -6979,6 +7238,8 @@
   /**
    * Parse a class native clause. Return the native clause that was parsed.
    *
+   * This method assumes that the current token matches `_NATIVE`.
+   *
    *     classNativeClause ::=
    *         'native' name
    */
@@ -6991,11 +7252,13 @@
   /**
    * Parse a new expression. Return the new expression that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.NEW`.
+   *
    *     newExpression ::=
    *         instanceCreationExpression
    */
   InstanceCreationExpression _parseNewExpression() =>
-      _parseInstanceCreationExpression(_expectKeyword(Keyword.NEW));
+      _parseInstanceCreationExpression(getAndAdvance());
 
   /**
    * Parse a non-labeled statement. Return the non-labeled statement that was
@@ -7020,7 +7283,8 @@
   Statement _parseNonLabeledStatement() {
     // TODO(brianwilkerson) Pass the comment and metadata on where appropriate.
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
-    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.OPEN_CURLY_BRACKET) {
       if (_tokenMatches(_peek(), TokenType.STRING)) {
         Token afterString = _skipStringLiteral(_currentToken.next);
         if (afterString != null && afterString.type == TokenType.COLON) {
@@ -7029,7 +7293,7 @@
         }
       }
       return parseBlock();
-    } else if (_matches(TokenType.KEYWORD) &&
+    } else if (type == TokenType.KEYWORD &&
         !_currentToken.keyword.isPseudoKeyword) {
       Keyword keyword = _currentToken.keyword;
       // TODO(jwren) compute some metrics to figure out a better order for this
@@ -7064,9 +7328,11 @@
         return _parseVariableDeclarationStatementAfterMetadata(
             commentAndMetadata);
       } else if (keyword == Keyword.VOID) {
-        TypeName returnType = parseReturnType();
+        TypeName returnType =
+            new TypeName(new SimpleIdentifier(getAndAdvance()), null);
+        Token next = _currentToken.next;
         if (_matchesIdentifier() &&
-            _peek().matchesAny(const <TokenType>[
+            next.matchesAny(const <TokenType>[
               TokenType.OPEN_PAREN,
               TokenType.OPEN_CURLY_BRACKET,
               TokenType.FUNCTION,
@@ -7079,7 +7345,7 @@
           // We have found an error of some kind. Try to recover.
           //
           if (_matchesIdentifier()) {
-            if (_peek().matchesAny(const <TokenType>[
+            if (next.matchesAny(const <TokenType>[
               TokenType.EQ,
               TokenType.COMMA,
               TokenType.SEMICOLON
@@ -7104,7 +7370,8 @@
           return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
         }
       } else if (keyword == Keyword.CONST) {
-        if (_peek().matchesAny(const <TokenType>[
+        Token next = _currentToken.next;
+        if (next.matchesAny(const <TokenType>[
           TokenType.LT,
           TokenType.OPEN_CURLY_BRACKET,
           TokenType.OPEN_SQUARE_BRACKET,
@@ -7112,8 +7379,8 @@
         ])) {
           return new ExpressionStatement(
               parseExpression2(), _expect(TokenType.SEMICOLON));
-        } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) {
-          Token afterType = _skipTypeName(_peek());
+        } else if (_tokenMatches(next, TokenType.IDENTIFIER)) {
+          Token afterType = _skipTypeName(next);
           if (afterType != null) {
             if (_tokenMatches(afterType, TokenType.OPEN_PAREN) ||
                 (_tokenMatches(afterType, TokenType.PERIOD) &&
@@ -7158,14 +7425,14 @@
             CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, awaitToken);
       }
       return statement;
-    } else if (_matches(TokenType.SEMICOLON)) {
+    } else if (type == TokenType.SEMICOLON) {
       return _parseEmptyStatement();
     } else if (_isInitializedVariableDeclaration()) {
       return _parseVariableDeclarationStatementAfterMetadata(
           commentAndMetadata);
     } else if (_isFunctionDeclaration()) {
       return _parseFunctionDeclarationStatement();
-    } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    } else if (type == TokenType.CLOSE_CURLY_BRACKET) {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT);
       return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
     } else {
@@ -7197,6 +7464,29 @@
           ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken);
       operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR);
     }
+    return _parseOperatorAfterKeyword(
+        commentAndMetadata, externalKeyword, returnType, operatorKeyword);
+  }
+
+  /**
+   * Parse an operator declaration starting after the 'operator' keyword. The
+   * [commentAndMetadata] is the documentation comment and metadata to be
+   * associated with the declaration. The [externalKeyword] is the 'external'
+   * token. The [returnType] is the return type that has already been parsed, or
+   * `null` if there was no return type. The [operatorKeyword] is the 'operator'
+   * keyword. Return the operator declaration that was parsed.
+   *
+   *     operatorDeclaration ::=
+   *         operatorSignature (';' | functionBody)
+   *
+   *     operatorSignature ::=
+   *         'external'? returnType? 'operator' operator formalParameterList
+   */
+  MethodDeclaration _parseOperatorAfterKeyword(
+      CommentAndMetadata commentAndMetadata,
+      Token externalKeyword,
+      TypeName returnType,
+      Token operatorKeyword) {
     if (!_currentToken.isUserDefinableOperator) {
       _reportErrorForCurrentToken(
           ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
@@ -7242,21 +7532,27 @@
     TypeName typeComment = _parseOptionalTypeNameComment();
     if (typeComment != null) {
       return typeComment;
-    } else if (_matchesKeyword(Keyword.VOID)) {
-      return parseReturnType();
-    } else if (_matchesIdentifier() &&
-        !_matchesKeyword(Keyword.GET) &&
-        !_matchesKeyword(Keyword.SET) &&
-        !_matchesKeyword(Keyword.OPERATOR) &&
-        (_tokenMatchesIdentifier(_peek()) ||
-            _tokenMatches(_peek(), TokenType.LT))) {
-      return parseReturnType();
-    } else if (_matchesIdentifier() &&
-        _tokenMatches(_peek(), TokenType.PERIOD) &&
-        _tokenMatchesIdentifier(_peekAt(2)) &&
-        (_tokenMatchesIdentifier(_peekAt(3)) ||
-            _tokenMatches(_peekAt(3), TokenType.LT))) {
-      return parseReturnType();
+    }
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.VOID) {
+      return new TypeName(new SimpleIdentifier(getAndAdvance()), null);
+    } else if (_matchesIdentifier()) {
+      Token next = _peek();
+      if (keyword != Keyword.GET &&
+          keyword != Keyword.SET &&
+          keyword != Keyword.OPERATOR &&
+          (_tokenMatchesIdentifier(next) ||
+              _tokenMatches(next, TokenType.LT))) {
+        return parseReturnType();
+      }
+      Token next2 = next.next;
+      Token next3 = next2.next;
+      if (_tokenMatches(next, TokenType.PERIOD) &&
+          _tokenMatchesIdentifier(next2) &&
+          (_tokenMatchesIdentifier(next3) ||
+              _tokenMatches(next3, TokenType.LT))) {
+        return parseReturnType();
+      }
     }
     return null;
   }
@@ -7280,35 +7576,67 @@
   }
 
   /**
+   * Parse a part directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the part or part-of directive that
+   * was parsed.
+   *
+   * This method assumes that the current token matches `Keyword.PART`.
+   *
+   *     partDirective ::=
+   *         metadata 'part' stringLiteral ';'
+   */
+  Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
+    Token partKeyword = getAndAdvance();
+    StringLiteral partUri = _parseUri();
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new PartDirective(commentAndMetadata.comment,
+        commentAndMetadata.metadata, partKeyword, partUri, semicolon);
+  }
+
+  /**
+   * Parse a part-of directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the part or part-of directive that
+   * was parsed.
+   *
+   * This method assumes that the current token matches [Keyword.PART] and that
+   * the following token matches the identifier 'of'.
+   *
+   *     partOfDirective ::=
+   *         metadata 'part' 'of' identifier ';'
+   */
+  Directive _parsePartOfDirective(CommentAndMetadata commentAndMetadata) {
+    Token partKeyword = getAndAdvance();
+    Token ofKeyword = getAndAdvance();
+    LibraryIdentifier libraryName = _parseLibraryName(
+        ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword);
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new PartOfDirective(
+        commentAndMetadata.comment,
+        commentAndMetadata.metadata,
+        partKeyword,
+        ofKeyword,
+        libraryName,
+        semicolon);
+  }
+
+  /**
    * Parse a part or part-of directive. The [commentAndMetadata] is the metadata
    * to be associated with the directive. Return the part or part-of directive
    * that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.PART`.
+   *
    *     partDirective ::=
    *         metadata 'part' stringLiteral ';'
    *
    *     partOfDirective ::=
    *         metadata 'part' 'of' identifier ';'
    */
-  Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
-    Token partKeyword = _expectKeyword(Keyword.PART);
-    if (_matchesString(_OF)) {
-      Token ofKeyword = getAndAdvance();
-      LibraryIdentifier libraryName = _parseLibraryName(
-          ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword);
-      Token semicolon = _expect(TokenType.SEMICOLON);
-      return new PartOfDirective(
-          commentAndMetadata.comment,
-          commentAndMetadata.metadata,
-          partKeyword,
-          ofKeyword,
-          libraryName,
-          semicolon);
+  Directive _parsePartOrPartOfDirective(CommentAndMetadata commentAndMetadata) {
+    if (_tokenMatchesString(_peek(), _OF)) {
+      return _parsePartOfDirective(commentAndMetadata);
     }
-    StringLiteral partUri = _parseUri();
-    Token semicolon = _expect(TokenType.SEMICOLON);
-    return new PartDirective(commentAndMetadata.comment,
-        commentAndMetadata.metadata, partKeyword, partUri, semicolon);
+    return _parsePartDirective(commentAndMetadata);
   }
 
   /**
@@ -7324,11 +7652,12 @@
    */
   Expression _parsePostfixExpression() {
     Expression operand = _parseAssignableExpression(true);
-    if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
-        _matches(TokenType.PERIOD) ||
-        _matches(TokenType.QUESTION_PERIOD) ||
-        _matches(TokenType.OPEN_PAREN) ||
-        (parseGenericMethods && _matches(TokenType.LT))) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.OPEN_SQUARE_BRACKET ||
+        type == TokenType.PERIOD ||
+        type == TokenType.QUESTION_PERIOD ||
+        type == TokenType.OPEN_PAREN ||
+        (parseGenericMethods && type == TokenType.LT)) {
       do {
         if (_isLikelyArgumentList()) {
           TypeArgumentList typeArguments = _parseOptionalTypeArguments();
@@ -7348,10 +7677,11 @@
         } else {
           operand = _parseAssignableSelector(operand, true);
         }
-      } while (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
-          _matches(TokenType.PERIOD) ||
-          _matches(TokenType.QUESTION_PERIOD) ||
-          _matches(TokenType.OPEN_PAREN));
+        type = _currentToken.type;
+      } while (type == TokenType.OPEN_SQUARE_BRACKET ||
+          type == TokenType.PERIOD ||
+          type == TokenType.QUESTION_PERIOD ||
+          type == TokenType.OPEN_PAREN);
       return operand;
     }
     if (!_currentToken.type.isIncrementOperator) {
@@ -7363,6 +7693,37 @@
   }
 
   /**
+   * Parse a prefixed identifier given that the given [qualifier] was already
+   * parsed. Return the prefixed identifier that was parsed.
+   *
+   *     prefixedIdentifier ::=
+   *         identifier ('.' identifier)?
+   */
+  Identifier _parsePrefixedIdentifierAfterIdentifier(
+      SimpleIdentifier qualifier) {
+    if (!_matches(TokenType.PERIOD) || _injectGenericCommentTypeList()) {
+      return qualifier;
+    }
+    Token period = getAndAdvance();
+    SimpleIdentifier qualified = parseSimpleIdentifier();
+    return new PrefixedIdentifier(qualifier, period, qualified);
+  }
+
+  /**
+   * Parse a prefixed identifier. Return the prefixed identifier that was
+   * parsed.
+   *
+   * This method assumes that the current token matches an identifier.
+   *
+   *     prefixedIdentifier ::=
+   *         identifier ('.' identifier)?
+   */
+  Identifier _parsePrefixedIdentifierUnchecked() {
+    return _parsePrefixedIdentifierAfterIdentifier(
+        _parseSimpleIdentifierUnchecked());
+  }
+
+  /**
    * Parse a primary expression. Return the primary expression that was parsed.
    *
    *     primary ::=
@@ -7386,39 +7747,24 @@
    *       | listLiteral
    */
   Expression _parsePrimaryExpression() {
-    if (_matchesKeyword(Keyword.THIS)) {
-      return new ThisExpression(getAndAdvance());
-    } else if (_matchesKeyword(Keyword.SUPER)) {
-      // TODO(paulberry): verify with Gilad that "super" must be followed by
-      // unconditionalAssignableSelector in this case.
-      return _parseAssignableSelector(
-          new SuperExpression(getAndAdvance()), false,
-          allowConditional: false);
-    } else if (_matchesKeyword(Keyword.NULL)) {
-      return new NullLiteral(getAndAdvance());
-    } else if (_matchesKeyword(Keyword.FALSE)) {
-      return new BooleanLiteral(getAndAdvance(), false);
-    } else if (_matchesKeyword(Keyword.TRUE)) {
-      return new BooleanLiteral(getAndAdvance(), true);
-    } else if (_matches(TokenType.DOUBLE)) {
-      Token token = getAndAdvance();
-      double value = 0.0;
-      try {
-        value = double.parse(token.lexeme);
-      } on FormatException {
-        // The invalid format should have been reported by the scanner.
-      }
-      return new DoubleLiteral(token, value);
-    } else if (_matches(TokenType.HEXADECIMAL)) {
-      Token token = getAndAdvance();
-      int value = null;
-      try {
-        value = int.parse(token.lexeme.substring(2), radix: 16);
-      } on FormatException {
-        // The invalid format should have been reported by the scanner.
-      }
-      return new IntegerLiteral(token, value);
-    } else if (_matches(TokenType.INT)) {
+    if (_matchesIdentifier()) {
+      // TODO(brianwilkerson) The code below was an attempt to recover from an
+      // error case, but it needs to be applied as a recovery only after we
+      // know that parsing it as an identifier doesn't work. Leaving the code as
+      // a reminder of how to recover.
+//      if (isFunctionExpression(_peek())) {
+//        //
+//        // Function expressions were allowed to have names at one point, but this is now illegal.
+//        //
+//        reportError(ParserErrorCode.NAMED_FUNCTION_EXPRESSION, getAndAdvance());
+//        return parseFunctionExpression();
+//      }
+      return _parsePrefixedIdentifierUnchecked();
+    }
+    TokenType type = _currentToken.type;
+    if (type == TokenType.STRING) {
+      return parseStringLiteral();
+    } else if (type == TokenType.INT) {
       Token token = getAndAdvance();
       int value = null;
       try {
@@ -7427,26 +7773,46 @@
         // The invalid format should have been reported by the scanner.
       }
       return new IntegerLiteral(token, value);
-    } else if (_matches(TokenType.STRING)) {
-      return parseStringLiteral();
-    } else if (_matchesIdentifier()) {
-      // TODO(brianwilkerson) The code below was an attempt to recover from an
-      // error case, but it needs to be applied as a recovery only after we
-      // know that parsing it as an identifier doesn't work. Leaving the code as
-      // a reminder of how to recover.
-//            if (isFunctionExpression(peek())) {
-//              //
-//              // Function expressions were allowed to have names at one point, but this is now illegal.
-//              //
-//              reportError(ParserErrorCode.NAMED_FUNCTION_EXPRESSION, getAndAdvance());
-//              return parseFunctionExpression();
-//            }
-      return parsePrefixedIdentifier();
-    } else if (_matchesKeyword(Keyword.NEW)) {
+    }
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.NULL) {
+      return new NullLiteral(getAndAdvance());
+    } else if (keyword == Keyword.NEW) {
       return _parseNewExpression();
-    } else if (_matchesKeyword(Keyword.CONST)) {
+    } else if (keyword == Keyword.THIS) {
+      return new ThisExpression(getAndAdvance());
+    } else if (keyword == Keyword.SUPER) {
+      // TODO(paulberry): verify with Gilad that "super" must be followed by
+      // unconditionalAssignableSelector in this case.
+      return _parseAssignableSelector(
+          new SuperExpression(getAndAdvance()), false,
+          allowConditional: false);
+    } else if (keyword == Keyword.FALSE) {
+      return new BooleanLiteral(getAndAdvance(), false);
+    } else if (keyword == Keyword.TRUE) {
+      return new BooleanLiteral(getAndAdvance(), true);
+    }
+    if (type == TokenType.DOUBLE) {
+      Token token = getAndAdvance();
+      double value = 0.0;
+      try {
+        value = double.parse(token.lexeme);
+      } on FormatException {
+        // The invalid format should have been reported by the scanner.
+      }
+      return new DoubleLiteral(token, value);
+    } else if (type == TokenType.HEXADECIMAL) {
+      Token token = getAndAdvance();
+      int value = null;
+      try {
+        value = int.parse(token.lexeme.substring(2), radix: 16);
+      } on FormatException {
+        // The invalid format should have been reported by the scanner.
+      }
+      return new IntegerLiteral(token, value);
+    } else if (keyword == Keyword.CONST) {
       return _parseConstExpression();
-    } else if (_matches(TokenType.OPEN_PAREN)) {
+    } else if (type == TokenType.OPEN_PAREN) {
       if (_isFunctionExpression(_currentToken)) {
         return parseFunctionExpression();
       }
@@ -7461,20 +7827,20 @@
       } finally {
         _inInitializer = wasInInitializer;
       }
-    } else if (_matches(TokenType.LT) || _injectGenericCommentTypeList()) {
+    } else if (type == TokenType.LT || _injectGenericCommentTypeList()) {
       return _parseListOrMapLiteral(null);
-    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+    } else if (type == TokenType.OPEN_CURLY_BRACKET) {
       return _parseMapLiteral(null, null);
-    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
-        _matches(TokenType.INDEX)) {
+    } else if (type == TokenType.OPEN_SQUARE_BRACKET ||
+        type == TokenType.INDEX) {
       return _parseListLiteral(null, null);
-    } else if (_matches(TokenType.QUESTION) &&
+    } else if (type == TokenType.QUESTION &&
         _tokenMatches(_peek(), TokenType.IDENTIFIER)) {
       _reportErrorForCurrentToken(
           ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
       _advance();
       return _parsePrimaryExpression();
-    } else if (_matchesKeyword(Keyword.VOID)) {
+    } else if (keyword == Keyword.VOID) {
       //
       // Recover from having a return type of "void" where a return type is not
       // expected.
@@ -7484,7 +7850,7 @@
           ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
       _advance();
       return _parsePrimaryExpression();
-    } else if (_matches(TokenType.HASH)) {
+    } else if (type == TokenType.HASH) {
       return _parseSymbolLiteral();
     } else {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
@@ -7493,21 +7859,31 @@
   }
 
   /**
-   * Parse a redirecting constructor invocation. Return the redirecting
+   * Parse a redirecting constructor invocation. The flag [hasPeriod] should be
+   * `true` if the `this` is followed by a period. Return the redirecting
    * constructor invocation that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.THIS`.
+   *
    *     redirectingConstructorInvocation ::=
    *         'this' ('.' identifier)? arguments
    */
-  RedirectingConstructorInvocation _parseRedirectingConstructorInvocation() {
-    Token keyword = _expectKeyword(Keyword.THIS);
+  RedirectingConstructorInvocation _parseRedirectingConstructorInvocation(
+      bool hasPeriod) {
+    Token keyword = getAndAdvance();
     Token period = null;
     SimpleIdentifier constructorName = null;
-    if (_matches(TokenType.PERIOD)) {
+    if (hasPeriod) {
       period = getAndAdvance();
-      constructorName = parseSimpleIdentifier();
+      if (_matchesIdentifier()) {
+        constructorName = _parseSimpleIdentifierUnchecked(isDeclaration: false);
+      } else {
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+        constructorName = _createSyntheticIdentifier(isDeclaration: false);
+        _advance();
+      }
     }
-    ArgumentList argumentList = parseArgumentList();
+    ArgumentList argumentList = _parseArgumentListChecked();
     return new RedirectingConstructorInvocation(
         keyword, period, constructorName, argumentList);
   }
@@ -7521,29 +7897,29 @@
    *       | 'super' relationalOperator bitwiseOrExpression
    */
   Expression _parseRelationalExpression() {
-    if (_matchesKeyword(Keyword.SUPER) &&
+    if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isRelationalOperator) {
       Expression expression = new SuperExpression(getAndAdvance());
       Token operator = getAndAdvance();
-      expression = new BinaryExpression(
+      return new BinaryExpression(
           expression, operator, parseBitwiseOrExpression());
-      return expression;
     }
     Expression expression = parseBitwiseOrExpression();
-    if (_matchesKeyword(Keyword.AS)) {
+    Keyword keyword = _currentToken.keyword;
+    if (keyword == Keyword.AS) {
       Token asOperator = getAndAdvance();
-      expression = new AsExpression(expression, asOperator, parseTypeName());
-    } else if (_matchesKeyword(Keyword.IS)) {
+      return new AsExpression(expression, asOperator, parseTypeName());
+    } else if (keyword == Keyword.IS) {
       Token isOperator = getAndAdvance();
       Token notOperator = null;
       if (_matches(TokenType.BANG)) {
         notOperator = getAndAdvance();
       }
-      expression = new IsExpression(
+      return new IsExpression(
           expression, isOperator, notOperator, parseTypeName());
     } else if (_currentToken.type.isRelationalOperator) {
       Token operator = getAndAdvance();
-      expression = new BinaryExpression(
+      return new BinaryExpression(
           expression, operator, parseBitwiseOrExpression());
     }
     return expression;
@@ -7552,20 +7928,24 @@
   /**
    * Parse a rethrow expression. Return the rethrow expression that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.RETHROW`.
+   *
    *     rethrowExpression ::=
    *         'rethrow'
    */
   Expression _parseRethrowExpression() =>
-      new RethrowExpression(_expectKeyword(Keyword.RETHROW));
+      new RethrowExpression(getAndAdvance());
 
   /**
    * Parse a return statement. Return the return statement that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.RETURN`.
+   *
    *     returnStatement ::=
    *         'return' expression? ';'
    */
   Statement _parseReturnStatement() {
-    Token returnKeyword = _expectKeyword(Keyword.RETURN);
+    Token returnKeyword = getAndAdvance();
     if (_matches(TokenType.SEMICOLON)) {
       return new ReturnStatement(returnKeyword, null, getAndAdvance());
     }
@@ -7582,6 +7962,8 @@
    * already been parsed, or `null` if there was no return type. Return the
    * setter that was parsed.
    *
+   * This method assumes that the current token matches `Keyword.SET`.
+   *
    *     setter ::=
    *         setterSignature functionBody?
    *
@@ -7590,7 +7972,7 @@
    */
   MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeName returnType) {
-    Token propertyKeyword = _expectKeyword(Keyword.SET);
+    Token propertyKeyword = getAndAdvance();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     FormalParameterList parameters = parseFormalParameterList();
     _validateFormalParameterList(parameters);
@@ -7624,21 +8006,39 @@
    */
   Expression _parseShiftExpression() {
     Expression expression;
-    if (_matchesKeyword(Keyword.SUPER) &&
+    if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isShiftOperator) {
       expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseAdditiveExpression();
     }
     while (_currentToken.type.isShiftOperator) {
-      Token operator = getAndAdvance();
       expression = new BinaryExpression(
-          expression, operator, _parseAdditiveExpression());
+          expression, getAndAdvance(), _parseAdditiveExpression());
     }
     return expression;
   }
 
   /**
+   * Parse a simple identifier. Return the simple identifier that was parsed.
+   *
+   * This method assumes that the current token matches an identifier.
+   *
+   *     identifier ::=
+   *         IDENTIFIER
+   */
+  SimpleIdentifier _parseSimpleIdentifierUnchecked(
+      {bool isDeclaration: false}) {
+    String lexeme = _currentToken.lexeme;
+    if ((_inAsync || _inGenerator) &&
+        (lexeme == ASYNC || lexeme == _AWAIT || lexeme == _YIELD)) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER);
+    }
+    return new SimpleIdentifier(getAndAdvance(), isDeclaration: isDeclaration);
+  }
+
+  /**
    * Parse a list of statements within a switch statement. Return the statements
    * that were parsed.
    *
@@ -7646,10 +8046,11 @@
    *         statement*
    */
   List<Statement> _parseStatementList() {
-    List<Statement> statements = new List<Statement>();
+    List<Statement> statements = <Statement>[];
     Token statementStart = _currentToken;
-    while (!_matches(TokenType.EOF) &&
-        !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
+    TokenType type = _currentToken.type;
+    while (type != TokenType.EOF &&
+        type != TokenType.CLOSE_CURLY_BRACKET &&
         !_isSwitchMember()) {
       statements.add(parseStatement2());
       if (identical(_currentToken, statementStart)) {
@@ -7658,6 +8059,7 @@
         _advance();
       }
       statementStart = _currentToken;
+      type = _currentToken.type;
     }
     return statements;
   }
@@ -7665,15 +8067,20 @@
   /**
    * Parse a string literal that contains interpolations. Return the string
    * literal that was parsed.
+   *
+   * This method assumes that the current token matches either
+   * [TokenType.STRING_INTERPOLATION_EXPRESSION] or
+   * [TokenType.STRING_INTERPOLATION_IDENTIFIER].
    */
   StringInterpolation _parseStringInterpolation(Token string) {
-    List<InterpolationElement> elements = new List<InterpolationElement>();
-    bool hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
-        _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
-    elements.add(new InterpolationString(
-        string, _computeStringValue(string.lexeme, true, !hasMore)));
+    List<InterpolationElement> elements = <InterpolationElement>[
+      new InterpolationString(
+          string, _computeStringValue(string.lexeme, true, false))
+    ];
+    bool hasMore = true;
+    bool isExpression = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION);
     while (hasMore) {
-      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+      if (isExpression) {
         Token openToken = getAndAdvance();
         bool wasInInitializer = _inInitializer;
         _inInitializer = false;
@@ -7697,8 +8104,9 @@
       }
       if (_matches(TokenType.STRING)) {
         string = getAndAdvance();
-        hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
-            _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+        isExpression = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION);
+        hasMore =
+            isExpression || _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
         elements.add(new InterpolationString(
             string, _computeStringValue(string.lexeme, false, !hasMore)));
       } else {
@@ -7709,21 +8117,47 @@
   }
 
   /**
+   * Parse a string literal. Return the string literal that was parsed.
+   *
+   * This method assumes that the current token matches `TokenType.STRING`.
+   *
+   *     stringLiteral ::=
+   *         MULTI_LINE_STRING+
+   *       | SINGLE_LINE_STRING+
+   */
+  StringLiteral _parseStringLiteralUnchecked() {
+    List<StringLiteral> strings = <StringLiteral>[];
+    do {
+      Token string = getAndAdvance();
+      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
+          _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+        strings.add(_parseStringInterpolation(string));
+      } else {
+        strings.add(new SimpleStringLiteral(
+            string, _computeStringValue(string.lexeme, true, true)));
+      }
+    } while (_matches(TokenType.STRING));
+    return strings.length == 1 ? strings[0] : new AdjacentStrings(strings);
+  }
+
+  /**
    * Parse a super constructor invocation. Return the super constructor
    * invocation that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.SUPER].
+   *
    *     superConstructorInvocation ::=
    *         'super' ('.' identifier)? arguments
    */
   SuperConstructorInvocation _parseSuperConstructorInvocation() {
-    Token keyword = _expectKeyword(Keyword.SUPER);
+    Token keyword = getAndAdvance();
     Token period = null;
     SimpleIdentifier constructorName = null;
     if (_matches(TokenType.PERIOD)) {
       period = getAndAdvance();
       constructorName = parseSimpleIdentifier();
     }
-    ArgumentList argumentList = parseArgumentList();
+    ArgumentList argumentList = _parseArgumentListChecked();
     return new SuperConstructorInvocation(
         keyword, period, constructorName, argumentList);
   }
@@ -7751,14 +8185,14 @@
       Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
       Token defaultKeyword = null;
-      List<SwitchMember> members = new List<SwitchMember>();
-      while (!_matches(TokenType.EOF) &&
-          !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
-        List<Label> labels = new List<Label>();
+      List<SwitchMember> members = <SwitchMember>[];
+      TokenType type = _currentToken.type;
+      while (type != TokenType.EOF && type != TokenType.CLOSE_CURLY_BRACKET) {
+        List<Label> labels = <Label>[];
         while (
             _matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
           SimpleIdentifier identifier =
-              parseSimpleIdentifier(isDeclaration: true);
+              _parseSimpleIdentifierUnchecked(isDeclaration: true);
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
             _reportErrorForToken(
@@ -7768,10 +8202,11 @@
           } else {
             definedLabels.add(label);
           }
-          Token colon = _expect(TokenType.COLON);
+          Token colon = getAndAdvance();
           labels.add(new Label(identifier, colon));
         }
-        if (_matchesKeyword(Keyword.CASE)) {
+        Keyword keyword = _currentToken.keyword;
+        if (keyword == Keyword.CASE) {
           Token caseKeyword = getAndAdvance();
           Expression caseExpression = parseExpression2();
           Token colon = _expect(TokenType.COLON);
@@ -7782,7 +8217,7 @@
                 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
                 caseKeyword);
           }
-        } else if (_matchesKeyword(Keyword.DEFAULT)) {
+        } else if (keyword == Keyword.DEFAULT) {
           if (defaultKeyword != null) {
             _reportErrorForToken(
                 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, _peek());
@@ -7795,13 +8230,20 @@
           // We need to advance, otherwise we could end up in an infinite loop,
           // but this could be a lot smarter about recovering from the error.
           _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT);
-          while (!_matches(TokenType.EOF) &&
-              !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
-              !_matchesKeyword(Keyword.CASE) &&
-              !_matchesKeyword(Keyword.DEFAULT)) {
+          bool atEndOrNextMember() {
+            TokenType type = _currentToken.type;
+            if (type == TokenType.EOF ||
+                type == TokenType.CLOSE_CURLY_BRACKET) {
+              return true;
+            }
+            Keyword keyword = _currentToken.keyword;
+            return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
+          }
+          while (!atEndOrNextMember()) {
             _advance();
           }
         }
+        type = _currentToken.type;
       }
       Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
       return new SwitchStatement(keyword, leftParenthesis, expression,
@@ -7814,16 +8256,17 @@
   /**
    * Parse a symbol literal. Return the symbol literal that was parsed.
    *
+   * This method assumes that the current token matches [TokenType.HASH].
+   *
    *     symbolLiteral ::=
    *         '#' identifier ('.' identifier)*
    */
   SymbolLiteral _parseSymbolLiteral() {
     Token poundSign = getAndAdvance();
-    List<Token> components = new List<Token>();
+    List<Token> components = <Token>[];
     if (_matchesIdentifier()) {
       components.add(getAndAdvance());
-      while (_matches(TokenType.PERIOD)) {
-        _advance();
+      while (_optional(TokenType.PERIOD)) {
         if (_matchesIdentifier()) {
           components.add(getAndAdvance());
         } else {
@@ -7834,7 +8277,7 @@
       }
     } else if (_currentToken.isOperator) {
       components.add(getAndAdvance());
-    } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) {
+    } else if (_matchesKeyword(Keyword.VOID)) {
       components.add(getAndAdvance());
     } else {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
@@ -7846,12 +8289,15 @@
   /**
    * Parse a throw expression. Return the throw expression that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.THROW].
+   *
    *     throwExpression ::=
    *         'throw' expression
    */
   Expression _parseThrowExpression() {
-    Token keyword = _expectKeyword(Keyword.THROW);
-    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+    Token keyword = getAndAdvance();
+    TokenType type = _currentToken.type;
+    if (type == TokenType.SEMICOLON || type == TokenType.CLOSE_PAREN) {
       _reportErrorForToken(
           ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken);
       return new ThrowExpression(keyword, _createSyntheticIdentifier());
@@ -7863,12 +8309,15 @@
   /**
    * Parse a throw expression. Return the throw expression that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.THROW].
+   *
    *     throwExpressionWithoutCascade ::=
    *         'throw' expressionWithoutCascade
    */
   Expression _parseThrowExpressionWithoutCascade() {
-    Token keyword = _expectKeyword(Keyword.THROW);
-    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+    Token keyword = getAndAdvance();
+    TokenType type = _currentToken.type;
+    if (type == TokenType.SEMICOLON || type == TokenType.CLOSE_PAREN) {
       _reportErrorForToken(
           ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken);
       return new ThrowExpression(keyword, _createSyntheticIdentifier());
@@ -7880,6 +8329,8 @@
   /**
    * Parse a try statement. Return the try statement that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.TRY].
+   *
    *     tryStatement ::=
    *         'try' block (onPart+ finallyPart? | finallyPart)
    *
@@ -7894,9 +8345,9 @@
    *         'finally' block
    */
   Statement _parseTryStatement() {
-    Token tryKeyword = _expectKeyword(Keyword.TRY);
-    Block body = parseBlock();
-    List<CatchClause> catchClauses = new List<CatchClause>();
+    Token tryKeyword = getAndAdvance();
+    Block body = _parseBlockChecked();
+    List<CatchClause> catchClauses = <CatchClause>[];
     Block finallyClause = null;
     while (_matchesString(_ON) || _matchesKeyword(Keyword.CATCH)) {
       Token onKeyword = null;
@@ -7921,7 +8372,7 @@
         }
         rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       }
-      Block catchBody = parseBlock();
+      Block catchBody = _parseBlockChecked();
       catchClauses.add(new CatchClause(
           onKeyword,
           exceptionType,
@@ -7936,11 +8387,9 @@
     Token finallyKeyword = null;
     if (_matchesKeyword(Keyword.FINALLY)) {
       finallyKeyword = getAndAdvance();
-      finallyClause = parseBlock();
-    } else {
-      if (catchClauses.isEmpty) {
-        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY);
-      }
+      finallyClause = _parseBlockChecked();
+    } else if (catchClauses.isEmpty) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY);
     }
     return new TryStatement(
         tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
@@ -7950,6 +8399,8 @@
    * Parse a type alias. The [commentAndMetadata] is the metadata to be
    * associated with the member. Return the type alias that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.TYPEDEF].
+   *
    *     typeAlias ::=
    *         'typedef' typeAliasBody
    *
@@ -7970,7 +8421,7 @@
    *         returnType? name
    */
   TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) {
-    Token keyword = _expectKeyword(Keyword.TYPEDEF);
+    Token keyword = getAndAdvance();
     if (_matchesIdentifier()) {
       Token next = _peek();
       if (_tokenMatches(next, TokenType.LT)) {
@@ -7995,11 +8446,11 @@
 
   TypeName _parseTypeName() {
     Identifier typeName;
-    if (_matchesKeyword(Keyword.VAR)) {
+    if (_matchesIdentifier()) {
+      typeName = _parsePrefixedIdentifierUnchecked();
+    } else if (_matchesKeyword(Keyword.VAR)) {
       _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME);
       typeName = new SimpleIdentifier(getAndAdvance());
-    } else if (_matchesIdentifier()) {
-      typeName = parsePrefixedIdentifier();
     } else {
       typeName = _createSyntheticIdentifier();
       _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME);
@@ -8009,6 +8460,25 @@
   }
 
   /**
+   * Parse a type name. Return the type name that was parsed.
+   *
+   * This method assumes that the current token is an identifier.
+   *
+   *     type ::=
+   *         qualified typeArguments?
+   */
+  TypeName _parseTypeNameAfterIdentifier() {
+    Identifier typeName = _parsePrefixedIdentifierUnchecked();
+    TypeArgumentList typeArguments = _parseOptionalTypeArguments();
+    // If this is followed by a generic method type comment, allow the comment
+    // type to replace the real type name.
+    // TODO(jmesserly): this feels like a big hammer. Can we restrict it to
+    // only work inside generic methods?
+    TypeName typeFromComment = _parseOptionalTypeNameComment();
+    return typeFromComment ?? new TypeName(typeName, typeArguments);
+  }
+
+  /**
    * Parse a unary expression. Return the unary expression that was parsed.
    *
    *     unaryExpression ::=
@@ -8020,13 +8490,15 @@
    *       | incrementOperator assignableExpression
    */
   Expression _parseUnaryExpression() {
-    if (_matches(TokenType.MINUS) ||
-        _matches(TokenType.BANG) ||
-        _matches(TokenType.TILDE)) {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.MINUS ||
+        type == TokenType.BANG ||
+        type == TokenType.TILDE) {
       Token operator = getAndAdvance();
       if (_matchesKeyword(Keyword.SUPER)) {
-        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
-            _tokenMatches(_peek(), TokenType.PERIOD)) {
+        TokenType nextType = _peek().type;
+        if (nextType == TokenType.OPEN_SQUARE_BRACKET ||
+            nextType == TokenType.PERIOD) {
           //     "prefixOperator unaryExpression"
           // --> "prefixOperator postfixExpression"
           // --> "prefixOperator primary                    selector*"
@@ -8040,8 +8512,9 @@
     } else if (_currentToken.type.isIncrementOperator) {
       Token operator = getAndAdvance();
       if (_matchesKeyword(Keyword.SUPER)) {
-        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
-            _tokenMatches(_peek(), TokenType.PERIOD)) {
+        TokenType nextType = _peek().type;
+        if (nextType == TokenType.OPEN_SQUARE_BRACKET ||
+            nextType == TokenType.PERIOD) {
           // --> "prefixOperator 'super' assignableSelector selector*"
           return new PrefixExpression(operator, _parseUnaryExpression());
         }
@@ -8052,7 +8525,7 @@
         // we cannot do the same for "++super" because "+super" is also not
         // valid.
         //
-        if (operator.type == TokenType.MINUS_MINUS) {
+        if (type == TokenType.MINUS_MINUS) {
           Token firstOperator = _createToken(operator, TokenType.MINUS);
           Token secondOperator =
               new Token(TokenType.MINUS, operator.offset + 1);
@@ -8063,16 +8536,16 @@
               firstOperator,
               new PrefixExpression(
                   secondOperator, new SuperExpression(getAndAdvance())));
-        } else {
-          // Invalid operator before 'super'
-          _reportErrorForCurrentToken(
-              ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
-          return new PrefixExpression(
-              operator, new SuperExpression(getAndAdvance()));
         }
+        // Invalid operator before 'super'
+        _reportErrorForCurrentToken(
+            ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+        return new PrefixExpression(
+            operator, new SuperExpression(getAndAdvance()));
       }
-      return new PrefixExpression(operator, _parseAssignableExpression(false));
-    } else if (_matches(TokenType.PLUS)) {
+      return new PrefixExpression(
+          operator, _parseAssignableExpressionNotStartingWithSuper(false));
+    } else if (type == TokenType.PLUS) {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
       return _createSyntheticIdentifier();
     } else if (_inAsync && _matchesString(_AWAIT)) {
@@ -8086,28 +8559,35 @@
    * was parsed.
    */
   StringLiteral _parseUri() {
-    bool iskeywordAfterUri(Token token) =>
+    // TODO(brianwilkerson) Should this function also return true for valid
+    // top-level keywords?
+    bool isKeywordAfterUri(Token token) =>
         token.lexeme == Keyword.AS.syntax ||
         token.lexeme == _HIDE ||
         token.lexeme == _SHOW;
-    if (!_matches(TokenType.STRING) &&
-        !_matches(TokenType.SEMICOLON) &&
-        !iskeywordAfterUri(_currentToken)) {
+    TokenType type = _currentToken.type;
+    if (type != TokenType.STRING &&
+        type != TokenType.SEMICOLON &&
+        !isKeywordAfterUri(_currentToken)) {
       // Attempt to recover in the case where the URI was not enclosed in
       // quotes.
       Token token = _currentToken;
-      while ((_tokenMatchesIdentifier(token) && !iskeywordAfterUri(token)) ||
-          _tokenMatches(token, TokenType.COLON) ||
-          _tokenMatches(token, TokenType.SLASH) ||
-          _tokenMatches(token, TokenType.PERIOD) ||
-          _tokenMatches(token, TokenType.PERIOD_PERIOD) ||
-          _tokenMatches(token, TokenType.PERIOD_PERIOD_PERIOD) ||
-          _tokenMatches(token, TokenType.INT) ||
-          _tokenMatches(token, TokenType.DOUBLE)) {
+      bool isValidInUri(Token token) {
+        TokenType type = token.type;
+        return type == TokenType.COLON ||
+            type == TokenType.SLASH ||
+            type == TokenType.PERIOD ||
+            type == TokenType.PERIOD_PERIOD ||
+            type == TokenType.PERIOD_PERIOD_PERIOD ||
+            type == TokenType.INT ||
+            type == TokenType.DOUBLE;
+      }
+      while ((_tokenMatchesIdentifier(token) && !isKeywordAfterUri(token)) ||
+          isValidInUri(token)) {
         token = token.next;
       }
       if (_tokenMatches(token, TokenType.SEMICOLON) ||
-          iskeywordAfterUri(token)) {
+          isKeywordAfterUri(token)) {
         Token endToken = token.previous;
         token = _currentToken;
         int endOffset = token.end;
@@ -8193,10 +8673,10 @@
         _tokenMatchesKeyword(keyword, Keyword.VAR)) {
       _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword);
     }
-    List<VariableDeclaration> variables = new List<VariableDeclaration>();
-    variables.add(_parseVariableDeclaration());
-    while (_matches(TokenType.COMMA)) {
-      _advance();
+    List<VariableDeclaration> variables = <VariableDeclaration>[
+      _parseVariableDeclaration()
+    ];
+    while (_optional(TokenType.COMMA)) {
       variables.add(_parseVariableDeclaration());
     }
     return new VariableDeclarationList(commentAndMetadata?.comment,
@@ -8250,6 +8730,8 @@
   /**
    * Parse a while statement. Return the while statement that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.WHILE].
+   *
    *     whileStatement ::=
    *         'while' '(' expression ')' statement
    */
@@ -8257,7 +8739,7 @@
     bool wasInLoop = _inLoop;
     _inLoop = true;
     try {
-      Token keyword = _expectKeyword(Keyword.WHILE);
+      Token keyword = getAndAdvance();
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression condition = parseExpression2();
       Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
@@ -8272,6 +8754,8 @@
   /**
    * Parse a yield statement. Return the yield statement that was parsed.
    *
+   * This method assumes that the current token matches [Keyword.YIELD].
+   *
    *     yieldStatement ::=
    *         'yield' '*'? expression ';'
    */
@@ -8415,8 +8899,8 @@
    *   | type
    */
   Token _skipFinalConstVarOrType(Token startToken) {
-    if (_tokenMatchesKeyword(startToken, Keyword.FINAL) ||
-        _tokenMatchesKeyword(startToken, Keyword.CONST)) {
+    Keyword keyword = startToken.keyword;
+    if (keyword == Keyword.FINAL || keyword == Keyword.CONST) {
       Token next = startToken.next;
       if (_tokenMatchesIdentifier(next)) {
         Token next2 = next.next;
@@ -8429,7 +8913,7 @@
         // "parameter"
         return next;
       }
-    } else if (_tokenMatchesKeyword(startToken, Keyword.VAR)) {
+    } else if (keyword == Keyword.VAR) {
       return startToken.next;
     } else if (_tokenMatchesIdentifier(startToken)) {
       Token next = startToken.next;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index cf2ced8..d74e925 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -262,7 +262,6 @@
   @override
   Object visitMethodInvocation(MethodInvocation node) {
     _checkForCanBeNullAfterNullAware(node.realTarget, node.operator);
-    _checkForInvalidProtectedMethodCalls(node);
     DartType staticInvokeType = node.staticInvokeType;
     if (staticInvokeType is InterfaceType) {
       MethodElement methodElement = staticInvokeType.lookUpMethod(
@@ -300,7 +299,7 @@
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForDeprecatedMemberUseAtIdentifier(node);
-    _checkForInvalidProtectedPropertyAccess(node);
+    _checkForInvalidProtectedMemberAccess(node);
     return super.visitSimpleIdentifier(node);
   }
 
@@ -678,61 +677,35 @@
   }
 
   /**
-   * Produces a hint if the given invocation is of a protected method outside
-   * a subclass instance method.
+   * Produces a hint if the given identifier is a protected closure, field or
+   * getter/setter, method closure or invocation accessed outside a subclass.
    */
-  void _checkForInvalidProtectedMethodCalls(MethodInvocation node) {
-    Element element = node.methodName.bestElement;
-    if (element == null || !element.isProtected) {
-      return;
-    }
-
-    ClassElement definingClass = element.enclosingElement;
-
-    MethodDeclaration decl =
-        node.getAncestor((AstNode node) => node is MethodDeclaration);
-    if (decl == null) {
-      _errorReporter.reportErrorForNode(
-          HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
-          node,
-          [node.methodName.toString(), definingClass.name]);
-      return;
-    }
-
-    ClassElement invokingClass = decl.element?.enclosingElement;
-    if (invokingClass != null) {
-      if (!_hasSuperClassOrMixin(invokingClass, definingClass.type)) {
-        _errorReporter.reportErrorForNode(
-            HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
-            node,
-            [node.methodName.toString(), definingClass.name]);
-      }
-    }
-  }
-
-  /**
-   * Produces a hint if the given identifier is a protected field or getter
-   * accessed outside a subclass.
-   */
-  void _checkForInvalidProtectedPropertyAccess(SimpleIdentifier identifier) {
+  void _checkForInvalidProtectedMemberAccess(SimpleIdentifier identifier) {
     if (identifier.inDeclarationContext()) {
       return;
     }
+
+    bool isProtected(Element element) {
+      if (element is PropertyAccessorElement &&
+          element.enclosingElement is ClassElement &&
+          (element.isProtected || element.variable.isProtected)) {
+        return true;
+      }
+      if (element is MethodElement &&
+          element.enclosingElement is ClassElement &&
+          element.isProtected) {
+        return true;
+      }
+      return false;
+    }
+
     Element element = identifier.bestElement;
-    if (element is PropertyAccessorElement &&
-        element.enclosingElement is ClassElement &&
-        (element.isProtected || element.variable.isProtected)) {
+    if (isProtected(element)) {
       ClassElement definingClass = element.enclosingElement;
       ClassDeclaration accessingClass =
           identifier.getAncestor((AstNode node) => node is ClassDeclaration);
-
-      if (accessingClass == null) {
-        _errorReporter.reportErrorForNode(
-            HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
-            identifier,
-            [identifier.name.toString(), definingClass.name]);
-      } else if (!_hasSuperClassOrMixin(
-          accessingClass.element, definingClass.type)) {
+      if (accessingClass == null ||
+          !_hasTypeOrSuperType(accessingClass.element, definingClass.type)) {
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
             identifier,
@@ -962,6 +935,25 @@
   }
 
   /**
+   * Check for situations where the result of a method or function is used, when
+   * it returns 'void'.
+   *
+   * See [HintCode.USE_OF_VOID_RESULT].
+   */
+  void _checkForUseOfVoidResult(Expression expression) {
+    // TODO(jwren) Many other situations of use could be covered. We currently
+    // cover the cases var x = m() and x = m(), but we could also cover cases
+    // such as m().x, m()[k], a + m(), f(m()), return m().
+    if (expression is MethodInvocation) {
+      if (identical(expression.staticType, VoidTypeImpl.instance)) {
+        SimpleIdentifier methodName = expression.methodName;
+        _errorReporter.reportErrorForNode(
+            HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
+      }
+    }
+  }
+
+  /**
    * Check for the passed class declaration for the
    * [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
    *
@@ -990,41 +982,14 @@
 //    return false;
 //  }
 
-  /**
-   * Check for situations where the result of a method or function is used, when
-   * it returns 'void'.
-   *
-   * See [HintCode.USE_OF_VOID_RESULT].
-   */
-  void _checkForUseOfVoidResult(Expression expression) {
-    // TODO(jwren) Many other situations of use could be covered. We currently
-    // cover the cases var x = m() and x = m(), but we could also cover cases
-    // such as m().x, m()[k], a + m(), f(m()), return m().
-    if (expression is MethodInvocation) {
-      if (identical(expression.staticType, VoidTypeImpl.instance)) {
-        SimpleIdentifier methodName = expression.methodName;
-        _errorReporter.reportErrorForNode(
-            HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
-      }
+  bool _hasTypeOrSuperType(ClassElement element, InterfaceType type) {
+    if (element == null) {
+      return false;
     }
-  }
-
-  bool _hasSuperClassOrMixin(ClassElement element, InterfaceType type) {
-    List<ClassElement> seenClasses = <ClassElement>[];
-    while (element != null && !seenClasses.contains(element)) {
-      if (element.type == type) {
-        return true;
-      }
-
-      if (element.mixins.any((InterfaceType t) => t == type)) {
-        return true;
-      }
-
-      seenClasses.add(element);
-      element = element.supertype?.element;
-    }
-
-    return false;
+    ClassElement typeElement = type.element;
+    return element == typeElement ||
+        element.allSupertypes
+            .any((InterfaceType t) => t.element == typeElement);
   }
 
   /**
@@ -2079,22 +2044,25 @@
 
   /**
    * Given some [NodeList] of [Statement]s, from either a [Block] or
-   * [SwitchMember], this loops through the list in reverse order searching for statements
-   * after a return, unlabeled break or unlabeled continue statement to mark them as dead code.
+   * [SwitchMember], this loops through the list searching for dead statements.
    *
    * @param statements some ordered list of statements in a [Block] or [SwitchMember]
    */
   void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) {
+    bool statementExits(Statement statement) {
+      if (statement is BreakStatement) {
+        return statement.label == null;
+      } else if (statement is ContinueStatement) {
+        return statement.label == null;
+      }
+      return ExitDetector.exits(statement);
+    }
+
     int size = statements.length;
     for (int i = 0; i < size; i++) {
       Statement currentStatement = statements[i];
       currentStatement?.accept(this);
-      bool returnOrBreakingStatement = currentStatement is ReturnStatement ||
-          (currentStatement is BreakStatement &&
-              currentStatement.label == null) ||
-          (currentStatement is ContinueStatement &&
-              currentStatement.label == null);
-      if (returnOrBreakingStatement && i != size - 1) {
+      if (statementExits(currentStatement) && i != size - 1) {
         Statement nextStatement = statements[i + 1];
         Statement lastStatement = statements[size - 1];
         int offset = nextStatement.offset;
@@ -3346,9 +3314,8 @@
     //
     // Finish building the enum.
     //
-    ClassElementImpl enumElement = node.name.staticElement as ClassElementImpl;
+    EnumElementImpl enumElement = node.name.staticElement as EnumElementImpl;
     InterfaceType enumType = enumElement.type;
-    enumElement.supertype = _typeProvider.objectType;
     //
     // Populate the fields.
     //
@@ -3407,19 +3374,10 @@
   }
 
   /**
-   * Create a getter that corresponds to the given field.
-   *
-   * @param field the field for which a getter is to be created
-   * @return the getter that was created
+   * Create a getter that corresponds to the given [field].
    */
   PropertyAccessorElement _createGetter(FieldElementImpl field) {
-    PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl.forVariable(field);
-    getter.getter = true;
-    getter.returnType = field.type;
-    getter.type = new FunctionTypeImpl(getter);
-    field.getter = getter;
-    return getter;
+    return new PropertyAccessorElementImpl_ImplicitGetter(field);
   }
 }
 
@@ -3817,18 +3775,7 @@
           return false;
         }
       }
-      // All of the members exit, determine whether there are possible cases
-      // that are not caught by the members.
-      DartType type = node.expression?.bestType;
-      if (type is InterfaceType) {
-        ClassElement element = type.element;
-        if (element != null && element.isEnum) {
-          // If some of the enum values are not covered, then a warning will
-          // have already been generated, so there's no point in generating a
-          // hint.
-          return true;
-        }
-      }
+      // As all cases exit, return whether that list includes `default`.
       return hasDefault;
     } finally {
       _enclosingBlockContainsBreak = outerBreakValue;
@@ -3905,6 +3852,9 @@
     }
   }
 
+  @override
+  bool visitYieldStatement(YieldStatement node) => _nodeExits(node.expression);
+
   /**
    * Return `true` if the given node exits.
    *
@@ -9995,8 +9945,7 @@
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
-    ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    if (element == null) {
+    if (node.element == null) {
       ClassDeclaration classNode =
           node.getAncestor((node) => node is ClassDeclaration);
       StringBuffer buffer = new StringBuffer();
@@ -10013,10 +9962,6 @@
       buffer.write(" was not set while trying to resolve types.");
       AnalysisEngine.instance.logger.logError(buffer.toString(),
           new CaughtException(new AnalysisException(), null));
-    } else {
-      ClassElement definingClass = element.enclosingElement as ClassElement;
-      element.returnType = definingClass.type;
-      element.type = new FunctionTypeImpl(element);
     }
     return null;
   }
@@ -10216,26 +10161,8 @@
       declaredType = _typeNameResolver._getType(typeName);
     }
     Element element = node.name.staticElement;
-    if (element is VariableElement) {
-      (element as VariableElementImpl).type = declaredType;
-      if (element is PropertyInducingElement) {
-        PropertyAccessorElementImpl getter =
-            element.getter as PropertyAccessorElementImpl;
-        getter.returnType = declaredType;
-        getter.type = new FunctionTypeImpl(getter);
-        PropertyAccessorElementImpl setter =
-            element.setter as PropertyAccessorElementImpl;
-        if (setter != null) {
-          List<ParameterElement> parameters = setter.parameters;
-          if (parameters.length > 0) {
-            (parameters[0] as ParameterElementImpl).type = declaredType;
-          }
-          setter.returnType = VoidTypeImpl.instance;
-          setter.type = new FunctionTypeImpl(setter);
-        }
-      }
-    } else {
-      // TODO(brianwilkerson) Report the internal error.
+    if (element is VariableElementImpl) {
+      element.type = declaredType;
     }
     return null;
   }
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 6f50b44..cd813a0 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -38,6 +38,11 @@
   static const String DART_HTML = "dart:html";
 
   /**
+   * The prefix shared by all dart library URIs.
+   */
+  static const String DART_LIBRARY_PREFIX = "dart:";
+
+  /**
    * The version number that is returned when the real version number could not
    * be determined.
    */
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 9fd53dd..106977c 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -47,16 +47,8 @@
     ClassElementImpl element = new ClassElementImpl(typeName, 0);
     element.constructors = const <ConstructorElement>[];
     element.supertype = superclassType;
-    InterfaceTypeImpl type = new InterfaceTypeImpl(element);
-    element.type = type;
     if (parameterNames != null) {
-      int count = parameterNames.length;
-      if (count > 0) {
-        element.typeParameters = typeParameters(parameterNames);
-        type.typeArguments = new List<DartType>.from(
-            element.typeParameters.map((p) => p.type),
-            growable: false);
-      }
+      element.typeParameters = typeParameters(parameterNames);
     }
     return element;
   }
@@ -96,7 +88,6 @@
   static ConstructorElementImpl constructorElement(
       ClassElement definingClass, String name, bool isConst,
       [List<DartType> argumentTypes]) {
-    DartType type = definingClass.type;
     ConstructorElementImpl constructor = name == null
         ? new ConstructorElementImpl("", -1)
         : new ConstructorElementImpl(name, 0);
@@ -123,9 +114,7 @@
     } else {
       constructor.parameters = <ParameterElement>[];
     }
-    constructor.returnType = type;
     constructor.enclosingElement = definingClass;
-    constructor.type = new FunctionTypeImpl(constructor);
     if (!constructor.isSynthetic) {
       constructor.constantInitializers = <ConstructorInitializer>[];
     }
@@ -137,17 +126,13 @@
           [List<DartType> argumentTypes]) =>
       constructorElement(definingClass, name, false, argumentTypes);
 
-  static ClassElementImpl enumElement(
-      TypeProvider typeProvider, String enumName,
+  static EnumElementImpl enumElement(TypeProvider typeProvider, String enumName,
       [List<String> constantNames]) {
     //
     // Build the enum.
     //
-    ClassElementImpl enumElement = new ClassElementImpl(enumName, -1);
-    InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
-    enumElement.type = enumType;
-    enumElement.supertype = objectType;
-    enumElement.enum2 = true;
+    EnumElementImpl enumElement = new EnumElementImpl(enumName, -1);
+    InterfaceTypeImpl enumType = enumElement.type;
     //
     // Populate the fields.
     //
@@ -222,27 +207,9 @@
     if (isConst) {
       (field as ConstFieldElementImpl).constantInitializer = initializer;
     }
-    PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl.forVariable(field);
-    getter.getter = true;
-    getter.synthetic = true;
-    getter.variable = field;
-    getter.returnType = type;
-    field.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
-    getter.type = getterType;
+    new PropertyAccessorElementImpl_ImplicitGetter(field);
     if (!isConst && !isFinal) {
-      PropertyAccessorElementImpl setter =
-          new PropertyAccessorElementImpl.forVariable(field);
-      setter.setter = true;
-      setter.synthetic = true;
-      setter.variable = field;
-      setter.parameters = <ParameterElement>[
-        requiredParameter2("_$name", type)
-      ];
-      setter.returnType = VoidTypeImpl.instance;
-      setter.type = new FunctionTypeImpl(setter);
-      field.setter = setter;
+      new PropertyAccessorElementImpl_ImplicitSetter(field);
     }
     return field;
   }
@@ -564,7 +531,7 @@
     field.synthetic = true;
     field.type = type;
     PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl.forVariable(field);
+        new PropertyAccessorElementImpl(name, -1);
     getter.getter = true;
     getter.variable = field;
     getter.returnType = type;
@@ -573,7 +540,7 @@
     getter.type = getterType;
     ParameterElementImpl parameter = requiredParameter2("a", type);
     PropertyAccessorElementImpl setter =
-        new PropertyAccessorElementImpl.forVariable(field);
+        new PropertyAccessorElementImpl(name, -1);
     setter.setter = true;
     setter.synthetic = true;
     setter.variable = field;
@@ -614,28 +581,9 @@
     variable.final2 = isFinal;
     variable.synthetic = false;
     variable.type = type;
-    PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl.forVariable(variable);
-    getter.getter = true;
-    getter.synthetic = true;
-    getter.variable = variable;
-    getter.returnType = type;
-    variable.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
-    getter.type = getterType;
+    new PropertyAccessorElementImpl_ImplicitGetter(variable);
     if (!isConst && !isFinal) {
-      PropertyAccessorElementImpl setter =
-          new PropertyAccessorElementImpl.forVariable(variable);
-      setter.setter = true;
-      setter.static = true;
-      setter.synthetic = true;
-      setter.variable = variable;
-      setter.parameters = <ParameterElement>[
-        requiredParameter2("_$name", type)
-      ];
-      setter.returnType = VoidTypeImpl.instance;
-      setter.type = new FunctionTypeImpl(setter);
-      variable.setter = setter;
+      new PropertyAccessorElementImpl_ImplicitSetter(variable);
     }
     return variable;
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 64dadf2..0a524fa 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -149,7 +149,7 @@
   InterfaceType _typeType;
 
   /**
-   * The type representing typenames that can't be resolved.
+   * The type representing type names that can't be resolved.
    */
   DartType _undefinedType;
 
@@ -684,10 +684,6 @@
     for (MethodElement method in classElement.methods) {
       (method as ExecutableElementImpl).type = new FunctionTypeImpl(method);
     }
-    for (ConstructorElement constructor in classElement.constructors) {
-      (constructor as ExecutableElementImpl).type =
-          new FunctionTypeImpl(constructor);
-    }
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 19b5be5..7e4103d 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -73,7 +73,6 @@
   }
 
   /// Computes the greatest lower bound of [type1] and [type2].
-  @override
   DartType getGreatestLowerBound(
       TypeProvider provider, DartType type1, DartType type2) {
     // The greatest lower bound relation is reflexive.
@@ -203,6 +202,23 @@
     var inferringTypeSystem =
         new _StrongInferenceTypeSystem(typeProvider, fnType.typeFormals);
 
+    // Special case inference for Future.then.
+    //
+    // We don't have union types, so Future<T>.then<S> is typed to take a
+    // callback `T -> S`. However, the lambda might actually return a
+    // Future<S>. So we handle that special case here.
+    if (argumentTypes.isNotEmpty && argumentTypes[0] is FunctionType) {
+      Element element = fnType?.element;
+      bool isFutureThen = element is MethodElement &&
+          element.name == 'then' &&
+          element.enclosingElement.type.isDartAsyncFuture;
+      if (isFutureThen) {
+        // Ignore return context. We'll let the onValue function's return type
+        // drive inference.
+        returnContextType = null;
+      }
+    }
+
     if (returnContextType != null) {
       inferringTypeSystem.isSubtypeOf(fnType.returnType, returnContextType);
     }
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 701b10e..0a5b904 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -141,6 +141,198 @@
   }
 }
 
+class CacheAnalysisErrorBuilder extends Object with _CacheAnalysisErrorMixin implements idl.CacheAnalysisError {
+  bool _finished = false;
+
+  String _correction;
+  String _errorCodeUniqueName;
+  int _length;
+  String _message;
+  int _offset;
+
+  @override
+  String get correction => _correction ??= '';
+
+  /**
+   * The correction to be displayed for this error, or `null` if there is no
+   * correction information for this error. The correction should indicate how
+   * the user can fix the error.
+   */
+  void set correction(String _value) {
+    assert(!_finished);
+    _correction = _value;
+  }
+
+  @override
+  String get errorCodeUniqueName => _errorCodeUniqueName ??= '';
+
+  /**
+   * The unique name of the error code.
+   */
+  void set errorCodeUniqueName(String _value) {
+    assert(!_finished);
+    _errorCodeUniqueName = _value;
+  }
+
+  @override
+  int get length => _length ??= 0;
+
+  /**
+   * Length of the error range.
+   */
+  void set length(int _value) {
+    assert(!_finished);
+    assert(_value == null || _value >= 0);
+    _length = _value;
+  }
+
+  @override
+  String get message => _message ??= '';
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong and why it is wrong.
+   */
+  void set message(String _value) {
+    assert(!_finished);
+    _message = _value;
+  }
+
+  @override
+  int get offset => _offset ??= 0;
+
+  /**
+   * Offset of the error range relative to the beginning of the file.
+   */
+  void set offset(int _value) {
+    assert(!_finished);
+    assert(_value == null || _value >= 0);
+    _offset = _value;
+  }
+
+  CacheAnalysisErrorBuilder({String correction, String errorCodeUniqueName, int length, String message, int offset})
+    : _correction = correction,
+      _errorCodeUniqueName = errorCodeUniqueName,
+      _length = length,
+      _message = message,
+      _offset = offset;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    assert(!_finished);
+    _finished = true;
+    fb.Offset offset_correction;
+    fb.Offset offset_errorCodeUniqueName;
+    fb.Offset offset_message;
+    if (_correction != null) {
+      offset_correction = fbBuilder.writeString(_correction);
+    }
+    if (_errorCodeUniqueName != null) {
+      offset_errorCodeUniqueName = fbBuilder.writeString(_errorCodeUniqueName);
+    }
+    if (_message != null) {
+      offset_message = fbBuilder.writeString(_message);
+    }
+    fbBuilder.startTable();
+    if (offset_correction != null) {
+      fbBuilder.addOffset(4, offset_correction);
+    }
+    if (offset_errorCodeUniqueName != null) {
+      fbBuilder.addOffset(0, offset_errorCodeUniqueName);
+    }
+    if (_length != null && _length != 0) {
+      fbBuilder.addUint32(2, _length);
+    }
+    if (offset_message != null) {
+      fbBuilder.addOffset(3, offset_message);
+    }
+    if (_offset != null && _offset != 0) {
+      fbBuilder.addUint32(1, _offset);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _CacheAnalysisErrorReader extends fb.TableReader<_CacheAnalysisErrorImpl> {
+  const _CacheAnalysisErrorReader();
+
+  @override
+  _CacheAnalysisErrorImpl createObject(fb.BufferContext bc, int offset) => new _CacheAnalysisErrorImpl(bc, offset);
+}
+
+class _CacheAnalysisErrorImpl extends Object with _CacheAnalysisErrorMixin implements idl.CacheAnalysisError {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _CacheAnalysisErrorImpl(this._bc, this._bcOffset);
+
+  String _correction;
+  String _errorCodeUniqueName;
+  int _length;
+  String _message;
+  int _offset;
+
+  @override
+  String get correction {
+    _correction ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 4, '');
+    return _correction;
+  }
+
+  @override
+  String get errorCodeUniqueName {
+    _errorCodeUniqueName ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+    return _errorCodeUniqueName;
+  }
+
+  @override
+  int get length {
+    _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
+    return _length;
+  }
+
+  @override
+  String get message {
+    _message ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
+    return _message;
+  }
+
+  @override
+  int get offset {
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
+    return _offset;
+  }
+}
+
+abstract class _CacheAnalysisErrorMixin implements idl.CacheAnalysisError {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (correction != '') _result["correction"] = correction;
+    if (errorCodeUniqueName != '') _result["errorCodeUniqueName"] = errorCodeUniqueName;
+    if (length != 0) _result["length"] = length;
+    if (message != '') _result["message"] = message;
+    if (offset != 0) _result["offset"] = offset;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+    "correction": correction,
+    "errorCodeUniqueName": errorCodeUniqueName,
+    "length": length,
+    "message": message,
+    "offset": offset,
+  };
+
+  @override
+  String toString() => convert.JSON.encode(toJson());
+}
+
 class CacheSourceContentBuilder extends Object with _CacheSourceContentMixin implements idl.CacheSourceContent {
   bool _finished = false;
 
@@ -316,6 +508,96 @@
   String toString() => convert.JSON.encode(toJson());
 }
 
+class CacheSourceErrorsInLibraryBuilder extends Object with _CacheSourceErrorsInLibraryMixin implements idl.CacheSourceErrorsInLibrary {
+  bool _finished = false;
+
+  List<CacheAnalysisErrorBuilder> _errors;
+
+  @override
+  List<CacheAnalysisErrorBuilder> get errors => _errors ??= <CacheAnalysisErrorBuilder>[];
+
+  /**
+   * The list of errors in the source in the library.
+   */
+  void set errors(List<CacheAnalysisErrorBuilder> _value) {
+    assert(!_finished);
+    _errors = _value;
+  }
+
+  CacheSourceErrorsInLibraryBuilder({List<CacheAnalysisErrorBuilder> errors})
+    : _errors = errors;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _errors?.forEach((b) => b.flushInformative());
+  }
+
+  List<int> toBuffer() {
+    fb.Builder fbBuilder = new fb.Builder();
+    return fbBuilder.finish(finish(fbBuilder), "CSEL");
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    assert(!_finished);
+    _finished = true;
+    fb.Offset offset_errors;
+    if (!(_errors == null || _errors.isEmpty)) {
+      offset_errors = fbBuilder.writeList(_errors.map((b) => b.finish(fbBuilder)).toList());
+    }
+    fbBuilder.startTable();
+    if (offset_errors != null) {
+      fbBuilder.addOffset(0, offset_errors);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+idl.CacheSourceErrorsInLibrary readCacheSourceErrorsInLibrary(List<int> buffer) {
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _CacheSourceErrorsInLibraryReader().read(rootRef, 0);
+}
+
+class _CacheSourceErrorsInLibraryReader extends fb.TableReader<_CacheSourceErrorsInLibraryImpl> {
+  const _CacheSourceErrorsInLibraryReader();
+
+  @override
+  _CacheSourceErrorsInLibraryImpl createObject(fb.BufferContext bc, int offset) => new _CacheSourceErrorsInLibraryImpl(bc, offset);
+}
+
+class _CacheSourceErrorsInLibraryImpl extends Object with _CacheSourceErrorsInLibraryMixin implements idl.CacheSourceErrorsInLibrary {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _CacheSourceErrorsInLibraryImpl(this._bc, this._bcOffset);
+
+  List<idl.CacheAnalysisError> _errors;
+
+  @override
+  List<idl.CacheAnalysisError> get errors {
+    _errors ??= const fb.ListReader<idl.CacheAnalysisError>(const _CacheAnalysisErrorReader()).vTableGet(_bc, _bcOffset, 0, const <idl.CacheAnalysisError>[]);
+    return _errors;
+  }
+}
+
+abstract class _CacheSourceErrorsInLibraryMixin implements idl.CacheSourceErrorsInLibrary {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (errors.isNotEmpty) _result["errors"] = errors.map((_value) => _value.toJson()).toList();
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+    "errors": errors,
+  };
+
+  @override
+  String toString() => convert.JSON.encode(toJson());
+}
+
 class CodeRangeBuilder extends Object with _CodeRangeMixin implements idl.CodeRange {
   bool _finished = false;
 
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 26c6256..d08851c 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -561,8 +561,11 @@
    * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
    * from the end) and use them as positional arguments.  Use the lists of
    * positional and names arguments to invoke a method (or a function) with
-   * the reference from [UnlinkedConst.references].  Push the result of
-   * invocation value into the stack.
+   * the reference from [UnlinkedConst.references].  If `k` is nonzero (where
+   * `k` is obtained from [UnlinkedConst.ints]), obtain `k` type arguments from
+   * [UnlinkedConst.references] and use them as generic type arguments for the
+   * aforementioned method or function.  Push the result of the invocation onto
+   * the stack.
    *
    * In general `a.b` cannot not be distinguished between: `a` is a prefix and
    * `b` is a top-level function; or `a` is an object and `b` is the name of a
@@ -579,11 +582,14 @@
    * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
    * from the end) and use them as positional arguments.  Use the lists of
    * positional and names arguments to invoke the method with the name from
-   * [UnlinkedConst.strings] of the target popped from the stack, and push the
-   * resulting value into the stack.
+   * [UnlinkedConst.strings] of the target popped from the stack.  If `k` is
+   * nonzero (where `k` is obtained from [UnlinkedConst.ints]), obtain `k` type
+   * arguments from [UnlinkedConst.references] and use them as generic type
+   * arguments for the aforementioned method.  Push the result of the
+   * invocation onto the stack.
    *
    * This operation should be used for invocation of a method invocation
-   * where `target` is know to be an object instance.
+   * where `target` is known to be an object instance.
    */
   invokeMethod,
 
@@ -785,6 +791,39 @@
 }
 
 /**
+ * Information about an analysis error in a source.
+ */
+table CacheAnalysisError {
+  /**
+   * The correction to be displayed for this error, or `null` if there is no
+   * correction information for this error. The correction should indicate how
+   * the user can fix the error.
+   */
+  correction:string (id: 4);
+
+  /**
+   * The unique name of the error code.
+   */
+  errorCodeUniqueName:string (id: 0);
+
+  /**
+   * Length of the error range.
+   */
+  length:uint (id: 2);
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong and why it is wrong.
+   */
+  message:string (id: 3);
+
+  /**
+   * Offset of the error range relative to the beginning of the file.
+   */
+  offset:uint (id: 1);
+}
+
+/**
  * Information about a source that depends only on its content.
  */
 table CacheSourceContent {
@@ -813,6 +852,17 @@
 }
 
 /**
+ * Errors of a source in a library, which depends on the import/export closure
+ * of the containing library and the source.
+ */
+table CacheSourceErrorsInLibrary {
+  /**
+   * The list of errors in the source in the library.
+   */
+  errors:[CacheAnalysisError] (id: 0);
+}
+
+/**
  * Information about an element code range.
  */
 table CodeRange {
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 7f2fe39..505ade8 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -58,6 +58,44 @@
 const informative = null;
 
 /**
+ * Information about an analysis error in a source.
+ */
+abstract class CacheAnalysisError extends base.SummaryClass {
+  /**
+   * The correction to be displayed for this error, or `null` if there is no
+   * correction information for this error. The correction should indicate how
+   * the user can fix the error.
+   */
+  @Id(4)
+  String get correction;
+
+  /**
+   * The unique name of the error code.
+   */
+  @Id(0)
+  String get errorCodeUniqueName;
+
+  /**
+   * Length of the error range.
+   */
+  @Id(2)
+  int get length;
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong and why it is wrong.
+   */
+  @Id(3)
+  String get message;
+
+  /**
+   * Offset of the error range relative to the beginning of the file.
+   */
+  @Id(1)
+  int get offset;
+}
+
+/**
  * Information about a source that depends only on its content.
  */
 @TopLevel('CaSS')
@@ -94,6 +132,21 @@
 }
 
 /**
+ * Errors of a source in a library, which depends on the import/export closure
+ * of the containing library and the source.
+ */
+@TopLevel('CSEL')
+abstract class CacheSourceErrorsInLibrary extends base.SummaryClass {
+  factory CacheSourceErrorsInLibrary.fromBuffer(List<int> buffer) =>
+      generated.readCacheSourceErrorsInLibrary(buffer);
+  /**
+   * The list of errors in the source in the library.
+   */
+  @Id(0)
+  List<CacheAnalysisError> get errors;
+}
+
+/**
  * Kind of a source in the cache.
  */
 enum CacheSourceKind { library, part }
@@ -1401,8 +1454,11 @@
    * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
    * from the end) and use them as positional arguments.  Use the lists of
    * positional and names arguments to invoke a method (or a function) with
-   * the reference from [UnlinkedConst.references].  Push the result of
-   * invocation value into the stack.
+   * the reference from [UnlinkedConst.references].  If `k` is nonzero (where
+   * `k` is obtained from [UnlinkedConst.ints]), obtain `k` type arguments from
+   * [UnlinkedConst.references] and use them as generic type arguments for the
+   * aforementioned method or function.  Push the result of the invocation onto
+   * the stack.
    *
    * In general `a.b` cannot not be distinguished between: `a` is a prefix and
    * `b` is a top-level function; or `a` is an object and `b` is the name of a
@@ -1419,11 +1475,14 @@
    * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
    * from the end) and use them as positional arguments.  Use the lists of
    * positional and names arguments to invoke the method with the name from
-   * [UnlinkedConst.strings] of the target popped from the stack, and push the
-   * resulting value into the stack.
+   * [UnlinkedConst.strings] of the target popped from the stack.  If `k` is
+   * nonzero (where `k` is obtained from [UnlinkedConst.ints]), obtain `k` type
+   * arguments from [UnlinkedConst.references] and use them as generic type
+   * arguments for the aforementioned method.  Push the result of the
+   * invocation onto the stack.
    *
    * This operation should be used for invocation of a method invocation
-   * where `target` is know to be an object instance.
+   * where `target` is known to be an object instance.
    */
   invokeMethod,
 
diff --git a/pkg/analyzer/lib/src/summary/incremental_cache.dart b/pkg/analyzer/lib/src/summary/incremental_cache.dart
index 1d913be..cadeffb 100644
--- a/pkg/analyzer/lib/src/summary/incremental_cache.dart
+++ b/pkg/analyzer/lib/src/summary/incremental_cache.dart
@@ -2,12 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:convert' show ChunkedConversionSink, UTF8;
+import 'dart:convert';
 import 'dart:core' hide Resource;
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -139,9 +140,6 @@
       List<Source> closureSources = _getLibraryClosure(librarySource);
       List<LibraryBundleWithId> closureBundles = <LibraryBundleWithId>[];
       for (Source source in closureSources) {
-        if (source.isInSystemLibrary) {
-          continue;
-        }
         if (getSourceKind(source) == SourceKind.PART) {
           continue;
         }
@@ -159,6 +157,48 @@
   }
 
   /**
+   * Return the parts of the given [librarySource], or `null` if unknown.
+   */
+  List<Source> getLibraryParts(Source librarySource) {
+    try {
+      CacheSourceContent contentSource = _getCacheSourceContent(librarySource);
+      if (contentSource != null) {
+        return contentSource.partUris.map((String partUri) {
+          Source partSource = _resolveUri(librarySource, partUri);
+          if (partSource == null) {
+            throw new StateError(
+                'Unable to resolve $partUri in $librarySource');
+          }
+          return partSource;
+        }).toList();
+      }
+    } catch (e) {}
+    return null;
+  }
+
+  /**
+   * Return cached errors in the given [source] in the context of the given
+   * [librarySource], or `null` if the cache does not have this information.
+   */
+  List<AnalysisError> getSourceErrorsInLibrary(
+      Source librarySource, Source source) {
+    try {
+      String key = _getSourceErrorsKey(librarySource, source);
+      List<int> bytes = storage.get(key);
+      if (bytes == null) {
+        return null;
+      }
+      CacheSourceErrorsInLibrary errorsObject =
+          new CacheSourceErrorsInLibrary.fromBuffer(bytes);
+      return errorsObject.errors
+          .map((e) => _convertErrorFromCached(source, e))
+          .toList();
+    } catch (e) {
+      return null;
+    }
+  }
+
+  /**
    * Return the kind of the given [source], or `null` if unknown.
    */
   SourceKind getSourceKind(Source source) {
@@ -189,11 +229,27 @@
   }
 
   /**
+   * Associate the given [errors] with the [source] in the [librarySource].
+   */
+  void putSourceErrorsInLibrary(
+      Source librarySource, Source source, List<AnalysisError> errors) {
+    CacheSourceErrorsInLibraryBuilder builder =
+        new CacheSourceErrorsInLibraryBuilder(
+            errors: errors.map(_convertErrorToCached).toList());
+    String key = _getSourceErrorsKey(librarySource, source);
+    List<int> bytes = builder.toBuffer();
+    storage.put(key, bytes);
+  }
+
+  /**
    * Fill the whole source closure of the library with the given
    * [librarySource]. It includes defining units and parts of the library and
    * all its directly or indirectly imported or exported libraries.
    */
   void _appendLibraryClosure(Set<Source> closure, Source librarySource) {
+    if (librarySource.isInSystemLibrary) {
+      return;
+    }
     if (closure.add(librarySource)) {
       CacheSourceContent contentSource = _getCacheSourceContent(librarySource);
       if (contentSource == null) {
@@ -220,6 +276,48 @@
     }
   }
 
+  List<int> _computeSaltedMD5OfBytes(addData(ByteConversionSink byteSink)) {
+    Digest digest;
+    ChunkedConversionSink<Digest> digestSink =
+        new ChunkedConversionSink<Digest>.withCallback((List<Digest> digests) {
+      digest = digests.single;
+    });
+    ByteConversionSink byteSink = md5.startChunkedConversion(digestSink);
+    // Add data.
+    addData(byteSink);
+    byteSink.add(configSalt);
+    // Done.
+    byteSink.close();
+    return digest.bytes;
+  }
+
+  /**
+   * Return the [AnalysisError] for the given [cachedError].
+   */
+  AnalysisError _convertErrorFromCached(
+      Source source, CacheAnalysisError cachedError) {
+    ErrorCode errorCode = _getErrorCode(cachedError);
+    return new AnalysisError.forValues(
+        source,
+        cachedError.offset,
+        cachedError.length,
+        errorCode,
+        cachedError.message,
+        cachedError.correction);
+  }
+
+  /**
+   * Return the [CacheAnalysisError] for the given [error].
+   */
+  CacheAnalysisError _convertErrorToCached(AnalysisError error) {
+    return new CacheAnalysisErrorBuilder(
+        errorCodeUniqueName: error.errorCode.uniqueName,
+        offset: error.offset,
+        length: error.length,
+        message: error.message,
+        correction: error.correction);
+  }
+
   /**
    * Get the content based information about the given [source], maybe `null`
    * if the information is not in the cache.
@@ -248,6 +346,18 @@
   }
 
   /**
+   * Return the [ErrorCode] of the given [error], throws if not found.
+   */
+  ErrorCode _getErrorCode(CacheAnalysisError error) {
+    String uniqueName = error.errorCodeUniqueName;
+    ErrorCode errorCode = ErrorCode.byUniqueName(uniqueName);
+    if (errorCode != null) {
+      return errorCode;
+    }
+    throw new StateError('Unable to find ErrorCode: $uniqueName');
+  }
+
+  /**
    * Get the bundle for the given key.
    */
   PackageBundle _getLibraryBundle(String key) {
@@ -292,31 +402,12 @@
   List<int> _getLibraryClosureHash(Source librarySource) {
     return _libraryClosureHashMap.putIfAbsent(librarySource, () {
       List<Source> closure = _getLibraryClosure(librarySource);
-
-      Digest digest;
-
-      var digestSink = new ChunkedConversionSink<Digest>.withCallback(
-          (List<Digest> digests) {
-        digest = digests.single;
+      return _computeSaltedMD5OfBytes((ByteConversionSink byteSink) {
+        for (Source source in closure) {
+          List<int> sourceHash = _getSourceContentHash(source);
+          byteSink.add(sourceHash);
+        }
       });
-
-      var byteSink = md5.startChunkedConversion(digestSink);
-
-      for (Source source in closure) {
-        List<int> sourceHash = _getSourceContentHash(source);
-        byteSink.add(sourceHash);
-      }
-      byteSink.add(configSalt);
-
-      byteSink.close();
-      // TODO(paulberry): this call to `close` should not be needed.
-      // Can be removed once
-      //   https://github.com/dart-lang/crypto/issues/33
-      // is fixed – ensure the min version constraint on crypto is updated, tho.
-      // Does not cause any problems in the mean time.
-      digestSink.close();
-
-      return digest.bytes;
     });
   }
 
@@ -332,6 +423,18 @@
   }
 
   /**
+   * Return the key for errors in the [source] in the [librarySource].
+   */
+  String _getSourceErrorsKey(Source librarySource, Source source) {
+    List<int> hash = _computeSaltedMD5OfBytes((ByteConversionSink byteSink) {
+      byteSink.add(_getLibraryClosureHash(librarySource));
+      byteSink.add(_getSourceContentHash(source));
+    });
+    String hashStr = hex.encode(hash);
+    return '$hashStr.errorsInLibrary';
+  }
+
+  /**
    * Return a source representing the URI that results from resolving the given
    * (possibly relative) [containedUri] against the URI associated with the
    * [containingSource], whether or not the resulting source exists, or `null`
@@ -354,11 +457,13 @@
    * Write the content based information about the given [source].
    */
   void _writeCacheSourceContent(Source source, CacheSourceContentBuilder b) {
-    String key = _getCacheSourceContentKey(source);
-    List<int> bytes = b.toBuffer();
-    storage.put(key, bytes);
-    // Put into the cache to avoid reading it later.
-    _sourceContentMap[source] = new CacheSourceContent.fromBuffer(bytes);
+    if (!_sourceContentMap.containsKey(source)) {
+      String key = _getCacheSourceContentKey(source);
+      List<int> bytes = b.toBuffer();
+      storage.put(key, bytes);
+      // Put into the cache to avoid reading it later.
+      _sourceContentMap[source] = new CacheSourceContent.fromBuffer(bytes);
+    }
   }
 
   /**
@@ -368,10 +473,6 @@
   void _writeCacheSourceContents(LibraryElement library,
       [Set<LibraryElement> writtenLibraries]) {
     Source librarySource = library.source;
-    // Do nothing if already cached.
-    if (_sourceContentMap.containsKey(librarySource)) {
-      return;
-    }
     // Stop recursion cycle.
     writtenLibraries ??= new Set<LibraryElement>();
     if (!writtenLibraries.add(library)) {
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 77c86f2..81ae854 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -242,6 +242,13 @@
   throw new UnimplementedError('${type.runtimeType}');
 }
 
+DartType _dynamicIfNull(DartType type) {
+  if (type == null || type.isBottom || type.isVoid) {
+    return DynamicTypeImpl.instance;
+  }
+  return type;
+}
+
 /**
  * Create an [UnlinkedParam] representing the given [parameter], which should be
  * a parameter of a synthetic function type (e.g. one produced during type
@@ -334,7 +341,7 @@
  */
 abstract class ClassElementForLink extends Object
     with ReferenceableElementForLink
-    implements ClassElementImpl {
+    implements AbstractClassElementImpl {
   Map<String, ReferenceableElementForLink> _containedNames;
 
   @override
@@ -381,9 +388,6 @@
   String get name;
 
   @override
-  ResynthesizerContext get resynthesizerContext => enclosingElement;
-
-  @override
   ConstructorElementForLink get unnamedConstructor;
 
   @override
@@ -420,7 +424,8 @@
  * linking.
  */
 class ClassElementForLink_Class extends ClassElementForLink
-    with TypeParameterizedElementMixin {
+    with TypeParameterizedElementMixin
+    implements ClassElementImpl {
   /**
    * The unlinked representation of the class in the summary.
    */
@@ -668,7 +673,8 @@
  * Element representing an enum resynthesized from a summary during
  * linking.
  */
-class ClassElementForLink_Enum extends ClassElementForLink {
+class ClassElementForLink_Enum extends ClassElementForLink
+    implements EnumElementImpl {
   /**
    * The unlinked representation of the enum in the summary.
    */
@@ -1491,10 +1497,20 @@
       return;
     }
     int refPtr = 0;
+    int intPtr = 0;
     for (UnlinkedConstOperation operation in unlinkedConst.operations) {
       switch (operation) {
+        case UnlinkedConstOperation.pushInt:
+          intPtr++;
+          break;
+        case UnlinkedConstOperation.pushLongInt:
+          int numInts = unlinkedConst.ints[intPtr++];
+          intPtr += numInts;
+          break;
+        case UnlinkedConstOperation.concatenate:
+          intPtr++;
+          break;
         case UnlinkedConstOperation.pushReference:
-        case UnlinkedConstOperation.invokeMethodRef:
           EntityRef ref = unlinkedConst.references[refPtr++];
           ConstVariableNode variable =
               compilationUnit.resolveRef(ref.reference).asConstVariable;
@@ -1502,11 +1518,36 @@
             dependencies.add(variable);
           }
           break;
+        case UnlinkedConstOperation.makeUntypedList:
+        case UnlinkedConstOperation.makeUntypedMap:
+          intPtr++;
+          break;
+        case UnlinkedConstOperation.assignToRef:
+          refPtr++;
+          break;
+        case UnlinkedConstOperation.invokeMethodRef:
+          EntityRef ref = unlinkedConst.references[refPtr++];
+          ConstVariableNode variable =
+              compilationUnit.resolveRef(ref.reference).asConstVariable;
+          if (variable != null) {
+            dependencies.add(variable);
+          }
+          intPtr += 2;
+          int numTypeArguments = unlinkedConst.ints[intPtr++];
+          refPtr += numTypeArguments;
+          break;
+        case UnlinkedConstOperation.invokeMethod:
+          intPtr += 2;
+          int numTypeArguments = unlinkedConst.ints[intPtr++];
+          refPtr += numTypeArguments;
+          break;
         case UnlinkedConstOperation.makeTypedList:
           refPtr++;
+          intPtr++;
           break;
         case UnlinkedConstOperation.makeTypedMap:
           refPtr += 2;
+          intPtr++;
           break;
         case UnlinkedConstOperation.invokeConstructor:
           EntityRef ref = unlinkedConst.references[refPtr++];
@@ -1515,12 +1556,21 @@
           if (element?._constNode != null) {
             dependencies.add(element._constNode);
           }
+          intPtr += 2;
+          break;
+        case UnlinkedConstOperation.typeCast:
+        case UnlinkedConstOperation.typeCheck:
+          refPtr++;
+          break;
+        case UnlinkedConstOperation.pushLocalFunctionReference:
+          intPtr += 2;
           break;
         default:
           break;
       }
     }
     assert(refPtr == unlinkedConst.references.length);
+    assert(intPtr == unlinkedConst.ints.length);
   }
 }
 
@@ -1972,13 +2022,12 @@
 }
 
 class ExprTypeComputer {
-  VariableElementForLink variable;
-  FunctionElementForLink_Initializer initializer;
-  CompilationUnitElementForLink unit;
-  LibraryElementForLink library;
-  Linker linker;
-  TypeProvider typeProvider;
-  UnlinkedConst unlinkedConst;
+  final FunctionElementForLink_Local function;
+  final CompilationUnitElementForLink unit;
+  final LibraryElementForLink library;
+  final Linker linker;
+  final TypeProvider typeProvider;
+  final UnlinkedConst unlinkedConst;
 
   final List<DartType> stack = <DartType>[];
   int intPtr = 0;
@@ -1986,17 +2035,25 @@
   int strPtr = 0;
   int assignmentOperatorPtr = 0;
 
-  ExprTypeComputer(VariableElementForLink variableElement) {
-    this.variable = variableElement;
-    initializer = variableElement.initializer;
-    unit = variableElement.compilationUnit;
-    library = unit.enclosingElement;
-    linker = library._linker;
-    typeProvider = linker.typeProvider;
-    unlinkedConst = variableElement.unlinkedVariable.initializer?.bodyExpr;
+  factory ExprTypeComputer(FunctionElementForLink_Local functionElement) {
+    CompilationUnitElementForLink unit = functionElement.compilationUnit;
+    LibraryElementForLink library = unit.enclosingElement;
+    Linker linker = library._linker;
+    TypeProvider typeProvider = linker.typeProvider;
+    UnlinkedConst unlinkedConst = functionElement._unlinkedExecutable.bodyExpr;
+    return new ExprTypeComputer._(
+        functionElement, unit, library, linker, typeProvider, unlinkedConst);
   }
 
+  ExprTypeComputer._(this.function, this.unit, this.library, this.linker,
+      this.typeProvider, this.unlinkedConst);
+
   DartType compute() {
+    if (unlinkedConst == null) {
+      // No function body was stored for this function, so we can't infer its
+      // return type.  Assume `dynamic`.
+      return DynamicTypeImpl.instance;
+    }
     // Perform RPN evaluation of the constant, using a stack of inferred types.
     for (UnlinkedConstOperation operation in unlinkedConst.operations) {
       switch (operation) {
@@ -2158,7 +2215,10 @@
         case UnlinkedConstOperation.pushLocalFunctionReference:
           int popCount = _getNextInt();
           assert(popCount == 0); // TODO(paulberry): handle the nonzero case.
-          stack.add(initializer.functions[_getNextInt()].type);
+          stack.add(function.functions[_getNextInt()].type);
+          break;
+        case UnlinkedConstOperation.pushParameter:
+          stack.add(_findParameterType(_getNextString()));
           break;
         default:
           // TODO(paulberry): implement.
@@ -2170,7 +2230,7 @@
     assert(strPtr == unlinkedConst.strings.length);
     assert(assignmentOperatorPtr == unlinkedConst.assignmentOperators.length);
     assert(stack.length == 1);
-    return _dynamicIfNull(stack[0]);
+    return stack[0];
   }
 
   void _computeBinaryExpressionType(TokenType operator) {
@@ -2315,7 +2375,7 @@
         // Type argument explicitly specified.
         if (i < ref.typeArguments.length) {
           return unit.resolveTypeRef(
-              ref.typeArguments[i], variable._typeParameterContext);
+              ref.typeArguments[i], function.typeParameterContext);
         } else {
           return null;
         }
@@ -2334,14 +2394,21 @@
     // TODO(scheglov) if we pushed target and method name first, we might be
     // able to move work with arguments in _inferExecutableType()
     String methodName = _getNextString();
+    List<DartType> typeArguments = _getTypeArguments();
     DartType target = stack.removeLast();
     stack.add(() {
       if (target is InterfaceType) {
         MethodElement method =
             target.lookUpInheritedMethod(methodName, library: library);
         FunctionType rawType = method?.type;
-        FunctionType inferredType = _inferExecutableType(rawType, numNamed,
-            numPositional, namedArgNames, namedArgTypeList, positionalArgTypes);
+        FunctionType inferredType = _inferExecutableType(
+            rawType,
+            numNamed,
+            numPositional,
+            namedArgNames,
+            namedArgTypeList,
+            positionalArgTypes,
+            typeArguments);
         if (inferredType != null) {
           return inferredType.returnType;
         }
@@ -2358,11 +2425,18 @@
     List<DartType> positionalArgTypes = _popList(numPositional);
     EntityRef ref = _getNextRef();
     ReferenceableElementForLink element = unit.resolveRef(ref.reference);
+    List<DartType> typeArguments = _getTypeArguments();
     stack.add(() {
       DartType rawType = element.asStaticType;
       if (rawType is FunctionType) {
-        FunctionType inferredType = _inferExecutableType(rawType, numNamed,
-            numPositional, namedArgNames, namedArgTypeList, positionalArgTypes);
+        FunctionType inferredType = _inferExecutableType(
+            rawType,
+            numNamed,
+            numPositional,
+            namedArgNames,
+            namedArgTypeList,
+            positionalArgTypes,
+            typeArguments);
         if (inferredType != null) {
           return inferredType.returnType;
         }
@@ -2428,6 +2502,29 @@
     }
   }
 
+  /**
+   * Find the parameter in scope called [parameterName] and return its type.
+   */
+  DartType _findParameterType(String parameterName) {
+    FunctionElementForLink_Local f = this.function;
+    while (true) {
+      for (ParameterElement parameter in f.parameters) {
+        if (parameter.name == parameterName) {
+          return parameter.type;
+        }
+      }
+      Element parent = f.enclosingElement;
+      if (parent is FunctionElementForLink_Local) {
+        f = parent;
+      } else {
+        // Parameter not found.  This should never happen in a well-formed
+        // summary.
+        assert(false);
+        return DynamicTypeImpl.instance;
+      }
+    }
+  }
+
   int _getNextInt() {
     return unlinkedConst.ints[intPtr++];
   }
@@ -2448,7 +2545,7 @@
 
   DartType _getNextTypeRef() {
     EntityRef ref = _getNextRef();
-    return unit.resolveTypeRef(ref, variable._typeParameterContext);
+    return unit.resolveTypeRef(ref, function.typeParameterContext);
   }
 
   /**
@@ -2464,16 +2561,33 @@
         : DynamicTypeImpl.instance;
   }
 
+  List<DartType> _getTypeArguments() {
+    int numTypeArguments = _getNextInt();
+    List<DartType> typeArguments = new List<DartType>(numTypeArguments);
+    for (int i = 0; i < numTypeArguments; i++) {
+      typeArguments[i] = _getNextTypeRef();
+    }
+    return typeArguments;
+  }
+
   FunctionType _inferExecutableType(
       FunctionType rawMethodType,
       int numNamed,
       int numPositional,
       List<String> namedArgNames,
       List<DartType> namedArgTypeList,
-      List<DartType> positionalArgTypes) {
+      List<DartType> positionalArgTypes,
+      List<DartType> typeArguments) {
     TypeSystem ts = linker.typeSystem;
     if (rawMethodType != null) {
-      if (rawMethodType.typeFormals.isNotEmpty && ts is StrongTypeSystemImpl) {
+      if (rawMethodType.typeFormals.isNotEmpty && typeArguments.isNotEmpty) {
+        Element methodElement = rawMethodType.element;
+        if (methodElement is TypeParameterizedElement &&
+            methodElement.typeParameters.length == typeArguments.length) {
+          return rawMethodType.instantiate(typeArguments);
+        }
+      } else if (rawMethodType.typeFormals.isNotEmpty &&
+          ts is StrongTypeSystemImpl) {
         List<DartType> paramTypes = <DartType>[];
         List<DartType> argTypes = <DartType>[];
         // Add positional parameter and argument types.
@@ -2587,13 +2701,6 @@
         return TokenType.MINUS_MINUS;
     }
   }
-
-  static DartType _dynamicIfNull(DartType type) {
-    if (type == null || type.isBottom || type.isVoid) {
-      return DynamicTypeImpl.instance;
-    }
-    return type;
-  }
 }
 
 /**
@@ -2650,6 +2757,7 @@
           unlinkedVariable.inferredTypeSlot,
           isStatic ? inferredType : _inferredInstanceType,
           _typeParameterContext);
+      initializer?.link(compilationUnit);
     }
   }
 
@@ -2758,18 +2866,33 @@
  * Element representing the initializer expression of a variable.
  */
 class FunctionElementForLink_Initializer extends Object
-    with ReferenceableElementForLink
+    with ReferenceableElementForLink, TypeParameterizedElementMixin
     implements FunctionElementForLink_Local {
   /**
    * The variable for which this element is the initializer.
    */
   final VariableElementForLink _variable;
 
+  /**
+   * The type inference node for this function, or `null` if it hasn't been
+   * computed yet.
+   */
+  TypeInferenceNode _typeInferenceNode;
+
   List<FunctionElementForLink_Local_NonSynthetic> _functions;
+  DartType _inferredReturnType;
 
   FunctionElementForLink_Initializer(this._variable);
 
   @override
+  TypeInferenceNode get asTypeInferenceNode =>
+      _typeInferenceNode ??= new TypeInferenceNode(this);
+
+  @override
+  CompilationUnitElementForLink get compilationUnit =>
+      _variable.compilationUnit;
+
+  @override
   VariableElementForLink get enclosingElement => _variable;
 
   TypeParameterizedElementMixin get enclosingTypeParameterContext =>
@@ -2778,6 +2901,9 @@
           : null;
 
   @override
+  CompilationUnitElementForLink get enclosingUnit => _variable.compilationUnit;
+
+  @override
   List<FunctionElementForLink_Local_NonSynthetic> get functions =>
       _functions ??= _variable.unlinkedVariable.initializer.localFunctions
           .map((UnlinkedExecutable ex) =>
@@ -2807,10 +2933,17 @@
   }
 
   @override
-  int get typeParameterNestingLevel =>
-      enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0;
+  TypeParameterizedElementMixin get typeParameterContext => this;
 
-  List<TypeParameterElement> get typeParameters => const [];
+  @override
+  List<UnlinkedTypeParam> get unlinkedTypeParams => const [];
+
+  @override
+  bool get _hasTypeBeenInferred => _inferredReturnType != null;
+
+  @override
+  UnlinkedExecutable get _unlinkedExecutable =>
+      _variable.unlinkedVariable.initializer;
 
   @override
   FunctionElementForLink_Local getLocalFunction(int index) {
@@ -2818,8 +2951,27 @@
     return index < functions.length ? functions[index] : null;
   }
 
+  /**
+   * Store the results of type inference for this initializer in
+   * [compilationUnit].
+   */
+  void link(CompilationUnitElementInBuildUnit compilationUnit) {
+    compilationUnit._storeLinkedType(_unlinkedExecutable.inferredReturnTypeSlot,
+        _inferredReturnType, typeParameterContext);
+    for (FunctionElementForLink_Local_NonSynthetic function in functions) {
+      function.link(compilationUnit);
+    }
+  }
+
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  void _setInferredType(DartType type) {
+    assert(!_hasTypeBeenInferred);
+    _inferredReturnType = type;
+    _variable._inferredType = _dynamicIfNull(type);
+  }
 }
 
 /**
@@ -2829,7 +2981,18 @@
     implements
         ExecutableElementForLink,
         FunctionElementImpl,
-        ReferenceableElementForLink {}
+        ReferenceableElementForLink {
+  /**
+   * Indicates whether type inference has completed for this function.
+   */
+  bool get _hasTypeBeenInferred;
+
+  /**
+   * Stores the given [type] as the inferred return type for this function.
+   * Should only be called if [_hasTypeBeenInferred] is `false`.
+   */
+  void _setInferredType(DartType type);
+}
 
 /**
  * Element representing a local function (possibly a closure) inside another
@@ -2841,6 +3004,14 @@
   @override
   final ExecutableElementForLink enclosingElement;
 
+  List<FunctionElementForLink_Local_NonSynthetic> _functions;
+
+  /**
+   * The type inference node for this function, or `null` if it hasn't been
+   * computed yet.
+   */
+  TypeInferenceNode _typeInferenceNode;
+
   FunctionElementForLink_Local_NonSynthetic(
       CompilationUnitElementForLink compilationUnit,
       this.enclosingElement,
@@ -2848,10 +3019,25 @@
       : super(compilationUnit, unlinkedExecutable);
 
   @override
+  TypeInferenceNode get asTypeInferenceNode =>
+      _typeInferenceNode ??= new TypeInferenceNode(this);
+
+  @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext =>
       enclosingElement;
 
   @override
+  List<FunctionElementForLink_Local_NonSynthetic> get functions =>
+      _functions ??= _unlinkedExecutable.localFunctions
+          .map((UnlinkedExecutable ex) =>
+              new FunctionElementForLink_Local_NonSynthetic(
+                  compilationUnit, this, ex))
+          .toList();
+
+  @override
+  bool get _hasTypeBeenInferred => _inferredReturnType != null;
+
+  @override
   DartType buildType(
       DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
     assert(implicitFunctionTypeIndices.isEmpty);
@@ -2860,12 +3046,30 @@
 
   @override
   FunctionElementForLink_Local getLocalFunction(int index) {
-    // TODO(paulberry): implement.
-    throw new UnimplementedError();
+    List<FunctionElementForLink_Local_NonSynthetic> functions = this.functions;
+    return index < functions.length ? functions[index] : null;
+  }
+
+  /**
+   * Store the results of type inference for this function in [compilationUnit].
+   */
+  void link(CompilationUnitElementInBuildUnit compilationUnit) {
+    compilationUnit._storeLinkedType(
+        _unlinkedExecutable.inferredReturnTypeSlot, inferredReturnType, this);
+    for (FunctionElementForLink_Local_NonSynthetic function in functions) {
+      function.link(compilationUnit);
+    }
   }
 
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  void _setInferredType(DartType type) {
+    // TODO(paulberry): store the inferred return type in the summary.
+    assert(!_hasTypeBeenInferred);
+    _inferredReturnType = _dynamicIfNull(type);
+  }
 }
 
 /**
@@ -4290,6 +4494,7 @@
         compilationUnit._storeLinkedType(
             unlinkedVariable.inferredTypeSlot, inferredType, null);
       }
+      initializer?.link(compilationUnit);
     }
   }
 }
@@ -4319,32 +4524,43 @@
  */
 class TypeInferenceNode extends Node<TypeInferenceNode> {
   /**
-   * The [FieldElement] or [TopLevelVariableElement] to which this
-   * node refers.
+   * The [FunctionElementForLink_Local] to which this node refers.
    */
-  final VariableElementForLink variableElement;
+  final FunctionElementForLink_Local functionElement;
 
-  TypeInferenceNode(this.variableElement);
+  TypeInferenceNode(this.functionElement);
 
   @override
-  bool get isEvaluated => variableElement._inferredType != null;
+  bool get isEvaluated => functionElement._hasTypeBeenInferred;
 
   /**
-   * Collect the type inference dependencies in [unlinkedConst] (which should be
-   * interpreted relative to [compilationUnit]) and store them in
+   * Collect the type inference dependencies in [unlinkedExecutable] (which
+   * should be interpreted relative to [compilationUnit]) and store them in
    * [dependencies].
    */
   void collectDependencies(
       List<TypeInferenceNode> dependencies,
-      UnlinkedConst unlinkedConst,
+      UnlinkedExecutable unlinkedExecutable,
       CompilationUnitElementForLink compilationUnit) {
+    UnlinkedConst unlinkedConst = unlinkedExecutable?.bodyExpr;
     if (unlinkedConst == null) {
       return;
     }
     int refPtr = 0;
+    int intPtr = 0;
 
     for (UnlinkedConstOperation operation in unlinkedConst.operations) {
       switch (operation) {
+        case UnlinkedConstOperation.pushInt:
+          intPtr++;
+          break;
+        case UnlinkedConstOperation.pushLongInt:
+          int numInts = unlinkedConst.ints[intPtr++];
+          intPtr += numInts;
+          break;
+        case UnlinkedConstOperation.concatenate:
+          intPtr++;
+          break;
         case UnlinkedConstOperation.pushReference:
           EntityRef ref = unlinkedConst.references[refPtr++];
           // TODO(paulberry): cache these resolved references for
@@ -4355,12 +4571,21 @@
             dependencies.add(dependency);
           }
           break;
-        case UnlinkedConstOperation.makeTypedList:
         case UnlinkedConstOperation.invokeConstructor:
           refPtr++;
+          intPtr += 2;
+          break;
+        case UnlinkedConstOperation.makeUntypedList:
+        case UnlinkedConstOperation.makeUntypedMap:
+          intPtr++;
+          break;
+        case UnlinkedConstOperation.makeTypedList:
+          refPtr++;
+          intPtr++;
           break;
         case UnlinkedConstOperation.makeTypedMap:
           refPtr += 2;
+          intPtr++;
           break;
         case UnlinkedConstOperation.assignToRef:
           // TODO(paulberry): if this reference refers to a variable, should it
@@ -4371,39 +4596,53 @@
           // TODO(paulberry): if this reference refers to a variable, should it
           // be considered a type inference dependency?
           refPtr++;
+          intPtr += 2;
+          int numTypeArguments = unlinkedConst.ints[intPtr++];
+          refPtr += numTypeArguments;
+          break;
+        case UnlinkedConstOperation.invokeMethod:
+          intPtr += 2;
+          int numTypeArguments = unlinkedConst.ints[intPtr++];
+          refPtr += numTypeArguments;
           break;
         case UnlinkedConstOperation.typeCast:
         case UnlinkedConstOperation.typeCheck:
           refPtr++;
           break;
+        case UnlinkedConstOperation.pushLocalFunctionReference:
+          int popCount = unlinkedConst.ints[intPtr++];
+          assert(popCount == 0); // TODO(paulberry): handle the nonzero case.
+          dependencies.add(functionElement
+              .getLocalFunction(unlinkedConst.ints[intPtr++])
+              .asTypeInferenceNode);
+          break;
         default:
           break;
       }
     }
     assert(refPtr == unlinkedConst.references.length);
+    assert(intPtr == unlinkedConst.ints.length);
   }
 
   @override
   List<TypeInferenceNode> computeDependencies() {
     List<TypeInferenceNode> dependencies = <TypeInferenceNode>[];
-    collectDependencies(
-        dependencies,
-        variableElement.unlinkedVariable.initializer?.bodyExpr,
-        variableElement.compilationUnit);
+    collectDependencies(dependencies, functionElement._unlinkedExecutable,
+        functionElement.compilationUnit);
     return dependencies;
   }
 
   void evaluate(bool inCycle) {
     if (inCycle) {
-      variableElement._inferredType = DynamicTypeImpl.instance;
+      functionElement._setInferredType(DynamicTypeImpl.instance);
     } else {
-      variableElement._inferredType =
-          new ExprTypeComputer(variableElement).compute();
+      functionElement
+          ._setInferredType(new ExprTypeComputer(functionElement).compute());
     }
   }
 
   @override
-  String toString() => 'TypeInferenceNode($variableElement)';
+  String toString() => 'TypeInferenceNode($functionElement)';
 }
 
 class TypeProviderForLink implements TypeProvider {
@@ -4606,7 +4845,7 @@
         unlinkedVariable.initializer?.bodyExpr != null) {
       _constNode = new ConstVariableNode(this);
       if (unlinkedVariable.type == null) {
-        _typeInferenceNode = new TypeInferenceNode(this);
+        _typeInferenceNode = initializer.asTypeInferenceNode;
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 7c6ee32..a3c1d0c 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
-import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/model.dart';
@@ -20,114 +19,18 @@
 /**
  * The [ResultProvider] that provides results from input package summaries.
  */
-class InputPackagesResultProvider extends ResultProvider {
-  final InternalAnalysisContext _context;
-
-  _FileBasedSummaryResynthesizer _resynthesizer;
-  SummaryResultProvider _sdkProvider;
-
-  InputPackagesResultProvider(this._context, SummaryDataStore dataStore) {
-    InternalAnalysisContext sdkContext = _context.sourceFactory.dartSdk.context;
-    _sdkProvider = sdkContext.resultProvider;
-    // Set the type provider to prevent the context from computing it.
-    _context.typeProvider = sdkContext.typeProvider;
-    // Create a chained resynthesizer.
-    _resynthesizer = new _FileBasedSummaryResynthesizer(
-        _sdkProvider.resynthesizer,
-        _context,
-        _context.typeProvider,
-        _context.sourceFactory,
-        _context.analysisOptions.strongMode,
-        dataStore);
+class InputPackagesResultProvider extends ResynthesizerResultProvider {
+  InputPackagesResultProvider(
+      InternalAnalysisContext context, SummaryDataStore dataStore)
+      : super(context, dataStore) {
+    AnalysisContext sdkContext = context.sourceFactory.dartSdk.context;
+    createResynthesizer(sdkContext, sdkContext.typeProvider);
   }
 
   @override
-  bool compute(CacheEntry entry, ResultDescriptor result) {
-    if (_sdkProvider.compute(entry, result)) {
-      return true;
-    }
-    AnalysisTarget target = entry.target;
-    // Only library results are supported for now.
-    if (target is Source) {
-      Uri uri = target.uri;
-      // We know how to server results to input packages.
-      String uriString = uri.toString();
-      if (!_resynthesizer.hasLibrarySummary(uriString)) {
-        return false;
-      }
-      // Provide known results.
-      if (result == LIBRARY_ELEMENT1 ||
-          result == LIBRARY_ELEMENT2 ||
-          result == LIBRARY_ELEMENT3 ||
-          result == LIBRARY_ELEMENT4 ||
-          result == LIBRARY_ELEMENT5 ||
-          result == LIBRARY_ELEMENT6 ||
-          result == LIBRARY_ELEMENT7 ||
-          result == LIBRARY_ELEMENT8 ||
-          result == LIBRARY_ELEMENT9 ||
-          result == LIBRARY_ELEMENT ||
-          false) {
-        LibraryElement libraryElement =
-            _resynthesizer.getLibraryElement(uriString);
-        entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST);
-        return true;
-      } else if (result == READY_LIBRARY_ELEMENT2 ||
-          result == READY_LIBRARY_ELEMENT6 ||
-          result == READY_LIBRARY_ELEMENT7) {
-        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
-        return true;
-      } else if (result == SOURCE_KIND) {
-        if (_resynthesizer._dataStore.linkedMap.containsKey(uriString)) {
-          entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST);
-          return true;
-        }
-        if (_resynthesizer._dataStore.unlinkedMap.containsKey(uriString)) {
-          entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST);
-          return true;
-        }
-        return false;
-      }
-    } else if (target is LibrarySpecificUnit) {
-      String uriString = target.library.uri.toString();
-      if (!_resynthesizer.hasLibrarySummary(uriString)) {
-        return false;
-      }
-      if (result == CREATED_RESOLVED_UNIT1 ||
-          result == CREATED_RESOLVED_UNIT2 ||
-          result == CREATED_RESOLVED_UNIT3 ||
-          result == CREATED_RESOLVED_UNIT4 ||
-          result == CREATED_RESOLVED_UNIT5 ||
-          result == CREATED_RESOLVED_UNIT6 ||
-          result == CREATED_RESOLVED_UNIT7 ||
-          result == CREATED_RESOLVED_UNIT8 ||
-          result == CREATED_RESOLVED_UNIT9 ||
-          result == CREATED_RESOLVED_UNIT10 ||
-          result == CREATED_RESOLVED_UNIT11 ||
-          result == CREATED_RESOLVED_UNIT12) {
-        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
-        return true;
-      }
-      if (result == COMPILATION_UNIT_ELEMENT) {
-        String libraryUri = target.library.uri.toString();
-        String unitUri = target.unit.uri.toString();
-        CompilationUnitElement unit = _resynthesizer.getElement(
-            new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
-        if (unit != null) {
-          entry.setValue(result, unit, TargetedResult.EMPTY_LIST);
-          return true;
-        }
-      }
-    } else if (target is VariableElement) {
-      if (!_resynthesizer
-          .hasLibrarySummary(target.library.source.uri.toString())) {
-        return false;
-      }
-      if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
-        entry.setValue(result, target, TargetedResult.EMPTY_LIST);
-        return true;
-      }
-    }
-    return false;
+  bool hasResultsForSource(Source source) {
+    String uriString = source.uri.toString();
+    return resynthesizer.hasLibrarySummary(uriString);
   }
 }
 
@@ -211,6 +114,147 @@
 }
 
 /**
+ * The [ResultProvider] that provides results using summary resynthesizer.
+ */
+abstract class ResynthesizerResultProvider extends ResultProvider {
+  final InternalAnalysisContext context;
+  final SummaryDataStore _dataStore;
+
+  _FileBasedSummaryResynthesizer _resynthesizer;
+  ResynthesizerResultProvider _sdkProvider;
+
+  ResynthesizerResultProvider(this.context, this._dataStore);
+
+  SummaryResynthesizer get resynthesizer => _resynthesizer;
+
+  /**
+   * Add a new [bundle] to the resynthesizer.
+   */
+  void addBundle(String path, PackageBundle bundle) {
+    _dataStore.addBundle(path, bundle);
+  }
+
+  @override
+  bool compute(CacheEntry entry, ResultDescriptor result) {
+    if (_sdkProvider != null && _sdkProvider.compute(entry, result)) {
+      return true;
+    }
+    AnalysisTarget target = entry.target;
+    // Check whether there are results for the source.
+    if (!hasResultsForSource(target.source)) {
+      return false;
+    }
+    // Constant expressions are always resolved in summaries.
+    if (result == CONSTANT_EXPRESSION_RESOLVED &&
+        target is ConstantEvaluationTarget) {
+      entry.setValue(result, true, TargetedResult.EMPTY_LIST);
+      return true;
+    }
+    // Provide results for Source.
+    if (target is Source) {
+      String uriString = target.uri.toString();
+      // Provide known results.
+      if (result == LIBRARY_ELEMENT1 ||
+          result == LIBRARY_ELEMENT2 ||
+          result == LIBRARY_ELEMENT3 ||
+          result == LIBRARY_ELEMENT4 ||
+          result == LIBRARY_ELEMENT5 ||
+          result == LIBRARY_ELEMENT6 ||
+          result == LIBRARY_ELEMENT7 ||
+          result == LIBRARY_ELEMENT8 ||
+          result == LIBRARY_ELEMENT9 ||
+          result == LIBRARY_ELEMENT) {
+        LibraryElement libraryElement =
+            resynthesizer.getLibraryElement(uriString);
+        entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST);
+        return true;
+      } else if (result == READY_LIBRARY_ELEMENT2 ||
+          result == READY_LIBRARY_ELEMENT6 ||
+          result == READY_LIBRARY_ELEMENT7) {
+        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
+        return true;
+      } else if (result == SOURCE_KIND) {
+        if (_dataStore.linkedMap.containsKey(uriString)) {
+          entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST);
+          return true;
+        }
+        if (_dataStore.unlinkedMap.containsKey(uriString)) {
+          entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST);
+          return true;
+        }
+        return false;
+      }
+    } else if (target is LibrarySpecificUnit) {
+      if (!hasResultsForSource(target.library)) {
+        return false;
+      }
+      if (result == CREATED_RESOLVED_UNIT1 ||
+          result == CREATED_RESOLVED_UNIT2 ||
+          result == CREATED_RESOLVED_UNIT3 ||
+          result == CREATED_RESOLVED_UNIT4 ||
+          result == CREATED_RESOLVED_UNIT5 ||
+          result == CREATED_RESOLVED_UNIT6 ||
+          result == CREATED_RESOLVED_UNIT7 ||
+          result == CREATED_RESOLVED_UNIT8 ||
+          result == CREATED_RESOLVED_UNIT9 ||
+          result == CREATED_RESOLVED_UNIT10 ||
+          result == CREATED_RESOLVED_UNIT11 ||
+          result == CREATED_RESOLVED_UNIT12) {
+        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
+        return true;
+      }
+      if (result == COMPILATION_UNIT_ELEMENT) {
+        String libraryUri = target.library.uri.toString();
+        String unitUri = target.unit.uri.toString();
+        CompilationUnitElement unit = resynthesizer.getElement(
+            new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
+        if (unit != null) {
+          entry.setValue(result, unit, TargetedResult.EMPTY_LIST);
+          return true;
+        }
+      }
+    } else if (target is VariableElement) {
+      if (!hasResultsForSource(target.library.source)) {
+        return false;
+      }
+      if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
+        entry.setValue(result, target, TargetedResult.EMPTY_LIST);
+        return true;
+      }
+    }
+    // Unknown target.
+    return false;
+  }
+
+  /**
+   * Create the [resynthesizer] instance.
+   *
+   * Subclasses must call this method in their constructors.
+   */
+  void createResynthesizer(
+      InternalAnalysisContext sdkContext, TypeProvider typeProvider) {
+    // Set the type provider to prevent the context from computing it.
+    context.typeProvider = typeProvider;
+    // Create a chained resynthesizer.
+    _sdkProvider = sdkContext?.resultProvider;
+    _resynthesizer = new _FileBasedSummaryResynthesizer(
+        _sdkProvider?.resynthesizer,
+        context,
+        typeProvider,
+        context.sourceFactory,
+        context.analysisOptions.strongMode,
+        _dataStore);
+  }
+
+  /**
+   * Return `true` if this result provider can provide a result for the
+   * given [source].  The provider must ensure that [addBundle] is invoked for
+   * every bundle that would be required to provide results for the [source].
+   */
+  bool hasResultsForSource(Source source);
+}
+
+/**
  * A [SummaryDataStore] is a container for the data extracted from a set of
  * summary package bundles.  It contains maps which can be used to find linked
  * and unlinked summaries by URI.
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 298c20d..d757b80 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -14,13 +14,11 @@
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/idl.dart';
 
 /**
@@ -310,6 +308,19 @@
 
   _ConstExprBuilder(this.resynthesizer, this.context, this.uc);
 
+  /**
+   * Return the [ConstructorElement] enclosing [context].
+   */
+  ConstructorElement get _enclosingConstructor {
+    for (Element e = context; e != null; e = e.enclosingElement) {
+      if (e is ConstructorElement) {
+        return e;
+      }
+    }
+    throw new StateError(
+        'Unable to find the enclosing constructor of $context');
+  }
+
   Expression build() {
     if (!uc.isValidConst) {
       return AstFactory.identifier3(r'$$invalidConstExpr$$');
@@ -471,7 +482,7 @@
         case UnlinkedConstOperation.pushParameter:
           String name = uc.strings[stringPtr++];
           SimpleIdentifier identifier = AstFactory.identifier3(name);
-          identifier.staticElement = resynthesizer.currentConstructor.parameters
+          identifier.staticElement = _enclosingConstructor.parameters
               .firstWhere((parameter) => parameter.name == name,
                   orElse: () => throw new StateError(
                       'Unable to resolve constructor parameter: $name'));
@@ -575,8 +586,8 @@
    */
   TypeName _newTypeName() {
     EntityRef typeRef = uc.references[refPtr++];
-    DartType type = resynthesizer.buildType(
-        typeRef, resynthesizer._currentTypeParameterizedElement);
+    DartType type =
+        resynthesizer.buildType(typeRef, context?.typeParameterContext);
     return _buildTypeAst(type);
   }
 
@@ -622,7 +633,7 @@
       InterfaceType definingType = resynthesizer._createConstructorDefiningType(
           context?.typeParameterContext, info, ref.typeArguments);
       constructorElement =
-          resynthesizer._createConstructorElement(definingType, info);
+          resynthesizer._getConstructorForInfo(definingType, info);
       typeNode = _buildTypeAst(definingType);
     } else {
       if (info.enclosing != null) {
@@ -675,12 +686,21 @@
     EntityRef ref = uc.references[refPtr++];
     _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference);
     Expression node = _buildIdentifierSequence(info);
+    TypeArgumentList typeArguments;
+    int numTypeArguments = uc.ints[intPtr++];
+    if (numTypeArguments > 0) {
+      List<TypeName> typeNames = new List<TypeName>(numTypeArguments);
+      for (int i = 0; i < numTypeArguments; i++) {
+        typeNames[i] = _newTypeName();
+      }
+      typeArguments = AstFactory.typeArgumentList(typeNames);
+    }
     if (node is SimpleIdentifier) {
       _push(new MethodInvocation(
           null,
           TokenFactory.tokenFromType(TokenType.PERIOD),
           node,
-          null,
+          typeArguments,
           AstFactory.argumentList(arguments)));
     } else {
       throw new UnimplementedError('For ${node?.runtimeType}: $node');
@@ -729,184 +749,6 @@
 }
 
 /**
- * Temporary [TypeParameterizedElementMixin] implementation.
- *
- * TODO(scheglov) remove after moving resynthesize logic to Impl.
- */
-class _CurrentTypeParameterizedElement
-    implements TypeParameterizedElementMixin {
-  final _UnitResynthesizer unitResynthesizer;
-
-  _CurrentTypeParameterizedElement(this.unitResynthesizer);
-
-  @override
-  TypeParameterType getTypeParameterType(int index) {
-    return unitResynthesizer.getTypeParameterFromScope(index);
-  }
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-/**
- * A class element that has been resynthesized from a summary.  The actual
- * element won't be constructed until it is requested.  But properties
- * [context],  [displayName], [enclosingElement] and [name] can be used without
- * creating the actual element.  This allows to put these elements into
- * namespaces without creating actual elements until they are really needed.
- */
-class _DeferredClassElement extends ClassElementHandle {
-  final _UnitResynthesizer unitResynthesizer;
-  final CompilationUnitElement unitElement;
-  final UnlinkedClass serializedClass;
-
-  ClassElementImpl _actualElement;
-
-  /**
-   * We don't resynthesize executables of classes until they are requested.
-   * TODO(scheglov) Check whether we need separate flags for separate kinds.
-   */
-  bool _executablesResynthesized = false;
-
-  @override
-  final String name;
-
-  factory _DeferredClassElement(_UnitResynthesizer unitResynthesizer,
-      CompilationUnitElement unitElement, UnlinkedClass serializedClass) {
-    String name = serializedClass.name;
-    List<String> components =
-        unitResynthesizer.unit.location.components.toList();
-    components.add(name);
-    ElementLocationImpl location = new ElementLocationImpl.con3(components);
-    return new _DeferredClassElement._(
-        unitResynthesizer, unitElement, serializedClass, name, location);
-  }
-
-  _DeferredClassElement._(this.unitResynthesizer, this.unitElement,
-      this.serializedClass, this.name, ElementLocation location)
-      : super(null, location);
-
-  @override
-  List<PropertyAccessorElement> get accessors {
-    _ensureExecutables();
-    return actualElement.accessors;
-  }
-
-  @override
-  ClassElementImpl get actualElement {
-    if (_actualElement == null) {
-      _actualElement = unitResynthesizer.buildClassImpl(serializedClass, this);
-      _actualElement.enclosingElement = unitElement;
-    }
-    return _actualElement;
-  }
-
-  @override
-  List<ConstructorElement> get constructors {
-    _ensureExecutables();
-    return actualElement.constructors;
-  }
-
-  @override
-  AnalysisContext get context => unitElement.context;
-
-  @override
-  String get displayName => name;
-
-  @override
-  CompilationUnitElement get enclosingElement {
-    return unitElement;
-  }
-
-  @override
-  List<FieldElement> get fields {
-    _ensureExecutables();
-    return actualElement.fields;
-  }
-
-  @override
-  List<MethodElement> get methods {
-    _ensureExecutables();
-    return actualElement.methods;
-  }
-
-  @override
-  void ensureAccessorsReady() {
-    _ensureExecutables();
-  }
-
-  @override
-  void ensureActualElementComplete() {
-    _ensureExecutables();
-  }
-
-  @override
-  void ensureConstructorsReady() {
-    _ensureExecutables();
-  }
-
-  @override
-  void ensureMethodsReady() {
-    _ensureExecutables();
-  }
-
-  /**
-   * Ensure that we have [actualElement], and it has all executables.
-   */
-  void _ensureExecutables() {
-    if (!_executablesResynthesized) {
-      _executablesResynthesized = true;
-      unitResynthesizer.buildClassExecutables(actualElement, serializedClass);
-    }
-  }
-}
-
-/**
- * The constructor element that has been resynthesized from a summary.  The
- * actual element won't be constructed until it is requested.  But properties
- * [displayName], [enclosingElement] and [name] can be used without creating
- * the actual element.
- */
-class _DeferredConstructorElement extends ConstructorElementHandle {
-  /**
-   * The type defining this constructor element.  If [_isMember] is `false`,
-   * then the type parameters of [_definingType] are not guaranteed to be
-   * valid.
-   */
-  final InterfaceType _definingType;
-
-  /**
-   * The constructor name.
-   */
-  final String name;
-
-  factory _DeferredConstructorElement(InterfaceType definingType, String name) {
-    List<String> components = definingType.element.location.components.toList();
-    components.add(name);
-    ElementLocationImpl location = new ElementLocationImpl.con3(components);
-    return new _DeferredConstructorElement._(definingType, name, location);
-  }
-
-  _DeferredConstructorElement._(
-      this._definingType, this.name, ElementLocation location)
-      : super(null, location);
-
-  @override
-  ConstructorElement get actualElement =>
-      enclosingElement.getNamedConstructor(name);
-
-  @override
-  AnalysisContext get context => _definingType.element.context;
-
-  @override
-  String get displayName => name;
-
-  @override
-  ClassElement get enclosingElement {
-    return _definingType.element;
-  }
-}
-
-/**
  * Local function element representing the initializer for a variable that has
  * been resynthesized from a summary.  The actual element won't be constructed
  * until it is requested.  But properties [context] and [enclosingElement] can
@@ -1043,12 +885,6 @@
   LibraryElementImpl library;
 
   /**
-   * Classes which should have their supertype set to "object" once
-   * resynthesis is complete.  Only used if [isCoreLibrary] is `true`.
-   */
-  List<ClassElementImpl> delayedObjectSubclasses = <ClassElementImpl>[];
-
-  /**
    * Map of compilation unit elements that have been resynthesized so far.  The
    * key is the URI of the compilation unit.
    */
@@ -1170,17 +1006,9 @@
     }
     library.parts = partResynthesizers.map((r) => r.unit).toList();
     // Populate units.
-    populateUnit(definingUnitResynthesizer);
+    rememberUriToUnit(definingUnitResynthesizer);
     for (_UnitResynthesizer partResynthesizer in partResynthesizers) {
-      populateUnit(partResynthesizer);
-    }
-    // Update delayed Object class references.
-    if (isCoreLibrary) {
-      ClassElement objectElement = library.getType('Object');
-      assert(objectElement != null);
-      for (ClassElementImpl classElement in delayedObjectSubclasses) {
-        classElement.supertype = objectElement.type;
-      }
+      rememberUriToUnit(partResynthesizer);
     }
     // Create the synthetic element for `loadLibrary`.
     // Until the client received dart:core and dart:async, we cannot do this,
@@ -1261,13 +1089,12 @@
   }
 
   /**
-   * Populate a [CompilationUnitElement] by deserializing all the elements
-   * contained in it.
+   * Remember the absolute URI to the corresponding unit mapping.
    */
-  void populateUnit(_UnitResynthesizer unitResynthesized) {
-    unitResynthesized.populateUnit();
-    String absoluteUri = unitResynthesized.unit.source.uri.toString();
-    resynthesizedUnits[absoluteUri] = unitResynthesized.unit;
+  void rememberUriToUnit(_UnitResynthesizer unitResynthesized) {
+    CompilationUnitElementImpl unit = unitResynthesized.unit;
+    String absoluteUri = unit.source.uri.toString();
+    resynthesizedUnits[absoluteUri] = unit;
   }
 }
 
@@ -1536,13 +1363,20 @@
   }
 
   @override
-  List<FunctionElementImpl> buildTopLevelFunctions() {
-    return _unitResynthesizer.buildTopLevelFunctions();
+  UnitExplicitTopLevelVariables buildTopLevelVariables() {
+    return _unitResynthesizer.buildUnitExplicitTopLevelVariables();
   }
 
   @override
-  UnitExplicitTopLevelVariables buildTopLevelVariables() {
-    return _unitResynthesizer.buildUnitExplicitTopLevelVariables();
+  bool isInConstCycle(int slot) {
+    return _unitResynthesizer.constCycles.contains(slot);
+  }
+
+  @override
+  ConstructorElement resolveConstructorRef(
+      TypeParameterizedElementMixin typeParameterContext, EntityRef entry) {
+    return _unitResynthesizer._getConstructorForEntry(
+        typeParameterContext, entry);
   }
 
   @override
@@ -1588,13 +1422,6 @@
   CompilationUnitElementImpl unit;
 
   /**
-   * [ElementHolder] into which resynthesized elements should be placed.  This
-   * object is recreated afresh for each unit in the library, and is used to
-   * populate the [CompilationUnitElement].
-   */
-  final ElementHolder unitHolder = new ElementHolder();
-
-  /**
    * Map from slot id to the corresponding [EntityRef] object for linked types
    * (i.e. propagated and inferred types).
    */
@@ -1606,39 +1433,6 @@
    */
   Set<int> constCycles;
 
-  /**
-   * The [ConstructorElementImpl] for the constructor currently being
-   * resynthesized.
-   */
-  ConstructorElementImpl currentConstructor;
-
-  /**
-   * Type parameters for the generic class, typedef, or executable currently
-   * being resynthesized, if any.  This is a list of lists; if multiple
-   * entities with type parameters are nested (e.g. a generic executable inside
-   * a generic class), then the zeroth element of [currentTypeParameters]
-   * contains the type parameters for the outermost nested entity, and further
-   * elements contain the type parameters for entities that are more deeply
-   * nested.  If we are not currently resynthesizing a class, typedef, or
-   * executable, then this is an empty list.
-   */
-  final List<List<TypeParameterElement>> currentTypeParameters =
-      <List<TypeParameterElement>>[];
-
-  /**
-   * If a class is currently being resynthesized, map from field name to the
-   * corresponding field element.  This is used when resynthesizing
-   * initializing formal parameters.
-   */
-  Map<String, FieldElementImpl> fields;
-
-  /**
-   * If a class is currently being resynthesized, map from constructor name to
-   * the corresponding constructor element.  This is used when resynthesizing
-   * constructor initializers.
-   */
-  Map<String, ConstructorElementImpl> constructors;
-
   int numLinkedReferences;
   int numUnlinkedReferences;
 
@@ -1654,11 +1448,6 @@
    */
   ResynthesizerContext _resynthesizerContext;
 
-  /**
-   * TODO(scheglov) clean up after moving resynthesize logic to Impl.
-   */
-  TypeParameterizedElementMixin _currentTypeParameterizedElement;
-
   _UnitResynthesizer(this.libraryResynthesizer, this.unlinkedUnit,
       this.linkedUnit, Source unitSource, UnlinkedPart unlinkedPart) {
     _resynthesizerContext = new _ResynthesizerContext(this);
@@ -1675,8 +1464,6 @@
     numLinkedReferences = linkedUnit.references.length;
     numUnlinkedReferences = unlinkedUnit.references.length;
     referenceInfos = new List<_ReferenceInfo>(numLinkedReferences);
-    _currentTypeParameterizedElement =
-        new _CurrentTypeParameterizedElement(this);
   }
 
   SummaryResynthesizer get summaryResynthesizer =>
@@ -1713,499 +1500,14 @@
   }
 
   /**
-   * Build the annotations for the given [element].
-   */
-  void buildAnnotations(
-      ElementImpl element, List<UnlinkedConst> serializedAnnotations) {
-    if (serializedAnnotations.isNotEmpty) {
-      element.metadata = serializedAnnotations
-          .map((a) => buildAnnotation(element, a))
-          .toList();
-    }
-  }
-
-  /**
-   * Resynthesize a [ClassElement] and place it in [unitHolder].
-   */
-  void buildClass(UnlinkedClass serializedClass) {
-    ClassElement classElement;
-    if (libraryResynthesizer.isCoreLibrary &&
-        serializedClass.supertype == null) {
-      classElement = buildClassImpl(serializedClass, null);
-      if (!serializedClass.hasNoSupertype) {
-        libraryResynthesizer.delayedObjectSubclasses.add(classElement);
-      }
-    } else {
-      classElement = new _DeferredClassElement(this, unit, serializedClass);
-    }
-    unitHolder.addType(classElement);
-  }
-
-  /**
-   * Fill the given [ClassElementImpl] with executable elements and fields.
-   */
-  void buildClassExecutables(
-      ClassElementImpl classElement, UnlinkedClass serializedClass) {
-    currentTypeParameters.add(classElement.typeParameters);
-    ElementHolder memberHolder = new ElementHolder();
-    fields = <String, FieldElementImpl>{};
-    for (UnlinkedVariable serializedVariable in serializedClass.fields) {
-      buildVariable(classElement, serializedVariable, memberHolder);
-    }
-    bool constructorFound = false;
-    constructors = <String, ConstructorElementImpl>{};
-    for (UnlinkedExecutable serializedExecutable
-        in serializedClass.executables) {
-      switch (serializedExecutable.kind) {
-        case UnlinkedExecutableKind.constructor:
-          constructorFound = true;
-          buildConstructor(serializedExecutable, classElement, memberHolder);
-          break;
-        case UnlinkedExecutableKind.functionOrMethod:
-        case UnlinkedExecutableKind.getter:
-        case UnlinkedExecutableKind.setter:
-          if (serializedExecutable.isStatic) {
-            currentTypeParameters.removeLast();
-          }
-          buildExecutable(serializedExecutable, classElement, memberHolder);
-          if (serializedExecutable.isStatic) {
-            currentTypeParameters.add(classElement.typeParameters);
-          }
-          break;
-      }
-    }
-    if (!serializedClass.isMixinApplication) {
-      if (!constructorFound) {
-        // Synthesize implicit constructors.
-        ConstructorElementImpl constructor = new ConstructorElementImpl('', -1);
-        constructor.synthetic = true;
-        constructor.returnType = classElement.type;
-        constructor.type = new FunctionTypeImpl.elementWithNameAndArgs(
-            constructor, null, getCurrentTypeArguments(), false);
-        memberHolder.addConstructor(constructor);
-      }
-      classElement.constructors = memberHolder.constructors;
-    }
-    classElement.accessors = memberHolder.accessors;
-    classElement.fields = memberHolder.fields;
-    classElement.methods = memberHolder.methods;
-    resolveConstructorInitializers(classElement);
-    currentTypeParameters.removeLast();
-    assert(currentTypeParameters.isEmpty);
-  }
-
-  /**
-   * Resynthesize a [ClassElementImpl].  If [handle] is not `null`, then
-   * executables are not resynthesized, and [InterfaceTypeImpl] is created
-   * around the [handle], so that executables are resynthesized lazily.
-   */
-  ClassElementImpl buildClassImpl(
-      UnlinkedClass serializedClass, ClassElementHandle handle) {
-    ClassElementImpl classElement =
-        new ClassElementImpl.forSerialized(serializedClass, unit);
-    classElement.hasBeenInferred = summaryResynthesizer.strongMode;
-    InterfaceTypeImpl correspondingType =
-        new InterfaceTypeImpl(handle ?? classElement);
-    if (serializedClass.supertype != null) {
-      classElement.supertype =
-          buildType(serializedClass.supertype, classElement);
-    } else if (!libraryResynthesizer.isCoreLibrary) {
-      classElement.supertype = typeProvider.objectType;
-    }
-    classElement.interfaces = serializedClass.interfaces
-        .map((EntityRef t) => buildType(t, classElement))
-        .toList();
-    classElement.mixins = serializedClass.mixins
-        .map((EntityRef t) => buildType(t, classElement))
-        .toList();
-    // TODO(scheglov) move to ClassElementImpl
-    correspondingType.typeArguments = classElement.typeParameterTypes;
-    classElement.type = correspondingType;
-    assert(currentTypeParameters.isEmpty);
-    // TODO(scheglov) Somehow Observatory shows too much time spent here
-    // during DDC run on the large codebase. I would expect only Object here.
-    if (handle == null) {
-      buildClassExecutables(classElement, serializedClass);
-    }
-    fields = null;
-    constructors = null;
-    return classElement;
-  }
-
-  void buildCodeRange(ElementImpl element, CodeRange codeRange) {
-    if (codeRange != null) {
-      element.setCodeRange(codeRange.offset, codeRange.length);
-    }
-  }
-
-  /**
-   * Resynthesize a [NamespaceCombinator].
-   */
-  NamespaceCombinator buildCombinator(UnlinkedCombinator serializedCombinator) {
-    if (serializedCombinator.shows.isNotEmpty) {
-      ShowElementCombinatorImpl combinator = new ShowElementCombinatorImpl();
-      // Note: we call toList() so that we don't retain a reference to the
-      // deserialized data structure.
-      combinator.shownNames = serializedCombinator.shows.toList();
-      combinator.offset = serializedCombinator.offset;
-      combinator.end = serializedCombinator.end;
-      return combinator;
-    } else {
-      HideElementCombinatorImpl combinator = new HideElementCombinatorImpl();
-      // Note: we call toList() so that we don't retain a reference to the
-      // deserialized data structure.
-      combinator.hiddenNames = serializedCombinator.hides.toList();
-      return combinator;
-    }
-  }
-
-  /**
-   * Resynthesize a [ConstructorElement] and place it in the given [holder].
-   * [classElement] is the element of the class for which this element is a
-   * constructor.
-   */
-  void buildConstructor(UnlinkedExecutable serializedExecutable,
-      ClassElementImpl classElement, ElementHolder holder) {
-    assert(serializedExecutable.kind == UnlinkedExecutableKind.constructor);
-    currentConstructor = new ConstructorElementImpl.forSerialized(
-        serializedExecutable, classElement);
-    currentConstructor.isCycleFree = serializedExecutable.isConst &&
-        !constCycles.contains(serializedExecutable.constCycleSlot);
-    if (serializedExecutable.name.isEmpty) {
-      currentConstructor.nameEnd =
-          serializedExecutable.nameOffset + classElement.name.length;
-    } else {
-      currentConstructor.nameEnd = serializedExecutable.nameEnd;
-      currentConstructor.periodOffset = serializedExecutable.periodOffset;
-    }
-    constructors[serializedExecutable.name] = currentConstructor;
-    buildExecutableCommonParts(currentConstructor, serializedExecutable);
-    currentConstructor.constantInitializers = serializedExecutable
-        .constantInitializers
-        .map((i) => buildConstructorInitializer(currentConstructor, i))
-        .toList();
-    if (serializedExecutable.isRedirectedConstructor) {
-      if (serializedExecutable.isFactory) {
-        EntityRef redirectedConstructor =
-            serializedExecutable.redirectedConstructor;
-        _ReferenceInfo info = getReferenceInfo(redirectedConstructor.reference);
-        List<EntityRef> typeArguments = redirectedConstructor.typeArguments;
-        currentConstructor.redirectedConstructor = _createConstructorElement(
-            _createConstructorDefiningType(classElement, info, typeArguments),
-            info);
-      } else {
-        List<String> locationComponents = unit.location.components.toList();
-        locationComponents.add(classElement.name);
-        locationComponents.add(serializedExecutable.redirectedConstructorName);
-        currentConstructor.redirectedConstructor =
-            new _DeferredConstructorElement._(
-                classElement.type,
-                serializedExecutable.redirectedConstructorName,
-                new ElementLocationImpl.con3(locationComponents));
-      }
-    }
-    holder.addConstructor(currentConstructor);
-    currentConstructor = null;
-  }
-
-  /**
-   * Resynthesize the [ConstructorInitializer] in context of
-   * [currentConstructor], which is used to resolve constructor parameter names.
-   */
-  ConstructorInitializer buildConstructorInitializer(
-      ConstructorElementImpl enclosingConstructor,
-      UnlinkedConstructorInitializer serialized) {
-    UnlinkedConstructorInitializerKind kind = serialized.kind;
-    String name = serialized.name;
-    List<Expression> arguments = <Expression>[];
-    {
-      int numArguments = serialized.arguments.length;
-      int numNames = serialized.argumentNames.length;
-      for (int i = 0; i < numArguments; i++) {
-        Expression expression = _buildConstExpression(
-            enclosingConstructor, serialized.arguments[i]);
-        int nameIndex = numNames + i - numArguments;
-        if (nameIndex >= 0) {
-          expression = AstFactory.namedExpression2(
-              serialized.argumentNames[nameIndex], expression);
-        }
-        arguments.add(expression);
-      }
-    }
-    switch (kind) {
-      case UnlinkedConstructorInitializerKind.field:
-        return AstFactory.constructorFieldInitializer(false, name,
-            _buildConstExpression(enclosingConstructor, serialized.expression));
-      case UnlinkedConstructorInitializerKind.superInvocation:
-        return AstFactory.superConstructorInvocation2(
-            name.isNotEmpty ? name : null, arguments);
-      case UnlinkedConstructorInitializerKind.thisInvocation:
-        return AstFactory.redirectingConstructorInvocation2(
-            name.isNotEmpty ? name : null, arguments);
-    }
-  }
-
-  /**
-   * Build the documentation for the given [element].  Does nothing if
-   * [serializedDocumentationComment] is `null`.
-   */
-  void buildDocumentation(ElementImpl element,
-      UnlinkedDocumentationComment serializedDocumentationComment) {
-    if (serializedDocumentationComment != null) {
-      element.documentationComment = serializedDocumentationComment.text;
-      element.setDocRange(serializedDocumentationComment.offset,
-          serializedDocumentationComment.length);
-    }
-  }
-
-  /**
-   * Resynthesize the [ClassElement] corresponding to an enum, along with the
-   * associated fields and implicit accessors.
-   */
-  void buildEnum(UnlinkedEnum serializedEnum) {
-    assert(!libraryResynthesizer.isCoreLibrary);
-    ClassElementImpl classElement =
-        new ClassElementImpl(serializedEnum.name, serializedEnum.nameOffset);
-    classElement.enum2 = true;
-    InterfaceType enumType = new InterfaceTypeImpl(classElement);
-    classElement.type = enumType;
-    classElement.supertype = typeProvider.objectType;
-    buildDocumentation(classElement, serializedEnum.documentationComment);
-    buildAnnotations(classElement, serializedEnum.annotations);
-    buildCodeRange(classElement, serializedEnum.codeRange);
-    ElementHolder memberHolder = new ElementHolder();
-    // Build the 'index' field.
-    FieldElementImpl indexField = new FieldElementImpl('index', -1);
-    indexField.final2 = true;
-    indexField.synthetic = true;
-    indexField.type = typeProvider.intType;
-    memberHolder.addField(indexField);
-    buildImplicitAccessors(indexField, memberHolder);
-    // Build the 'values' field.
-    FieldElementImpl valuesField = new ConstFieldElementImpl('values', -1);
-    valuesField.synthetic = true;
-    valuesField.const3 = true;
-    valuesField.static = true;
-    valuesField.type = typeProvider.listType.instantiate(<DartType>[enumType]);
-    memberHolder.addField(valuesField);
-    buildImplicitAccessors(valuesField, memberHolder);
-    // Build fields for all enum constants.
-    List<DartObjectImpl> constantValues = <DartObjectImpl>[];
-    for (int i = 0; i < serializedEnum.values.length; i++) {
-      UnlinkedEnumValue serializedEnumValue = serializedEnum.values[i];
-      String fieldName = serializedEnumValue.name;
-      ConstFieldElementImpl field =
-          new ConstFieldElementImpl(fieldName, serializedEnumValue.nameOffset);
-      buildDocumentation(field, serializedEnumValue.documentationComment);
-      field.const3 = true;
-      field.static = true;
-      field.type = enumType;
-      // Create a value for the constant.
-      Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{
-        fieldName: new DartObjectImpl(typeProvider.intType, new IntState(i))
-      };
-      DartObjectImpl value =
-          new DartObjectImpl(enumType, new GenericState(fieldMap));
-      constantValues.add(value);
-      field.evaluationResult = new EvaluationResultImpl(value);
-      // Add the field.
-      memberHolder.addField(field);
-      buildImplicitAccessors(field, memberHolder);
-    }
-    // Build the value of the 'values' field.
-    valuesField.evaluationResult = new EvaluationResultImpl(
-        new DartObjectImpl(valuesField.type, new ListState(constantValues)));
-    // done
-    classElement.fields = memberHolder.fields;
-    classElement.accessors = memberHolder.accessors;
-    classElement.constructors = <ConstructorElement>[];
-    unitHolder.addEnum(classElement);
-  }
-
-  /**
-   * Resynthesize an [ExecutableElement] and place it in the given [holder].
-   */
-  void buildExecutable(
-      UnlinkedExecutable serializedExecutable, ElementImpl enclosingElement,
-      [ElementHolder holder]) {
-    bool isTopLevel = holder == null;
-    if (holder == null) {
-      holder = unitHolder;
-    }
-    UnlinkedExecutableKind kind = serializedExecutable.kind;
-    String name = serializedExecutable.name;
-    if (kind == UnlinkedExecutableKind.setter) {
-      assert(name.endsWith('='));
-      name = name.substring(0, name.length - 1);
-    }
-    switch (kind) {
-      case UnlinkedExecutableKind.functionOrMethod:
-        if (isTopLevel) {
-          // Created lazily.
-        } else {
-          MethodElementImpl executableElement =
-              new MethodElementImpl.forSerialized(
-                  serializedExecutable, enclosingElement);
-          buildExecutableCommonParts(executableElement, serializedExecutable);
-          holder.addMethod(executableElement);
-        }
-        break;
-      case UnlinkedExecutableKind.getter:
-      case UnlinkedExecutableKind.setter:
-        // Top-level accessors are created lazily.
-        if (isTopLevel) {
-          break;
-        }
-        // Class member accessors.
-        PropertyAccessorElementImpl executableElement =
-            new PropertyAccessorElementImpl.forSerialized(
-                serializedExecutable, enclosingElement);
-        buildExecutableCommonParts(executableElement, serializedExecutable);
-        DartType type;
-        if (kind == UnlinkedExecutableKind.getter) {
-          type = executableElement.returnType;
-        } else {
-          type = executableElement.parameters[0].type;
-        }
-        holder.addAccessor(executableElement);
-        FieldElementImpl field = buildImplicitField(name, type, kind, holder);
-        field.static = serializedExecutable.isStatic;
-        executableElement.variable = field;
-        if (kind == UnlinkedExecutableKind.getter) {
-          field.getter = executableElement;
-        } else {
-          field.setter = executableElement;
-        }
-        break;
-      default:
-        // The only other executable type is a constructor, and that is handled
-        // separately (in [buildConstructor].  So this code should be
-        // unreachable.
-        assert(false);
-    }
-  }
-
-  /**
-   * Handle the parts of an executable element that are common to constructors,
-   * functions, methods, getters, and setters.
-   */
-  void buildExecutableCommonParts(ExecutableElementImpl executableElement,
-      UnlinkedExecutable serializedExecutable) {
-    executableElement.typeParameters =
-        buildTypeParameters(serializedExecutable.typeParameters);
-    {
-      List<UnlinkedParam> unlinkedParameters = serializedExecutable.parameters;
-      int length = unlinkedParameters.length;
-      if (length != 0) {
-        List<ParameterElementImpl> parameters =
-            new List<ParameterElementImpl>(length);
-        for (int i = 0; i < length; i++) {
-          parameters[i] =
-              buildParameter(unlinkedParameters[i], executableElement);
-        }
-        executableElement.parameters = parameters;
-      }
-    }
-    executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs(
-        executableElement, null, getCurrentTypeArguments(skipLevels: 1), false);
-    {
-      List<UnlinkedExecutable> unlinkedFunctions =
-          serializedExecutable.localFunctions;
-      int length = unlinkedFunctions.length;
-      if (length != 0) {
-        List<FunctionElementImpl> localFunctions =
-            new List<FunctionElementImpl>(length);
-        for (int i = 0; i < length; i++) {
-          localFunctions[i] =
-              buildLocalFunction(unlinkedFunctions[i], executableElement);
-        }
-        executableElement.functions = localFunctions;
-      }
-    }
-    {
-      List<UnlinkedLabel> unlinkedLabels = serializedExecutable.localLabels;
-      int length = unlinkedLabels.length;
-      if (length != 0) {
-        List<LabelElementImpl> localLabels = new List<LabelElementImpl>(length);
-        for (int i = 0; i < length; i++) {
-          localLabels[i] = buildLocalLabel(unlinkedLabels[i]);
-        }
-        executableElement.labels = localLabels;
-      }
-    }
-    {
-      List<UnlinkedVariable> unlinkedVariables =
-          serializedExecutable.localVariables;
-      int length = unlinkedVariables.length;
-      if (length != 0) {
-        List<LocalVariableElementImpl> localVariables =
-            new List<LocalVariableElementImpl>(length);
-        for (int i = 0; i < length; i++) {
-          localVariables[i] =
-              buildLocalVariable(unlinkedVariables[i], executableElement);
-        }
-        executableElement.localVariables = localVariables;
-      }
-    }
-    currentTypeParameters.removeLast();
-  }
-
-  /**
-   * Build the implicit getter and setter associated with [element], and place
-   * them in [holder].
-   */
-  void buildImplicitAccessors(
-      PropertyInducingElementImpl element, ElementHolder holder) {
-    String name = element.name;
-    DartType type = element.type;
-    PropertyAccessorElementImpl getter =
-        buildImplicitGetter(element, name, type);
-    holder?.addAccessor(getter);
-    if (!(element.isConst || element.isFinal)) {
-      PropertyAccessorElementImpl setter =
-          buildImplicitSetter(element, name, type);
-      holder?.addAccessor(setter);
-    }
-  }
-
-  /**
-   * Build the implicit field associated with a getter or setter, and place it
-   * in [holder].
-   */
-  FieldElementImpl buildImplicitField(String name, DartType type,
-      UnlinkedExecutableKind kind, ElementHolder holder) {
-    FieldElementImpl field = holder.getField(name);
-    if (field == null) {
-      field = new FieldElementImpl(name, -1);
-      field.synthetic = true;
-      field.final2 = kind == UnlinkedExecutableKind.getter;
-      field.type = type;
-      holder.addField(field);
-      return field;
-    } else {
-      // TODO(paulberry): what if the getter and setter have a type mismatch?
-      field.final2 = false;
-      return field;
-    }
-  }
-
-  /**
    * Build an implicit getter for the given [property] and bind it to the
    * [property] and to its enclosing element.
    */
   PropertyAccessorElementImpl buildImplicitGetter(
-      PropertyInducingElementImpl property, String name, DartType type) {
-    PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl(name, property.nameOffset);
+      PropertyInducingElementImpl property) {
+    PropertyAccessorElementImpl_ImplicitGetter getter =
+        new PropertyAccessorElementImpl_ImplicitGetter(property);
     getter.enclosingElement = property.enclosingElement;
-    getter.getter = true;
-    getter.static = property.isStatic;
-    getter.synthetic = true;
-    getter.returnType = type;
-    getter.type = new FunctionTypeImpl(getter);
-    getter.variable = property;
-    getter.hasImplicitReturnType = property.hasImplicitType;
-    property.getter = getter;
     return getter;
   }
 
@@ -2214,23 +1516,10 @@
    * [property] and to its enclosing element.
    */
   PropertyAccessorElementImpl buildImplicitSetter(
-      PropertyInducingElementImpl property, String name, DartType type) {
-    PropertyAccessorElementImpl setter =
-        new PropertyAccessorElementImpl(name, property.nameOffset);
+      PropertyInducingElementImpl property) {
+    PropertyAccessorElementImpl_ImplicitSetter setter =
+        new PropertyAccessorElementImpl_ImplicitSetter(property);
     setter.enclosingElement = property.enclosingElement;
-    setter.setter = true;
-    setter.static = property.isStatic;
-    setter.synthetic = true;
-    setter.parameters = <ParameterElement>[
-      new ParameterElementImpl('_$name', property.nameOffset)
-        ..synthetic = true
-        ..type = type
-        ..parameterKind = ParameterKind.REQUIRED
-    ];
-    setter.returnType = VoidTypeImpl.instance;
-    setter.type = new FunctionTypeImpl(setter);
-    setter.variable = property;
-    property.setter = setter;
     return setter;
   }
 
@@ -2254,137 +1543,6 @@
   }
 
   /**
-   * Resynthesize a local [FunctionElement].
-   */
-  FunctionElementImpl buildLocalFunction(
-      UnlinkedExecutable serializedExecutable, ElementImpl enclosingElement) {
-    FunctionElementImpl element = new FunctionElementImpl.forSerialized(
-        serializedExecutable, enclosingElement);
-    if (serializedExecutable.visibleOffset != 0) {
-      element.setVisibleRange(serializedExecutable.visibleOffset,
-          serializedExecutable.visibleLength);
-    }
-    buildExecutableCommonParts(element, serializedExecutable);
-    return element;
-  }
-
-  /**
-   * Resynthesize a [LabelElement].
-   */
-  LabelElement buildLocalLabel(UnlinkedLabel serializedLabel) {
-    return new LabelElementImpl(
-        serializedLabel.name,
-        serializedLabel.nameOffset,
-        serializedLabel.isOnSwitchStatement,
-        serializedLabel.isOnSwitchMember);
-  }
-
-  /**
-   * Resynthesize a [LocalVariableElement].
-   */
-  LocalVariableElement buildLocalVariable(UnlinkedVariable serializedVariable,
-      ExecutableElementImpl enclosingExecutable) {
-    LocalVariableElementImpl element;
-    if (serializedVariable.initializer?.bodyExpr != null &&
-        serializedVariable.isConst) {
-      ConstLocalVariableElementImpl constElement =
-          new ConstLocalVariableElementImpl.forSerialized(
-              serializedVariable, enclosingExecutable);
-      element = constElement;
-      constElement.constantInitializer = _buildConstExpression(
-          enclosingExecutable, serializedVariable.initializer.bodyExpr);
-    } else {
-      element = new LocalVariableElementImpl.forSerialized(
-          serializedVariable, enclosingExecutable);
-    }
-    if (serializedVariable.visibleOffset != 0) {
-      element.setVisibleRange(
-          serializedVariable.visibleOffset, serializedVariable.visibleLength);
-    }
-    buildVariableCommonParts(element, serializedVariable);
-    return element;
-  }
-
-  /**
-   * Resynthesize a [ParameterElement].
-   */
-  ParameterElement buildParameter(
-      UnlinkedParam serializedParameter, ElementImpl enclosingElement,
-      {bool synthetic: false}) {
-    ParameterElementImpl parameterElement;
-    if (serializedParameter.isInitializingFormal) {
-      if (serializedParameter.kind == UnlinkedParamKind.required) {
-        parameterElement = new FieldFormalParameterElementImpl.forSerialized(
-            serializedParameter, enclosingElement);
-      } else {
-        parameterElement =
-            new DefaultFieldFormalParameterElementImpl.forSerialized(
-                serializedParameter, enclosingElement);
-      }
-    } else {
-      if (serializedParameter.kind == UnlinkedParamKind.required) {
-        parameterElement = new ParameterElementImpl.forSerialized(
-            serializedParameter, enclosingElement);
-      } else {
-        parameterElement = new DefaultParameterElementImpl.forSerialized(
-            serializedParameter, enclosingElement);
-      }
-    }
-    parameterElement.synthetic = synthetic;
-    if (serializedParameter.isFunctionTyped) {
-      FunctionElementImpl parameterTypeElement =
-          new FunctionElementImpl_forFunctionTypedParameter(
-              unit, parameterElement);
-      if (!synthetic) {
-        parameterTypeElement.enclosingElement = parameterElement;
-      }
-      List<ParameterElement> subParameters = serializedParameter.parameters
-          .map((UnlinkedParam p) =>
-              buildParameter(p, parameterTypeElement, synthetic: synthetic))
-          .toList();
-      if (synthetic) {
-        parameterTypeElement.parameters = subParameters;
-      } else {
-        parameterElement.parameters = subParameters;
-        parameterTypeElement.shareParameters(subParameters);
-      }
-      parameterTypeElement.returnType =
-          buildType(serializedParameter.type, _currentTypeParameterizedElement);
-      parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs(
-          parameterTypeElement, null, getCurrentTypeArguments(), false);
-      parameterTypeElement.type = parameterElement.type;
-    }
-    buildVariableInitializer(parameterElement, serializedParameter.initializer);
-    return parameterElement;
-  }
-
-  /**
-   * Handle the parts that are common to top level variables and fields.
-   */
-  void buildPropertyIntroducingElementCommonParts(
-      PropertyInducingElementImpl element,
-      UnlinkedVariable serializedVariable) {
-    buildVariableCommonParts(element, serializedVariable);
-    element.propagatedType = buildLinkedType(
-        serializedVariable.propagatedTypeSlot,
-        _currentTypeParameterizedElement);
-  }
-
-  List<FunctionElementImpl> buildTopLevelFunctions() {
-    List<FunctionElementImpl> functions = <FunctionElementImpl>[];
-    List<UnlinkedExecutable> executables = unlinkedUnit.executables;
-    for (UnlinkedExecutable unlinkedExecutable in executables) {
-      if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) {
-        FunctionElementImpl function =
-            new FunctionElementImpl.forSerialized(unlinkedExecutable, unit);
-        buildExecutableCommonParts(function, unlinkedExecutable);
-        functions.add(function);
-      }
-    }
-    return functions;
-  }
-
-  /**
    * Build a [DartType] object based on a [EntityRef].  This [DartType]
    * may refer to elements in other libraries than the library being
    * deserialized, so handles are used to avoid having to deserialize other
@@ -2404,17 +1562,8 @@
       return typeParameterContext.getTypeParameterType(type.paramReference);
     } else if (type.syntheticReturnType != null) {
       FunctionElementImpl element =
-          new FunctionElementImpl_forLUB(unit, typeParameterContext);
-      element.parameters = type.syntheticParams
-          .map((UnlinkedParam param) =>
-              buildParameter(param, element, synthetic: true))
-          .toList();
-      element.returnType =
-          buildType(type.syntheticReturnType, typeParameterContext);
-      FunctionTypeImpl result = new FunctionTypeImpl.elementWithNameAndArgs(
-          element, null, null, false);
-      element.type = result;
-      return result;
+          new FunctionElementImpl_forLUB(unit, typeParameterContext, type);
+      return element.type;
     } else {
       DartType getTypeArgument(int i) {
         if (i < type.typeArguments.length) {
@@ -2432,72 +1581,6 @@
     }
   }
 
-  /**
-   * Resynthesize a [FunctionTypeAliasElement] and place it in the
-   * [unitHolder].
-   */
-  void buildTypedef(UnlinkedTypedef serializedTypedef) {
-    FunctionTypeAliasElementImpl functionTypeAliasElement =
-        new FunctionTypeAliasElementImpl.forSerialized(serializedTypedef, unit);
-    // TODO(scheglov) remove this after delaying parameters and their types
-    currentTypeParameters.add(functionTypeAliasElement.typeParameters);
-    functionTypeAliasElement.parameters = serializedTypedef.parameters
-        .map((p) => buildParameter(p, functionTypeAliasElement))
-        .toList();
-    functionTypeAliasElement.type =
-        new FunctionTypeImpl.forTypedef(functionTypeAliasElement);
-    unitHolder.addTypeAlias(functionTypeAliasElement);
-    // TODO(scheglov) remove this after delaying parameters and their types
-    currentTypeParameters.removeLast();
-    assert(currentTypeParameters.isEmpty);
-  }
-
-  /**
-   * Resynthesize a [TypeParameterElement], handling all parts of its except
-   * its bound.
-   *
-   * The bound is deferred until later since it may refer to other type
-   * parameters that have not been resynthesized yet.  To handle the bound,
-   * call [finishTypeParameter].
-   */
-  TypeParameterElement buildTypeParameter(
-      UnlinkedTypeParam serializedTypeParameter) {
-    TypeParameterElementImpl typeParameterElement =
-        new TypeParameterElementImpl(
-            serializedTypeParameter.name, serializedTypeParameter.nameOffset);
-    typeParameterElement.type = new TypeParameterTypeImpl(typeParameterElement);
-    buildAnnotations(typeParameterElement, serializedTypeParameter.annotations);
-    buildCodeRange(typeParameterElement, serializedTypeParameter.codeRange);
-    return typeParameterElement;
-  }
-
-  /**
-   * Build [TypeParameterElement]s corresponding to the type parameters in
-   * [serializedTypeParameters] and store them in [currentTypeParameters].
-   * Also return them.
-   */
-  List<TypeParameterElement> buildTypeParameters(
-      List<UnlinkedTypeParam> serializedTypeParameters) {
-    int length = serializedTypeParameters.length;
-    if (length != 0) {
-      List<TypeParameterElement> typeParameters =
-          new List<TypeParameterElement>(length);
-      for (int i = 0; i < length; i++) {
-        typeParameters[i] = buildTypeParameter(serializedTypeParameters[i]);
-      }
-      currentTypeParameters.add(typeParameters);
-      for (int i = 0; i < length; i++) {
-        finishTypeParameter(serializedTypeParameters[i], typeParameters[i]);
-      }
-      return typeParameters;
-    } else {
-      List<TypeParameterElement> typeParameters =
-          const <TypeParameterElement>[];
-      currentTypeParameters.add(typeParameters);
-      return typeParameters;
-    }
-  }
-
   UnitExplicitTopLevelAccessors buildUnitExplicitTopLevelAccessors() {
     HashMap<String, TopLevelVariableElementImpl> implicitVariables =
         new HashMap<String, TopLevelVariableElementImpl>();
@@ -2518,7 +1601,6 @@
             new PropertyAccessorElementImpl.forSerialized(
                 unlinkedExecutable, unit);
         accessorsData.accessors.add(accessor);
-        buildExecutableCommonParts(accessor, unlinkedExecutable);
         // implicit variable
         TopLevelVariableElementImpl variable = implicitVariables[name];
         if (variable == null) {
@@ -2553,120 +1635,23 @@
       TopLevelVariableElementImpl element;
       if (unlinkedVariable.initializer?.bodyExpr != null &&
           unlinkedVariable.isConst) {
-        ConstTopLevelVariableElementImpl constElement =
-            new ConstTopLevelVariableElementImpl.forSerialized(
-                unlinkedVariable, unit);
-        element = constElement;
-        constElement.constantInitializer =
-            _buildConstExpression(null, unlinkedVariable.initializer.bodyExpr);
+        element = new ConstTopLevelVariableElementImpl.forSerialized(
+            unlinkedVariable, unit);
       } else {
         element = new TopLevelVariableElementImpl.forSerialized(
             unlinkedVariable, unit);
       }
-      buildPropertyIntroducingElementCommonParts(element, unlinkedVariable);
       variablesData.variables[i] = element;
       // implicit accessors
-      String name = element.name;
-      DartType type = element.type;
-      variablesData.implicitAccessors
-          .add(buildImplicitGetter(element, name, type));
+      variablesData.implicitAccessors.add(buildImplicitGetter(element));
       if (!(element.isConst || element.isFinal)) {
-        variablesData.implicitAccessors
-            .add(buildImplicitSetter(element, name, type));
+        variablesData.implicitAccessors.add(buildImplicitSetter(element));
       }
     }
     return variablesData;
   }
 
   /**
-   * Resynthesize a [TopLevelVariableElement] or [FieldElement].
-   */
-  void buildVariable(
-      ClassElementImpl enclosingClass, UnlinkedVariable serializedVariable,
-      [ElementHolder holder]) {
-    if (holder == null) {
-      throw new UnimplementedError('Must be lazy');
-    } else {
-      FieldElementImpl element;
-      if (serializedVariable.initializer?.bodyExpr != null &&
-          (serializedVariable.isConst ||
-              serializedVariable.isFinal && !serializedVariable.isStatic)) {
-        ConstFieldElementImpl constElement =
-            new ConstFieldElementImpl.forSerialized(
-                serializedVariable, enclosingClass);
-        element = constElement;
-        constElement.constantInitializer = _buildConstExpression(
-            enclosingClass, serializedVariable.initializer.bodyExpr);
-      } else {
-        element = new FieldElementImpl.forSerialized(
-            serializedVariable, enclosingClass);
-      }
-      buildPropertyIntroducingElementCommonParts(element, serializedVariable);
-      element.static = serializedVariable.isStatic;
-      holder.addField(element);
-      buildImplicitAccessors(element, holder);
-      fields[element.name] = element;
-    }
-  }
-
-  /**
-   * Handle the parts that are common to variables.
-   */
-  void buildVariableCommonParts(
-      VariableElementImpl element, UnlinkedVariable serializedVariable) {
-    element.type = buildLinkedType(serializedVariable.inferredTypeSlot,
-            element.typeParameterContext) ??
-        buildType(serializedVariable.type, element.typeParameterContext);
-    buildVariableInitializer(element, serializedVariable.initializer);
-  }
-
-  /**
-   * If the given [serializedInitializer] is not `null`, create the
-   * corresponding [FunctionElementImpl] and set it for the [variable].
-   */
-  void buildVariableInitializer(
-      VariableElementImpl variable, UnlinkedExecutable serializedInitializer) {
-    if (serializedInitializer == null) {
-      return null;
-    }
-    FunctionElementImpl initializerElement =
-        buildLocalFunction(serializedInitializer, variable);
-    initializerElement.synthetic = true;
-    variable.initializer = initializerElement;
-  }
-
-  /**
-   * Finish creating a [TypeParameterElement] by deserializing its bound.
-   */
-  void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter,
-      TypeParameterElementImpl typeParameterElement) {
-    if (serializedTypeParameter.bound != null) {
-      typeParameterElement.bound = buildType(
-          serializedTypeParameter.bound, _currentTypeParameterizedElement,
-          instantiateToBoundsAllowed: false);
-    }
-  }
-
-  /**
-   * Return a list of type arguments corresponding to [currentTypeParameters],
-   * skipping the innermost [skipLevels] nesting levels.
-   *
-   * Type parameters are listed in nesting order from innermost to outermost,
-   * and then in declaration order.  So for instance if we are resynthesizing a
-   * method declared as `class C<T, U> { void m<V, W>() { ... } }`, then the
-   * type parameters will be returned in the order `[V, W, T, U]`.
-   */
-  List<DartType> getCurrentTypeArguments({int skipLevels: 0}) {
-    assert(currentTypeParameters.length >= skipLevels);
-    List<DartType> result = <DartType>[];
-    for (int i = currentTypeParameters.length - 1 - skipLevels; i >= 0; i--) {
-      result.addAll(currentTypeParameters[i]
-          .map((TypeParameterElement param) => param.type));
-    }
-    return result;
-  }
-
-  /**
    * Return [_ReferenceInfo] with the given [index], lazily resolving it.
    */
   _ReferenceInfo getReferenceInfo(int index) {
@@ -2782,72 +1767,6 @@
     return result;
   }
 
-  /**
-   * Get the type parameter from the surrounding scope whose De Bruijn index is
-   * [index].
-   */
-  DartType getTypeParameterFromScope(int index) {
-    for (int i = currentTypeParameters.length - 1; i >= 0; i--) {
-      List<TypeParameterElement> paramsAtThisNestingLevel =
-          currentTypeParameters[i];
-      int numParamsAtThisNestingLevel = paramsAtThisNestingLevel.length;
-      if (index <= numParamsAtThisNestingLevel) {
-        return paramsAtThisNestingLevel[numParamsAtThisNestingLevel - index]
-            .type;
-      }
-      index -= numParamsAtThisNestingLevel;
-    }
-    throw new StateError('Type parameter not found');
-  }
-
-  /**
-   * Populate a [CompilationUnitElement] by deserializing all the elements
-   * contained in it.
-   */
-  void populateUnit() {
-    unlinkedUnit.classes.forEach(buildClass);
-    unlinkedUnit.enums.forEach(buildEnum);
-    unlinkedUnit.typedefs.forEach(buildTypedef);
-    unit.enums = unitHolder.enums;
-    List<FunctionTypeAliasElement> typeAliases = unitHolder.typeAliases;
-    for (FunctionTypeAliasElementImpl typeAlias in typeAliases) {
-      if (typeAlias.isSynthetic) {
-        typeAlias.enclosingElement = unit;
-      }
-    }
-    unit.typeAliases = typeAliases.where((e) => !e.isSynthetic).toList();
-    unit.types = unitHolder.types;
-    assert(currentTypeParameters.isEmpty);
-  }
-
-  /**
-   * Constructor initializers can reference fields and other constructors of
-   * the same class, including forward references. So, we need to delay
-   * resolution until after class elements are built.
-   */
-  void resolveConstructorInitializers(ClassElementImpl classElement) {
-    for (ConstructorElementImpl constructor in constructors.values) {
-      for (ConstructorInitializer initializer
-          in constructor.constantInitializers) {
-        if (initializer is ConstructorFieldInitializer) {
-          SimpleIdentifier nameNode = initializer.fieldName;
-          nameNode.staticElement = fields[nameNode.name];
-        } else if (initializer is SuperConstructorInvocation) {
-          SimpleIdentifier nameNode = initializer.constructorName;
-          ConstructorElement element = new _DeferredConstructorElement(
-              classElement.supertype, nameNode?.name ?? '');
-          initializer.staticElement = element;
-          nameNode?.staticElement = element;
-        } else if (initializer is RedirectingConstructorInvocation) {
-          SimpleIdentifier nameNode = initializer.constructorName;
-          ConstructorElement element = constructors[nameNode?.name ?? ''];
-          initializer.staticElement = element;
-          nameNode?.staticElement = element;
-        }
-      }
-    }
-  }
-
   Expression _buildConstExpression(ElementImpl context, UnlinkedConst uc) {
     return new _ConstExprBuilder(this, context, uc).build();
   }
@@ -2856,7 +1775,7 @@
    * Return the defining type for a [ConstructorElement] by applying
    * [typeArgumentRefs] to the given linked [info].
    */
-  InterfaceType _createConstructorDefiningType(
+  DartType _createConstructorDefiningType(
       TypeParameterizedElementMixin typeParameterContext,
       _ReferenceInfo info,
       List<EntityRef> typeArgumentRefs) {
@@ -2875,22 +1794,38 @@
   }
 
   /**
+   * Return the [ConstructorElement] corresponding to the given [entry].
+   */
+  ConstructorElement _getConstructorForEntry(
+      TypeParameterizedElementMixin typeParameterContext, EntityRef entry) {
+    _ReferenceInfo info = getReferenceInfo(entry.reference);
+    DartType type = _createConstructorDefiningType(
+        typeParameterContext, info, entry.typeArguments);
+    if (type is InterfaceType) {
+      return _getConstructorForInfo(type, info);
+    }
+    return null;
+  }
+
+  /**
    * Return the [ConstructorElement] corresponding to the given linked [info],
    * using the [classType] which has already been computed (e.g. by
    * [_createConstructorDefiningType]).  Both cases when [info] is a
    * [ClassElement] and [ConstructorElement] are supported.
    */
-  ConstructorElement _createConstructorElement(
+  ConstructorElement _getConstructorForInfo(
       InterfaceType classType, _ReferenceInfo info) {
-    bool isClass = info.element is ClassElement;
-    String name = isClass ? '' : info.name;
-    _DeferredConstructorElement element =
-        new _DeferredConstructorElement(classType, name);
-    if (info.numTypeParameters != 0) {
-      return new ConstructorMember(element, classType);
-    } else {
-      return element;
+    ConstructorElement element;
+    Element infoElement = info.element;
+    if (infoElement is ConstructorElement) {
+      element = infoElement;
+    } else if (infoElement is ClassElement) {
+      element = infoElement.unnamedConstructor;
     }
+    if (element != null && info.numTypeParameters != 0) {
+      return new ConstructorMember(element, classType);
+    }
+    return element;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 8be5f21..18db39f 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -137,11 +137,6 @@
       TypeArgumentList typeArguments, SimpleIdentifier name);
 
   /**
-   * Return [EntityRefBuilder] that corresponds to the given [identifier].
-   */
-  EntityRefBuilder serializeIdentifier(Identifier identifier);
-
-  /**
    * Return a pair of ints showing how the given [functionExpression] is nested
    * within the constant currently being serialized.  The first int indicates
    * how many levels of function nesting must be popped in order to reach the
@@ -154,6 +149,11 @@
   List<int> serializeFunctionExpression(FunctionExpression functionExpression);
 
   /**
+   * Return [EntityRefBuilder] that corresponds to the given [identifier].
+   */
+  EntityRefBuilder serializeIdentifier(Identifier identifier);
+
+  /**
    * Return [EntityRefBuilder] that corresponds to the given [expr], which
    * must be a sequence of identifiers.
    */
@@ -198,6 +198,34 @@
   }
 
   /**
+   * Return `true` if the given [expr] is a sequence of identifiers.
+   */
+  bool _isIdentifierSequence(Expression expr) {
+    while (expr != null) {
+      if (expr is SimpleIdentifier) {
+        AstNode parent = expr.parent;
+        if (parent is MethodInvocation && parent.methodName == expr) {
+          if (parent.isCascaded) {
+            return false;
+          }
+          return parent.target == null || _isIdentifierSequence(parent.target);
+        }
+        if (isParameterName(expr.name)) {
+          return false;
+        }
+        return true;
+      } else if (expr is PrefixedIdentifier) {
+        expr = (expr as PrefixedIdentifier).prefix;
+      } else if (expr is PropertyAccess) {
+        expr = (expr as PropertyAccess).target;
+      } else {
+        return false;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Push the operation for the given assignable [expr].
    */
   void _pushAssignable(Expression expr) {
@@ -217,6 +245,11 @@
       }
       _serialize(expr.index);
       operations.add(UnlinkedConstOperation.assignToIndex);
+    } else if (expr is PrefixedIdentifier) {
+      strings.add(expr.prefix.name);
+      operations.add(UnlinkedConstOperation.pushParameter);
+      strings.add(expr.identifier.name);
+      operations.add(UnlinkedConstOperation.assignToProperty);
     } else {
       throw new StateError('Unsupported assignable: $expr');
     }
@@ -269,6 +302,12 @@
       if (expr is SimpleIdentifier && isParameterName(expr.name)) {
         strings.add(expr.name);
         operations.add(UnlinkedConstOperation.pushParameter);
+      } else if (expr is PrefixedIdentifier &&
+          isParameterName(expr.prefix.name)) {
+        strings.add(expr.prefix.name);
+        operations.add(UnlinkedConstOperation.pushParameter);
+        strings.add(expr.identifier.name);
+        operations.add(UnlinkedConstOperation.extractProperty);
       } else {
         references.add(serializeIdentifier(expr));
         operations.add(UnlinkedConstOperation.pushReference);
@@ -501,6 +540,7 @@
       EntityRefBuilder ref = serializeIdentifierSequence(methodName);
       _serializeArguments(argumentList);
       references.add(ref);
+      _serializeTypeArguments(invocation.typeArguments);
       operations.add(UnlinkedConstOperation.invokeMethodRef);
     } else {
       if (!invocation.isCascaded) {
@@ -508,6 +548,7 @@
       }
       _serializeArguments(argumentList);
       strings.add(methodName.name);
+      _serializeTypeArguments(invocation.typeArguments);
       operations.add(UnlinkedConstOperation.invokeMethod);
     }
   }
@@ -596,28 +637,14 @@
     }
   }
 
-  /**
-   * Return `true` if the given [expr] is a sequence of identifiers.
-   */
-  static bool _isIdentifierSequence(Expression expr) {
-    while (expr != null) {
-      if (expr is SimpleIdentifier) {
-        AstNode parent = expr.parent;
-        if (parent is MethodInvocation && parent.methodName == expr) {
-          if (parent.isCascaded) {
-            return false;
-          }
-          return parent.target == null || _isIdentifierSequence(parent.target);
-        }
-        return true;
-      } else if (expr is PrefixedIdentifier) {
-        expr = (expr as PrefixedIdentifier).prefix;
-      } else if (expr is PropertyAccess) {
-        expr = (expr as PropertyAccess).target;
-      } else {
-        return false;
+  void _serializeTypeArguments(TypeArgumentList typeArguments) {
+    if (typeArguments == null) {
+      ints.add(0);
+    } else {
+      ints.add(typeArguments.arguments.length);
+      for (TypeName typeName in typeArguments.arguments) {
+        references.add(serializeTypeName(typeName));
       }
     }
-    return false;
   }
 }
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index ec9c988..987a187 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -8,33 +8,27 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/context/cache.dart' show CacheEntry;
 import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart'
-    show DartUriResolver, Source, SourceFactory, SourceKind;
+    show DartUriResolver, Source, SourceFactory;
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
 import 'package:analyzer/src/task/dart.dart';
-import 'package:analyzer/task/dart.dart';
-import 'package:analyzer/task/model.dart'
-    show AnalysisTarget, ResultDescriptor, TargetedResult;
+import 'package:analyzer/task/model.dart' show ResultDescriptor, TargetedResult;
 
-class SdkSummaryResultProvider implements SummaryResultProvider {
-  final InternalAnalysisContext context;
-  final PackageBundle bundle;
+class SdkSummaryResultProvider extends ResynthesizerResultProvider {
   final SummaryTypeProvider typeProvider = new SummaryTypeProvider();
 
-  @override
-  SummaryResynthesizer resynthesizer;
-
-  SdkSummaryResultProvider(this.context, this.bundle, bool strongMode) {
-    resynthesizer = new SdkSummaryResynthesizer(
-        context, typeProvider, context.sourceFactory, bundle, strongMode);
+  SdkSummaryResultProvider(
+      InternalAnalysisContext context, PackageBundle bundle, bool strongMode)
+      : super(context, new SummaryDataStore(const <String>[])) {
+    addBundle(null, bundle);
+    createResynthesizer(null, typeProvider);
     _buildCoreLibrary();
     _buildAsyncLibrary();
     resynthesizer.finalizeCoreAsyncLibraries();
@@ -47,87 +41,12 @@
       entry.setValue(result, typeProvider, TargetedResult.EMPTY_LIST);
       return true;
     }
-    AnalysisTarget target = entry.target;
-    // Only SDK sources after this point.
-    if (target.source == null || !target.source.isInSystemLibrary) {
-      return false;
-    }
-    // Constant expressions are always resolved in summaries.
-    if (result == CONSTANT_EXPRESSION_RESOLVED &&
-        target is ConstantEvaluationTarget) {
-      entry.setValue(result, true, TargetedResult.EMPTY_LIST);
-      return true;
-    }
-    if (target is Source) {
-      if (result == LIBRARY_ELEMENT1 ||
-          result == LIBRARY_ELEMENT2 ||
-          result == LIBRARY_ELEMENT3 ||
-          result == LIBRARY_ELEMENT4 ||
-          result == LIBRARY_ELEMENT5 ||
-          result == LIBRARY_ELEMENT6 ||
-          result == LIBRARY_ELEMENT7 ||
-          result == LIBRARY_ELEMENT8 ||
-          result == LIBRARY_ELEMENT9 ||
-          result == LIBRARY_ELEMENT) {
-        // TODO(scheglov) try to find a way to avoid listing every result
-        // e.g. "result.whenComplete == LIBRARY_ELEMENT"
-        String uri = target.uri.toString();
-        LibraryElement libraryElement = resynthesizer.getLibraryElement(uri);
-        entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST);
-        return true;
-      } else if (result == READY_LIBRARY_ELEMENT2 ||
-          result == READY_LIBRARY_ELEMENT6 ||
-          result == READY_LIBRARY_ELEMENT7) {
-        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
-        return true;
-      } else if (result == SOURCE_KIND) {
-        String uri = target.uri.toString();
-        SourceKind kind = _getSourceKind(uri);
-        if (kind != null) {
-          entry.setValue(result, kind, TargetedResult.EMPTY_LIST);
-          return true;
-        }
-        return false;
-      } else {
-//        throw new UnimplementedError('$result of $target');
-      }
-    }
-    if (target is LibrarySpecificUnit) {
-      if (target.library == null || !target.library.isInSystemLibrary) {
-        return false;
-      }
-      if (result == CREATED_RESOLVED_UNIT1 ||
-          result == CREATED_RESOLVED_UNIT2 ||
-          result == CREATED_RESOLVED_UNIT3 ||
-          result == CREATED_RESOLVED_UNIT4 ||
-          result == CREATED_RESOLVED_UNIT5 ||
-          result == CREATED_RESOLVED_UNIT6 ||
-          result == CREATED_RESOLVED_UNIT7 ||
-          result == CREATED_RESOLVED_UNIT8 ||
-          result == CREATED_RESOLVED_UNIT9 ||
-          result == CREATED_RESOLVED_UNIT10 ||
-          result == CREATED_RESOLVED_UNIT11 ||
-          result == CREATED_RESOLVED_UNIT12) {
-        entry.setValue(result, true, TargetedResult.EMPTY_LIST);
-        return true;
-      }
-      if (result == COMPILATION_UNIT_ELEMENT) {
-        String libraryUri = target.library.uri.toString();
-        String unitUri = target.unit.uri.toString();
-        CompilationUnitElement unit = resynthesizer.getElement(
-            new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
-        if (unit != null) {
-          entry.setValue(result, unit, TargetedResult.EMPTY_LIST);
-          return true;
-        }
-      }
-    } else if (target is VariableElement) {
-      if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
-        entry.setValue(result, target, TargetedResult.EMPTY_LIST);
-        return true;
-      }
-    }
-    return false;
+    return super.compute(entry, result);
+  }
+
+  @override
+  bool hasResultsForSource(Source source) {
+    return source.source != null && source.isInSystemLibrary;
   }
 
   void _buildAsyncLibrary() {
@@ -139,19 +58,6 @@
     LibraryElement library = resynthesizer.getLibraryElement('dart:core');
     typeProvider.initializeCore(library);
   }
-
-  /**
-   * Return the [SourceKind] of the given [uri] or `null` if it is unknown.
-   */
-  SourceKind _getSourceKind(String uri) {
-    if (bundle.linkedLibraryUris.contains(uri)) {
-      return SourceKind.LIBRARY;
-    }
-    if (bundle.unlinkedUnitUris.contains(uri)) {
-      return SourceKind.PART;
-    }
-    return null;
-  }
 }
 
 /**
@@ -266,22 +172,12 @@
 }
 
 /**
- * Provider for analysis results.
- */
-abstract class SummaryResultProvider extends ResultProvider {
-  /**
-   * The [SummaryResynthesizer] of this context, maybe `null`.
-   */
-  SummaryResynthesizer get resynthesizer;
-}
-
-/**
  * Implementation of [TypeProvider] which can be initialized separately with
  * `dart:core` and `dart:async` libraries.
  */
 class SummaryTypeProvider implements TypeProvider {
-  bool _isCoreInitialized = false;
-  bool _isAsyncInitialized = false;
+  LibraryElement _coreLibrary;
+  LibraryElement _asyncLibrary;
 
   InterfaceType _boolType;
   InterfaceType _deprecatedType;
@@ -308,7 +204,8 @@
 
   @override
   InterfaceType get boolType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _boolType ??= _getType(_coreLibrary, "bool");
     return _boolType;
   }
 
@@ -317,13 +214,15 @@
 
   @override
   InterfaceType get deprecatedType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _deprecatedType ??= _getType(_coreLibrary, "Deprecated");
     return _deprecatedType;
   }
 
   @override
   InterfaceType get doubleType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _doubleType ??= _getType(_coreLibrary, "double");
     return _doubleType;
   }
 
@@ -332,55 +231,64 @@
 
   @override
   InterfaceType get functionType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _functionType ??= _getType(_coreLibrary, "Function");
     return _functionType;
   }
 
   @override
   InterfaceType get futureDynamicType {
-    assert(_isAsyncInitialized);
+    assert(_asyncLibrary != null);
+    _futureDynamicType ??= futureType.instantiate(<DartType>[dynamicType]);
     return _futureDynamicType;
   }
 
   @override
   InterfaceType get futureNullType {
-    assert(_isAsyncInitialized);
+    assert(_asyncLibrary != null);
+    _futureNullType ??= futureType.instantiate(<DartType>[nullType]);
     return _futureNullType;
   }
 
   @override
   InterfaceType get futureType {
-    assert(_isAsyncInitialized);
+    assert(_asyncLibrary != null);
+    _futureType ??= _getType(_asyncLibrary, "Future");
     return _futureType;
   }
 
   @override
   InterfaceType get intType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _intType ??= _getType(_coreLibrary, "int");
     return _intType;
   }
 
   @override
   InterfaceType get iterableDynamicType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _iterableDynamicType ??= iterableType.instantiate(<DartType>[dynamicType]);
     return _iterableDynamicType;
   }
 
   @override
   InterfaceType get iterableType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _iterableType ??= _getType(_coreLibrary, "Iterable");
     return _iterableType;
   }
 
   @override
   InterfaceType get listType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _listType ??= _getType(_coreLibrary, "List");
     return _listType;
   }
 
   @override
   InterfaceType get mapType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _mapType ??= _getType(_coreLibrary, "Map");
     return _mapType;
   }
 
@@ -404,55 +312,64 @@
 
   @override
   InterfaceType get nullType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _nullType ??= _getType(_coreLibrary, "Null");
     return _nullType;
   }
 
   @override
   InterfaceType get numType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _numType ??= _getType(_coreLibrary, "num");
     return _numType;
   }
 
   @override
   InterfaceType get objectType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _objectType ??= _getType(_coreLibrary, "Object");
     return _objectType;
   }
 
   @override
   InterfaceType get stackTraceType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _stackTraceType ??= _getType(_coreLibrary, "StackTrace");
     return _stackTraceType;
   }
 
   @override
   InterfaceType get streamDynamicType {
-    assert(_isAsyncInitialized);
+    assert(_asyncLibrary != null);
+    _streamDynamicType ??= streamType.instantiate(<DartType>[dynamicType]);
     return _streamDynamicType;
   }
 
   @override
   InterfaceType get streamType {
-    assert(_isAsyncInitialized);
+    assert(_asyncLibrary != null);
+    _streamType ??= _getType(_asyncLibrary, "Stream");
     return _streamType;
   }
 
   @override
   InterfaceType get stringType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _stringType ??= _getType(_coreLibrary, "String");
     return _stringType;
   }
 
   @override
   InterfaceType get symbolType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _symbolType ??= _getType(_coreLibrary, "Symbol");
     return _symbolType;
   }
 
   @override
   InterfaceType get typeType {
-    assert(_isCoreInitialized);
+    assert(_coreLibrary != null);
+    _typeType ??= _getType(_coreLibrary, "Type");
     return _typeType;
   }
 
@@ -463,39 +380,18 @@
    * Initialize the `dart:async` types provided by this type provider.
    */
   void initializeAsync(LibraryElement library) {
-    assert(_isCoreInitialized);
-    assert(!_isAsyncInitialized);
-    _isAsyncInitialized = true;
-    _futureType = _getType(library, "Future");
-    _streamType = _getType(library, "Stream");
-    _futureDynamicType = _futureType.instantiate(<DartType>[dynamicType]);
-    _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
-    _streamDynamicType = _streamType.instantiate(<DartType>[dynamicType]);
+    assert(_coreLibrary != null);
+    assert(_asyncLibrary == null);
+    _asyncLibrary = library;
   }
 
   /**
    * Initialize the `dart:core` types provided by this type provider.
    */
   void initializeCore(LibraryElement library) {
-    assert(!_isCoreInitialized);
-    assert(!_isAsyncInitialized);
-    _isCoreInitialized = true;
-    _boolType = _getType(library, "bool");
-    _deprecatedType = _getType(library, "Deprecated");
-    _doubleType = _getType(library, "double");
-    _functionType = _getType(library, "Function");
-    _intType = _getType(library, "int");
-    _iterableType = _getType(library, "Iterable");
-    _listType = _getType(library, "List");
-    _mapType = _getType(library, "Map");
-    _nullType = _getType(library, "Null");
-    _numType = _getType(library, "num");
-    _objectType = _getType(library, "Object");
-    _stackTraceType = _getType(library, "StackTrace");
-    _stringType = _getType(library, "String");
-    _symbolType = _getType(library, "Symbol");
-    _typeType = _getType(library, "Type");
-    _iterableDynamicType = _iterableType.instantiate(<DartType>[dynamicType]);
+    assert(_coreLibrary == null);
+    assert(_asyncLibrary == null);
+    _coreLibrary = library;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 3d9d552..ea97f79 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -335,6 +335,12 @@
         'HINT_ERRORS', AnalysisError.NO_ERRORS);
 
 /**
+ * The ignore information for a [Source].
+ */
+final ResultDescriptor<IgnoreInfo> IGNORE_INFO =
+    new ResultDescriptor<IgnoreInfo>('IGNORE_INFO', null);
+
+/**
  * A list of the [VariableElement]s whose type should be inferred that another
  * inferable static variable (the target) depends on.
  *
@@ -2520,8 +2526,6 @@
  * of errors.
  */
 class DartErrorsTask extends SourceBasedAnalysisTask {
-  static final RegExp spacesRegExp = new RegExp(r'\s+');
-
   /**
    * The task descriptor describing this kind of task.
    */
@@ -2529,18 +2533,15 @@
       createTask, buildInputs, <ResultDescriptor>[DART_ERRORS]);
 
   /**
+   * The name of the [IGNORE_INFO_INPUT] input.
+   */
+  static const String IGNORE_INFO_INPUT = 'IGNORE_INFO_INPUT';
+
+  /**
    * The name of the [LINE_INFO_INPUT] input.
    */
   static const String LINE_INFO_INPUT = 'LINE_INFO_INPUT';
 
-  /**
-   * The name of the [PARSED_UNIT_INPUT] input.
-   */
-  static const String PARSED_UNIT_INPUT = 'PARSED_UNIT_INPUT';
-
-  // Prefix for comments ignoring error codes.
-  static const String _normalizedIgnorePrefix = '//ignore:';
-
   DartErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
       : super(context, target);
 
@@ -2584,69 +2585,19 @@
     outputs[DART_ERRORS] = errors;
   }
 
-  Token _advanceToLine(Token token, LineInfo lineInfo, int line) {
-    int offset = lineInfo.getOffsetOfLine(line - 1); // 0-based
-    while (token.offset < offset) {
-      token = token.next;
-    }
-    return token;
-  }
-
   List<AnalysisError> _filterIgnores(List<AnalysisError> errors) {
     if (errors.isEmpty) {
       return errors;
     }
 
-    // Sort errors.
-    errors.sort((AnalysisError e1, AnalysisError e2) => e1.offset - e2.offset);
+    IgnoreInfo ignoreInfo = getRequiredInput(IGNORE_INFO_INPUT);
+    if (!ignoreInfo.hasIgnores) {
+      return errors;
+    }
 
-    CompilationUnit cu = getRequiredInput(PARSED_UNIT_INPUT);
-    Token token = cu.beginToken;
     LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT);
 
-    bool isIgnored(AnalysisError error) {
-      int errorLine = lineInfo.getLocation(error.offset).lineNumber;
-      token = _advanceToLine(token, lineInfo, errorLine);
-
-      //Check for leading comment.
-      Token comments = token.precedingComments;
-      while (comments?.next != null) {
-        comments = comments.next;
-      }
-      if (_isIgnoredBy(error, comments)) {
-        return true;
-      }
-
-      //Check for trailing comment.
-      int lineNumber = errorLine + 1;
-      if (lineNumber <= lineInfo.lineCount) {
-        Token nextLine = _advanceToLine(token, lineInfo, lineNumber);
-        comments = nextLine.precedingComments;
-        if (comments != null && nextLine.previous.type != TokenType.EOF) {
-          int commentLine = lineInfo.getLocation(comments.offset).lineNumber;
-          if (commentLine == errorLine) {
-            return _isIgnoredBy(error, comments);
-          }
-        }
-      }
-
-      return false;
-    }
-
-    return errors.where((AnalysisError e) => !isIgnored(e)).toList();
-  }
-
-  bool _isIgnoredBy(AnalysisError error, Token comment) {
-    //Normalize first.
-    String contents =
-        comment?.lexeme?.toLowerCase()?.replaceAll(spacesRegExp, '');
-    if (contents == null || !contents.startsWith(_normalizedIgnorePrefix)) {
-      return false;
-    }
-    return contents
-        .substring(_normalizedIgnorePrefix.length)
-        .split(',')
-        .contains(error.errorCode.name.toLowerCase());
+    return filterIgnored(errors, ignoreInfo, lineInfo);
   }
 
   /**
@@ -2658,7 +2609,7 @@
     Source source = target;
     Map<String, TaskInput> inputs = <String, TaskInput>{};
     inputs[LINE_INFO_INPUT] = LINE_INFO.of(source);
-    inputs[PARSED_UNIT_INPUT] = PARSED_UNIT.of(source);
+    inputs[IGNORE_INFO_INPUT] = IGNORE_INFO.of(source);
     EnginePlugin enginePlugin = AnalysisEngine.instance.enginePlugin;
     // for Source
     List<ResultDescriptor> errorsForSource = enginePlugin.dartErrorsForSource;
@@ -2691,6 +2642,27 @@
       AnalysisContext context, AnalysisTarget target) {
     return new DartErrorsTask(context, target);
   }
+
+  /**
+   * Return a new list with items from [errors] which are not filtered out by
+   * the [ignoreInfo].
+   */
+  static List<AnalysisError> filterIgnored(
+      List<AnalysisError> errors, IgnoreInfo ignoreInfo, LineInfo lineInfo) {
+    if (errors.isEmpty || !ignoreInfo.hasIgnores) {
+      return errors;
+    }
+
+    bool isIgnored(AnalysisError error) {
+      int errorLine = lineInfo.getLocation(error.offset).lineNumber;
+      String errorCode = error.errorCode.name.toLowerCase();
+      // Ignores can be on the line or just preceding the error.
+      return ignoreInfo.ignoredAt(errorCode, errorLine) ||
+          ignoreInfo.ignoredAt(errorCode, errorLine - 1);
+    }
+
+    return errors.where((AnalysisError e) => !isIgnored(e)).toList();
+  }
 }
 
 /**
@@ -3100,6 +3072,78 @@
 }
 
 /**
+ * Information about analysis `//ignore:` comments within a source file.
+ */
+class IgnoreInfo {
+  /**
+   *  Instance shared by all cases without matches.
+   */
+  static final IgnoreInfo _EMPTY_INFO = new IgnoreInfo();
+
+  /**
+   * A regular expression for matching 'ignore' comments.  Produces matches
+   * containing 2 groups.  For example:
+   *
+   *     * ['//ignore: error_code', 'error_code']
+   *
+   * Resulting codes may be in a list ('error_code_1,error_code2').
+   */
+  static final RegExp _IGNORE_MATCHER =
+      new RegExp(r'//[ ]*ignore:(.*)$', multiLine: true);
+
+  final Map<int, List<String>> _ignoreMap = new HashMap<int, List<String>>();
+
+  /**
+   * Whether this info object defines any ignores.
+   */
+  bool get hasIgnores => ignores.isNotEmpty;
+
+  /**
+   * Map of line numbers to associated ignored error codes.
+   */
+  Map<int, Iterable<String>> get ignores => _ignoreMap;
+
+  /**
+   * Ignore this [errorCode] at [line].
+   */
+  void add(int line, String errorCode) {
+    _ignoreMap.putIfAbsent(line, () => new List<String>()).add(errorCode);
+  }
+
+  /**
+   * Ignore these [errorCodes] at [line].
+   */
+  void addAll(int line, Iterable<String> errorCodes) {
+    _ignoreMap.putIfAbsent(line, () => new List<String>()).addAll(errorCodes);
+  }
+
+  /**
+   * Test whether this [errorCode] is ignored at the given [line].
+   */
+  bool ignoredAt(String errorCode, int line) =>
+      _ignoreMap[line]?.contains(errorCode) == true;
+
+  /**
+   * Calculate ignores for the given [content] with line [info].
+   */
+  static IgnoreInfo calculateIgnores(String content, LineInfo info) {
+    Iterable<Match> matches = _IGNORE_MATCHER.allMatches(content);
+    if (matches.isEmpty) {
+      return _EMPTY_INFO;
+    }
+
+    IgnoreInfo ignoreInfo = new IgnoreInfo();
+    for (Match match in matches) {
+      // See _IGNORE_MATCHER for format --- note the possibility of error lists.
+      Iterable<String> codes =
+          match.group(1).split(',').map((String code) => code.trim());
+      ignoreInfo.addAll(info.getLocation(match.start).lineNumber, codes);
+    }
+    return ignoreInfo;
+  }
+}
+
+/**
  * A task that ensures that all of the inferable instance members in a
  * compilation unit have had their type inferred.
  */
@@ -5429,7 +5473,7 @@
       'ScanDartTask',
       createTask,
       buildInputs,
-      <ResultDescriptor>[LINE_INFO, SCAN_ERRORS, TOKEN_STREAM],
+      <ResultDescriptor>[IGNORE_INFO, LINE_INFO, SCAN_ERRORS, TOKEN_STREAM],
       suitabilityFor: suitabilityFor);
 
   /**
@@ -5482,8 +5526,12 @@
       scanner.preserveComments = context.analysisOptions.preserveComments;
       scanner.scanGenericMethodComments = context.analysisOptions.strongMode;
 
+      LineInfo lineInfo = new LineInfo(scanner.lineStarts);
+
       outputs[TOKEN_STREAM] = scanner.tokenize();
-      outputs[LINE_INFO] = new LineInfo(scanner.lineStarts);
+      outputs[LINE_INFO] = lineInfo;
+      outputs[IGNORE_INFO] =
+          IgnoreInfo.calculateIgnores(fragment.content, lineInfo);
       outputs[SCAN_ERRORS] = getUniqueErrors(errorListener.errors);
     } else if (target is Source) {
       String content = getRequiredInput(CONTENT_INPUT_NAME);
@@ -5493,8 +5541,11 @@
       scanner.preserveComments = context.analysisOptions.preserveComments;
       scanner.scanGenericMethodComments = context.analysisOptions.strongMode;
 
+      LineInfo lineInfo = new LineInfo(scanner.lineStarts);
+
       outputs[TOKEN_STREAM] = scanner.tokenize();
-      outputs[LINE_INFO] = new LineInfo(scanner.lineStarts);
+      outputs[LINE_INFO] = lineInfo;
+      outputs[IGNORE_INFO] = IgnoreInfo.calculateIgnores(content, lineInfo);
       outputs[SCAN_ERRORS] = getUniqueErrors(errorListener.errors);
     } else {
       throw new AnalysisException(
diff --git a/pkg/analyzer/lib/src/task/strong/info.dart b/pkg/analyzer/lib/src/task/strong/info.dart
index 408c05d..ec8626f 100644
--- a/pkg/analyzer/lib/src/task/strong/info.dart
+++ b/pkg/analyzer/lib/src/task/strong/info.dart
@@ -92,12 +92,6 @@
     // types, but the function type is not assignable to the class
     assert(toType.isSubtypeOf(fromType) || fromType.isAssignableTo(toType));
 
-    // Handle null call specially.
-    if (expression is NullLiteral) {
-      // TODO(vsm): Create a NullCast for this once we revisit nonnullability.
-      return new DownCastImplicit(rules, expression, fromType, toType);
-    }
-
     // Inference "casts":
     if (expression is Literal || expression is FunctionExpression) {
       // fromT should be an exact type - this will almost certainly fail at
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 2e3d3c0..420fd61 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -27,15 +27,6 @@
   if (field.initializer != null) {
     (field.initializer as ExecutableElementImpl).returnType = newType;
   }
-  if (field is PropertyInducingElementImpl) {
-    (field.getter as ExecutableElementImpl).returnType = newType;
-    if (!field.isFinal && !field.isConst) {
-      List<ParameterElement> setterParameters = field.setter.parameters;
-      if (setterParameters.isNotEmpty) {
-        (setterParameters[0] as ParameterElementImpl).type = newType;
-      }
-    }
-  }
 }
 
 /**
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 82bd902..4c65104 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.27.4-alpha.7.1
+version: 0.27.4-alpha.10
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -7,7 +7,7 @@
   sdk: '>=1.12.0 <2.0.0'
 dependencies:
   args: '>=0.12.1 <0.14.0'
-  crypto: '>=0.9.2 <2.0.0'
+  crypto: '>=1.1.1 <3.0.0'
   glob: ^1.0.3
   html: ^0.12.0
   package_config: ^0.1.1
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 35ff9a9..122a93e 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -592,6 +592,13 @@
     }
   }
 
+  void test_inGetterContext_constructorFieldInitializer() {
+    ConstructorFieldInitializer initializer = AstFactory
+        .constructorFieldInitializer(false, 'f', AstFactory.integer(0));
+    SimpleIdentifier identifier = initializer.fieldName;
+    expect(identifier.inGetterContext(), isFalse);
+  }
+
   void test_inGetterContext_forEachLoop() {
     SimpleIdentifier identifier = AstFactory.identifier3("a");
     Expression iterator = AstFactory.listLiteral();
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index c4a47ca..fcf09de 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -3916,10 +3916,10 @@
   }
 }
 ''');
-    _assertNthStatementExits(source, 0);
+    _assertNthStatementDoesNotExit(source, 0);
   }
 
-  void test_switch_withEnum_true_withDefault() {
+  void test_switch_withEnum_true_withExitingDefault() {
     Source source = addSource(r'''
 enum E { A, B }
 String f(E e) {
@@ -3934,6 +3934,22 @@
     _assertNthStatementExits(source, 0);
   }
 
+  void test_switch_withEnum_true_withNonExitingDefault() {
+    Source source = addSource(r'''
+enum E { A, B }
+String f(E e) {
+  var x;
+  switch (e) {
+    case A:
+      return 'A';
+    default:
+      x = '?';
+  }
+}
+''');
+    _assertNthStatementDoesNotExit(source, 1);
+  }
+
   void test_whileStatement_breakWithLabel() {
     Source source = addSource(r'''
 void f() {
@@ -3962,6 +3978,42 @@
     _assertNthStatementExits(source, 0);
   }
 
+  void test_yieldStatement_plain() {
+    Source source = addSource(r'''
+void f() sync* {
+  yield 1;
+}
+''');
+    _assertNthStatementDoesNotExit(source, 0);
+  }
+
+  void test_yieldStatement_throw() {
+    Source source = addSource(r'''
+void f() sync* {
+  yield throw '';
+}
+''');
+    _assertNthStatementExits(source, 0);
+  }
+
+  void test_yieldStatement_star_plain() {
+    Source source = addSource(r'''
+void f() sync* {
+  yield* 1;
+}
+''');
+    _assertNthStatementDoesNotExit(source, 0);
+  }
+
+  void test_yieldStatement_star_throw() {
+    Source source = addSource(r'''
+void f() sync* {
+  yield* throw '';
+}
+''');
+    _assertNthStatementExits(source, 0);
+  }
+
   void _assertHasReturn(bool expectedResult, Source source, int n) {
     LibraryElement element = resolve2(source);
     CompilationUnit unit = resolveCompilationUnit(source, element);
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 5eb564a..da95f04 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -353,7 +353,7 @@
   void test_visitEnumDeclaration() {
     CompilationUnitElementImpl compilationUnitElement =
         ElementFactory.compilationUnit('foo.dart');
-    ClassElementImpl enumElement =
+    EnumElementImpl enumElement =
         ElementFactory.enumElement(_typeProvider, ('E'));
     compilationUnitElement.enums = <ClassElement>[enumElement];
     EnumDeclaration enumNode = AstFactory.enumDeclaration2('E', []);
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 3975270..77b127f 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -21,33 +21,6 @@
 
 @reflectiveTest
 class HintCodeTest extends ResolverTestCase {
-  void fail_deadCode_statementAfterRehrow() {
-    Source source = addSource(r'''
-f() {
-  try {
-    var one = 1;
-  } catch (e) {
-    rethrow;
-    var two = 2;
-  }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void fail_deadCode_statementAfterThrow() {
-    Source source = addSource(r'''
-f() {
-  var one = 1;
-  throw 'Stop here';
-  var two = 2;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
   void fail_isInt() {
     Source source = addSource("var v = 1 is int;");
     computeLibrarySourceErrors(source);
@@ -553,6 +526,36 @@
     verify([source]);
   }
 
+  void test_deadCode_statementAfterExitingIf_returns() {
+    Source source = addSource(r'''
+f() {
+  if (1 > 2) {
+    return;
+  } else {
+    return;
+  }
+  var one = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterRethrow() {
+    Source source = addSource(r'''
+f() {
+  try {
+    var one = 1;
+  } catch (e) {
+    rethrow;
+    var two = 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
   void test_deadCode_statementAfterReturn_function() {
     Source source = addSource(r'''
 f() {
@@ -619,6 +622,18 @@
     verify([source]);
   }
 
+  void test_deadCode_statementAfterThrow() {
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  throw 'Stop here';
+  var two = 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
   void test_deprecatedAnnotationUse_assignment() {
     Source source = addSource(r'''
 class A {
@@ -634,6 +649,21 @@
     verify([source]);
   }
 
+  void test_deprecatedAnnotationUse_call() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  call() {}
+  m() {
+    A a = new A();
+    a();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
   void test_deprecatedAnnotationUse_Deprecated() {
     Source source = addSource(r'''
 class A {
@@ -658,28 +688,6 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_positional() {
-    Source source = addSource(r'''
-class A {
-  m([@deprecated int x]) {}
-  n() {m(1);}
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_named() {
-    Source source = addSource(r'''
-class A {
-  m({@deprecated int x}) {}
-  n() {m(x: 1);}
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
   void test_deprecatedAnnotationUse_export() {
     Source source = addSource("export 'deprecated_library.dart';");
     addNamedSource(
@@ -778,6 +786,17 @@
     verify([source]);
   }
 
+  void test_deprecatedAnnotationUse_named() {
+    Source source = addSource(r'''
+class A {
+  m({@deprecated int x}) {}
+  n() {m(x: 1);}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
   void test_deprecatedAnnotationUse_operator() {
     Source source = addSource(r'''
 class A {
@@ -793,6 +812,17 @@
     verify([source]);
   }
 
+  void test_deprecatedAnnotationUse_positional() {
+    Source source = addSource(r'''
+class A {
+  m([@deprecated int x]) {}
+  n() {m(1);}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
   void test_deprecatedAnnotationUse_setter() {
     Source source = addSource(r'''
 class A {
@@ -835,21 +865,6 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_call() {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  call() {}
-  m() {
-    A a = new A();
-    a();
-  }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
   void test_divisionOptimization_double() {
     Source source = addSource(r'''
 f(double x, double y) {
@@ -1029,6 +1044,23 @@
     verify([source]);
   }
 
+  void test_invalidUseOfProtectedMember_closure() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+
+class A {
+  @protected
+  int a() => 42;
+}
+void main() {
+  var leak = new A().a;
+  print(leak);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    verify([source]);
+  }
+
   void test_invalidUseOfProtectedMember_field() {
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
@@ -1036,11 +1068,26 @@
   @protected
   int a;
 }
+abstract class B {
+  int b() => new A().a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    verify([source]);
+  }
+
+  void test_invalidUseOfProtectedMember_field_OK() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  int a;
+}
 abstract class B implements A {
   int b() => a;
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1059,6 +1106,22 @@
     verify([source]);
   }
 
+  void test_invalidUseOfProtectedMember_function_OK() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  int a() => 0;
+}
+
+abstract class B implements A {
+  int b() => a();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_invalidUseOfProtectedMember_getter() {
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
@@ -1066,11 +1129,27 @@
   @protected
   int get a => 42;
 }
+class B {
+  A a;
+  int b() => a.a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    verify([source]);
+  }
+
+  void test_invalidUseOfProtectedMember_getter_OK() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  int get a => 42;
+}
 abstract class B implements A {
   int b() => a;
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1105,18 +1184,26 @@
     verify([source]);
   }
 
-  void test_invalidUseOfProtectedMember_method_2() {
+  void test_invalidUseOfProtectedMember_method_OK() {
+    // https://github.com/dart-lang/linter/issues/257
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
-class A {
+
+typedef void VoidCallback();
+
+class State<E> {
   @protected
-  void a(){ }
+  void setState(VoidCallback fn) {}
 }
-abstract class B implements A {
-  void b() => a();
-}''');
+
+class Button extends State<Object> {
+  void handleSomething() {
+    setState(() {});
+  }
+}
+''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1131,7 +1218,7 @@
   void b() => a();
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1146,7 +1233,7 @@
   void b() => a();
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1160,7 +1247,7 @@
   static m2(A a) => a.m1();
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1178,7 +1265,7 @@
   new B().a();
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1194,7 +1281,7 @@
 }
 ''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1210,7 +1297,7 @@
 }
 ''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1228,7 +1315,24 @@
 }
 ''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, []);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidUseOfProtectedMember_OK_setter_2() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  int _a;
+  @protected
+  void set a(int a) { _a = a; }
+  A(int a) {
+    this.a = a;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1239,13 +1343,31 @@
   @protected
   void set a(int i) { }
 }
+class B{
+  A a;
+  b(int i) {
+    a.a = i;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    verify([source]);
+  }
+
+  void test_invalidUseOfProtectedMember_setter_OK() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  void set a(int i) { }
+}
 abstract class B implements A {
   b(int i) {
     a = i;
   }
 }''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -1353,13 +1475,6 @@
     verify([source]);
   }
 
-  void test_missingReturn_function() {
-    Source source = addSource("int f() {}");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.MISSING_RETURN]);
-    verify([source]);
-  }
-
   void test_missingReturn_factory() {
     Source source = addSource(r'''
 class A {
@@ -1371,6 +1486,13 @@
     verify([source]);
   }
 
+  void test_missingReturn_function() {
+    Source source = addSource("int f() {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
   void test_missingReturn_method() {
     Source source = addSource(r'''
 class A {
@@ -1781,26 +1903,24 @@
     verify([source]);
   }
 
-  void test_undefinedIdentifier_importHide() {
+  void test_undefinedGetter() {
     Source source = addSource(r'''
-library L;
-import 'lib1.dart' hide a;''');
-    addNamedSource("/lib1.dart", "library lib1;");
+class A {}
+f(var a) {
+  if(a is A) {
+    return a.m;
+  }
+}''');
     computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_HIDDEN_NAME]);
-    verify([source]);
+    assertErrors(source, [HintCode.UNDEFINED_GETTER]);
   }
 
-  void test_undefinedIdentifier_importShow() {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show a;''');
-    addNamedSource("/lib1.dart", "library lib1;");
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_SHOWN_NAME]);
-    verify([source]);
+  void test_undefinedGetter_message() {
+    // The implementation of HintCode.UNDEFINED_SETTER assumes that
+    // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
+    // same, this verifies that assumption.
+    expect(StaticWarningCode.UNDEFINED_GETTER.message,
+        StaticTypeWarningCode.UNDEFINED_GETTER.message);
   }
 
   void test_undefinedIdentifier_exportHide() {
@@ -1823,24 +1943,26 @@
     verify([source]);
   }
 
-  void test_undefinedGetter() {
+  void test_undefinedIdentifier_importHide() {
     Source source = addSource(r'''
-class A {}
-f(var a) {
-  if(a is A) {
-    return a.m;
-  }
-}''');
+library L;
+import 'lib1.dart' hide a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
     computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.UNDEFINED_GETTER]);
+    assertErrors(
+        source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_HIDDEN_NAME]);
+    verify([source]);
   }
 
-  void test_undefinedGetter_message() {
-    // The implementation of HintCode.UNDEFINED_SETTER assumes that
-    // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
-    // same, this verifies that assumption.
-    expect(StaticWarningCode.UNDEFINED_GETTER.message,
-        StaticTypeWarningCode.UNDEFINED_GETTER.message);
+  void test_undefinedIdentifier_importShow() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_SHOWN_NAME]);
+    verify([source]);
   }
 
   void test_undefinedMethod() {
@@ -2886,6 +3008,30 @@
     verify([source]);
   }
 
+  void test_unusedField_notUsed_constructorFieldInitializers() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  A() : _f = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_fieldFormalParameter() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  A(this._f);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
   void test_unusedField_notUsed_noReference() {
     enableUnusedElement = true;
     Source source = addSource(r'''
@@ -3016,84 +3162,6 @@
     verify([source, source2]);
   }
 
-  void test_unusedShownName() {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-A a;''');
-    Source source2 = addNamedSource(
-        "/lib1.dart",
-        r'''
-library lib1;
-class A {}
-class B {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedShownName_topLevelVariable() {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show var1, var2;
-import 'lib1.dart' show var3, var4;
-int a = var1;
-int b = var2;
-int c = var3;''');
-    Source source2 = addNamedSource(
-        "/lib1.dart",
-        r'''
-library lib1;
-const int var1 = 1;
-const int var2 = 2;
-const int var3 = 3;
-const int var4 = 4;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedShownName_as() {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' as p show A, B;
-p.A a;''');
-    Source source2 = addNamedSource(
-        "/lib1.dart",
-        r'''
-library lib1;
-class A {}
-class B {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedShownName_duplicates() {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-import 'lib1.dart' show C, D;
-A a;
-C c;''');
-    Source source2 = addNamedSource(
-        "/lib1.dart",
-        r'''
-library lib1;
-class A {}
-class B {}
-class C {}
-class D {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
   void test_unusedLocalVariable_inCatch_exception() {
     enableUnusedLocalVariable = true;
     Source source = addSource(r'''
@@ -3281,6 +3349,84 @@
     verify([source]);
   }
 
+  void test_unusedShownName() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedShownName_as() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as p show A, B;
+p.A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedShownName_duplicates() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+import 'lib1.dart' show C, D;
+A a;
+C c;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}
+class C {}
+class D {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedShownName_topLevelVariable() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show var1, var2;
+import 'lib1.dart' show var3, var4;
+int a = var1;
+int b = var2;
+int c = var3;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+const int var1 = 1;
+const int var2 = 2;
+const int var3 = 3;
+const int var4 = 4;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
   void test_useOfVoidResult_assignmentExpression_function() {
     Source source = addSource(r'''
 void f() {}
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 41a5185..1be8c5b 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -5125,6 +5125,19 @@
     verify([source]);
   }
 
+  void test_typeArgumentNotMatchingBounds_ofFunctionTypeAlias_hasBound2() {
+    Source source = addSource(r'''
+class MyClass<T> {}
+typedef MyFunction<T, P extends MyClass<T>>();
+class A<T, P extends MyClass<T>> {
+  MyFunction<T, P> f;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_typeArgumentNotMatchingBounds_ofFunctionTypeAlias_noBound() {
     Source source = addSource(r'''
 typedef F<T>();
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 9fc1dfb..226f5e5 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -158,6 +158,19 @@
     verify([source]);
   }
 
+  void test_deadCode_statementAfterIfWithoutElse() {
+    Source source = addSource(r'''
+f() {
+  if (1 < 0) {
+    return;
+  }
+  int a = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_deprecatedMemberUse_inDeprecatedClass() {
     Source source = addSource(r'''
 @deprecated
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 47be73f..0e0ee77 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -6121,7 +6121,7 @@
     CommentAndMetadata commentAndMetadata =
         parse4("parseCommentAndMetadata", "/** 1 */ void");
     expect(commentAndMetadata.comment, isNotNull);
-    expect(commentAndMetadata.metadata, hasLength(0));
+    expect(commentAndMetadata.metadata, isNull);
   }
 
   void test_parseCommentAndMetadata_cmc() {
@@ -6177,7 +6177,7 @@
     CommentAndMetadata commentAndMetadata =
         parse4("parseCommentAndMetadata", "void");
     expect(commentAndMetadata.comment, isNull);
-    expect(commentAndMetadata.metadata, hasLength(0));
+    expect(commentAndMetadata.metadata, isNull);
   }
 
   void test_parseCommentAndMetadata_singleLine() {
@@ -6188,7 +6188,7 @@
 /// 2
 void''');
     expect(commentAndMetadata.comment, isNotNull);
-    expect(commentAndMetadata.metadata, hasLength(0));
+    expect(commentAndMetadata.metadata, isNull);
   }
 
   void test_parseCommentReference_new_prefixed() {
@@ -6999,7 +6999,7 @@
 
   void test_parseConstructorFieldInitializer_qualified() {
     ConstructorFieldInitializer invocation =
-        parse4("parseConstructorFieldInitializer", "this.a = b");
+        parse2("parseConstructorFieldInitializer", [true], "this.a = b");
     expect(invocation.equals, isNotNull);
     expect(invocation.expression, isNotNull);
     expect(invocation.fieldName, isNotNull);
@@ -7009,7 +7009,7 @@
 
   void test_parseConstructorFieldInitializer_unqualified() {
     ConstructorFieldInitializer invocation =
-        parse4("parseConstructorFieldInitializer", "a = b");
+        parse2("parseConstructorFieldInitializer", [false], "a = b");
     expect(invocation.equals, isNotNull);
     expect(invocation.expression, isNotNull);
     expect(invocation.fieldName, isNotNull);
@@ -9691,7 +9691,7 @@
 
   void test_parseRedirectingConstructorInvocation_named() {
     RedirectingConstructorInvocation invocation =
-        parse4("parseRedirectingConstructorInvocation", "this.a()");
+        parse2("parseRedirectingConstructorInvocation", [true], "this.a()");
     expect(invocation.argumentList, isNotNull);
     expect(invocation.constructorName, isNotNull);
     expect(invocation.thisKeyword, isNotNull);
@@ -9700,7 +9700,7 @@
 
   void test_parseRedirectingConstructorInvocation_unnamed() {
     RedirectingConstructorInvocation invocation =
-        parse4("parseRedirectingConstructorInvocation", "this()");
+        parse2("parseRedirectingConstructorInvocation", [false], "this()");
     expect(invocation.argumentList, isNotNull);
     expect(invocation.constructorName, isNull);
     expect(invocation.thisKeyword, isNotNull);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index fd39ad5..11eee0b 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -2922,8 +2922,6 @@
     ClassElementImpl element =
         new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
     element.supertype = superclassType;
-    InterfaceTypeImpl type = new InterfaceTypeImpl(element);
-    element.type = type;
     if (parameterNames != null) {
       int count = parameterNames.length;
       if (count > 0) {
@@ -2940,7 +2938,6 @@
           typeParameter.type = typeArguments[i];
         }
         element.typeParameters = typeParameters;
-        type.typeArguments = typeArguments;
       }
     }
     return element;
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 0e0e3a1..a8f9105 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -990,9 +990,6 @@
     String constructorName = "m";
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(classElement, constructorName);
-    constructor.returnType = classElement.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
-    constructor.type = constructorType;
     classElement.constructors = <ConstructorElement>[constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(
         null,
@@ -1010,9 +1007,6 @@
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(elementC, null);
     elementC.constructors = <ConstructorElement>[constructor];
-    constructor.returnType = elementC.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
-    constructor.type = constructorType;
     TypeName typeName =
         AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]);
     typeName.type = elementC.type.instantiate(<DartType>[elementI.type]);
@@ -1031,9 +1025,6 @@
     ClassElementImpl classElement = ElementFactory.classElement2("C");
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(classElement, null);
-    constructor.returnType = classElement.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
-    constructor.type = constructorType;
     classElement.constructors = <ConstructorElement>[constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(
         null, AstFactory.typeName(classElement));
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 381313e..241e3af 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -1381,7 +1381,7 @@
         [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
-  void test_typeArgumentNotMatchingBounds_ofFunctionTypeAlias() {
+  void fail_typeArgumentNotMatchingBounds_ofFunctionTypeAlias() {
     assertErrorsInCode(
         r'''
 class A {}
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index e169167..277f8bb 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -1795,10 +1795,12 @@
     errors.sort((AnalysisError e1, AnalysisError e2) =>
         e1.errorCode.name.compareTo(e2.errorCode.name));
 
-    expect(errors.map((e) => e.errorCode.name), [
-      'INVALID_METHOD_OVERRIDE_RETURN_TYPE',
-      'STRONG_MODE_INVALID_METHOD_OVERRIDE'
-    ]);
+    expect(
+        errors.map((e) => e.errorCode.name),
+        unorderedEquals([
+          'INVALID_METHOD_OVERRIDE_RETURN_TYPE',
+          'STRONG_MODE_INVALID_METHOD_OVERRIDE'
+        ]));
     expect(errors[0].message, contains('Iterable<S>'),
         reason: 'errors should be in terms of the type parameters '
             'at the error location');
@@ -1818,11 +1820,12 @@
     // TODO(jmesserly): this is modified code from assertErrors, which we can't
     // use directly because STRONG_MODE_* errors don't have working equality.
     List<AnalysisError> errors = analysisContext2.computeErrors(source);
-    List errorNames = errors.map((e) => e.errorCode.name).toList();
-    expect(errorNames, hasLength(2));
-    expect(errorNames, contains('STRONG_MODE_INVALID_METHOD_OVERRIDE'));
     expect(
-        errorNames, contains('INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND'));
+        errors.map((e) => e.errorCode.name),
+        unorderedEquals([
+          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND',
+          'STRONG_MODE_INVALID_METHOD_OVERRIDE'
+        ]));
     verify([source]);
   }
 
@@ -1837,10 +1840,12 @@
     // TODO(jmesserly): we can't use assertErrors because STRONG_MODE_* errors
     // from CodeChecker don't have working equality.
     List<AnalysisError> errors = analysisContext2.computeErrors(source);
-    expect(errors.map((e) => e.errorCode.name), [
-      'STRONG_MODE_INVALID_METHOD_OVERRIDE',
-      'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS'
-    ]);
+    expect(
+        errors.map((e) => e.errorCode.name),
+        unorderedEquals([
+          'STRONG_MODE_INVALID_METHOD_OVERRIDE',
+          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS'
+        ]));
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/src/context/context_factory_test.dart b/pkg/analyzer/test/src/context/context_factory_test.dart
new file mode 100644
index 0000000..a116d29
--- /dev/null
+++ b/pkg/analyzer/test/src/context/context_factory_test.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.context.context_factory_test;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/context/context_factory.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(PackageMapProcessorTest);
+}
+
+@reflectiveTest
+class PackageMapProcessorTest {
+  MemoryResourceProvider resourceProvider;
+
+  Folder empty;
+  Folder tmp_sdk_ext;
+  Folder tmp_embedder;
+  Map<String, List<Folder>> packageMap;
+
+  void setUp() {
+    resourceProvider = new MemoryResourceProvider();
+    empty = resourceProvider.newFolder('/empty');
+    tmp_sdk_ext = resourceProvider.newFolder('/tmp_sdk_ext');
+    tmp_embedder = resourceProvider.newFolder('/tmp_embedder');
+    packageMap = <String, List<Folder>>{
+      'empty': [empty],
+      'tmp_embedder': [tmp_embedder],
+      'tmp_sdk_ext': [tmp_sdk_ext]
+    };
+  }
+
+  void test_basic_processing() {
+    resourceProvider.newFile(
+        '/tmp_sdk_ext/_sdkext',
+        r'''
+  {
+    "dart:ui": "ui.dart"
+  }''');
+    resourceProvider.newFile(
+        '/tmp_embedder/_embedder.yaml',
+        r'''
+embedded_libs:
+  "dart:core" : "core.dart"
+  "dart:fox": "slippy.dart"
+  "dart:bear": "grizzly.dart"
+  "dart:relative": "../relative.dart"
+  "dart:deep": "deep/directory/file.dart"
+''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 5);
+    expect(proc.embeddedLibraries.getLibrary('dart:core').path,
+        '/tmp_embedder/core.dart');
+    expect(proc.extendedLibraries.size(), 1);
+    expect(proc.extendedLibraries.getLibrary('dart:ui').path,
+        '/tmp_sdk_ext/ui.dart');
+  }
+
+  void test_empty_package_map() {
+    PackageMapProcessor proc =
+        new PackageMapProcessor(<String, List<Folder>>{});
+    expect(proc.embeddedLibraries.size(), 0);
+    expect(proc.extendedLibraries.size(), 0);
+    expect(proc.libraryMap.size(), 0);
+  }
+
+  void test_extenders_do_not_override() {
+    resourceProvider.newFile(
+        '/tmp_sdk_ext/_sdkext',
+        r'''
+  {
+    "dart:ui": "ui2.dart"
+  }''');
+    resourceProvider.newFile(
+        '/tmp_embedder/_embedder.yaml',
+        r'''
+embedded_libs:
+  "dart:core" : "core.dart"
+  "dart:ui": "ui.dart"
+''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 2);
+    expect(proc.extendedLibraries.size(), 1);
+    expect(proc.libraryMap.size(), 2);
+    expect(proc.libraryMap.getLibrary('dart:ui').path, '/tmp_embedder/ui.dart');
+  }
+
+  void test_invalid_embedder() {
+    resourceProvider.newFile(
+        '/tmp_embedder/_embedder.yaml',
+        r'''
+invalid contents, will not parse
+''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 0);
+    expect(proc.extendedLibraries.size(), 0);
+    expect(proc.libraryMap.size(), 0);
+  }
+
+  void test_invalid_extender() {
+    resourceProvider.newFile(
+        '/tmp_sdk_ext/_sdkext',
+        r'''
+invalid contents, will not parse
+''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 0);
+    expect(proc.extendedLibraries.size(), 0);
+    expect(proc.libraryMap.size(), 0);
+  }
+
+  void test_no_embedder() {
+    resourceProvider.newFile(
+        '/tmp_sdk_ext/_sdkext',
+        r'''
+  {
+    "dart:ui": "ui2.dart"
+  }''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 0);
+    expect(proc.extendedLibraries.size(), 1);
+    expect(proc.libraryMap.size(), 1);
+  }
+
+  void test_no_embedder_or_extender() {
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 0);
+    expect(proc.extendedLibraries.size(), 0);
+    expect(proc.libraryMap.size(), 0);
+  }
+
+  void test_no_extender() {
+    resourceProvider.newFile(
+        '/tmp_embedder/_embedder.yaml',
+        r'''
+embedded_libs:
+  "dart:core" : "core.dart"
+  "dart:ui": "ui.dart"
+''');
+
+    PackageMapProcessor proc = new PackageMapProcessor(packageMap);
+    expect(proc.embeddedLibraries.size(), 2);
+    expect(proc.extendedLibraries.size(), 0);
+    expect(proc.libraryMap.size(), 2);
+  }
+}
diff --git a/pkg/analyzer/test/src/context/test_all.dart b/pkg/analyzer/test/src/context/test_all.dart
index 301b13c..6b9127c 100644
--- a/pkg/analyzer/test/src/context/test_all.dart
+++ b/pkg/analyzer/test/src/context/test_all.dart
@@ -8,6 +8,7 @@
 
 import '../../utils.dart';
 import 'cache_test.dart' as cache_test;
+import 'context_factory_test.dart' as context_factory_test;
 import 'context_test.dart' as context_test;
 
 /// Utility for manually running all tests.
@@ -15,6 +16,7 @@
   initializeTestEnvironment();
   group('context tests', () {
     cache_test.main();
+    context_factory_test.main();
     context_test.main();
   });
 }
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index ff2f9568..3de6bdf 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -44,6 +44,7 @@
   runReflectiveTests(MethodElementImplTest);
   runReflectiveTests(MultiplyDefinedElementImplTest);
   runReflectiveTests(ParameterElementImplTest);
+  runReflectiveTests(PropertyAccessorElementImplTest);
   runReflectiveTests(TopLevelVariableElementImplTest);
 }
 
@@ -308,7 +309,7 @@
   void test_isEnum() {
     String firstConst = "A";
     String secondConst = "B";
-    ClassElementImpl enumE = ElementFactory
+    EnumElementImpl enumE = ElementFactory
         .enumElement(new TestTypeProvider(), "E", [firstConst, secondConst]);
 
     // E is an enum
@@ -4184,6 +4185,39 @@
   }
 }
 
+@reflectiveTest
+class PropertyAccessorElementImplTest extends EngineTestCase {
+  void test_matchesHandle_getter() {
+    CompilationUnitElementImpl compilationUnitElement =
+        ElementFactory.compilationUnit('foo.dart');
+    LibraryElementImpl libraryElement = ElementFactory.library(null, '')
+      ..definingCompilationUnit = compilationUnitElement;
+    PropertyAccessorElementImpl element =
+        ElementFactory.getterElement('x', true, DynamicTypeImpl.instance);
+    compilationUnitElement.accessors = <PropertyAccessorElement>[element];
+    PropertyAccessorElementHandle handle =
+        new PropertyAccessorElementHandle(null, element.location);
+    expect(element.hashCode, handle.hashCode);
+    expect(element == handle, isTrue);
+    expect(handle == element, isTrue);
+  }
+
+  void test_matchesHandle_setter() {
+    CompilationUnitElementImpl compilationUnitElement =
+        ElementFactory.compilationUnit('foo.dart');
+    LibraryElementImpl libraryElement = ElementFactory.library(null, '')
+      ..definingCompilationUnit = compilationUnitElement;
+    PropertyAccessorElementImpl element =
+        ElementFactory.setterElement('x', true, DynamicTypeImpl.instance);
+    compilationUnitElement.accessors = <PropertyAccessorElement>[element];
+    PropertyAccessorElementHandle handle =
+        new PropertyAccessorElementHandle(null, element.location);
+    expect(element.hashCode, handle.hashCode);
+    expect(element == handle, isTrue);
+    expect(handle == element, isTrue);
+  }
+}
+
 class TestElementResynthesizer extends ElementResynthesizer {
   Map<ElementLocation, Element> locationMap;
 
diff --git a/pkg/analyzer/test/src/summary/incremental_cache_test.dart b/pkg/analyzer/test/src/summary/incremental_cache_test.dart
index bf7620a..695cb51 100644
--- a/pkg/analyzer/test/src/summary/incremental_cache_test.dart
+++ b/pkg/analyzer/test/src/summary/incremental_cache_test.dart
@@ -3,10 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/incremental_cache.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../generated/test_support.dart';
 import '../../reflective_tests.dart';
 import '../abstract_single_unit.dart';
 
@@ -119,6 +121,63 @@
     expect(bundles, isNotNull);
   }
 
+  void test_getLibraryParts_hasParts() {
+    Source part1Source = addSource('/part1.dart', r'part of test;');
+    Source part2Source = addSource('/part2.dart', r'part of test;');
+    putTestLibrary(r'''
+library test;
+part 'part1.dart';
+part 'part2.dart';
+''');
+    expect(cache.getLibraryParts(testSource),
+        unorderedEquals([part1Source, part2Source]));
+  }
+
+  void test_getLibraryParts_noParts() {
+    putTestLibrary(r'''
+main() {}
+''');
+    expect(cache.getLibraryParts(testSource), isEmpty);
+  }
+
+  void test_getSourceErrorsInLibrary_library() {
+    verifyNoTestUnitErrors = false;
+    putTestLibrary(r'''
+main() {
+  int unusedVar = 42;
+}
+''');
+    List<AnalysisError> computedErrors = context.computeErrors(testSource);
+    cache.putSourceErrorsInLibrary(testSource, testSource, computedErrors);
+    List<AnalysisError> readErrors =
+        cache.getSourceErrorsInLibrary(testSource, testSource);
+    new GatheringErrorListener()
+      ..addAll(readErrors)
+      ..assertErrors(computedErrors);
+  }
+
+  void test_getSourceErrorsInLibrary_part() {
+    verifyNoTestUnitErrors = false;
+    Source partSource = addSource(
+        '/foo.dart',
+        r'''
+main() {
+  int unusedVar = 42;
+}
+''');
+    putTestLibrary(r'''
+library lib;
+part 'foo.dart';
+''');
+    List<AnalysisError> computedErrors = context.computeErrors(partSource);
+    cache.putSourceErrorsInLibrary(testSource, partSource, computedErrors);
+    List<AnalysisError> readErrors =
+        cache.getSourceErrorsInLibrary(testSource, partSource);
+    new GatheringErrorListener()
+      ..addAll(readErrors)
+      ..assertErrors(computedErrors);
+  }
+
   void test_getSourceKind_library() {
     putTestLibrary(r'''
 main() {}
diff --git a/pkg/analyzer/test/src/summary/index_unit_test.dart b/pkg/analyzer/test/src/summary/index_unit_test.dart
index 9a269b0..1bf2cf5 100644
--- a/pkg/analyzer/test/src/summary/index_unit_test.dart
+++ b/pkg/analyzer/test/src/summary/index_unit_test.dart
@@ -699,7 +699,7 @@
   new A(field: 4);
 }
 ''');
-    FieldElement field = findElement('field');
+    FieldElement field = findElement('field', ElementKind.FIELD);
     PropertyAccessorElement getter = field.getter;
     PropertyAccessorElement setter = field.setter;
     // A()
@@ -729,7 +729,7 @@
 ''');
     // aaa
     {
-      FieldElement field = findElement('aaa');
+      FieldElement field = findElement('aaa', ElementKind.FIELD);
       PropertyAccessorElement getter = field.getter;
       PropertyAccessorElement setter = field.setter;
       assertThat(field)..isWrittenAt('aaa, ', true);
@@ -738,7 +738,7 @@
     }
     // bbb
     {
-      FieldElement field = findElement('bbb');
+      FieldElement field = findElement('bbb', ElementKind.FIELD);
       PropertyAccessorElement getter = field.getter;
       PropertyAccessorElement setter = field.setter;
       assertThat(field)..isWrittenAt('bbb) {}', true);
@@ -964,7 +964,7 @@
   A.bar() : field = 5;
 }
 ''');
-    FieldElement element = findElement('field');
+    FieldElement element = findElement('field', ElementKind.FIELD);
     assertThat(element)
       ..isWrittenAt('field})', true)
       ..isWrittenAt('field = 5', true);
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index f64a448..674ce9b 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -194,16 +194,32 @@
 var y = x;
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('y')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('y')).inferredType.toString(),
         '() → dynamic');
   }
 
+  void test_inferredType_closure_fromBundle_identifierSequence() {
+    var bundle = createPackageBundle(
+        '''
+class C {
+  static final x = (D d) => d.e;
+}
+class D {
+  E e;
+}
+class E {}
+''',
+        path: '/a.dart');
+    addBundle(bundle);
+    createLinker('''
+import 'a.dart';
+var y = C.x;
+''');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    expect(_getVariable(library.getContainedName('y')).inferredType.toString(),
+        '(D) → E');
+  }
+
   void test_inferredType_instanceField_dynamic() {
     createLinker('''
 var x;
@@ -277,12 +293,10 @@
 }
 ''');
     expect(
-        linker
-            .getLibrary(linkerInputs.testDartUri)
-            .getContainedName('C')
-            .getContainedName('y')
-            .asTypeInferenceNode
-            .variableElement
+        _getVariable(linker
+                .getLibrary(linkerInputs.testDartUri)
+                .getContainedName('C')
+                .getContainedName('y'))
             .inferredType
             .toString(),
         'dynamic');
@@ -294,11 +308,9 @@
 var y = x;
 ''');
     expect(
-        linker
-            .getLibrary(linkerInputs.testDartUri)
-            .getContainedName('y')
-            .asTypeInferenceNode
-            .variableElement
+        _getVariable(linker
+                .getLibrary(linkerInputs.testDartUri)
+                .getContainedName('y'))
             .inferredType
             .toString(),
         'dynamic');
@@ -317,13 +329,7 @@
 var z = y; // Inferred type: dynamic
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('z')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('z')).inferredType.toString(),
         'dynamic');
   }
 
@@ -341,13 +347,7 @@
 var x = new C().f; // Inferred type: int
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('x')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('x')).inferredType.toString(),
         'int');
   }
 
@@ -388,13 +388,7 @@
 var x = new C().f(0); // Inferred type: int
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('x')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('x')).inferredType.toString(),
         'int');
   }
 
@@ -442,13 +436,7 @@
 var x = new C().f(); // Inferred type: int
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('x')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('x')).inferredType.toString(),
         'int');
   }
 
@@ -483,11 +471,9 @@
     addBundle(bundle);
     createLinker('import "a.dart"; var x = C.f;', path: '/b.dart');
     expect(
-        linker
-            .getLibrary(linkerInputs.testDartUri)
-            .getContainedName('x')
-            .asTypeInferenceNode
-            .variableElement
+        _getVariable(linker
+                .getLibrary(linkerInputs.testDartUri)
+                .getContainedName('x'))
             .inferredType
             .toString(),
         'int');
@@ -498,11 +484,9 @@
     addBundle(bundle);
     createLinker('import "a.dart"; var b = a;', path: '/b.dart');
     expect(
-        linker
-            .getLibrary(linkerInputs.testDartUri)
-            .getContainedName('b')
-            .asTypeInferenceNode
-            .variableElement
+        _getVariable(linker
+                .getLibrary(linkerInputs.testDartUri)
+                .getContainedName('b'))
             .inferredType
             .toString(),
         'int');
@@ -674,16 +658,19 @@
 var y = x;
 ''');
     LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
-    expect(
-        library
-            .getContainedName('y')
-            .asTypeInferenceNode
-            .variableElement
-            .inferredType
-            .toString(),
+    expect(_getVariable(library.getContainedName('y')).inferredType.toString(),
         'dynamic');
   }
 
+  @failingTest
+  void test_methodCall_withTypeArguments_topLevelVariable() {
+    // The following code is incorrect but it shouldn't crash analyzer.
+    // TODO(paulberry): fix this.
+    createLinker('var f = f/*<int>*/();');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    library.libraryCycleForLink.ensureLinked();
+  }
+
   void test_multiplyInheritedExecutable_differentSignatures() {
     createLinker('''
 class B {
@@ -823,4 +810,8 @@
     PropertyAccessorElementForLink_Variable v = library.getContainedName('v');
     expect(v.variable.initializer, isNotNull);
   }
+
+  VariableElementForLink _getVariable(ReferenceableElementForLink element) {
+    return (element as PropertyAccessorElementForLink_Variable).variable;
+  }
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 164d8a7..1adaae0 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -47,9 +47,6 @@
   bool get mayCheckTypesOfLocals => false;
 
   @override
-  bool get skipBrokenAstInference => true;
-
-  @override
   void addFile(String content, {String name: '/main.dart'}) {
     addLibrarySource(name, content);
   }
@@ -154,6 +151,12 @@
 
   @override
   @failingTest
+  void test_circularReference_viaClosures_initializerTypes() {
+    super.test_circularReference_viaClosures_initializerTypes();
+  }
+
+  @override
+  @failingTest
   void test_genericMethods_inferJSBuiltin() {
     super.test_genericMethods_inferJSBuiltin();
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_test.dart b/pkg/analyzer/test/src/summary/resynthesize_test.dart
index 100dbcb..881ad8f 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_test.dart
@@ -51,16 +51,6 @@
 
   bool get checkPropagatedTypes => true;
 
-  /**
-   * Derived classes can override this getter to return `true` in order to
-   * cause certain checks to be skipped if they are known to fail with
-   * AST-based type inference.
-   *
-   * TODO(paulberry): remove this flag once AST-based type inference is fully
-   * working.
-   */
-  bool get skipBrokenAstInference => false;
-
   void addLibrary(String uri) {
     otherLibrarySources.add(context.sourceFactory.forUri(uri));
   }
@@ -211,10 +201,7 @@
     }
   }
 
-  void compareClassElements(
-      ClassElement resynthesized, ClassElement original, String desc) {
-    ClassElementImpl r = ClassElementImpl.getImpl(resynthesized);
-    ClassElementImpl o = ClassElementImpl.getImpl(original);
+  void compareClassElements(ClassElement r, ClassElement o, String desc) {
     compareElements(r, o, desc);
     expect(r.fields.length, o.fields.length, reason: '$desc fields.length');
     for (int i = 0; i < r.fields.length; i++) {
@@ -222,16 +209,18 @@
       compareFieldElements(r.fields[i], o.fields[i], '$desc.field $name');
     }
     compareTypes(r.supertype, o.supertype, '$desc supertype');
-    expect(r.interfaces.length, o.interfaces.length);
+    expect(r.interfaces.length, o.interfaces.length,
+        reason: '$desc interfaces.length');
     for (int i = 0; i < r.interfaces.length; i++) {
       compareTypes(r.interfaces[i], o.interfaces[i],
           '$desc interface ${o.interfaces[i].name}');
     }
-    expect(r.mixins.length, o.mixins.length);
+    expect(r.mixins.length, o.mixins.length, reason: '$desc mixins.length');
     for (int i = 0; i < r.mixins.length; i++) {
       compareTypes(r.mixins[i], o.mixins[i], '$desc mixin ${o.mixins[i].name}');
     }
-    expect(r.typeParameters.length, o.typeParameters.length);
+    expect(r.typeParameters.length, o.typeParameters.length,
+        reason: '$desc typeParameters.length');
     for (int i = 0; i < r.typeParameters.length; i++) {
       compareTypeParameterElements(r.typeParameters[i], o.typeParameters[i],
           '$desc type parameter ${o.typeParameters[i].name}');
@@ -242,18 +231,23 @@
       compareConstructorElements(r.constructors[i], o.constructors[i],
           '$desc constructor ${o.constructors[i].name}');
     }
-    expect(r.accessors.length, o.accessors.length);
+    expect(r.accessors.length, o.accessors.length,
+        reason: '$desc accessors.length');
+    List<PropertyAccessorElement> rAccessors = _getSortedPropertyAccessors(r);
+    List<PropertyAccessorElement> oAccessors = _getSortedPropertyAccessors(o);
     for (int i = 0; i < r.accessors.length; i++) {
-      comparePropertyAccessorElements(r.accessors[i], o.accessors[i],
-          '$desc accessor ${o.accessors[i].name}');
+      comparePropertyAccessorElements(
+          rAccessors[i], oAccessors[i], '$desc accessor ${oAccessors[i].name}');
     }
-    expect(r.methods.length, o.methods.length);
+    expect(r.methods.length, o.methods.length, reason: '$desc methods.length');
     for (int i = 0; i < r.methods.length; i++) {
       compareMethodElements(
           r.methods[i], o.methods[i], '$desc.${o.methods[i].name}');
     }
     compareTypes(r.type, o.type, desc);
-    expect(r.hasBeenInferred, o.hasBeenInferred, reason: desc);
+    if (r is ClassElementImpl && o is ClassElementImpl) {
+      expect(r.hasBeenInferred, o.hasBeenInferred, reason: desc);
+    }
   }
 
   void compareCompilationUnitElements(CompilationUnitElementImpl resynthesized,
@@ -677,7 +671,9 @@
       expect(rImpl.evaluationResult, isNull);
     } else {
       Type rRuntimeType;
-      if (rImpl is FunctionElementImpl) {
+      if (rImpl is ConstFieldElementImpl) {
+        rRuntimeType = ConstFieldElementImpl;
+      } else if (rImpl is FunctionElementImpl) {
         rRuntimeType = FunctionElementImpl;
       } else {
         rRuntimeType = rImpl.runtimeType;
@@ -1040,7 +1036,7 @@
         expect(resynthesized.element.type, same(resynthesized));
       }
       expect(resynthesized.typeArguments.length, original.typeArguments.length,
-          reason: desc);
+          reason: '$desc typeArguments.length');
       for (int i = 0; i < resynthesized.typeArguments.length; i++) {
         if (resynthesized.typeArguments[i].isDynamic &&
             original.typeArguments[i] is TypeParameterType) {
@@ -1108,10 +1104,8 @@
     VariableElementImpl resynthesizedActual =
         getActualElement(resynthesized, desc);
     VariableElementImpl originalActual = getActualElement(original, desc);
-    if (!skipBrokenAstInference) {
-      compareFunctionElements(resynthesizedActual.initializer,
-          originalActual.initializer, '$desc initializer');
-    }
+    compareFunctionElements(resynthesizedActual.initializer,
+        originalActual.initializer, '$desc initializer');
     if (originalActual is ConstVariableElement) {
       Element oEnclosing = original.enclosingElement;
       if (oEnclosing is ClassElement && oEnclosing.isEnum) {
@@ -1247,6 +1241,13 @@
     expect(identifier.staticElement, isNull, reason: desc);
   }
 
+  List<PropertyAccessorElement> _getSortedPropertyAccessors(
+      ClassElement classElement) {
+    List<PropertyAccessorElement> accessors = classElement.accessors.toList();
+    accessors.sort((a, b) => a.displayName.compareTo(b.displayName));
+    return accessors;
+  }
+
   bool _hasModifier(Element element, Modifier modifier) {
     if (modifier == Modifier.ABSTRACT) {
       if (element is ClassElement) {
@@ -3662,7 +3663,8 @@
   }
 
   test_localLabels_inConstructor() {
-    checkLibrary(r'''
+    checkLibrary(
+        r'''
 class C {
   C() {
     aaa: while (true) {}
@@ -3672,11 +3674,13 @@
     }
   }
 }
-''');
+''',
+        allowErrors: true);
   }
 
   test_localLabels_inMethod() {
-    checkLibrary(r'''
+    checkLibrary(
+        r'''
 class C {
   m() {
     aaa: while (true) {}
@@ -3686,11 +3690,13 @@
     }
   }
 }
-''');
+''',
+        allowErrors: true);
   }
 
   test_localLabels_inTopLevelFunction() {
-    checkLibrary(r'''
+    checkLibrary(
+        r'''
 main() {
   aaa: while (true) {}
   bbb: switch (42) {
@@ -3698,7 +3704,8 @@
       break;
   }
 }
-''');
+''',
+        allowErrors: true);
   }
 
   test_localVariables_inConstructor() {
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index d50f60d..a3e2695 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -1790,7 +1790,8 @@
           0,
           0,
           0,
-          2
+          2,
+          0
         ],
         referenceValidators: [
           (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -1821,7 +1822,8 @@
           0,
           1,
           0,
-          3
+          3,
+          0
         ],
         referenceValidators: [
           (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -2322,7 +2324,8 @@
     ], ints: [
       42,
       0,
-      2
+      2,
+      0
     ], referenceValidators: [
       (EntityRef r) {
         checkTypeRef(r, 'dart:core', 'dart:core', 'identical',
@@ -6881,9 +6884,9 @@
           UnlinkedConstOperation.cascadeSectionEnd,
         ],
         ints: [
-          5, 0, 1, // m(5)
-          0, 0, // abs()
-          6, 0, 1, // m(5)
+          5, 0, 1, 0, // m(5)
+          0, 0, 0, // abs()
+          6, 0, 1, 0, // m(5)
         ],
         strings: [
           'm',
@@ -6977,7 +6980,8 @@
           0,
           0,
           0,
-          2
+          2,
+          0
         ],
         referenceValidators: [
           (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -7008,7 +7012,8 @@
           0,
           1,
           0,
-          3
+          3,
+          0
         ],
         referenceValidators: [
           (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -7101,6 +7106,53 @@
         operators: [UnlinkedConstOperation.pushParameter], strings: ['x']);
   }
 
+  test_expr_inClosure_refersToParam_methodCall() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('var v = (x) => x.f();');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.invokeMethod
+        ],
+        strings: [
+          'x',
+          'f'
+        ],
+        ints: [
+          0,
+          0,
+          0
+        ]);
+  }
+
+  test_expr_inClosure_refersToParam_methodCall_prefixed() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable =
+        serializeVariableText('var v = (x) => x.y.f();');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.invokeMethod
+        ],
+        strings: [
+          'x',
+          'y',
+          'f'
+        ],
+        ints: [
+          0,
+          0,
+          0
+        ]);
+  }
+
   test_expr_inClosure_refersToParam_outOfScope() {
     if (skipNonConstInitializers) {
       return;
@@ -7128,6 +7180,86 @@
         ]);
   }
 
+  test_expr_inClosure_refersToParam_prefixedIdentifier() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('var v = (x) => x.y;');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        operators: [
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.extractProperty
+        ],
+        strings: [
+          'x',
+          'y'
+        ]);
+  }
+
+  test_expr_inClosure_refersToParam_prefixedIdentifier_assign() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable =
+        serializeVariableText('var v = (x) => x.y = null;');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushNull,
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.assignToProperty
+        ],
+        strings: [
+          'x',
+          'y'
+        ],
+        assignmentOperators: [
+          UnlinkedExprAssignOperator.assign
+        ]);
+  }
+
+  test_expr_inClosure_refersToParam_prefixedPrefixedIdentifier() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('var v = (x) => x.y.z;');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        operators: [
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.extractProperty
+        ],
+        strings: [
+          'x',
+          'y',
+          'z'
+        ]);
+  }
+
+  test_expr_inClosure_refersToParam_prefixedPrefixedIdentifier_assign() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable =
+        serializeVariableText('var v = (x) => x.y.z = null;');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushNull,
+          UnlinkedConstOperation.pushParameter,
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.assignToProperty
+        ],
+        strings: [
+          'x',
+          'y',
+          'z'
+        ],
+        assignmentOperators: [
+          UnlinkedExprAssignOperator.assign
+        ]);
+  }
+
   test_expr_invokeMethod_instance() {
     if (skipNonConstInitializers) {
       return;
@@ -7154,7 +7286,8 @@
           2,
           3,
           2,
-          1
+          1,
+          0
         ],
         strings: [
           'b',
@@ -7167,6 +7300,39 @@
         ]);
   }
 
+  test_expr_invokeMethod_withTypeParameters() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('''
+class C {
+  f<T, U>() => null;
+}
+final v = new C().f<int, String>();
+''');
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeConstructor,
+          UnlinkedConstOperation.invokeMethod
+        ],
+        ints: [
+          0,
+          0,
+          0,
+          0,
+          2
+        ],
+        strings: [
+          'f'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'String')
+        ]);
+  }
+
   test_expr_invokeMethodRef_instance() {
     if (skipNonConstInitializers) {
       return;
@@ -7195,7 +7361,8 @@
           10,
           20,
           0,
-          2
+          2,
+          0
         ],
         strings: [],
         referenceValidators: [
@@ -7232,6 +7399,7 @@
         ],
         ints: [
           0,
+          0,
           0
         ],
         strings: [],
@@ -7263,7 +7431,8 @@
         ],
         ints: [
           0,
-          1
+          1,
+          0
         ],
         referenceValidators: [
           (EntityRef r) => checkTypeRef(r, null, null, 'u',
@@ -7273,6 +7442,33 @@
         ]);
   }
 
+  test_expr_invokeMethodRef_withTypeParameters() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('''
+f<T, U>() => null;
+final v = f<int, String>();
+''');
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          0,
+          0,
+          2
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+              expectedKind: ReferenceKind.topLevelFunction,
+              numTypeParameters: 2),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'String')
+        ]);
+  }
+
   test_expr_throwException() {
     if (skipNonConstInitializers) {
       return;
@@ -7399,6 +7595,7 @@
         ints: [
           1,
           0,
+          0,
           0
         ],
         strings: [],
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index cddc662..f71c6ff 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -4464,20 +4464,41 @@
 
 @reflectiveTest
 class ScanDartTaskTest extends _AbstractDartTaskTest {
+  test_ignore_info() {
+    _performScanTask('''
+//ignore: error_code
+var x = '';
+foo(); // ignore:   error_code_2
+bar(); //ignore: error_code, error_code_2
+''');
+
+    IgnoreInfo info = outputs[IGNORE_INFO];
+    expect(info.ignores.keys, hasLength(3));
+    expect(info.ignores[1].first, 'error_code');
+    expect(info.ignores[3].first, 'error_code_2');
+    expect(info.ignores[4], unorderedEquals(['error_code', 'error_code_2']));
+  }
+
   test_perform_errors() {
     _performScanTask('import "');
-    expect(outputs, hasLength(3));
+    expect(outputs, hasLength(4));
     expect(outputs[LINE_INFO], isNotNull);
     expect(outputs[SCAN_ERRORS], hasLength(1));
     expect(outputs[TOKEN_STREAM], isNotNull);
+    IgnoreInfo ignoreInfo = outputs[IGNORE_INFO];
+    expect(ignoreInfo, isNotNull);
+    expect(ignoreInfo.hasIgnores, isFalse);
   }
 
   test_perform_noErrors() {
     _performScanTask('class A {}');
-    expect(outputs, hasLength(3));
+    expect(outputs, hasLength(4));
     expect(outputs[LINE_INFO], isNotNull);
     expect(outputs[SCAN_ERRORS], hasLength(0));
     expect(outputs[TOKEN_STREAM], isNotNull);
+    IgnoreInfo ignoreInfo = outputs[IGNORE_INFO];
+    expect(ignoreInfo, isNotNull);
+    expect(ignoreInfo.hasIgnores, isFalse);
   }
 
   test_perform_script() {
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 5fbc192..8a6376d 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -7,3310 +7,3296 @@
 /// General type checking tests
 library analyzer.test.src.task.strong.checker_test;
 
-import 'package:unittest/unittest.dart';
-
+import '../../../reflective_tests.dart';
 import 'strong_test_helper.dart';
 
 void main() {
   initStrongModeTests();
+  runReflectiveTests(CheckerTest);
+}
 
-  test('ternary operator', () {
+@reflectiveTest
+class CheckerTest {
+  void test_awaitForInCastsStreamElementToVariable() {
     checkFile('''
-        abstract class Comparable<T> {
-          int compareTo(T other);
-          static int compare(Comparable a, Comparable b) => a.compareTo(b);
-        }
-        typedef int Comparator<T>(T a, T b);
+import 'dart:async';
+main() async {
+  // Don't choke if sequence is not stream.
+  await for (var i in /*warning:FOR_IN_OF_INVALID_TYPE*/1234) {}
 
-        typedef bool _Predicate<T>(T value);
+  // Dynamic cast.
+  await for (String /*info:DYNAMIC_CAST*/s in new Stream<dynamic>()) {}
 
-        class SplayTreeMap<K, V> {
-          Comparator<K> _comparator;
-          _Predicate _validKey;
+  // Identity cast.
+  await for (String s in new Stream<String>()) {}
 
-          // The warning on assigning to _comparator is legitimate. Since K has
-          // no bound, all we know is that it's object. _comparator's function
-          // type is effectively:              (Object, Object) -> int
-          // We are assigning it a fn of type: (Comparable, Comparable) -> int
-          // There's no telling if that will work. For example, consider:
-          //
-          //     new SplayTreeMap<Uri>();
-          //
-          // This would end up calling .compareTo() on a Uri, which doesn't
-          // define that since it doesn't implement Comparable.
-          SplayTreeMap([int compare(K key1, K key2),
-                        bool isValidKey(potentialKey)])
-            : _comparator = /*warning:DOWN_CAST_COMPOSITE*/(compare == null) ? Comparable.compare : compare,
-              _validKey = (isValidKey != null) ? isValidKey : ((v) => true) {
-            _Predicate<Object> v = (isValidKey != null)
-                ? isValidKey : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
+  // Untyped.
+  await for (var s in new Stream<String>()) {}
 
-            v = (isValidKey != null)
-                 ? v : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
-          }
-        }
-        void main() {
-          Object obj = 42;
-          dynamic dyn = 42;
-          int i = 42;
+  // Downcast.
+  await for (int /*info:DOWN_CAST_IMPLICIT*/i in new Stream<num>()) {}
+}
+''');
+  }
 
-          // Check the boolean conversion of the condition.
-          print(/*warning:NON_BOOL_CONDITION*/i ? false : true);
-          print((/*info:DOWN_CAST_IMPLICIT*/obj) ? false : true);
-          print((/*info:DYNAMIC_CAST*/dyn) ? false : true);
-        }
-      ''');
-  });
-
-  test('least upper bounds', () {
+  void test_awaitForInCastsSupertypeSequenceToStream() {
     checkFile('''
-      typedef T Returns<T>();
+main() async {
+  dynamic d;
+  await for (var i in /*info:DYNAMIC_CAST*/d) {}
 
-      // regression test for https://github.com/dart-lang/sdk/issues/26094
-      class A <S extends  Returns<S>, T extends Returns<T>> {
-        int test(bool b) {
-          S s;
-          T t;
-          if (b) {
-            return /*warning:RETURN_OF_INVALID_TYPE*/b ? s : t;
-          } else {
-            return /*warning:RETURN_OF_INVALID_TYPE*/s ?? t;
-          }
-        }
-      }
+  Object o;
+  await for (var i in /*info:DOWN_CAST_IMPLICIT*/o) {}
+}
+''');
+  }
 
-      class B<S, T extends S> {
-        T t;
-        S s;
-        int test(bool b) {
-          return /*warning:RETURN_OF_INVALID_TYPE*/b ? t : s;
-        }
-      }
-
-      class C {
-        // Check that the least upper bound of two types with the same
-        // class but different type arguments produces the pointwise
-        // least upper bound of the type arguments
-        int test1(bool b) {
-          List<int> li;
-          List<double> ld;
-          return /*warning:RETURN_OF_INVALID_TYPE*/b ? li : ld;
-        }
-        // TODO(leafp): This case isn't handled yet.  This test checks
-        // the case where two related classes are instantiated with related
-        // but different types.
-        Iterable<num> test2(bool b) {
-          List<int> li;
-          Iterable<double> id;
-          int x =
-              /*info:ASSIGNMENT_CAST should be warning:INVALID_ASSIGNMENT*/
-              b ? li : id;
-          return /*warning:DOWN_CAST_COMPOSITE should be pass*/b ? li : id;
-        }
-      }
-      ''');
-  });
-
-  test('setter return types', () {
+  void test_binaryAndIndexOperators() {
     checkFile('''
-      void voidFn() => null;
-      class A {
-        set a(y) => 4;
-        set b(y) => voidFn();
-        void set c(y) => /*warning:RETURN_OF_INVALID_TYPE*/4;
-        void set d(y) => voidFn();
-        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set e(y) => 4;
-        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set f(y) =>
-            /*warning:RETURN_OF_INVALID_TYPE*/voidFn();
-        set g(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
-        void set h(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
-        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set i(y) {return 4;}
-      }
-    ''');
-  });
+class A {
+  A operator *(B b) => null;
+  A operator /(B b) => null;
+  A operator ~/(B b) => null;
+  A operator %(B b) => null;
+  A operator +(B b) => null;
+  A operator -(B b) => null;
+  A operator <<(B b) => null;
+  A operator >>(B b) => null;
+  A operator &(B b) => null;
+  A operator ^(B b) => null;
+  A operator |(B b) => null;
+  A operator[](B b) => null;
+}
 
-  test('if/for/do/while statements use boolean conversion', () {
+class B {
+  A operator -(B b) => null;
+}
+
+foo() => new A();
+
+test() {
+  A a = new A();
+  B b = new B();
+  var c = foo();
+  a = a * b;
+  a = a * /*info:DYNAMIC_CAST*/c;
+  a = a / b;
+  a = a ~/ b;
+  a = a % b;
+  a = a + b;
+  a = a + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
+  a = a - b;
+  b = /*warning:INVALID_ASSIGNMENT*/b - b;
+  a = a << b;
+  a = a >> b;
+  a = a & b;
+  a = a ^ b;
+  a = a | b;
+  c = (/*info:DYNAMIC_INVOKE*/c + b);
+
+  String x = 'hello';
+  int y = 42;
+  x = x + x;
+  x = x + /*info:DYNAMIC_CAST*/c;
+  x = x + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y;
+
+  bool p = true;
+  p = p && p;
+  p = p && /*info:DYNAMIC_CAST*/c;
+  p = (/*info:DYNAMIC_CAST*/c) && p;
+  p = (/*info:DYNAMIC_CAST*/c) && /*info:DYNAMIC_CAST*/c;
+  p = /*warning:NON_BOOL_OPERAND*/y && p;
+  p = c == y;
+
+  a = a[b];
+  a = a[/*info:DYNAMIC_CAST*/c];
+  c = (/*info:DYNAMIC_INVOKE*/c[b]);
+  a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y];
+}
+''');
+  }
+
+  void test_castsInConditions() {
     checkFile('''
-      main() {
-        dynamic dyn = 42;
-        Object obj = 42;
-        int i = 42;
-        bool b = false;
+main() {
+  bool b = true;
+  num x = b ? 1 : 2.3;
+  int y = /*info:ASSIGNMENT_CAST*/b ? 1 : 2.3;
+  String z = !b ? "hello" : null;
+  z = b ? null : "hello";
+}
+''');
+  }
 
-        if (b) {}
-        if (/*info:DYNAMIC_CAST*/dyn) {}
-        if (/*info:DOWN_CAST_IMPLICIT*/obj) {}
-        if (/*warning:NON_BOOL_CONDITION*/i) {}
-
-        while (b) {}
-        while (/*info:DYNAMIC_CAST*/dyn) {}
-        while (/*info:DOWN_CAST_IMPLICIT*/obj) {}
-        while (/*warning:NON_BOOL_CONDITION*/i) {}
-
-        do {} while (b);
-        do {} while (/*info:DYNAMIC_CAST*/dyn);
-        do {} while (/*info:DOWN_CAST_IMPLICIT*/obj);
-        do {} while (/*warning:NON_BOOL_CONDITION*/i);
-
-        for (;b;) {}
-        for (;/*info:DYNAMIC_CAST*/dyn;) {}
-        for (;/*info:DOWN_CAST_IMPLICIT*/obj;) {}
-        for (;/*warning:NON_BOOL_CONDITION*/i;) {}
-      }
-    ''');
-  });
-
-  test('for-in casts supertype sequence to iterable', () {
+  void test_castsInConstantContexts() {
     checkFile('''
-      main() {
-        dynamic d;
-        for (var i in /*info:DYNAMIC_CAST*/d) {}
+class A {
+  static const num n = 3.0;
+  // The severe error is from constant evaluation where we know the
+  // concrete type.
+  static const int /*severe:VARIABLE_TYPE_MISMATCH*/i = /*info:ASSIGNMENT_CAST*/n;
+  final int fi;
+  const A(num a) : this.fi = /*info:DOWN_CAST_IMPLICIT*/a;
+}
+class B extends A {
+  const B(Object a) : super(/*info:DOWN_CAST_IMPLICIT*/a);
+}
+void foo(Object o) {
+  var a = const A(/*info:DOWN_CAST_IMPLICIT, severe:CONST_WITH_NON_CONSTANT_ARGUMENT, severe:INVALID_CONSTANT*/o);
+}
+''');
+  }
 
-        Object o;
-        for (var i in /*info:DOWN_CAST_IMPLICIT*/o) {}
-      }
-    ''');
-  });
-
-  test('await for-in casts supertype sequence to stream', () {
+  void test_classOverrideOfGrandInterface_interfaceOfAbstractSuperclass() {
     checkFile('''
-      main() async {
-        dynamic d;
-        await for (var i in /*info:DYNAMIC_CAST*/d) {}
+class A {}
+class B {}
 
-        Object o;
-        await for (var i in /*info:DOWN_CAST_IMPLICIT*/o) {}
-      }
-    ''');
-  });
+abstract class I1 {
+    m(A a);
+}
+abstract class Base implements I1 {}
 
-  test('for-in casts iterable element to variable', () {
+class T1 extends Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
+
+  void test_classOverrideOfGrandInterface_interfaceOfConcreteSuperclass() {
     checkFile('''
-      main() {
-        // Don't choke if sequence is not iterable.
-        for (var i in /*warning:FOR_IN_OF_INVALID_TYPE*/1234) {}
+class A {}
+class B {}
 
-        // Dynamic cast.
-        for (String /*info:DYNAMIC_CAST*/s in <dynamic>[]) {}
+abstract class I1 {
+    m(A a);
+}
 
-        // Identity cast.
-        for (String s in <String>[]) {}
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
+    implements I1 {}
 
-        // Untyped.
-        for (var s in <String>[]) {}
+class T1 extends Base {
+    // not reported technically because if the class is concrete,
+    // it should implement all its interfaces and hence it is
+    // sufficient to check overrides against it.
+    m(/*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
 
-        // Downcast.
-        for (int /*info:DOWN_CAST_IMPLICIT*/i in <num>[]) {}
-      }
-    ''');
-  });
-
-  test('await for-in casts stream element to variable', () {
+  void test_classOverrideOfGrandInterface_interfaceOfInterfaceOfChild() {
     checkFile('''
-      import 'dart:async';
-      main() async {
-        // Don't choke if sequence is not stream.
-        await for (var i in /*warning:FOR_IN_OF_INVALID_TYPE*/1234) {}
+class A {}
+class B {}
 
-        // Dynamic cast.
-        await for (String /*info:DYNAMIC_CAST*/s in new Stream<dynamic>()) {}
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 implements I1 {}
 
-        // Identity cast.
-        await for (String s in new Stream<String>()) {}
+class T1 implements I2 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
 
-        // Untyped.
-        await for (var s in new Stream<String>()) {}
-
-        // Downcast.
-        await for (int /*info:DOWN_CAST_IMPLICIT*/i in new Stream<num>()) {}
-      }
-    ''');
-  });
-
-  test('dynamic invocation', () {
+  void test_classOverrideOfGrandInterface_mixinOfInterfaceOfChild() {
     checkFile('''
-      typedef dynamic A(dynamic x);
-      class B {
-        int call(int x) => x;
-        double col(double x) => x;
-      }
-      void main() {
-        {
-          B f = new B();
-          int x;
-          double y;
-          x = f(3);
-          x = /*warning:INVALID_ASSIGNMENT*/f.col(3.0);
-          y = /*warning:INVALID_ASSIGNMENT*/f(3);
-          y = f.col(3.0);
-          f(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3.0);
-          f.col(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
-        }
-        {
-          Function f = new B();
-          int x;
-          double y;
-          x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
-          x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE, info:INVALID_ASSIGNMENT*/f.col(3.0);
-          y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
-          y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f.col(3.0);
-          /*info:DYNAMIC_INVOKE*/f(3.0);
-          // Through type propagation, we know f is actually a B, hence the
-          // hint.
-          /*info:DYNAMIC_INVOKE*/f.col(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
-        }
-        {
-          A f = new B();
-          int x;
-          double y;
-          x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
-          y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
-          /*info:DYNAMIC_INVOKE*/f(3.0);
-        }
-        {
-          dynamic g = new B();
-          /*info:DYNAMIC_INVOKE*/g.call(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/32.0);
-          /*info:DYNAMIC_INVOKE*/g.col(42.0);
-          /*info:DYNAMIC_INVOKE*/g.foo(42.0);
-          /*info:DYNAMIC_INVOKE*/g./*info:UNDEFINED_GETTER*/x;
-          A f = new B();
-          /*info:DYNAMIC_INVOKE*/f.col(42.0);
-          /*info:DYNAMIC_INVOKE*/f.foo(42.0);
-          /*info:DYNAMIC_INVOKE*/f./*warning:UNDEFINED_GETTER*/x;
-        }
-      }
-    ''');
-  });
+class A {}
+class B {}
 
-  test('conversion and dynamic invoke', () {
+abstract class M1 {
+    m(A a);
+}
+abstract class I2 extends Object with M1 {}
+
+class T1 implements I2 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
+
+  void test_classOverrideOfGrandInterface_superclassOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 extends I1 {}
+
+class T1 implements I2 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
+
+  void test_compoundAssignments() {
+    checkFile('''
+class A {
+  A operator *(B b) => null;
+  A operator /(B b) => null;
+  A operator ~/(B b) => null;
+  A operator %(B b) => null;
+  A operator +(B b) => null;
+  A operator -(B b) => null;
+  A operator <<(B b) => null;
+  A operator >>(B b) => null;
+  A operator &(B b) => null;
+  A operator ^(B b) => null;
+  A operator |(B b) => null;
+  D operator [](B index) => null;
+  void operator []=(B index, D value) => null;
+}
+
+class B {
+  A operator -(B b) => null;
+}
+
+class D {
+  D operator +(D d) => null;
+}
+
+foo() => new A();
+
+test() {
+  int x = 0;
+  x += 5;
+  /*severe:STATIC_TYPE_ERROR*/x += 3.14;
+
+  double y = 0.0;
+  y += 5;
+  y += 3.14;
+
+  num z = 0;
+  z += 5;
+  z += 3.14;
+
+  x = /*info:DOWN_CAST_IMPLICIT*/x + z;
+  x += /*info:DOWN_CAST_IMPLICIT*/z;
+  y = y + z;
+  y += z;
+
+  dynamic w = 42;
+  x += /*info:DYNAMIC_CAST*/w;
+  y += /*info:DYNAMIC_CAST*/w;
+  z += /*info:DYNAMIC_CAST*/w;
+
+  A a = new A();
+  B b = new B();
+  var c = foo();
+  a = a * b;
+  a *= b;
+  a *= /*info:DYNAMIC_CAST*/c;
+  a /= b;
+  a ~/= b;
+  a %= b;
+  a += b;
+  a += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
+  a -= b;
+  /*severe:STATIC_TYPE_ERROR*/b -= /*warning:INVALID_ASSIGNMENT*/b;
+  a <<= b;
+  a >>= b;
+  a &= b;
+  a ^= b;
+  a |= b;
+  /*info:DYNAMIC_INVOKE*/c += b;
+
+  var d = new D();
+  a[b] += d;
+  a[/*info:DYNAMIC_CAST*/c] += d;
+  a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z] += d;
+  a[b] += /*info:DYNAMIC_CAST*/c;
+  a[b] += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z;
+  /*info:DYNAMIC_INVOKE,info:DYNAMIC_INVOKE*/c[b] += d;
+}
+''');
+  }
+
+  void test_constructors() {
+    checkFile('''
+const num z = 25;
+Object obj = "world";
+
+class A {
+  int x;
+  String y;
+
+  A(this.x) : this.y = /*warning:FIELD_INITIALIZER_NOT_ASSIGNABLE*/42;
+
+  A.c1(p): this.x = /*info:DOWN_CAST_IMPLICIT*/z, this.y = /*info:DYNAMIC_CAST*/p;
+
+  A.c2(this.x, this.y);
+
+  A.c3(/*severe:INVALID_PARAMETER_DECLARATION*/num this.x, String this.y);
+}
+
+class B extends A {
+  B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+
+  B.c2(int x, String y) : super.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y,
+                                   /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/x);
+
+  B.c3(num x, Object y) : super.c3(x, /*info:DOWN_CAST_IMPLICIT*/y);
+}
+
+void main() {
+   A a = new A.c2(/*info:DOWN_CAST_IMPLICIT*/z, /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z);
+   var b = new B.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello", /*info:DOWN_CAST_IMPLICIT*/obj);
+}
+''');
+  }
+
+  void test_conversionAndDynamicInvoke() {
     addFile(
         '''
-      dynamic toString = (int x) => x + 42;
-      dynamic hashCode = "hello";
-      ''',
+dynamic toString = (int x) => x + 42;
+dynamic hashCode = "hello";
+''',
         name: '/helper.dart');
     checkFile('''
-      import 'helper.dart' as helper;
+import 'helper.dart' as helper;
 
-      class A {
-        String x = "hello world";
+class A {
+  String x = "hello world";
 
-        void baz1(y) { x + /*info:DYNAMIC_CAST*/y; }
-        static baz2(y) => /*info:DYNAMIC_INVOKE*/y + y;
-      }
+  void baz1(y) { x + /*info:DYNAMIC_CAST*/y; }
+  static baz2(y) => /*info:DYNAMIC_INVOKE*/y + y;
+}
 
-      void foo(String str) {
-        print(str);
-      }
+void foo(String str) {
+  print(str);
+}
 
-      class B {
-        String toString([int arg]) => arg.toString();
-      }
+class B {
+  String toString([int arg]) => arg.toString();
+}
 
-      void bar(a) {
-        foo(/*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/a.x);
-      }
+void bar(a) {
+  foo(/*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/a.x);
+}
 
-      baz() => new B();
+baz() => new B();
 
-      typedef DynFun(x);
-      typedef StrFun(String x);
+typedef DynFun(x);
+typedef StrFun(String x);
 
-      var bar1 = bar;
+var bar1 = bar;
 
-      void main() {
-        var a = new A();
-        bar(a);
-        (/*info:DYNAMIC_INVOKE*/bar1(a));
-        var b = bar;
-        (/*info:DYNAMIC_INVOKE*/b(a));
-        var f1 = foo;
-        f1("hello");
-        dynamic f2 = foo;
-        (/*info:DYNAMIC_INVOKE*/f2("hello"));
-        DynFun f3 = foo;
-        (/*info:DYNAMIC_INVOKE*/f3("hello"));
-        (/*info:DYNAMIC_INVOKE*/f3(42));
-        StrFun f4 = foo;
-        f4("hello");
-        a.baz1("hello");
-        var b1 = a.baz1;
-        (/*info:DYNAMIC_INVOKE*/b1("hello"));
-        A.baz2("hello");
-        var b2 = A.baz2;
-        (/*info:DYNAMIC_INVOKE*/b2("hello"));
+void main() {
+  var a = new A();
+  bar(a);
+  (/*info:DYNAMIC_INVOKE*/bar1(a));
+  var b = bar;
+  (/*info:DYNAMIC_INVOKE*/b(a));
+  var f1 = foo;
+  f1("hello");
+  dynamic f2 = foo;
+  (/*info:DYNAMIC_INVOKE*/f2("hello"));
+  DynFun f3 = foo;
+  (/*info:DYNAMIC_INVOKE*/f3("hello"));
+  (/*info:DYNAMIC_INVOKE*/f3(42));
+  StrFun f4 = foo;
+  f4("hello");
+  a.baz1("hello");
+  var b1 = a.baz1;
+  (/*info:DYNAMIC_INVOKE*/b1("hello"));
+  A.baz2("hello");
+  var b2 = A.baz2;
+  (/*info:DYNAMIC_INVOKE*/b2("hello"));
 
-        dynamic a1 = new B();
-        (/*info:DYNAMIC_INVOKE*/a1./*info:UNDEFINED_GETTER*/x);
-        a1.toString();
-        (/*info:DYNAMIC_INVOKE*/a1.toString(42));
-        var toStringClosure = a1.toString;
-        (/*info:DYNAMIC_INVOKE*/a1.toStringClosure());
-        (/*info:DYNAMIC_INVOKE*/a1.toStringClosure(42));
-        (/*info:DYNAMIC_INVOKE*/a1.toStringClosure("hello"));
-        a1.hashCode;
+  dynamic a1 = new B();
+  (/*info:DYNAMIC_INVOKE*/a1./*info:UNDEFINED_GETTER*/x);
+  a1.toString();
+  (/*info:DYNAMIC_INVOKE*/a1.toString(42));
+  var toStringClosure = a1.toString;
+  (/*info:DYNAMIC_INVOKE*/a1.toStringClosure());
+  (/*info:DYNAMIC_INVOKE*/a1.toStringClosure(42));
+  (/*info:DYNAMIC_INVOKE*/a1.toStringClosure("hello"));
+  a1.hashCode;
 
-        dynamic toString = () => null;
-        (/*info:DYNAMIC_INVOKE*/toString());
+  dynamic toString = () => null;
+  (/*info:DYNAMIC_INVOKE*/toString());
 
-        (/*info:DYNAMIC_INVOKE*/helper.toString());
-        var toStringClosure2 = helper.toString;
-        (/*info:DYNAMIC_INVOKE*/toStringClosure2());
-        int hashCode = /*info:DYNAMIC_CAST*/helper.hashCode;
+  (/*info:DYNAMIC_INVOKE*/helper.toString());
+  var toStringClosure2 = helper.toString;
+  (/*info:DYNAMIC_INVOKE*/toStringClosure2());
+  int hashCode = /*info:DYNAMIC_CAST*/helper.hashCode;
 
-        baz().toString();
-        baz().hashCode;
-      }
-    ''');
-  });
+  baz().toString();
+  baz().hashCode;
+}
+''');
+  }
 
-  test('Constructors', () {
+  void test_dynamicInvocation() {
     checkFile('''
-      const num z = 25;
-      Object obj = "world";
+typedef dynamic A(dynamic x);
+class B {
+  int call(int x) => x;
+  double col(double x) => x;
+}
+void main() {
+  {
+    B f = new B();
+    int x;
+    double y;
+    x = f(3);
+    x = /*warning:INVALID_ASSIGNMENT*/f.col(3.0);
+    y = /*warning:INVALID_ASSIGNMENT*/f(3);
+    y = f.col(3.0);
+    f(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3.0);
+    f.col(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+  }
+  {
+    Function f = new B();
+    int x;
+    double y;
+    x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
+    x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE, info:INVALID_ASSIGNMENT*/f.col(3.0);
+    y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
+    y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f.col(3.0);
+    /*info:DYNAMIC_INVOKE*/f(3.0);
+    // Through type propagation, we know f is actually a B, hence the
+    // hint.
+    /*info:DYNAMIC_INVOKE*/f.col(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+  }
+  {
+    A f = new B();
+    int x;
+    double y;
+    x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
+    y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
+    /*info:DYNAMIC_INVOKE*/f(3.0);
+  }
+  {
+    dynamic g = new B();
+    /*info:DYNAMIC_INVOKE*/g.call(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/32.0);
+    /*info:DYNAMIC_INVOKE*/g.col(42.0);
+    /*info:DYNAMIC_INVOKE*/g.foo(42.0);
+    /*info:DYNAMIC_INVOKE*/g./*info:UNDEFINED_GETTER*/x;
+    A f = new B();
+    /*info:DYNAMIC_INVOKE*/f.col(42.0);
+    /*info:DYNAMIC_INVOKE*/f.foo(42.0);
+    /*info:DYNAMIC_INVOKE*/f./*warning:UNDEFINED_GETTER*/x;
+  }
+}
+''');
+  }
 
-      class A {
-        int x;
-        String y;
+  void test_factoryConstructorDowncast() {
+    checkFile(r'''
+class Animal {
+  Animal();
+  factory Animal.cat() => new Cat();
+}
 
-        A(this.x) : this.y = /*warning:FIELD_INITIALIZER_NOT_ASSIGNABLE*/42;
+class Cat extends Animal {}
 
-        A.c1(p): this.x = /*info:DOWN_CAST_IMPLICIT*/z, this.y = /*info:DYNAMIC_CAST*/p;
+void main() {
+  Cat c = /*info:ASSIGNMENT_CAST*/new Animal.cat();
+  c = /*severe:STATIC_TYPE_ERROR*/new Animal();
+}''');
+  }
 
-        A.c2(this.x, this.y);
-
-        A.c3(/*severe:INVALID_PARAMETER_DECLARATION*/num this.x, String this.y);
-      }
-
-      class B extends A {
-        B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
-
-        B.c2(int x, String y) : super.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y,
-                                         /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/x);
-
-        B.c3(num x, Object y) : super.c3(x, /*info:DOWN_CAST_IMPLICIT*/y);
-      }
-
-      void main() {
-         A a = new A.c2(/*info:DOWN_CAST_IMPLICIT*/z, /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z);
-         var b = new B.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello", /*info:DOWN_CAST_IMPLICIT*/obj);
-      }
-   ''');
-  });
-
-  test('Unbound variable', () {
+  void test_fieldFieldOverride() {
     checkFile('''
-      void main() {
-         dynamic y = /*warning:UNDEFINED_IDENTIFIER should be error*/unboundVariable;
-      }
-   ''');
-  });
+class A {}
+class B extends A {}
+class C extends B {}
 
-  test('Unbound type name', () {
+class Base {
+  B f1;
+  B f2;
+  B f3;
+  B f4;
+}
+
+class Child extends Base {
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
+  /*severe:INVALID_FIELD_OVERRIDE*/var f3;
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic f4;
+}
+
+class Child2 implements Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
+  /*severe:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
+  var f3;
+  /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic f4;
+}
+''');
+  }
+
+  void test_fieldGetterOverride() {
     checkFile('''
-      void main() {
-         /*warning:UNDEFINED_CLASS should be error*/AToB y;
-      }
-   ''');
-  });
+class A {}
+class B extends A {}
+class C extends B {}
 
-  // Regression test for https://github.com/dart-lang/sdk/issues/25069
-  test('Void subtyping', () {
+abstract class Base {
+  B f1;
+  B f2;
+  B f3;
+  B f4;
+}
+
+class Child extends Base {
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/C get f2 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/get f3 => null;
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+}
+
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implements Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  C get f2 => null;
+  get f3 => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+}
+''');
+  }
+
+  void test_fieldOverride_fuzzyArrows() {
     checkFile('''
-      typedef int Foo();
-      void foo() {}
-      void main () {
-        Foo x = /*warning:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo();
-      }
-   ''');
-  });
+typedef void ToVoid<T>(T x);
+class F {
+  final ToVoid<dynamic> f = null;
+  final ToVoid<int> g = null;
+}
 
-  group('Ground type subtyping:', () {
-    test('dynamic is top', () {
-      checkFile('''
+class G extends F {
+  /*severe:INVALID_FIELD_OVERRIDE*/final ToVoid<int> f = null;
+  /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
+}
 
-      class A {}
-      class B extends A {}
+class H implements F {
+  final ToVoid<int> f = null;
+  /*severe:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
+}
+ ''');
+  }
 
-      void main() {
-         dynamic y;
-         Object o;
-         int i = 0;
-         double d = 0.0;
-         num n;
-         A a;
-         B b;
-         y = o;
-         y = i;
-         y = d;
-         y = n;
-         y = a;
-         y = b;
-      }
-   ''');
-    });
+  void test_fieldSetterOverride() {
+    checkFile('''
+class A {}
+class B extends A {}
+class C extends B {}
 
-    test('dynamic downcasts', () {
-      checkFile('''
+class Base {
+  B f1;
+  B f2;
+  B f3;
+  B f4;
+  B f5;
+}
 
-      class A {}
-      class B extends A {}
+class Child extends Base {
+  /*severe:INVALID_FIELD_OVERRIDE*/B get f1 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/B get f2 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/B get f3 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/B get f4 => null;
+  /*severe:INVALID_FIELD_OVERRIDE*/B get f5 => null;
 
-      void main() {
-         dynamic y;
-         Object o;
-         int i = 0;
-         double d = 0.0;
-         num n;
-         A a;
-         B b;
-         o = y;
-         i = /*info:DYNAMIC_CAST*/y;
-         d = /*info:DYNAMIC_CAST*/y;
-         n = /*info:DYNAMIC_CAST*/y;
-         a = /*info:DYNAMIC_CAST*/y;
-         b = /*info:DYNAMIC_CAST*/y;
-      }
-   ''');
-    });
+  /*severe:INVALID_FIELD_OVERRIDE*/void set f1(A value) {}
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  /*severe:INVALID_FIELD_OVERRIDE*/void set f3(value) {}
+  /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
+  /*severe:INVALID_FIELD_OVERRIDE*/set f5(B value) {}
+}
 
-    test('assigning a class', () {
-      checkFile('''
+class Child2 implements Base {
+  B get f1 => null;
+  B get f2 => null;
+  B get f3 => null;
+  B get f4 => null;
+  B get f5 => null;
 
-      class A {}
-      class B extends A {}
+  void set f1(A value) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  void set f3(value) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
+  set f5(B value) {}
+}
+''');
+  }
 
-      void main() {
-         dynamic y;
-         Object o;
-         int i = 0;
-         double d = 0.0;
-         num n;
-         A a;
-         B b;
-         y = a;
-         o = a;
-         i = /*warning:INVALID_ASSIGNMENT*/a;
-         d = /*warning:INVALID_ASSIGNMENT*/a;
-         n = /*warning:INVALID_ASSIGNMENT*/a;
-         a = a;
-         b = /*info:DOWN_CAST_IMPLICIT*/a;
-      }
-   ''');
-    });
+  void test_forInCastsIterateElementToVariable() {
+    checkFile('''
+main() {
+  // Don't choke if sequence is not iterable.
+  for (var i in /*warning:FOR_IN_OF_INVALID_TYPE*/1234) {}
 
-    test('assigning a subclass', () {
-      checkFile('''
+  // Dynamic cast.
+  for (String /*info:DYNAMIC_CAST*/s in <dynamic>[]) {}
 
-      class A {}
-      class B extends A {}
-      class C extends A {}
+  // Identity cast.
+  for (String s in <String>[]) {}
 
-      void main() {
-         dynamic y;
-         Object o;
-         int i = 0;
-         double d = 0.0;
-         num n;
-         A a;
-         B b;
-         C c;
-         y = b;
-         o = b;
-         i = /*warning:INVALID_ASSIGNMENT*/b;
-         d = /*warning:INVALID_ASSIGNMENT*/b;
-         n = /*warning:INVALID_ASSIGNMENT*/b;
-         a = b;
-         b = b;
-         c = /*warning:INVALID_ASSIGNMENT*/b;
-      }
-   ''');
-    });
+  // Untyped.
+  for (var s in <String>[]) {}
 
-    test('interfaces', () {
-      checkFile('''
+  // Downcast.
+  for (int /*info:DOWN_CAST_IMPLICIT*/i in <num>[]) {}
+}
+''');
+  }
 
-      class A {}
-      class B extends A {}
-      class C extends A {}
-      class D extends B implements C {}
+  void test_forInCastsSupertypeSequenceToIterate() {
+    checkFile('''
+main() {
+  dynamic d;
+  for (var i in /*info:DYNAMIC_CAST*/d) {}
 
-      void main() {
-         A top;
-         B left;
-         C right;
-         D bot;
-         {
-           top = top;
-           top = left;
-           top = right;
-           top = bot;
-         }
-         {
-           left = /*info:DOWN_CAST_IMPLICIT*/top;
-           left = left;
-           left = /*warning:INVALID_ASSIGNMENT*/right;
-           left = bot;
-         }
-         {
-           right = /*info:DOWN_CAST_IMPLICIT*/top;
-           right = /*warning:INVALID_ASSIGNMENT*/left;
-           right = right;
-           right = bot;
-         }
-         {
-           bot = /*info:DOWN_CAST_IMPLICIT*/top;
-           bot = /*info:DOWN_CAST_IMPLICIT*/left;
-           bot = /*info:DOWN_CAST_IMPLICIT*/right;
-           bot = bot;
-         }
-      }
-   ''');
-    });
-  });
+  Object o;
+  for (var i in /*info:DOWN_CAST_IMPLICIT*/o) {}
+}
+''');
+  }
 
-  group('Function typing and subtyping:', () {
-    test('int and object', () {
-      checkFile('''
+  void test_forLoopVariable() {
+    checkFile('''
+foo() {
+  for (int i = 0; i < 10; i++) {
+    i = /*warning:INVALID_ASSIGNMENT*/"hi";
+  }
+}
+bar() {
+  for (var i = 0; i < 10; i++) {
+    int j = i + 1;
+  }
+}
+''');
+  }
 
-      typedef Object Top(int x);      // Top of the lattice
-      typedef int Left(int x);        // Left branch
-      typedef int Left2(int x);       // Left branch
-      typedef Object Right(Object x); // Right branch
-      typedef int Bot(Object x);      // Bottom of the lattice
+  void test_functionModifiers_async() {
+    checkFile('''
+import 'dart:async';
+import 'dart:math' show Random;
 
-      Object globalTop(int x) => x;
-      int globalLeft(int x) => x;
-      Object globalRight(Object x) => x;
-      int bot_(Object x) => /*info:DOWN_CAST_IMPLICIT*/x;
-      int globalBot(Object x) => x as int;
+dynamic x;
 
-      void main() {
-        // Note: use locals so we only know the type, not that it's a specific
-        // function declaration. (we can issue better errors in that case.)
-        var top = globalTop;
-        var left = globalLeft;
-        var right = globalRight;
-        var bot = globalBot;
+foo1() async => x;
+Future foo2() async => x;
+Future<int> foo3() async => /*info:DYNAMIC_CAST*/x;
+Future<int> foo4() async => new Future<int>.value(/*info:DYNAMIC_CAST*/x);
+Future<int> foo5() async =>
+    /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
 
-        { // Check typedef equality
-          Left f = left;
-          Left2 g = f;
-        }
-        {
-          Top f;
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Left f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/right; // Should we reject this?
-          f = bot;
-        }
-        {
-          Right f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/left; // Should we reject this?
-          f = right;
-          f = bot;
-        }
-        {
-          Bot f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/right;
-          f = bot;
-        }
-      }
-   ''');
-    });
+bar1() async { return x; }
+Future bar2() async { return x; }
+Future<int> bar3() async { return /*info:DYNAMIC_CAST*/x; }
+Future<int> bar4() async { return new Future<int>.value(/*info:DYNAMIC_CAST*/x); }
+Future<int> bar5() async {
+  return /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
+}
 
-    test('classes', () {
-      checkFile('''
+int y;
+Future<int> z;
 
-      class A {}
-      class B extends A {}
+baz() async {
+  int a = /*info:DYNAMIC_CAST*/await x;
+  int b = await y;
+  int c = await z;
+  String d = /*warning:INVALID_ASSIGNMENT*/await z;
+}
 
-      typedef A Top(B x);   // Top of the lattice
-      typedef B Left(B x);  // Left branch
-      typedef B Left2(B x); // Left branch
-      typedef A Right(A x); // Right branch
-      typedef B Bot(A x);   // Bottom of the lattice
+Future<bool> get issue_264 async {
+  await 42;
+  if (new Random().nextBool()) {
+    return true;
+  } else {
+    return new Future<bool>.value(false);
+  }
+}
+''');
+  }
 
-      B left(B x) => x;
-      B bot_(A x) => /*info:DOWN_CAST_IMPLICIT*/x;
-      B bot(A x) => x as B;
-      A top(B x) => x;
-      A right(A x) => x;
+  void test_functionModifiers_asyncStar() {
+    checkFile('''
+import 'dart:async';
 
-      void main() {
-        { // Check typedef equality
-          Left f = left;
-          Left2 g = f;
-        }
-        {
-          Top f;
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Left f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-        {
-          Right f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Bot f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-      }
-   ''');
-    });
+dynamic x;
 
-    test('dynamic', () {
-      checkFile('''
+bar1() async* { yield x; }
+Stream bar2() async* { yield x; }
+Stream<int> bar3() async* { yield /*info:DYNAMIC_CAST*/x; }
+Stream<int> bar4() async* { yield /*warning:YIELD_OF_INVALID_TYPE*/new Stream<int>(); }
 
-      class A {}
+baz1() async* { yield* /*info:DYNAMIC_CAST*/x; }
+Stream baz2() async* { yield* /*info:DYNAMIC_CAST*/x; }
+Stream<int> baz3() async* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
+Stream<int> baz4() async* { yield* new Stream<int>(); }
+Stream<int> baz5() async* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new Stream(); }
+''');
+  }
 
-      typedef dynamic Top(dynamic x);     // Top of the lattice
-      typedef dynamic Left(A x);          // Left branch
-      typedef A Right(dynamic x);         // Right branch
-      typedef A Bottom(A x);              // Bottom of the lattice
+  void test_functionModifiers_syncStar() {
+    checkFile('''
+dynamic x;
 
-      void main() {
-        Top top;
-        Left left;
-        Right right;
-        Bottom bot;
-        {
-          Top f;
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Left f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/right;
-          f = bot;
-        }
-        {
-          Right f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Bottom f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/right;
-          f = bot;
-        }
-      }
-   ''');
-    });
+bar1() sync* { yield x; }
+Iterable bar2() sync* { yield x; }
+Iterable<int> bar3() sync* { yield /*info:DYNAMIC_CAST*/x; }
+Iterable<int> bar4() sync* { yield /*warning:YIELD_OF_INVALID_TYPE*/bar3(); }
 
-    test('dynamic functions - closures are not fuzzy', () {
-      // Regression test for
-      // https://github.com/dart-lang/sdk/issues/26118
-      // https://github.com/dart-lang/sdk/issues/26156
-      checkFile('''
-        void takesF(void f(int x)) {}
+baz1() sync* { yield* /*info:DYNAMIC_CAST*/x; }
+Iterable baz2() sync* { yield* /*info:DYNAMIC_CAST*/x; }
+Iterable<int> baz3() sync* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
+Iterable<int> baz4() sync* { yield* bar3(); }
+Iterable<int> baz5() sync* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new List(); }
+''');
+  }
 
-        typedef void TakesInt(int x);
+  void test_functionTypingAndSubtyping_classes() {
+    checkFile('''
+class A {}
+class B extends A {}
 
-        void update(_) {}
-        void updateOpt([_]) {}
-        void updateOptNum([num x]) {}
+typedef A Top(B x);   // Top of the lattice
+typedef B Left(B x);  // Left branch
+typedef B Left2(B x); // Left branch
+typedef A Right(A x); // Right branch
+typedef B Bot(A x);   // Bottom of the lattice
 
-        class A {
-          TakesInt f;
-          A(TakesInt g) {
-            f = update;
-            f = updateOpt;
-            f = updateOptNum;
-          }
-          TakesInt g(bool a, bool b) {
-            if (a) {
-              return update;
-            } else if (b) {
-              return updateOpt;
-            } else {
-              return updateOptNum;
-            }
-          }
-        }
+B left(B x) => x;
+B bot_(A x) => /*info:DOWN_CAST_IMPLICIT*/x;
+B bot(A x) => x as B;
+A top(B x) => x;
+A right(A x) => x;
 
-        void test0() {
-          takesF(update);
-          takesF(updateOpt);
-          takesF(updateOptNum);
-          TakesInt f;
-          f = update;
-          f = updateOpt;
-          f = updateOptNum;
-          new A(update);
-          new A(updateOpt);
-          new A(updateOptNum);
-        }
+void main() {
+  { // Check typedef equality
+    Left f = left;
+    Left2 g = f;
+  }
+  {
+    Top f;
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Left f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+  {
+    Right f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Bot f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+}
+''');
+  }
 
-        void test1() {
-          void takesF(f(int x)) => null;
-          takesF((dynamic y) => 3);
-        }
+  void test_functionTypingAndSubtyping_dynamic() {
+    checkFile('''
+class A {}
 
-        void test2() {
-          int x;
-          int f/*<T>*/(/*=T*/ t, callback(/*=T*/ x)) { return 3; }
-          f(x, (y) => 3);
-        }
-     ''');
-    });
+typedef dynamic Top(dynamic x);     // Top of the lattice
+typedef dynamic Left(A x);          // Left branch
+typedef A Right(dynamic x);         // Right branch
+typedef A Bottom(A x);              // Bottom of the lattice
 
-    test('dynamic - known functions', () {
-      // Our lattice should look like this:
-      //
-      //
-      //           Bot -> Top
-      //          /        \
-      //      A -> Top    Bot -> A
-      //       /     \      /
-      // Top -> Top   A -> A
-      //         \      /
-      //         Top -> A
-      //
-      // Note that downcasts of known functions are promoted to
-      // static type errors, since they cannot succeed.
-      // This makes some of what look like downcasts turn into
-      // type errors below.
-      checkFile('''
-        class A {}
+void main() {
+  Top top;
+  Left left;
+  Right right;
+  Bottom bot;
+  {
+    Top f;
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Left f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/right;
+    f = bot;
+  }
+  {
+    Right f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Bottom f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/right;
+    f = bot;
+  }
+}
+''');
+  }
 
-        typedef dynamic BotTop(dynamic x);
-        typedef dynamic ATop(A x);
-        typedef A BotA(dynamic x);
-        typedef A AA(A x);
-        typedef A TopA(Object x);
-        typedef dynamic TopTop(Object x);
+  void test_functionTypingAndSubtyping_dynamic_knownFunctions() {
+    // Our lattice should look like this:
+    //
+    //
+    //           Bot -> Top
+    //          /        \
+    //      A -> Top    Bot -> A
+    //       /     \      /
+    // Top -> Top   A -> A
+    //         \      /
+    //         Top -> A
+    //
+    // Note that downcasts of known functions are promoted to
+    // static type errors, since they cannot succeed.
+    // This makes some of what look like downcasts turn into
+    // type errors below.
+    checkFile('''
+class A {}
 
-        dynamic aTop(A x) => x;
-        A aa(A x) => x;
-        dynamic topTop(dynamic x) => x;
-        A topA(dynamic x) => /*info:DYNAMIC_CAST*/x;
-        void apply/*<T>*/(/*=T*/ f0, /*=T*/ f1, /*=T*/ f2,
-                          /*=T*/ f3, /*=T*/ f4, /*=T*/ f5) {}
-        void main() {
-          BotTop botTop;
-          BotA botA;
-          {
-            BotTop f;
-            f = topA;
-            f = topTop;
-            f = aa;
-            f = aTop;
-            f = botA;
-            f = botTop;
-            apply/*<BotTop>*/(
-                topA,
-                topTop,
-                aa,
-                aTop,
-                botA,
-                botTop
-                              );
-            apply/*<BotTop>*/(
-                (dynamic x) => new A(),
-                (dynamic x) => (x as Object),
-                (A x) => x,
-                (A x) => null,
-                botA,
-                botTop
-                              );
-          }
-          {
-            ATop f;
-            f = topA;
-            f = topTop;
-            f = aa;
-            f = aTop;
-            f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
-            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
-            apply/*<ATop>*/(
-                topA,
-                topTop,
-                aa,
-                aTop,
-                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-            apply/*<ATop>*/(
-                (dynamic x) => new A(),
-                (dynamic x) => (x as Object),
-                (A x) => x,
-                (A x) => null,
-                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-          }
-          {
-            BotA f;
-            f = topA;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop;
-            f = aa;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop;
-            f = botA;
-            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
-            apply/*<BotA>*/(
-                topA,
-                /*severe:STATIC_TYPE_ERROR*/topTop,
-                aa,
-                /*severe:STATIC_TYPE_ERROR*/aTop,
-                botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-            apply/*<BotA>*/(
-                (dynamic x) => new A(),
-                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
-                (A x) => x,
-                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object),
-                botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-          }
-          {
-            AA f;
-            f = topA;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop;
-            f = aa;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
-            f = /*warning:DOWN_CAST_COMPOSITE*/botA;
-            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
-            apply/*<AA>*/(
-                topA,
-                /*severe:STATIC_TYPE_ERROR*/topTop,
-                aa,
-                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
-                /*warning:DOWN_CAST_COMPOSITE*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                          );
-            apply/*<AA>*/(
-                (dynamic x) => new A(),
-                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
-                (A x) => x,
-                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
-                /*warning:DOWN_CAST_COMPOSITE*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                          );
-          }
-          {
-            TopTop f;
-            f = topA;
-            f = topTop;
-            f = /*severe:STATIC_TYPE_ERROR*/aa;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
-            f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
-            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
-            apply/*<TopTop>*/(
-                topA,
-                topTop,
-                /*severe:STATIC_TYPE_ERROR*/aa,
-                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
-                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                              );
-            apply/*<TopTop>*/(
-                (dynamic x) => new A(),
-                (dynamic x) => (x as Object),
-                /*severe:STATIC_TYPE_ERROR*/(A x) => x,
-                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
-                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                              );
-          }
-          {
-            TopA f;
-            f = topA;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop; // known function
-            f = /*severe:STATIC_TYPE_ERROR*/aa; // known function
-            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
-            f = /*warning:DOWN_CAST_COMPOSITE*/botA;
-            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
-            apply/*<TopA>*/(
-                topA,
-                /*severe:STATIC_TYPE_ERROR*/topTop, // known function
-                /*severe:STATIC_TYPE_ERROR*/aa, // known function
-                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
-                /*warning:DOWN_CAST_COMPOSITE*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-            apply/*<TopA>*/(
-                (dynamic x) => new A(),
-                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object), // known function
-                /*severe:STATIC_TYPE_ERROR*/(A x) => x, // known function
-                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
-                /*warning:DOWN_CAST_COMPOSITE*/botA,
-                /*warning:DOWN_CAST_COMPOSITE*/botTop
-                            );
-          }
-        }
-     ''');
-    });
-
-    test('function literal variance', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      typedef T Function2<S, T>(S z);
-
-      A top(B x) => x;
-      B left(B x) => x;
-      A right(A x) => x;
-      B bot(A x) => x as B;
-
-      void main() {
-        {
-          Function2<B, A> f;
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<B, B> f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-        {
-          Function2<A, A> f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<A, B> f;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-      }
-   ''');
-    });
-
-    test('function variable variance', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      typedef T Function2<S, T>(S z);
-
-      void main() {
-        {
-          Function2<B, A> top;
-          Function2<B, B> left;
-          Function2<A, A> right;
-          Function2<A, B> bot;
-
-          top = right;
-          top = bot;
-          top = top;
-          top = left;
-
-          left = /*warning:DOWN_CAST_COMPOSITE*/top;
-          left = left;
-          left = /*warning:DOWN_CAST_COMPOSITE*/right; // Should we reject this?
-          left = bot;
-
-          right = /*warning:DOWN_CAST_COMPOSITE*/top;
-          right = /*warning:DOWN_CAST_COMPOSITE*/left; // Should we reject this?
-          right = right;
-          right = bot;
-
-          bot = /*warning:DOWN_CAST_COMPOSITE*/top;
-          bot = /*warning:DOWN_CAST_COMPOSITE*/left;
-          bot = /*warning:DOWN_CAST_COMPOSITE*/right;
-          bot = bot;
-        }
-      }
-   ''');
-    });
-
-    test('static method variance', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      class C {
-        static A top(B x) => x;
-        static B left(B x) => x;
-        static A right(A x) => x;
-        static B bot(A x) => x as B;
-      }
-
-      typedef T Function2<S, T>(S z);
-
-      void main() {
-        {
-          Function2<B, A> f;
-          f = C.top;
-          f = C.left;
-          f = C.right;
-          f = C.bot;
-        }
-        {
-          Function2<B, B> f;
-          f = /*severe:STATIC_TYPE_ERROR*/C.top;
-          f = C.left;
-          f = /*severe:STATIC_TYPE_ERROR*/C.right;
-          f = C.bot;
-        }
-        {
-          Function2<A, A> f;
-          f = /*severe:STATIC_TYPE_ERROR*/C.top;
-          f = /*severe:STATIC_TYPE_ERROR*/C.left;
-          f = C.right;
-          f = C.bot;
-        }
-        {
-          Function2<A, B> f;
-          f = /*severe:STATIC_TYPE_ERROR*/C.top;
-          f = /*severe:STATIC_TYPE_ERROR*/C.left;
-          f = /*severe:STATIC_TYPE_ERROR*/C.right;
-          f = C.bot;
-        }
-      }
-   ''');
-    });
-
-    test('instance method variance', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      class C {
-        A top(B x) => x;
-        B left(B x) => x;
-        A right(A x) => x;
-        B bot(A x) => x as B;
-      }
-
-      typedef T Function2<S, T>(S z);
-
-      void main() {
-        C c = new C();
-        {
-          Function2<B, A> f;
-          f = c.top;
-          f = c.left;
-          f = c.right;
-          f = c.bot;
-        }
-        {
-          Function2<B, B> f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
-          f = c.left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.right;
-          f = c.bot;
-        }
-        {
-          Function2<A, A> f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.left;
-          f = c.right;
-          f = c.bot;
-        }
-        {
-          Function2<A, B> f;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.left;
-          f = /*warning:DOWN_CAST_COMPOSITE*/c.right;
-          f = c.bot;
-        }
-      }
-   ''');
-    });
-
-    test('higher order function literals 1', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      typedef T Function2<S, T>(S z);
-
-      typedef A BToA(B x);  // Top of the base lattice
-      typedef B AToB(A x);  // Bot of the base lattice
-
-      BToA top(AToB f) => f;
-      AToB left(AToB f) => f;
-      BToA right(BToA f) => f;
-      AToB bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
-      AToB bot(BToA f) => f as AToB;
-
-      void main() {
-        {
-          Function2<AToB, BToA> f; // Top
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<AToB, AToB> f; // Left
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-        {
-          Function2<BToA, BToA> f; // Right
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<BToA, AToB> f; // Bot
-          f = bot;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-        }
-      }
-   ''');
-    });
-
-    test('higher order function literals 2', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      typedef T Function2<S, T>(S z);
-
-      typedef A BToA(B x);  // Top of the base lattice
-      typedef B AToB(A x);  // Bot of the base lattice
-
-      Function2<B, A> top(AToB f) => f;
-      Function2<A, B> left(AToB f) => f;
-      Function2<B, A> right(BToA f) => f;
-      Function2<A, B> bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
-      Function2<A, B> bot(BToA f) => f as Function2<A, B>;
-
-      void main() {
-        {
-          Function2<AToB, BToA> f; // Top
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<AToB, AToB> f; // Left
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-        {
-          Function2<BToA, BToA> f; // Right
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<BToA, AToB> f; // Bot
-          f = bot;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-        }
-      }
-   ''');
-    });
-
-    test('higher order function literals 3', () {
-      checkFile('''
-
-      class A {}
-      class B extends A {}
-
-      typedef T Function2<S, T>(S z);
-
-      typedef A BToA(B x);  // Top of the base lattice
-      typedef B AToB(A x);  // Bot of the base lattice
-
-      BToA top(Function2<A, B> f) => f;
-      AToB left(Function2<A, B> f) => f;
-      BToA right(Function2<B, A> f) => f;
-      AToB bot_(Function2<B, A> f) => /*warning:DOWN_CAST_COMPOSITE*/f;
-      AToB bot(Function2<B, A> f) => f as AToB;
-
-      void main() {
-        {
-          Function2<AToB, BToA> f; // Top
-          f = top;
-          f = left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<AToB, AToB> f; // Left
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = left;
-          f = /*severe:STATIC_TYPE_ERROR*/right;
-          f = bot;
-        }
-        {
-          Function2<BToA, BToA> f; // Right
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = right;
-          f = bot;
-        }
-        {
-          Function2<BToA, AToB> f; // Bot
-          f = bot;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-          f = /*severe:STATIC_TYPE_ERROR*/top;
-          f = /*severe:STATIC_TYPE_ERROR*/left;
-        }
-      }
-   ''');
-    });
-
-    test('higher order function variables', () {
-      checkFile('''
-
-    class A {}
-    class B extends A {}
-
-    typedef T Function2<S, T>(S z);
+typedef dynamic BotTop(dynamic x);
+typedef dynamic ATop(A x);
+typedef A BotA(dynamic x);
+typedef A AA(A x);
+typedef A TopA(Object x);
+typedef dynamic TopTop(Object x);
 
-    void main() {
-      {
-        Function2<Function2<A, B>, Function2<B, A>> top;
-        Function2<Function2<B, A>, Function2<B, A>> right;
-        Function2<Function2<A, B>, Function2<A, B>> left;
-        Function2<Function2<B, A>, Function2<A, B>> bot;
+dynamic aTop(A x) => x;
+A aa(A x) => x;
+dynamic topTop(dynamic x) => x;
+A topA(dynamic x) => /*info:DYNAMIC_CAST*/x;
+void apply/*<T>*/(/*=T*/ f0, /*=T*/ f1, /*=T*/ f2,
+                  /*=T*/ f3, /*=T*/ f4, /*=T*/ f5) {}
+void main() {
+  BotTop botTop;
+  BotA botA;
+  {
+    BotTop f;
+    f = topA;
+    f = topTop;
+    f = aa;
+    f = aTop;
+    f = botA;
+    f = botTop;
+    apply/*<BotTop>*/(
+        topA,
+        topTop,
+        aa,
+        aTop,
+        botA,
+        botTop
+                      );
+    apply/*<BotTop>*/(
+        (dynamic x) => new A(),
+        (dynamic x) => (x as Object),
+        (A x) => x,
+        (A x) => null,
+        botA,
+        botTop
+                      );
+  }
+  {
+    ATop f;
+    f = topA;
+    f = topTop;
+    f = aa;
+    f = aTop;
+    f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
+    f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+    apply/*<ATop>*/(
+        topA,
+        topTop,
+        aa,
+        aTop,
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+    apply/*<ATop>*/(
+        (dynamic x) => new A(),
+        (dynamic x) => (x as Object),
+        (A x) => x,
+        (A x) => null,
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+  }
+  {
+    BotA f;
+    f = topA;
+    f = /*severe:STATIC_TYPE_ERROR*/topTop;
+    f = aa;
+    f = /*severe:STATIC_TYPE_ERROR*/aTop;
+    f = botA;
+    f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+    apply/*<BotA>*/(
+        topA,
+        /*severe:STATIC_TYPE_ERROR*/topTop,
+        aa,
+        /*severe:STATIC_TYPE_ERROR*/aTop,
+        botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+    apply/*<BotA>*/(
+        (dynamic x) => new A(),
+        /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
+        (A x) => x,
+        /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object),
+        botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+  }
+  {
+    AA f;
+    f = topA;
+    f = /*severe:STATIC_TYPE_ERROR*/topTop;
+    f = aa;
+    f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+    f = /*warning:DOWN_CAST_COMPOSITE*/botA;
+    f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+    apply/*<AA>*/(
+        topA,
+        /*severe:STATIC_TYPE_ERROR*/topTop,
+        aa,
+        /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+        /*warning:DOWN_CAST_COMPOSITE*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                  );
+    apply/*<AA>*/(
+        (dynamic x) => new A(),
+        /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
+        (A x) => x,
+        /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+        /*warning:DOWN_CAST_COMPOSITE*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                  );
+  }
+  {
+    TopTop f;
+    f = topA;
+    f = topTop;
+    f = /*severe:STATIC_TYPE_ERROR*/aa;
+    f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+    f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
+    f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+    apply/*<TopTop>*/(
+        topA,
+        topTop,
+        /*severe:STATIC_TYPE_ERROR*/aa,
+        /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                      );
+    apply/*<TopTop>*/(
+        (dynamic x) => new A(),
+        (dynamic x) => (x as Object),
+        /*severe:STATIC_TYPE_ERROR*/(A x) => x,
+        /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                      );
+  }
+  {
+    TopA f;
+    f = topA;
+    f = /*severe:STATIC_TYPE_ERROR*/topTop; // known function
+    f = /*severe:STATIC_TYPE_ERROR*/aa; // known function
+    f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+    f = /*warning:DOWN_CAST_COMPOSITE*/botA;
+    f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+    apply/*<TopA>*/(
+        topA,
+        /*severe:STATIC_TYPE_ERROR*/topTop, // known function
+        /*severe:STATIC_TYPE_ERROR*/aa, // known function
+        /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+        /*warning:DOWN_CAST_COMPOSITE*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+    apply/*<TopA>*/(
+        (dynamic x) => new A(),
+        /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object), // known function
+        /*severe:STATIC_TYPE_ERROR*/(A x) => x, // known function
+        /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+        /*warning:DOWN_CAST_COMPOSITE*/botA,
+        /*warning:DOWN_CAST_COMPOSITE*/botTop
+                    );
+  }
+}
+''');
+  }
 
-        top = right;
-        top = bot;
-        top = top;
-        top = left;
+  void test_functionTypingAndSubtyping_dynamicFunctions_clasuresAreNotFuzzy() {
+    // Regression test for
+    // https://github.com/dart-lang/sdk/issues/26118
+    // https://github.com/dart-lang/sdk/issues/26156
+    checkFile('''
+void takesF(void f(int x)) {}
 
-        left = /*warning:DOWN_CAST_COMPOSITE*/top;
-        left = left;
-        left =
-            /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/right;
-        left = bot;
+typedef void TakesInt(int x);
 
-        right = /*warning:DOWN_CAST_COMPOSITE*/top;
-        right =
-            /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/left;
-        right = right;
-        right = bot;
+void update(_) {}
+void updateOpt([_]) {}
+void updateOptNum([num x]) {}
 
-        bot = /*warning:DOWN_CAST_COMPOSITE*/top;
-        bot = /*warning:DOWN_CAST_COMPOSITE*/left;
-        bot = /*warning:DOWN_CAST_COMPOSITE*/right;
-        bot = bot;
-      }
+class A {
+  TakesInt f;
+  A(TakesInt g) {
+    f = update;
+    f = updateOpt;
+    f = updateOptNum;
+  }
+  TakesInt g(bool a, bool b) {
+    if (a) {
+      return update;
+    } else if (b) {
+      return updateOpt;
+    } else {
+      return updateOptNum;
     }
-   ''');
-    });
+  }
+}
 
-    test('named and optional parameters', () {
-      checkFile('''
+void test0() {
+  takesF(update);
+  takesF(updateOpt);
+  takesF(updateOptNum);
+  TakesInt f;
+  f = update;
+  f = updateOpt;
+  f = updateOptNum;
+  new A(update);
+  new A(updateOpt);
+  new A(updateOptNum);
+}
 
-      class A {}
+void test1() {
+  void takesF(f(int x)) => null;
+  takesF((dynamic y) => 3);
+}
 
-      typedef A FR(A x);
-      typedef A FO([A x]);
-      typedef A FN({A x});
-      typedef A FRR(A x, A y);
-      typedef A FRO(A x, [A y]);
-      typedef A FRN(A x, {A n});
-      typedef A FOO([A x, A y]);
-      typedef A FNN({A x, A y});
-      typedef A FNNN({A z, A y, A x});
+void test2() {
+  int x;
+  int f/*<T>*/(/*=T*/ t, callback(/*=T*/ x)) { return 3; }
+  f(x, (y) => 3);
+}
+''');
+  }
 
-      void main() {
-         FR r;
-         FO o;
-         FN n;
-         FRR rr;
-         FRO ro;
-         FRN rn;
-         FOO oo;
-         FNN nn;
-         FNNN nnn;
-
-         r = r;
-         r = o;
-         r = /*warning:INVALID_ASSIGNMENT*/n;
-         r = /*warning:INVALID_ASSIGNMENT*/rr;
-         r = ro;
-         r = rn;
-         r = oo;
-         r = /*warning:INVALID_ASSIGNMENT*/nn;
-         r = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         o = /*warning:DOWN_CAST_COMPOSITE*/r;
-         o = o;
-         o = /*warning:INVALID_ASSIGNMENT*/n;
-         o = /*warning:INVALID_ASSIGNMENT*/rr;
-         o = /*warning:INVALID_ASSIGNMENT*/ro;
-         o = /*warning:INVALID_ASSIGNMENT*/rn;
-         o = oo;
-         o = /*warning:INVALID_ASSIGNMENT*/nn;
-         o = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         n = /*warning:INVALID_ASSIGNMENT*/r;
-         n = /*warning:INVALID_ASSIGNMENT*/o;
-         n = n;
-         n = /*warning:INVALID_ASSIGNMENT*/rr;
-         n = /*warning:INVALID_ASSIGNMENT*/ro;
-         n = /*warning:INVALID_ASSIGNMENT*/rn;
-         n = /*warning:INVALID_ASSIGNMENT*/oo;
-         n = nn;
-         n = nnn;
-
-         rr = /*warning:INVALID_ASSIGNMENT*/r;
-         rr = /*warning:INVALID_ASSIGNMENT*/o;
-         rr = /*warning:INVALID_ASSIGNMENT*/n;
-         rr = rr;
-         rr = ro;
-         rr = /*warning:INVALID_ASSIGNMENT*/rn;
-         rr = oo;
-         rr = /*warning:INVALID_ASSIGNMENT*/nn;
-         rr = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         ro = /*warning:DOWN_CAST_COMPOSITE*/r;
-         ro = /*warning:INVALID_ASSIGNMENT*/o;
-         ro = /*warning:INVALID_ASSIGNMENT*/n;
-         ro = /*warning:DOWN_CAST_COMPOSITE*/rr;
-         ro = ro;
-         ro = /*warning:INVALID_ASSIGNMENT*/rn;
-         ro = oo;
-         ro = /*warning:INVALID_ASSIGNMENT*/nn;
-         ro = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         rn = /*warning:DOWN_CAST_COMPOSITE*/r;
-         rn = /*warning:INVALID_ASSIGNMENT*/o;
-         rn = /*warning:INVALID_ASSIGNMENT*/n;
-         rn = /*warning:INVALID_ASSIGNMENT*/rr;
-         rn = /*warning:INVALID_ASSIGNMENT*/ro;
-         rn = rn;
-         rn = /*warning:INVALID_ASSIGNMENT*/oo;
-         rn = /*warning:INVALID_ASSIGNMENT*/nn;
-         rn = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         oo = /*warning:DOWN_CAST_COMPOSITE*/r;
-         oo = /*warning:DOWN_CAST_COMPOSITE*/o;
-         oo = /*warning:INVALID_ASSIGNMENT*/n;
-         oo = /*warning:DOWN_CAST_COMPOSITE*/rr;
-         oo = /*warning:DOWN_CAST_COMPOSITE*/ro;
-         oo = /*warning:INVALID_ASSIGNMENT*/rn;
-         oo = oo;
-         oo = /*warning:INVALID_ASSIGNMENT*/nn;
-         oo = /*warning:INVALID_ASSIGNMENT*/nnn;
-
-         nn = /*warning:INVALID_ASSIGNMENT*/r;
-         nn = /*warning:INVALID_ASSIGNMENT*/o;
-         nn = /*warning:DOWN_CAST_COMPOSITE*/n;
-         nn = /*warning:INVALID_ASSIGNMENT*/rr;
-         nn = /*warning:INVALID_ASSIGNMENT*/ro;
-         nn = /*warning:INVALID_ASSIGNMENT*/rn;
-         nn = /*warning:INVALID_ASSIGNMENT*/oo;
-         nn = nn;
-         nn = nnn;
-
-         nnn = /*warning:INVALID_ASSIGNMENT*/r;
-         nnn = /*warning:INVALID_ASSIGNMENT*/o;
-         nnn = /*warning:DOWN_CAST_COMPOSITE*/n;
-         nnn = /*warning:INVALID_ASSIGNMENT*/rr;
-         nnn = /*warning:INVALID_ASSIGNMENT*/ro;
-         nnn = /*warning:INVALID_ASSIGNMENT*/rn;
-         nnn = /*warning:INVALID_ASSIGNMENT*/oo;
-         nnn = /*warning:DOWN_CAST_COMPOSITE*/nn;
-         nnn = nnn;
-      }
-   ''');
-    });
-
-    test('Function subtyping: objects with call methods', () {
-      checkFile('''
-
-      typedef int I2I(int x);
-      typedef num N2N(num x);
-      class A {
-         int call(int x) => x;
-      }
-      class B {
-         num call(num x) => x;
-      }
-      int i2i(int x) => x;
-      num n2n(num x) => x;
-      void main() {
-         {
-           I2I f;
-           f = new A();
-           f = /*warning:INVALID_ASSIGNMENT*/new B();
-           f = i2i;
-           f = /*severe:STATIC_TYPE_ERROR*/n2n;
-           f = /*warning:DOWN_CAST_COMPOSITE*/i2i as Object;
-           f = /*warning:DOWN_CAST_COMPOSITE*/n2n as Function;
-         }
-         {
-           N2N f;
-           f = /*warning:INVALID_ASSIGNMENT*/new A();
-           f = new B();
-           f = /*severe:STATIC_TYPE_ERROR*/i2i;
-           f = n2n;
-           f = /*warning:DOWN_CAST_COMPOSITE*/i2i as Object;
-           f = /*warning:DOWN_CAST_COMPOSITE*/n2n as Function;
-         }
-         {
-           A f;
-           f = new A();
-           f = /*warning:INVALID_ASSIGNMENT*/new B();
-           f = /*warning:INVALID_ASSIGNMENT*/i2i;
-           f = /*warning:INVALID_ASSIGNMENT*/n2n;
-           f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
-           f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
-         }
-         {
-           B f;
-           f = /*warning:INVALID_ASSIGNMENT*/new A();
-           f = new B();
-           f = /*warning:INVALID_ASSIGNMENT*/i2i;
-           f = /*warning:INVALID_ASSIGNMENT*/n2n;
-           f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
-           f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
-         }
-         {
-           Function f;
-           f = new A();
-           f = new B();
-           f = i2i;
-           f = n2n;
-           f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
-           f = (n2n as Function);
-         }
-      }
-   ''');
-    });
-
-    test('void', () {
-      checkFile('''
-
-      class A {
-        void bar() => null;
-        void foo() => bar(); // allowed
-      }
-   ''');
-    });
-
-    test('uninferred closure', () {
-      checkFile('''
-        typedef num Num2Num(num x);
-        void main() {
-          Num2Num g = /*info:INFERRED_TYPE_CLOSURE,severe:STATIC_TYPE_ERROR*/(int x) { return x; };
-          print(g(42));
-        }
-      ''');
-    });
-
-    test('subtype of universal type', () {
-      checkFile('''
-        void main() {
-          nonGenericFn(x) => null;
-          {
-            /*=R*/ f/*<P, R>*/(/*=P*/ p) => null;
-            /*=T*/ g/*<S, T>*/(/*=S*/ s) => null;
-
-            var local = f;
-            local = g; // valid
-
-            // Non-generic function cannot subtype a generic one.
-            local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
-            local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
-          }
-          {
-            Iterable/*<R>*/ f/*<P, R>*/(List/*<P>*/ p) => null;
-            List/*<T>*/ g/*<S, T>*/(Iterable/*<S>*/ s) => null;
-
-            var local = f;
-            local = g; // valid
-
-            var local2 = g;
-            local = local2;
-            local2 = /*severe:STATIC_TYPE_ERROR*/f;
-            local2 = /*warning:DOWN_CAST_COMPOSITE*/local;
-
-            // Non-generic function cannot subtype a generic one.
-            local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
-            local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
-          }
-        }
-      ''');
-    });
-  });
-
-  test('Relaxed casts', () {
+  void test_functionTypingAndSubtyping_functionLiteralVariance() {
     checkFile('''
+class A {}
+class B extends A {}
 
-      class A {}
+typedef T Function2<S, T>(S z);
 
-      class L<T> {}
-      class M<T> extends L<T> {}
-      //     L<dynamic|Object>
-      //    /              \
-      // M<dynamic|Object>  L<A>
-      //    \              /
-      //          M<A>
-      // In normal Dart, there are additional edges
-      //  from M<A> to M<dynamic>
-      //  from L<A> to M<dynamic>
-      //  from L<A> to L<dynamic>
-      void main() {
-        L lOfDs;
-        L<Object> lOfOs;
-        L<A> lOfAs;
+A top(B x) => x;
+B left(B x) => x;
+A right(A x) => x;
+B bot(A x) => x as B;
 
-        M mOfDs;
-        M<Object> mOfOs;
-        M<A> mOfAs;
+void main() {
+  {
+    Function2<B, A> f;
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<B, B> f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+  {
+    Function2<A, A> f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<A, B> f;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+}
+''');
+  }
 
-        {
-          lOfDs = mOfDs;
-          lOfDs = mOfOs;
-          lOfDs = mOfAs;
-          lOfDs = lOfDs;
-          lOfDs = lOfOs;
-          lOfDs = lOfAs;
-          lOfDs = new L(); // Reset type propagation.
-        }
-        {
-          lOfOs = mOfDs;
-          lOfOs = mOfOs;
-          lOfOs = mOfAs;
-          lOfOs = lOfDs;
-          lOfOs = lOfOs;
-          lOfOs = lOfAs;
-          lOfOs = new L<Object>(); // Reset type propagation.
-        }
-        {
-          lOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
-          lOfAs = /*warning:INVALID_ASSIGNMENT*/mOfOs;
-          lOfAs = mOfAs;
-          lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
-          lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
-          lOfAs = lOfAs;
-          lOfAs = new L<A>(); // Reset type propagation.
-        }
-        {
-          mOfDs = mOfDs;
-          mOfDs = mOfOs;
-          mOfDs = mOfAs;
-          mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
-          mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
-          mOfDs = /*warning:DOWN_CAST_COMPOSITE*/lOfAs;
-          mOfDs = new M(); // Reset type propagation.
-        }
-        {
-          mOfOs = mOfDs;
-          mOfOs = mOfOs;
-          mOfOs = mOfAs;
-          mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
-          mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
-          mOfOs = /*warning:INVALID_ASSIGNMENT*/lOfAs;
-          mOfOs = new M<Object>(); // Reset type propagation.
-        }
-        {
-          mOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
-          mOfAs = /*info:DOWN_CAST_IMPLICIT*/mOfOs;
-          mOfAs = mOfAs;
-          mOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
-          mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
-          mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfAs;
-        }
-      }
-   ''');
-  });
-
-  test('Type checking literals', () {
+  void test_functionTypingAndSubtyping_functionVariableVariance() {
     checkFile('''
-          test() {
-            num n = 3;
-            int i = 3;
-            String s = "hello";
-            {
-               List<int> l = <int>[i];
-               l = <int>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
-               l = <int>[/*info:DOWN_CAST_IMPLICIT*/n];
-               l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
-            }
-            {
-               List l = /*info:INFERRED_TYPE_LITERAL*/[i];
-               l = /*info:INFERRED_TYPE_LITERAL*/[s];
-               l = /*info:INFERRED_TYPE_LITERAL*/[n];
-               l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s];
-            }
-            {
-               Map<String, int> m = <String, int>{s: i};
-               m = <String, int>{s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
-               m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n};
-               m = <String, int>{s: i,
-                                 s: /*info:DOWN_CAST_IMPLICIT*/n,
-                                 s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
-            }
-           // TODO(leafp): We can't currently test for key errors since the
-           // error marker binds to the entire entry.
-            {
-               Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i};
-               m = /*info:INFERRED_TYPE_LITERAL*/{s: s};
-               m = /*info:INFERRED_TYPE_LITERAL*/{s: n};
-               m = /*info:INFERRED_TYPE_LITERAL*/
-                   {s: i,
-                    s: n,
-                    s: s};
-               m = /*info:INFERRED_TYPE_LITERAL*/
-                   {i: s,
-                    n: s,
-                    s: s};
-            }
-          }
-   ''');
-  });
+class A {}
+class B extends A {}
 
-  test('casts in constant contexts', () {
+typedef T Function2<S, T>(S z);
+
+void main() {
+  {
+    Function2<B, A> top;
+    Function2<B, B> left;
+    Function2<A, A> right;
+    Function2<A, B> bot;
+
+    top = right;
+    top = bot;
+    top = top;
+    top = left;
+
+    left = /*warning:DOWN_CAST_COMPOSITE*/top;
+    left = left;
+    left = /*warning:DOWN_CAST_COMPOSITE*/right; // Should we reject this?
+    left = bot;
+
+    right = /*warning:DOWN_CAST_COMPOSITE*/top;
+    right = /*warning:DOWN_CAST_COMPOSITE*/left; // Should we reject this?
+    right = right;
+    right = bot;
+
+    bot = /*warning:DOWN_CAST_COMPOSITE*/top;
+    bot = /*warning:DOWN_CAST_COMPOSITE*/left;
+    bot = /*warning:DOWN_CAST_COMPOSITE*/right;
+    bot = bot;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_higherOrderFunctionLiteral1() {
     checkFile('''
-          class A {
-            static const num n = 3.0;
-            // The severe error is from constant evaluation where we know the
-            // concrete type.
-            static const int /*severe:VARIABLE_TYPE_MISMATCH*/i = /*info:ASSIGNMENT_CAST*/n;
-            final int fi;
-            const A(num a) : this.fi = /*info:DOWN_CAST_IMPLICIT*/a;
-          }
-          class B extends A {
-            const B(Object a) : super(/*info:DOWN_CAST_IMPLICIT*/a);
-          }
-          void foo(Object o) {
-            var a = const A(/*info:DOWN_CAST_IMPLICIT, severe:CONST_WITH_NON_CONSTANT_ARGUMENT, severe:INVALID_CONSTANT*/o);
-          }
-     ''');
-  });
+class A {}
+class B extends A {}
 
-  test('casts in conditionals', () {
+typedef T Function2<S, T>(S z);
+
+typedef A BToA(B x);  // Top of the base lattice
+typedef B AToB(A x);  // Bot of the base lattice
+
+BToA top(AToB f) => f;
+AToB left(AToB f) => f;
+BToA right(BToA f) => f;
+AToB bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
+AToB bot(BToA f) => f as AToB;
+
+void main() {
+  {
+    Function2<AToB, BToA> f; // Top
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<AToB, AToB> f; // Left
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+  {
+    Function2<BToA, BToA> f; // Right
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<BToA, AToB> f; // Bot
+    f = bot;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_higherOrderFunctionLiteral2() {
     checkFile('''
-          main() {
-            bool b = true;
-            num x = b ? 1 : 2.3;
-            int y = /*info:ASSIGNMENT_CAST*/b ? 1 : 2.3;
-            String z = !b ? "hello" : null;
-            z = b ? null : "hello";
-          }
-      ''');
-  });
+class A {}
+class B extends A {}
 
-  // This is a regression test for https://github.com/dart-lang/sdk/issues/25071
-  test('unbound redirecting constructor', () {
+typedef T Function2<S, T>(S z);
+
+typedef A BToA(B x);  // Top of the base lattice
+typedef B AToB(A x);  // Bot of the base lattice
+
+Function2<B, A> top(AToB f) => f;
+Function2<A, B> left(AToB f) => f;
+Function2<B, A> right(BToA f) => f;
+Function2<A, B> bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
+Function2<A, B> bot(BToA f) => f as Function2<A, B>;
+
+void main() {
+  {
+    Function2<AToB, BToA> f; // Top
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<AToB, AToB> f; // Left
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+  {
+    Function2<BToA, BToA> f; // Right
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<BToA, AToB> f; // Bot
+    f = bot;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_higherOrderFunctionLiteral3() {
     checkFile('''
-      class Foo {
-        Foo() : /*severe:REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR*/this.init();
-      }
-       ''');
-  });
+class A {}
+class B extends A {}
 
-  test('redirecting constructor', () {
+typedef T Function2<S, T>(S z);
+
+typedef A BToA(B x);  // Top of the base lattice
+typedef B AToB(A x);  // Bot of the base lattice
+
+BToA top(Function2<A, B> f) => f;
+AToB left(Function2<A, B> f) => f;
+BToA right(Function2<B, A> f) => f;
+AToB bot_(Function2<B, A> f) => /*warning:DOWN_CAST_COMPOSITE*/f;
+AToB bot(Function2<B, A> f) => f as AToB;
+
+void main() {
+  {
+    Function2<AToB, BToA> f; // Top
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<AToB, AToB> f; // Left
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = left;
+    f = /*severe:STATIC_TYPE_ERROR*/right;
+    f = bot;
+  }
+  {
+    Function2<BToA, BToA> f; // Right
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = right;
+    f = bot;
+  }
+  {
+    Function2<BToA, AToB> f; // Bot
+    f = bot;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+    f = /*severe:STATIC_TYPE_ERROR*/top;
+    f = /*severe:STATIC_TYPE_ERROR*/left;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_higherOrderFunctionVariables() {
     checkFile('''
-          class A {
-            A(A x) {}
-            A.two() : this(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
-          }
-       ''');
-  });
+class A {}
+class B extends A {}
 
-  test('super constructor', () {
+typedef T Function2<S, T>(S z);
+
+void main() {
+  {
+    Function2<Function2<A, B>, Function2<B, A>> top;
+    Function2<Function2<B, A>, Function2<B, A>> right;
+    Function2<Function2<A, B>, Function2<A, B>> left;
+    Function2<Function2<B, A>, Function2<A, B>> bot;
+
+    top = right;
+    top = bot;
+    top = top;
+    top = left;
+
+    left = /*warning:DOWN_CAST_COMPOSITE*/top;
+    left = left;
+    left =
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/right;
+    left = bot;
+
+    right = /*warning:DOWN_CAST_COMPOSITE*/top;
+    right =
+        /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/left;
+    right = right;
+    right = bot;
+
+    bot = /*warning:DOWN_CAST_COMPOSITE*/top;
+    bot = /*warning:DOWN_CAST_COMPOSITE*/left;
+    bot = /*warning:DOWN_CAST_COMPOSITE*/right;
+    bot = bot;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_instanceMethodVariance() {
     checkFile('''
-          class A { A(A x) {} }
-          class B extends A {
-            B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
-          }
-       ''');
-  });
+class A {}
+class B extends A {}
 
-  test('factory constructor downcast', () {
+class C {
+  A top(B x) => x;
+  B left(B x) => x;
+  A right(A x) => x;
+  B bot(A x) => x as B;
+}
+
+typedef T Function2<S, T>(S z);
+
+void main() {
+  C c = new C();
+  {
+    Function2<B, A> f;
+    f = c.top;
+    f = c.left;
+    f = c.right;
+    f = c.bot;
+  }
+  {
+    Function2<B, B> f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
+    f = c.left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.right;
+    f = c.bot;
+  }
+  {
+    Function2<A, A> f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.left;
+    f = c.right;
+    f = c.bot;
+  }
+  {
+    Function2<A, B> f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/c.right;
+    f = c.bot;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_intAndObject() {
+    checkFile('''
+typedef Object Top(int x);      // Top of the lattice
+typedef int Left(int x);        // Left branch
+typedef int Left2(int x);       // Left branch
+typedef Object Right(Object x); // Right branch
+typedef int Bot(Object x);      // Bottom of the lattice
+
+Object globalTop(int x) => x;
+int globalLeft(int x) => x;
+Object globalRight(Object x) => x;
+int bot_(Object x) => /*info:DOWN_CAST_IMPLICIT*/x;
+int globalBot(Object x) => x as int;
+
+void main() {
+  // Note: use locals so we only know the type, not that it's a specific
+  // function declaration. (we can issue better errors in that case.)
+  var top = globalTop;
+  var left = globalLeft;
+  var right = globalRight;
+  var bot = globalBot;
+
+  { // Check typedef equality
+    Left f = left;
+    Left2 g = f;
+  }
+  {
+    Top f;
+    f = top;
+    f = left;
+    f = right;
+    f = bot;
+  }
+  {
+    Left f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/right; // Should we reject this?
+    f = bot;
+  }
+  {
+    Right f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/left; // Should we reject this?
+    f = right;
+    f = bot;
+  }
+  {
+    Bot f;
+    f = /*warning:DOWN_CAST_COMPOSITE*/top;
+    f = /*warning:DOWN_CAST_COMPOSITE*/left;
+    f = /*warning:DOWN_CAST_COMPOSITE*/right;
+    f = bot;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_namedAndOptionalParameters() {
+    checkFile('''
+class A {}
+
+typedef A FR(A x);
+typedef A FO([A x]);
+typedef A FN({A x});
+typedef A FRR(A x, A y);
+typedef A FRO(A x, [A y]);
+typedef A FRN(A x, {A n});
+typedef A FOO([A x, A y]);
+typedef A FNN({A x, A y});
+typedef A FNNN({A z, A y, A x});
+
+void main() {
+   FR r;
+   FO o;
+   FN n;
+   FRR rr;
+   FRO ro;
+   FRN rn;
+   FOO oo;
+   FNN nn;
+   FNNN nnn;
+
+   r = r;
+   r = o;
+   r = /*warning:INVALID_ASSIGNMENT*/n;
+   r = /*warning:INVALID_ASSIGNMENT*/rr;
+   r = ro;
+   r = rn;
+   r = oo;
+   r = /*warning:INVALID_ASSIGNMENT*/nn;
+   r = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   o = /*warning:DOWN_CAST_COMPOSITE*/r;
+   o = o;
+   o = /*warning:INVALID_ASSIGNMENT*/n;
+   o = /*warning:INVALID_ASSIGNMENT*/rr;
+   o = /*warning:INVALID_ASSIGNMENT*/ro;
+   o = /*warning:INVALID_ASSIGNMENT*/rn;
+   o = oo;
+   o = /*warning:INVALID_ASSIGNMENT*/nn;
+   o = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   n = /*warning:INVALID_ASSIGNMENT*/r;
+   n = /*warning:INVALID_ASSIGNMENT*/o;
+   n = n;
+   n = /*warning:INVALID_ASSIGNMENT*/rr;
+   n = /*warning:INVALID_ASSIGNMENT*/ro;
+   n = /*warning:INVALID_ASSIGNMENT*/rn;
+   n = /*warning:INVALID_ASSIGNMENT*/oo;
+   n = nn;
+   n = nnn;
+
+   rr = /*warning:INVALID_ASSIGNMENT*/r;
+   rr = /*warning:INVALID_ASSIGNMENT*/o;
+   rr = /*warning:INVALID_ASSIGNMENT*/n;
+   rr = rr;
+   rr = ro;
+   rr = /*warning:INVALID_ASSIGNMENT*/rn;
+   rr = oo;
+   rr = /*warning:INVALID_ASSIGNMENT*/nn;
+   rr = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   ro = /*warning:DOWN_CAST_COMPOSITE*/r;
+   ro = /*warning:INVALID_ASSIGNMENT*/o;
+   ro = /*warning:INVALID_ASSIGNMENT*/n;
+   ro = /*warning:DOWN_CAST_COMPOSITE*/rr;
+   ro = ro;
+   ro = /*warning:INVALID_ASSIGNMENT*/rn;
+   ro = oo;
+   ro = /*warning:INVALID_ASSIGNMENT*/nn;
+   ro = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   rn = /*warning:DOWN_CAST_COMPOSITE*/r;
+   rn = /*warning:INVALID_ASSIGNMENT*/o;
+   rn = /*warning:INVALID_ASSIGNMENT*/n;
+   rn = /*warning:INVALID_ASSIGNMENT*/rr;
+   rn = /*warning:INVALID_ASSIGNMENT*/ro;
+   rn = rn;
+   rn = /*warning:INVALID_ASSIGNMENT*/oo;
+   rn = /*warning:INVALID_ASSIGNMENT*/nn;
+   rn = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   oo = /*warning:DOWN_CAST_COMPOSITE*/r;
+   oo = /*warning:DOWN_CAST_COMPOSITE*/o;
+   oo = /*warning:INVALID_ASSIGNMENT*/n;
+   oo = /*warning:DOWN_CAST_COMPOSITE*/rr;
+   oo = /*warning:DOWN_CAST_COMPOSITE*/ro;
+   oo = /*warning:INVALID_ASSIGNMENT*/rn;
+   oo = oo;
+   oo = /*warning:INVALID_ASSIGNMENT*/nn;
+   oo = /*warning:INVALID_ASSIGNMENT*/nnn;
+
+   nn = /*warning:INVALID_ASSIGNMENT*/r;
+   nn = /*warning:INVALID_ASSIGNMENT*/o;
+   nn = /*warning:DOWN_CAST_COMPOSITE*/n;
+   nn = /*warning:INVALID_ASSIGNMENT*/rr;
+   nn = /*warning:INVALID_ASSIGNMENT*/ro;
+   nn = /*warning:INVALID_ASSIGNMENT*/rn;
+   nn = /*warning:INVALID_ASSIGNMENT*/oo;
+   nn = nn;
+   nn = nnn;
+
+   nnn = /*warning:INVALID_ASSIGNMENT*/r;
+   nnn = /*warning:INVALID_ASSIGNMENT*/o;
+   nnn = /*warning:DOWN_CAST_COMPOSITE*/n;
+   nnn = /*warning:INVALID_ASSIGNMENT*/rr;
+   nnn = /*warning:INVALID_ASSIGNMENT*/ro;
+   nnn = /*warning:INVALID_ASSIGNMENT*/rn;
+   nnn = /*warning:INVALID_ASSIGNMENT*/oo;
+   nnn = /*warning:DOWN_CAST_COMPOSITE*/nn;
+   nnn = nnn;
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_objectsWithCallMethods() {
+    checkFile('''
+typedef int I2I(int x);
+typedef num N2N(num x);
+class A {
+   int call(int x) => x;
+}
+class B {
+   num call(num x) => x;
+}
+int i2i(int x) => x;
+num n2n(num x) => x;
+void main() {
+   {
+     I2I f;
+     f = new A();
+     f = /*warning:INVALID_ASSIGNMENT*/new B();
+     f = i2i;
+     f = /*severe:STATIC_TYPE_ERROR*/n2n;
+     f = /*warning:DOWN_CAST_COMPOSITE*/i2i as Object;
+     f = /*warning:DOWN_CAST_COMPOSITE*/n2n as Function;
+   }
+   {
+     N2N f;
+     f = /*warning:INVALID_ASSIGNMENT*/new A();
+     f = new B();
+     f = /*severe:STATIC_TYPE_ERROR*/i2i;
+     f = n2n;
+     f = /*warning:DOWN_CAST_COMPOSITE*/i2i as Object;
+     f = /*warning:DOWN_CAST_COMPOSITE*/n2n as Function;
+   }
+   {
+     A f;
+     f = new A();
+     f = /*warning:INVALID_ASSIGNMENT*/new B();
+     f = /*warning:INVALID_ASSIGNMENT*/i2i;
+     f = /*warning:INVALID_ASSIGNMENT*/n2n;
+     f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
+     f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
+   }
+   {
+     B f;
+     f = /*warning:INVALID_ASSIGNMENT*/new A();
+     f = new B();
+     f = /*warning:INVALID_ASSIGNMENT*/i2i;
+     f = /*warning:INVALID_ASSIGNMENT*/n2n;
+     f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
+     f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
+   }
+   {
+     Function f;
+     f = new A();
+     f = new B();
+     f = i2i;
+     f = n2n;
+     f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
+     f = (n2n as Function);
+   }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_staticMethodVariance() {
+    checkFile('''
+class A {}
+class B extends A {}
+
+class C {
+  static A top(B x) => x;
+  static B left(B x) => x;
+  static A right(A x) => x;
+  static B bot(A x) => x as B;
+}
+
+typedef T Function2<S, T>(S z);
+
+void main() {
+  {
+    Function2<B, A> f;
+    f = C.top;
+    f = C.left;
+    f = C.right;
+    f = C.bot;
+  }
+  {
+    Function2<B, B> f;
+    f = /*severe:STATIC_TYPE_ERROR*/C.top;
+    f = C.left;
+    f = /*severe:STATIC_TYPE_ERROR*/C.right;
+    f = C.bot;
+  }
+  {
+    Function2<A, A> f;
+    f = /*severe:STATIC_TYPE_ERROR*/C.top;
+    f = /*severe:STATIC_TYPE_ERROR*/C.left;
+    f = C.right;
+    f = C.bot;
+  }
+  {
+    Function2<A, B> f;
+    f = /*severe:STATIC_TYPE_ERROR*/C.top;
+    f = /*severe:STATIC_TYPE_ERROR*/C.left;
+    f = /*severe:STATIC_TYPE_ERROR*/C.right;
+    f = C.bot;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_subtypeOfUniversalType() {
+    checkFile('''
+void main() {
+  nonGenericFn(x) => null;
+  {
+    /*=R*/ f/*<P, R>*/(/*=P*/ p) => null;
+    /*=T*/ g/*<S, T>*/(/*=S*/ s) => null;
+
+    var local = f;
+    local = g; // valid
+
+    // Non-generic function cannot subtype a generic one.
+    local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
+    local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
+  }
+  {
+    Iterable/*<R>*/ f/*<P, R>*/(List/*<P>*/ p) => null;
+    List/*<T>*/ g/*<S, T>*/(Iterable/*<S>*/ s) => null;
+
+    var local = f;
+    local = g; // valid
+
+    var local2 = g;
+    local = local2;
+    local2 = /*severe:STATIC_TYPE_ERROR*/f;
+    local2 = /*warning:DOWN_CAST_COMPOSITE*/local;
+
+    // Non-generic function cannot subtype a generic one.
+    local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
+    local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
+  }
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_uninferredClosure() {
+    checkFile('''
+typedef num Num2Num(num x);
+void main() {
+  Num2Num g = /*info:INFERRED_TYPE_CLOSURE,severe:STATIC_TYPE_ERROR*/(int x) { return x; };
+  print(g(42));
+}
+''');
+  }
+
+  void test_functionTypingAndSubtyping_void() {
+    checkFile('''
+class A {
+  void bar() => null;
+  void foo() => bar(); // allowed
+}
+''');
+  }
+
+  void test_genericClassMethodOverride() {
+    checkFile('''
+class A {}
+class B extends A {}
+
+class Base<T extends B> {
+  T foo() => null;
+}
+
+class Derived<S extends A> extends Base<B> {
+  /*severe:INVALID_METHOD_OVERRIDE*/S
+      /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/foo() => null;
+}
+
+class Derived2<S extends B> extends Base<B> {
+  S foo() => null;
+}
+''');
+  }
+
+  void test_genericFunctionWrongNumberOfArguments() {
     checkFile(r'''
-        class Animal {
-          Animal();
-          factory Animal.cat() => new Cat();
-        }
+/*=T*/ foo/*<T>*/(/*=T*/ x, /*=T*/ y) => x;
+/*=T*/ bar/*<T>*/({/*=T*/ x, /*=T*/ y}) => x;
 
-        class Cat extends Animal {}
+main() {
+  String x;
+  // resolving these shouldn't crash.
+  foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/(1, 2, 3);
+  x = foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/('1', '2', '3');
+  foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/(1);
+  x = foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/('1');
+  x = /*info:DYNAMIC_CAST*/foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/(1, 2, 3);
+  x = /*info:DYNAMIC_CAST*/foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/(1);
 
-        void main() {
-          Cat c = /*info:ASSIGNMENT_CAST*/new Animal.cat();
-          c = /*severe:STATIC_TYPE_ERROR*/new Animal();
-        }''');
-  });
+  // named arguments
+  bar(y: 1, x: 2, /*warning:UNDEFINED_NAMED_PARAMETER*/z: 3);
+  x = bar(/*warning:UNDEFINED_NAMED_PARAMETER*/z: '1', x: '2', y: '3');
+  bar(y: 1);
+  x = bar(x: '1', /*warning:UNDEFINED_NAMED_PARAMETER*/z: 42);
+  x = /*info:DYNAMIC_CAST*/bar(y: 1, x: 2, /*warning:UNDEFINED_NAMED_PARAMETER*/z: 3);
+  x = /*info:DYNAMIC_CAST*/bar(x: 1);
+}
+''');
+  }
 
-  test('field/field override', () {
+  void test_genericMethodOverride() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+class Future<T> {
+  /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null;
+}
 
-          class Base {
-            B f1;
-            B f2;
-            B f3;
-            B f4;
-          }
+class DerivedFuture<T> extends Future<T> {
+  /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null;
+}
 
-          class Child extends Base {
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
-            /*severe:INVALID_FIELD_OVERRIDE*/var f3;
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic f4;
-          }
+class DerivedFuture2<A> extends Future<A> {
+  /*=B*/ then/*<B>*/(/*=B*/ onValue(A a)) => null;
+}
 
-          class Child2 implements Base {
-            /*severe:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
-            /*severe:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
-            var f3;
-            /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic f4;
-          }
-       ''');
-  });
+class DerivedFuture3<T> extends Future<T> {
+  /*=S*/ then/*<S>*/(Object onValue(T t)) => null;
+}
 
-  test('private override', () {
-    addFile(
-        '''
-          import 'main.dart' as main;
+class DerivedFuture4<A> extends Future<A> {
+  /*=B*/ then/*<B>*/(Object onValue(A a)) => null;
+}
+''');
+  }
 
-          class Base {
-            var f1;
-            var _f2;
-            var _f3;
-            get _f4 => null;
-
-            int _m1() => null;
-          }
-
-          class GrandChild extends main.Child {
-            /*severe:INVALID_FIELD_OVERRIDE*/var _f2;
-            /*severe:INVALID_FIELD_OVERRIDE*/var _f3;
-            var _f4;
-
-            /*severe:INVALID_METHOD_OVERRIDE*/String
-                /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/_m1() => null;
-          }
-    ''',
-        name: '/helper.dart');
+  void test_getterGetterOverride() {
     checkFile('''
-          import 'helper.dart' as helper;
+class A {}
+class B extends A {}
+class C extends B {}
 
-          class Child extends helper.Base {
-            /*severe:INVALID_FIELD_OVERRIDE*/var f1;
-            var _f2;
-            var _f4;
+abstract class Base {
+  B get f1;
+  B get f2;
+  B get f3;
+  B get f4;
+}
 
-            String _m1() => null;
-          }
-    ''');
-  });
+class Child extends Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  C get f2 => null;
+  get f3 => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+}
+''');
+  }
 
-  test('getter/getter override', () {
+  void test_getterOverride_fuzzyArrows() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+typedef void ToVoid<T>(T x);
 
-          abstract class Base {
-            B get f1;
-            B get f2;
-            B get f3;
-            B get f4;
-          }
+class F {
+  ToVoid<dynamic> get f => null;
+  ToVoid<int> get g => null;
+}
 
-          class Child extends Base {
-            /*severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
-            C get f2 => null;
-            get f3 => null;
-            /*severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
-          }
-       ''');
-  });
+class G extends F {
+  ToVoid<int> get f => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/ToVoid<dynamic> get g => null;
+}
 
-  test('field/getter override', () {
+class H implements F {
+  ToVoid<int> get f => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/ToVoid<dynamic> get g => null;
+}
+''');
+  }
+
+  void test_ifForDoWhileStatementsUseBooleanConversion() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+main() {
+  dynamic dyn = 42;
+  Object obj = 42;
+  int i = 42;
+  bool b = false;
 
-          abstract class Base {
-            B f1;
-            B f2;
-            B f3;
-            B f4;
-          }
+  if (b) {}
+  if (/*info:DYNAMIC_CAST*/dyn) {}
+  if (/*info:DOWN_CAST_IMPLICIT*/obj) {}
+  if (/*warning:NON_BOOL_CONDITION*/i) {}
 
-          class Child extends Base {
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/C get f2 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/get f3 => null;
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
-          }
+  while (b) {}
+  while (/*info:DYNAMIC_CAST*/dyn) {}
+  while (/*info:DOWN_CAST_IMPLICIT*/obj) {}
+  while (/*warning:NON_BOOL_CONDITION*/i) {}
 
-          class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implements Base {
-            /*severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
-            C get f2 => null;
-            get f3 => null;
-            /*severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
-          }
-       ''');
-  });
+  do {} while (b);
+  do {} while (/*info:DYNAMIC_CAST*/dyn);
+  do {} while (/*info:DOWN_CAST_IMPLICIT*/obj);
+  do {} while (/*warning:NON_BOOL_CONDITION*/i);
 
-  test('setter/setter override', () {
+  for (;b;) {}
+  for (;/*info:DYNAMIC_CAST*/dyn;) {}
+  for (;/*info:DOWN_CAST_IMPLICIT*/obj;) {}
+  for (;/*warning:NON_BOOL_CONDITION*/i;) {}
+}
+''');
+  }
+
+  void test_invalidOverrides_baseClassOverrideToChildInterface() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+class A {}
+class B {}
 
-          abstract class Base {
-            void set f1(B value);
-            void set f2(B value);
-            void set f3(B value);
-            void set f4(B value);
-            void set f5(B value);
-          }
+abstract class I {
+    m(A a);
+}
 
-          class Child extends Base {
-            void set f1(A value) {}
-            /*severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
-            void set f3(value) {}
-            /*severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
-            set f5(B value) {}
-          }
-       ''');
-  });
+class Base {
+    m(B a) {}
+}
 
-  test('field/setter override', () {
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I {}
+''');
+  }
+
+  void test_invalidOverrides_childOverride() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+class A {}
+class B {}
 
-          class Base {
-            B f1;
-            B f2;
-            B f3;
-            B f4;
-            B f5;
-          }
+class Base {
+    A f;
+}
 
-          class Child extends Base {
-            /*severe:INVALID_FIELD_OVERRIDE*/B get f1 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/B get f2 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/B get f3 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/B get f4 => null;
-            /*severe:INVALID_FIELD_OVERRIDE*/B get f5 => null;
+class T1 extends Base {
+  /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B get
+      /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
+}
 
-            /*severe:INVALID_FIELD_OVERRIDE*/void set f1(A value) {}
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
-            /*severe:INVALID_FIELD_OVERRIDE*/void set f3(value) {}
-            /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
-            /*severe:INVALID_FIELD_OVERRIDE*/set f5(B value) {}
-          }
+class T2 extends Base {
+  /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/set f(
+      /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
+}
 
-          class Child2 implements Base {
-            B get f1 => null;
-            B get f2 => null;
-            B get f3 => null;
-            B get f4 => null;
-            B get f5 => null;
+class T3 extends Base {
+  /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/final B
+      /*warning:FINAL_NOT_INITIALIZED, warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f;
+}
+class T4 extends Base {
+  // two: one for the getter one for the setter.
+  /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
+      /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
+}
 
-            void set f1(A value) {}
-            /*severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
-            void set f3(value) {}
-            /*severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
-            set f5(B value) {}
-          }
-       ''');
-  });
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Base {
+  /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/B get
+      /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
+}
 
-  test('method override', () {
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Base {
+  /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/set f(
+      /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
+}
+
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T7 implements Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/final B
+      /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f = null;
+}
+class T8 implements Base {
+  // two: one for the getter one for the setter.
+  /*severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
+      /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
+}
+''');
+  }
+
+  void test_invalidOverrides_childOverride2() {
     checkFile('''
-          class A {}
-          class B extends A {}
-          class C extends B {}
+class A {}
+class B {}
 
-          class Base {
-            B m1(B a) => null;
-            B m2(B a) => null;
-            B m3(B a) => null;
-            B m4(B a) => null;
-            B m5(B a) => null;
-            B m6(B a) => null;
-          }
+class Base {
+    m(A a) {}
+}
 
-          class Child extends Base {
-            /*severe:INVALID_METHOD_OVERRIDE*/A m1(A value) => null;
-            /*severe:INVALID_METHOD_OVERRIDE*/C m2(C value) => null;
-            /*severe:INVALID_METHOD_OVERRIDE*/A m3(C value) => null;
-            C m4(A value) => null;
-            m5(value) => null;
-            /*severe:INVALID_METHOD_OVERRIDE*/dynamic m6(dynamic value) => null;
-          }
-       ''');
-  });
+class Test extends Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+        /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
 
-  test('method override, fuzzy arrows', () {
+  void test_invalidOverrides_classOverrideOfInterface() {
     checkFile('''
-      abstract class A {
-        bool operator ==(Object object);
-      }
+class A {}
+class B {}
 
-      class B implements A {}
+abstract class I {
+    m(A a);
+}
 
+class T1 implements I {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
 
-      class F {
-        void f(x) {}
-        void g(int x) {}
-      }
-
-      class G extends F {
-        /*severe:INVALID_METHOD_OVERRIDE*/void f(int x) {}
-        void g(dynamic x) {}
-      }
-
-      class H implements F {
-        /*severe:INVALID_METHOD_OVERRIDE*/void f(int x) {}
-        void g(dynamic x) {}
-      }
-
-      ''');
-  });
-
-  test('getter override, fuzzy arrows', () {
+  void test_invalidOverrides_doubleOverride() {
     checkFile('''
-      typedef void ToVoid<T>(T x);
-      class F {
-        ToVoid<dynamic> get f => null;
-        ToVoid<int> get g => null;
-      }
+class A {}
+class B {}
 
-      class G extends F {
-        ToVoid<int> get f => null;
-        /*severe:INVALID_METHOD_OVERRIDE*/ToVoid<dynamic> get g => null;
-      }
+class Grandparent {
+    m(A a) {}
+}
+class Parent extends Grandparent {
+    m(A a) {}
+}
 
-      class H implements F {
-        ToVoid<int> get f => null;
-        /*severe:INVALID_METHOD_OVERRIDE*/ToVoid<dynamic> get g => null;
-      }
-       ''');
-  });
+class Test extends Parent {
+    // Reported only once
+    /*severe:INVALID_METHOD_OVERRIDE*/m(
+        /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
 
-  test('setter override, fuzzy arrows', () {
+  void test_invalidOverrides_doubleOverride2() {
     checkFile('''
-      typedef void ToVoid<T>(T x);
-      class F {
-        void set f(ToVoid<dynamic> x) {}
-        void set g(ToVoid<int> x) {}
-        void set h(dynamic x) {}
-        void set i(int x) {}
-     }
+class A {}
+class B {}
 
-      class G extends F {
-        /*severe:INVALID_METHOD_OVERRIDE*/void set f(ToVoid<int> x) {}
-        void set g(ToVoid<dynamic> x) {}
-        void set h(int x) {}
-        /*severe:INVALID_METHOD_OVERRIDE*/void set i(dynamic x) {}
-      }
+class Grandparent {
+    m(A a) {}
+}
+class Parent extends Grandparent {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
 
-      class H implements F {
-        /*severe:INVALID_METHOD_OVERRIDE*/void set f(ToVoid<int> x) {}
-        void set g(ToVoid<dynamic> x) {}
-        void set h(int x) {}
-        /*severe:INVALID_METHOD_OVERRIDE*/void set i(dynamic x) {}
-      }
-       ''');
-  });
+class Test extends Parent {
+    m(B a) {}
+}
+''');
+  }
 
-  test('field override, fuzzy arrows', () {
+  void test_invalidOverrides_grandChildOverride() {
     checkFile('''
-      typedef void ToVoid<T>(T x);
-      class F {
-        final ToVoid<dynamic> f = null;
-        final ToVoid<int> g = null;
-      }
+class A {}
+class B {}
 
-      class G extends F {
-        /*severe:INVALID_FIELD_OVERRIDE*/final ToVoid<int> f = null;
-        /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
-      }
+class Grandparent {
+    m(A a) {}
+    int x;
+}
+class Parent extends Grandparent {
+}
 
-      class H implements F {
-        final ToVoid<int> f = null;
-        /*severe:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
-      }
-       ''');
-  });
+class Test extends Parent {
+    /*severe:INVALID_METHOD_OVERRIDE*/m(
+          /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+    /*severe:INVALID_FIELD_OVERRIDE*/int x;
+}
+''');
+  }
 
-  test('generic class method override', () {
+  void test_invalidOverrides_mixinOverrideOfInterface() {
     checkFile('''
-          class A {}
-          class B extends A {}
+class A {}
+class B {}
 
-          class Base<T extends B> {
-            T foo() => null;
-          }
+abstract class I {
+    m(A a);
+}
 
-          class Derived<S extends A> extends Base<B> {
-            /*severe:INVALID_METHOD_OVERRIDE*/S
-                /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/foo() => null;
-          }
+class M {
+    m(B a) {}
+}
 
-          class Derived2<S extends B> extends Base<B> {
-            S foo() => null;
-          }
-       ''');
-  });
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I {}
+''');
+  }
 
-  test('generic method override', () {
+  void test_invalidOverrides_mixinOverrideToBase() {
     checkFile('''
-          class Future<T> {
-            /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null;
-          }
+class A {}
+class B {}
 
-          class DerivedFuture<T> extends Future<T> {
-            /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null;
-          }
+class Base {
+    m(A a) {}
+    int x;
+}
 
-          class DerivedFuture2<A> extends Future<A> {
-            /*=B*/ then/*<B>*/(/*=B*/ onValue(A a)) => null;
-          }
+class M1 {
+    m(B a) {}
+}
 
-          class DerivedFuture3<T> extends Future<T> {
-            /*=S*/ then/*<S>*/(Object onValue(T t)) => null;
-          }
+class M2 {
+    int x;
+}
 
-          class DerivedFuture4<A> extends Future<A> {
-            /*=B*/ then/*<B>*/(Object onValue(A a)) => null;
-          }
-      ''');
-  });
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+    with /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base
+    with /*severe:INVALID_METHOD_OVERRIDE*/M1, /*severe:INVALID_FIELD_OVERRIDE*/M2 {}
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base
+    with /*severe:INVALID_FIELD_OVERRIDE*/M2, /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
+''');
+  }
 
-  test('generic function wrong number of arguments', () {
-    checkFile(r'''
-          /*=T*/ foo/*<T>*/(/*=T*/ x, /*=T*/ y) => x;
-          /*=T*/ bar/*<T>*/({/*=T*/ x, /*=T*/ y}) => x;
-
-          main() {
-            String x;
-            // resolving these shouldn't crash.
-            foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/(1, 2, 3);
-            x = foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/('1', '2', '3');
-            foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/(1);
-            x = foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/('1');
-            x = /*info:DYNAMIC_CAST*/foo/*warning:EXTRA_POSITIONAL_ARGUMENTS*/(1, 2, 3);
-            x = /*info:DYNAMIC_CAST*/foo/*warning:NOT_ENOUGH_REQUIRED_ARGUMENTS*/(1);
-
-            // named arguments
-            bar(y: 1, x: 2, /*warning:UNDEFINED_NAMED_PARAMETER*/z: 3);
-            x = bar(/*warning:UNDEFINED_NAMED_PARAMETER*/z: '1', x: '2', y: '3');
-            bar(y: 1);
-            x = bar(x: '1', /*warning:UNDEFINED_NAMED_PARAMETER*/z: 42);
-            x = /*info:DYNAMIC_CAST*/bar(y: 1, x: 2, /*warning:UNDEFINED_NAMED_PARAMETER*/z: 3);
-            x = /*info:DYNAMIC_CAST*/bar(x: 1);
-          }
-      ''');
-  });
-
-  test('type promotion from dynamic', () {
-    checkFile(r'''
-          f() {
-            dynamic x;
-            if (x is int) {
-              int y = x;
-              String z = /*warning:INVALID_ASSIGNMENT*/x;
-            }
-          }
-          g() {
-            Object x;
-            if (x is int) {
-              int y = x;
-              String z = /*warning:INVALID_ASSIGNMENT*/x;
-            }
-          }
-    ''');
-  });
-
-  test('unary operators', () {
+  void test_invalidOverrides_mixinOverrideToMixin() {
     checkFile('''
-      class A {
-        A operator ~() => null;
-        A operator +(int x) => null;
-        A operator -(int x) => null;
-        A operator -() => null;
-      }
+class A {}
+class B {}
 
-      foo() => new A();
+class Base {
+}
 
-      test() {
-        A a = new A();
-        var c = foo();
-        dynamic d;
+class M1 {
+    m(B a) {}
+    int x;
+}
 
-        ~a;
-        (/*info:DYNAMIC_INVOKE*/~d);
+class M2 {
+    m(A a) {}
+    int x;
+}
 
-        !/*warning:NON_BOOL_NEGATION_EXPRESSION*/a;
-        !/*info:DYNAMIC_CAST*/d;
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+    with M1,
+    /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/M2 {}
+''');
+  }
 
-        -a;
-        (/*info:DYNAMIC_INVOKE*/-d);
-
-        ++a;
-        --a;
-        (/*info:DYNAMIC_INVOKE*/++d);
-        (/*info:DYNAMIC_INVOKE*/--d);
-
-        a++;
-        a--;
-        (/*info:DYNAMIC_INVOKE*/d++);
-        (/*info:DYNAMIC_INVOKE*/d--);
-      }''');
-  });
-
-  test('binary and index operators', () {
-    checkFile('''
-          class A {
-            A operator *(B b) => null;
-            A operator /(B b) => null;
-            A operator ~/(B b) => null;
-            A operator %(B b) => null;
-            A operator +(B b) => null;
-            A operator -(B b) => null;
-            A operator <<(B b) => null;
-            A operator >>(B b) => null;
-            A operator &(B b) => null;
-            A operator ^(B b) => null;
-            A operator |(B b) => null;
-            A operator[](B b) => null;
-          }
-
-          class B {
-            A operator -(B b) => null;
-          }
-
-          foo() => new A();
-
-          test() {
-            A a = new A();
-            B b = new B();
-            var c = foo();
-            a = a * b;
-            a = a * /*info:DYNAMIC_CAST*/c;
-            a = a / b;
-            a = a ~/ b;
-            a = a % b;
-            a = a + b;
-            a = a + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
-            a = a - b;
-            b = /*warning:INVALID_ASSIGNMENT*/b - b;
-            a = a << b;
-            a = a >> b;
-            a = a & b;
-            a = a ^ b;
-            a = a | b;
-            c = (/*info:DYNAMIC_INVOKE*/c + b);
-
-            String x = 'hello';
-            int y = 42;
-            x = x + x;
-            x = x + /*info:DYNAMIC_CAST*/c;
-            x = x + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y;
-
-            bool p = true;
-            p = p && p;
-            p = p && /*info:DYNAMIC_CAST*/c;
-            p = (/*info:DYNAMIC_CAST*/c) && p;
-            p = (/*info:DYNAMIC_CAST*/c) && /*info:DYNAMIC_CAST*/c;
-            p = /*warning:NON_BOOL_OPERAND*/y && p;
-            p = c == y;
-
-            a = a[b];
-            a = a[/*info:DYNAMIC_CAST*/c];
-            c = (/*info:DYNAMIC_INVOKE*/c[b]);
-            a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y];
-          }
-       ''');
-  });
-
-  test('null coalescing operator', () {
-    checkFile('''
-          class A {}
-          class C<T> {}
-          main() {
-            A a, b;
-            a ??= new A();
-            b = b ?? new A();
-
-            // downwards inference
-            C<int> c, d;
-            c ??= /*info:INFERRED_TYPE_ALLOCATION*/new C();
-            d = d ?? /*info:INFERRED_TYPE_ALLOCATION*/new C();
-          }
-       ''');
-  });
-
-  test('compound assignments', () {
-    checkFile('''
-          class A {
-            A operator *(B b) => null;
-            A operator /(B b) => null;
-            A operator ~/(B b) => null;
-            A operator %(B b) => null;
-            A operator +(B b) => null;
-            A operator -(B b) => null;
-            A operator <<(B b) => null;
-            A operator >>(B b) => null;
-            A operator &(B b) => null;
-            A operator ^(B b) => null;
-            A operator |(B b) => null;
-            D operator [](B index) => null;
-            void operator []=(B index, D value) => null;
-          }
-
-          class B {
-            A operator -(B b) => null;
-          }
-
-          class D {
-            D operator +(D d) => null;
-          }
-
-          foo() => new A();
-
-          test() {
-            int x = 0;
-            x += 5;
-            /*severe:STATIC_TYPE_ERROR*/x += 3.14;
-
-            double y = 0.0;
-            y += 5;
-            y += 3.14;
-
-            num z = 0;
-            z += 5;
-            z += 3.14;
-
-            x = /*info:DOWN_CAST_IMPLICIT*/x + z;
-            x += /*info:DOWN_CAST_IMPLICIT*/z;
-            y = y + z;
-            y += z;
-
-            dynamic w = 42;
-            x += /*info:DYNAMIC_CAST*/w;
-            y += /*info:DYNAMIC_CAST*/w;
-            z += /*info:DYNAMIC_CAST*/w;
-
-            A a = new A();
-            B b = new B();
-            var c = foo();
-            a = a * b;
-            a *= b;
-            a *= /*info:DYNAMIC_CAST*/c;
-            a /= b;
-            a ~/= b;
-            a %= b;
-            a += b;
-            a += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
-            a -= b;
-            /*severe:STATIC_TYPE_ERROR*/b -= /*warning:INVALID_ASSIGNMENT*/b;
-            a <<= b;
-            a >>= b;
-            a &= b;
-            a ^= b;
-            a |= b;
-            /*info:DYNAMIC_INVOKE*/c += b;
-
-            var d = new D();
-            a[b] += d;
-            a[/*info:DYNAMIC_CAST*/c] += d;
-            a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z] += d;
-            a[b] += /*info:DYNAMIC_CAST*/c;
-            a[b] += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z;
-            /*info:DYNAMIC_INVOKE,info:DYNAMIC_INVOKE*/c[b] += d;
-          }
-       ''');
-  });
-
-  test('super call placement', () {
-    checkFile('''
-          class Base {
-            var x;
-            Base() : x = print('Base.1') { print('Base.2'); }
-          }
-
-          class Derived extends Base {
-            var y, z;
-            Derived()
-                : y = print('Derived.1'),
-                  /*severe:INVALID_SUPER_INVOCATION*/super(),
-                  z = print('Derived.2') {
-              print('Derived.3');
-            }
-          }
-
-          class Valid extends Base {
-            var y, z;
-            Valid()
-                : y = print('Valid.1'),
-                  z = print('Valid.2'),
-                  super() {
-              print('Valid.3');
-            }
-          }
-
-          class AlsoValid extends Base {
-            AlsoValid() : super();
-          }
-
-          main() => new Derived();
-       ''');
-  });
-
-  test('for loop variable', () {
-    checkFile('''
-          foo() {
-            for (int i = 0; i < 10; i++) {
-              i = /*warning:INVALID_ASSIGNMENT*/"hi";
-            }
-          }
-          bar() {
-            for (var i = 0; i < 10; i++) {
-              int j = i + 1;
-            }
-          }
-        ''');
-  });
-
-  test('loadLibrary', () {
-    addFile('''library lib1;''', name: '/lib1.dart');
-    checkFile(r'''
-        import 'lib1.dart' deferred as lib1;
-        import 'dart:async' show Future;
-        main() {
-          Future f = lib1.loadLibrary();
-        }''');
-  });
-
-  group('invalid overrides', () {
-    test('child override', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Base {
-                A f;
-            }
-
-            class T1 extends Base {
-              /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B get
-                  /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
-            }
-
-            class T2 extends Base {
-              /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/set f(
-                  /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
-            }
-
-            class T3 extends Base {
-              /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/final B
-                  /*warning:FINAL_NOT_INITIALIZED, warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f;
-            }
-            class T4 extends Base {
-              // two: one for the getter one for the setter.
-              /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
-                  /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
-            }
-
-            class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Base {
-              /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/B get
-                  /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
-            }
-
-            class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Base {
-              /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/set f(
-                  /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
-            }
-
-            class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T7 implements Base {
-              /*severe:INVALID_METHOD_OVERRIDE*/final B
-                  /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f = null;
-            }
-            class T8 implements Base {
-              // two: one for the getter one for the setter.
-              /*severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
-                  /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
-            }
-         ''');
-    });
-
-    test('child override 2', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Base {
-                m(A a) {}
-            }
-
-            class Test extends Base {
-              /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-            }
-         ''');
-    });
-    test('grandchild override', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Grandparent {
-                m(A a) {}
-                int x;
-            }
-            class Parent extends Grandparent {
-            }
-
-            class Test extends Parent {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-                /*severe:INVALID_FIELD_OVERRIDE*/int x;
-            }
-         ''');
-    });
-
-    test('double override', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Grandparent {
-                m(A a) {}
-            }
-            class Parent extends Grandparent {
-                m(A a) {}
-            }
-
-            class Test extends Parent {
-                // Reported only once
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-            }
-         ''');
-    });
-
-    test('double override 2', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Grandparent {
-                m(A a) {}
-            }
-            class Parent extends Grandparent {
-              /*severe:INVALID_METHOD_OVERRIDE*/m(
-                  /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-            }
-
-            class Test extends Parent {
-                m(B a) {}
-            }
-         ''');
-    });
-
-    test('mixin override to base', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Base {
-                m(A a) {}
-                int x;
-            }
-
-            class M1 {
-                m(B a) {}
-            }
-
-            class M2 {
-                int x;
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-                with /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base
-                with /*severe:INVALID_METHOD_OVERRIDE*/M1, /*severe:INVALID_FIELD_OVERRIDE*/M2 {}
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base
-                with /*severe:INVALID_FIELD_OVERRIDE*/M2, /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
-         ''');
-    });
-
-    test('mixin override to mixin', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Base {
-            }
-
-            class M1 {
-                m(B a) {}
-                int x;
-            }
-
-            class M2 {
-                m(A a) {}
-                int x;
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-                with M1,
-                /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/M2 {}
-         ''');
-    });
-
+  void test_invalidOverrides_noDuplicateMixinOverride() {
     // This is a regression test for a bug in an earlier implementation were
     // names were hiding errors if the first mixin override looked correct,
     // but subsequent ones did not.
-    test('no duplicate mixin override', () {
-      checkFile('''
-            class A {}
-            class B {}
+    checkFile('''
+class A {}
+class B {}
 
-            class Base {
-                m(A a) {}
-            }
+class Base {
+    m(A a) {}
+}
 
-            class M1 {
-                m(A a) {}
-            }
+class M1 {
+    m(A a) {}
+}
 
-            class M2 {
-                m(B a) {}
-            }
+class M2 {
+    m(B a) {}
+}
 
-            class M3 {
-                m(B a) {}
-            }
+class M3 {
+    m(B a) {}
+}
 
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-                with M1, /*severe:INVALID_METHOD_OVERRIDE*/M2, M3 {}
-         ''');
-    });
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+    with M1, /*severe:INVALID_METHOD_OVERRIDE*/M2, M3 {}
+''');
+  }
 
-    test('class override of interface', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            abstract class I {
-                m(A a);
-            }
-
-            class T1 implements I {
-              /*severe:INVALID_METHOD_OVERRIDE*/m(
-                  /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-            }
-         ''');
-    });
-
-    test('base class override to child interface', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            abstract class I {
-                m(A a);
-            }
-
-            class Base {
-                m(B a) {}
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I {}
-         ''');
-    });
-
-    test('mixin override of interface', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            abstract class I {
-                m(A a);
-            }
-
-            class M {
-                m(B a) {}
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
-                implements I {}
-         ''');
-    });
-
+  void
+      test_invalidOverrides_noErrorsIfSubclassCorrectlyOverrideBaseAndInterface() {
     // This is a case were it is incorrect to say that the base class
     // incorrectly overrides the interface.
-    test('no errors if subclass correctly overrides base and interface', () {
-      checkFile('''
-            class A {}
-            class B {}
-
-            class Base {
-                m(A a) {}
-            }
-
-            class I1 {
-                m(B a) {}
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                /*severe:INVALID_METHOD_OVERRIDE*/extends Base
-                implements I1 {}
-
-            class T2 extends Base implements I1 {
-                m(a) {}
-            }
-
-            class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3
-                extends Object with /*severe:INVALID_METHOD_OVERRIDE*/Base
-                implements I1 {}
-
-            class T4 extends Object with Base implements I1 {
-                m(a) {}
-            }
-         ''');
-    });
-  });
-
-  group('class override of grand interface', () {
-    test('interface of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 implements I1 {}
-
-              class T1 implements I2 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-    test('superclass of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 extends I1 {}
-
-              class T1 implements I2 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-    test('mixin of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class M1 {
-                  m(A a);
-              }
-              abstract class I2 extends Object with M1 {}
-
-              class T1 implements I2 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-    test('interface of abstract superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class Base implements I1 {}
-
-              class T1 extends Base {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-    test('interface of concrete superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
-                  implements I1 {}
-
-              class T1 extends Base {
-                  // not reported technically because if the class is concrete,
-                  // it should implement all its interfaces and hence it is
-                  // sufficient to check overrides against it.
-                  m(/*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-  });
-
-  group('mixin override of grand interface', () {
-    test('interface of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 implements I1 {}
-
-              class M {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
-                  implements I2 {}
-           ''');
-    });
-    test('superclass of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 extends I1 {}
-
-              class M {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
-                  implements I2 {}
-           ''');
-    });
-    test('mixin of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class M1 {
-                  m(A a);
-              }
-              abstract class I2 extends Object with M1 {}
-
-              class M {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
-                  implements I2 {}
-           ''');
-    });
-    test('interface of abstract superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class Base implements I1 {}
-
-              class M {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-                  with /*severe:INVALID_METHOD_OVERRIDE*/M {}
-           ''');
-    });
-    test('interface of concrete superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
-                  implements I1 {}
-
-              class M {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-                  with M {}
-           ''');
-    });
-  });
-
-  group('superclass override of grand interface', () {
-    test('interface of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 implements I1 {}
-
-              class Base {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I2 {}
-           ''');
-    });
-    test('superclass of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 extends I1 {}
-
-              class Base {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Base
-                  implements I2 {}
-           ''');
-    });
-    test('mixin of interface of child', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class M1 {
-                  m(A a);
-              }
-              abstract class I2 extends Object with M1 {}
-
-              class Base {
-                  m(B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Base
-                  implements I2 {}
-           ''');
-    });
-    test('interface of abstract superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              abstract class Base implements I1 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-
-              class T1 extends Base {
-                  // we consider the base class incomplete because it is
-                  // abstract, so we report the error here too.
-                  // TODO(sigmund): consider tracking overrides in a fine-grain
-                  // manner, then this and the double-overrides would not be
-                  // reported.
-                  /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
-              }
-           ''');
-    });
-    test('interface of concrete superclass', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class Base implements I1 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-
-              class T1 extends Base {
-                  m(B a) {}
-              }
-           ''');
-    });
-  });
-
-  group('no duplicate reports from overriding interfaces', () {
-    test('type overrides same method in multiple interfaces', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-              abstract class I2 implements I1 {
-                  m(A a);
-              }
-
-              class Base {}
-
-              class T1 implements I2 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-           ''');
-    });
-
-    test('type and base type override same method in interface', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class Base {
-                  m(B a) {}
-              }
-
-              // Note: no error reported in `extends Base` to avoid duplicating
-              // the error in T1.
-              class T1 extends Base implements I1 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-
-              // If there is no error in the class, we do report the error at
-              // the base class:
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Base
-                  implements I1 {}
-           ''');
-    });
-
-    test('type and mixin override same method in interface', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class M {
-                  m(B a) {}
-              }
-
-              class T1 extends Object with M implements I1 {
-                /*severe:INVALID_METHOD_OVERRIDE*/m(
-                    /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
-              }
-
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
-                  extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
-                  implements I1 {}
-           ''');
-    });
-
-    test('two grand types override same method in interface', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class Grandparent {
-                  m(B a) {}
-              }
-
-              class Parent1 extends Grandparent {
-                  m(B a) {}
-              }
-              class Parent2 extends Grandparent {}
-
-              // Note: otherwise both errors would be reported on this line
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Parent1
-                  implements I1 {}
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Parent2
-                  implements I1 {}
-           ''');
-    });
-
-    test('two mixins override same method in interface', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class M1 {
-                  m(B a) {}
-              }
-
-              class M2 {
-                  m(B a) {}
-              }
-
-              // Here we want to report both, because the error location is
-              // different.
-              // TODO(sigmund): should we merge these as well?
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object
-                  with /*severe:INVALID_METHOD_OVERRIDE*/M1,
-                  /*severe:INVALID_METHOD_OVERRIDE*/M2
-                  implements I1 {}
-           ''');
-    });
-
-    test('base type and mixin override same method in interface', () {
-      checkFile('''
-              class A {}
-              class B {}
-
-              abstract class I1 {
-                  m(A a);
-              }
-
-              class Base {
-                  m(B a) {}
-              }
-
-              class M {
-                  m(B a) {}
-              }
-
-              // Here we want to report both, because the error location is
-              // different.
-              // TODO(sigmund): should we merge these as well?
-              class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
-                  /*severe:INVALID_METHOD_OVERRIDE*/extends Base
-                  with /*severe:INVALID_METHOD_OVERRIDE*/M
-                  implements I1 {}
-           ''');
-    });
-  });
-
-  test('invalid runtime checks', () {
     checkFile('''
-          typedef int I2I(int x);
-          typedef int D2I(x);
-          typedef int II2I(int x, int y);
-          typedef int DI2I(x, int y);
-          typedef int ID2I(int x, y);
-          typedef int DD2I(x, y);
+class A {}
+class B {}
 
-          typedef I2D(int x);
-          typedef D2D(x);
-          typedef II2D(int x, int y);
-          typedef DI2D(x, int y);
-          typedef ID2D(int x, y);
-          typedef DD2D(x, y);
+class Base {
+    m(A a) {}
+}
 
-          int foo(int x) => x;
-          int bar(int x, int y) => x + y;
+class I1 {
+    m(B a) {}
+}
 
-          void main() {
-            bool b;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is I2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is D2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is I2D;
-            b = foo is D2D;
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base
+    implements I1 {}
 
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is II2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DI2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is ID2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is II2D;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DD2I;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DI2D;
-            b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is ID2D;
-            b = bar is DD2D;
+class T2 extends Base implements I1 {
+    m(a) {}
+}
 
-            // For as, the validity of checks is deferred to runtime.
-            Function f;
-            f = foo as I2I;
-            f = foo as D2I;
-            f = foo as I2D;
-            f = foo as D2D;
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/Base
+    implements I1 {}
 
-            f = bar as II2I;
-            f = bar as DI2I;
-            f = bar as ID2I;
-            f = bar as II2D;
-            f = bar as DD2I;
-            f = bar as DI2D;
-            f = bar as ID2D;
-            f = bar as DD2D;
-          }
-      ''');
-  });
+class T4 extends Object with Base implements I1 {
+    m(a) {}
+}
+''');
+  }
 
-  group('function modifiers', () {
-    test('async', () {
-      checkFile('''
-        import 'dart:async';
-        import 'dart:math' show Random;
+  void test_invalidRuntimeChecks() {
+    checkFile('''
+typedef int I2I(int x);
+typedef int D2I(x);
+typedef int II2I(int x, int y);
+typedef int DI2I(x, int y);
+typedef int ID2I(int x, y);
+typedef int DD2I(x, y);
 
-        dynamic x;
+typedef I2D(int x);
+typedef D2D(x);
+typedef II2D(int x, int y);
+typedef DI2D(x, int y);
+typedef ID2D(int x, y);
+typedef DD2D(x, y);
 
-        foo1() async => x;
-        Future foo2() async => x;
-        Future<int> foo3() async => /*info:DYNAMIC_CAST*/x;
-        Future<int> foo4() async => new Future<int>.value(/*info:DYNAMIC_CAST*/x);
-        Future<int> foo5() async =>
-            /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
+int foo(int x) => x;
+int bar(int x, int y) => x + y;
 
-        bar1() async { return x; }
-        Future bar2() async { return x; }
-        Future<int> bar3() async { return /*info:DYNAMIC_CAST*/x; }
-        Future<int> bar4() async { return new Future<int>.value(/*info:DYNAMIC_CAST*/x); }
-        Future<int> bar5() async {
-          return /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
-        }
+void main() {
+  bool b;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is I2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is D2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/foo is I2D;
+  b = foo is D2D;
 
-        int y;
-        Future<int> z;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is II2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DI2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is ID2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is II2D;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DD2I;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is DI2D;
+  b = /*info:NON_GROUND_TYPE_CHECK_INFO*/bar is ID2D;
+  b = bar is DD2D;
 
-        baz() async {
-          int a = /*info:DYNAMIC_CAST*/await x;
-          int b = await y;
-          int c = await z;
-          String d = /*warning:INVALID_ASSIGNMENT*/await z;
-        }
+  // For as, the validity of checks is deferred to runtime.
+  Function f;
+  f = foo as I2I;
+  f = foo as D2I;
+  f = foo as I2D;
+  f = foo as D2D;
 
-        Future<bool> get issue_264 async {
-          await 42;
-          if (new Random().nextBool()) {
-            return true;
-          } else {
-            return new Future<bool>.value(false);
-          }
-        }
-    ''');
-    });
+  f = bar as II2I;
+  f = bar as DI2I;
+  f = bar as ID2I;
+  f = bar as II2D;
+  f = bar as DD2I;
+  f = bar as DI2D;
+  f = bar as ID2D;
+  f = bar as DD2D;
+}
+''');
+  }
 
-    test('async*', () {
-      checkFile('''
-        import 'dart:async';
+  void test_leastUpperBounds() {
+    checkFile('''
+typedef T Returns<T>();
 
-        dynamic x;
+// regression test for https://github.com/dart-lang/sdk/issues/26094
+class A <S extends  Returns<S>, T extends Returns<T>> {
+  int test(bool b) {
+    S s;
+    T t;
+    if (b) {
+      return /*warning:RETURN_OF_INVALID_TYPE*/b ? s : t;
+    } else {
+      return /*warning:RETURN_OF_INVALID_TYPE*/s ?? t;
+    }
+  }
+}
 
-        bar1() async* { yield x; }
-        Stream bar2() async* { yield x; }
-        Stream<int> bar3() async* { yield /*info:DYNAMIC_CAST*/x; }
-        Stream<int> bar4() async* { yield /*warning:YIELD_OF_INVALID_TYPE*/new Stream<int>(); }
+class B<S, T extends S> {
+  T t;
+  S s;
+  int test(bool b) {
+    return /*warning:RETURN_OF_INVALID_TYPE*/b ? t : s;
+  }
+}
 
-        baz1() async* { yield* /*info:DYNAMIC_CAST*/x; }
-        Stream baz2() async* { yield* /*info:DYNAMIC_CAST*/x; }
-        Stream<int> baz3() async* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
-        Stream<int> baz4() async* { yield* new Stream<int>(); }
-        Stream<int> baz5() async* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new Stream(); }
-    ''');
-    });
+class C {
+  // Check that the least upper bound of two types with the same
+  // class but different type arguments produces the pointwise
+  // least upper bound of the type arguments
+  int test1(bool b) {
+    List<int> li;
+    List<double> ld;
+    return /*warning:RETURN_OF_INVALID_TYPE*/b ? li : ld;
+  }
+  // TODO(leafp): This case isn't handled yet.  This test checks
+  // the case where two related classes are instantiated with related
+  // but different types.
+  Iterable<num> test2(bool b) {
+    List<int> li;
+    Iterable<double> id;
+    int x =
+        /*info:ASSIGNMENT_CAST should be warning:INVALID_ASSIGNMENT*/
+        b ? li : id;
+    return /*warning:DOWN_CAST_COMPOSITE should be pass*/b ? li : id;
+  }
+}
+''');
+  }
 
-    test('sync*', () {
-      checkFile('''
-        dynamic x;
+  void test_loadLibrary() {
+    addFile('''library lib1;''', name: '/lib1.dart');
+    checkFile(r'''
+import 'lib1.dart' deferred as lib1;
+import 'dart:async' show Future;
+main() {
+  Future f = lib1.loadLibrary();
+}''');
+  }
 
-        bar1() sync* { yield x; }
-        Iterable bar2() sync* { yield x; }
-        Iterable<int> bar3() sync* { yield /*info:DYNAMIC_CAST*/x; }
-        Iterable<int> bar4() sync* { yield /*warning:YIELD_OF_INVALID_TYPE*/bar3(); }
+  void test_methodOverride() {
+    checkFile('''
+class A {}
+class B extends A {}
+class C extends B {}
 
-        baz1() sync* { yield* /*info:DYNAMIC_CAST*/x; }
-        Iterable baz2() sync* { yield* /*info:DYNAMIC_CAST*/x; }
-        Iterable<int> baz3() sync* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
-        Iterable<int> baz4() sync* { yield* bar3(); }
-        Iterable<int> baz5() sync* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new List(); }
-    ''');
-    });
-  });
+class Base {
+  B m1(B a) => null;
+  B m2(B a) => null;
+  B m3(B a) => null;
+  B m4(B a) => null;
+  B m5(B a) => null;
+  B m6(B a) => null;
+}
+
+class Child extends Base {
+  /*severe:INVALID_METHOD_OVERRIDE*/A m1(A value) => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/C m2(C value) => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/A m3(C value) => null;
+  C m4(A value) => null;
+  m5(value) => null;
+  /*severe:INVALID_METHOD_OVERRIDE*/dynamic m6(dynamic value) => null;
+}
+''');
+  }
+
+  void test_methodOverride_fuzzyArrows() {
+    checkFile('''
+abstract class A {
+  bool operator ==(Object object);
+}
+
+class B implements A {}
+
+class F {
+  void f(x) {}
+  void g(int x) {}
+}
+
+class G extends F {
+  /*severe:INVALID_METHOD_OVERRIDE*/void f(int x) {}
+  void g(dynamic x) {}
+}
+
+class H implements F {
+  /*severe:INVALID_METHOD_OVERRIDE*/void f(int x) {}
+  void g(dynamic x) {}
+}
+''');
+  }
+
+  void test_mixinOverrideOfGrandInterface_interfaceOfAbstractSuperclass() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class Base implements I1 {}
+
+class M {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+    with /*severe:INVALID_METHOD_OVERRIDE*/M {}
+''');
+  }
+
+  void test_mixinOverrideOfGrandInterface_interfaceOfConcreteSuperclass() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
+    implements I1 {}
+
+class M {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+    with M {}
+''');
+  }
+
+  void test_mixinOverrideOfGrandInterface_interfaceOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 implements I1 {}
+
+class M {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I2 {}
+''');
+  }
+
+  void test_mixinOverrideOfGrandInterface_mixinOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class M1 {
+    m(A a);
+}
+abstract class I2 extends Object with M1 {}
+
+class M {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I2 {}
+''');
+  }
+
+  void test_mixinOverrideOfGrandInterface_superclassOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 extends I1 {}
+
+class M {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I2 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_baseTypeAndMixinOverrideSameMethodInInterface() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class Base {
+    m(B a) {}
+}
+
+class M {
+    m(B a) {}
+}
+
+// Here we want to report both, because the error location is
+// different.
+// TODO(sigmund): should we merge these as well?
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base
+    with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I1 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_twoGrandTypesOverrideSameMethodInInterface() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class Grandparent {
+    m(B a) {}
+}
+
+class Parent1 extends Grandparent {
+    m(B a) {}
+}
+class Parent2 extends Grandparent {}
+
+// Note: otherwise both errors would be reported on this line
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Parent1
+    implements I1 {}
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Parent2
+    implements I1 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_twoMixinsOverrideSameMethodInInterface() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class M1 {
+    m(B a) {}
+}
+
+class M2 {
+    m(B a) {}
+}
+
+// Here we want to report both, because the error location is
+// different.
+// TODO(sigmund): should we merge these as well?
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object
+    with /*severe:INVALID_METHOD_OVERRIDE*/M1,
+    /*severe:INVALID_METHOD_OVERRIDE*/M2
+    implements I1 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_typeAndBaseTypeOverrideSameMethodInInterface() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class Base {
+    m(B a) {}
+}
+
+// Note: no error reported in `extends Base` to avoid duplicating
+// the error in T1.
+class T1 extends Base implements I1 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+
+// If there is no error in the class, we do report the error at
+// the base class:
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base
+    implements I1 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_typeAndMixinOverrideSameMethodInInterface() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class M {
+    m(B a) {}
+}
+
+class T1 extends Object with M implements I1 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
+    extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
+    implements I1 {}
+''');
+  }
+
+  void
+      test_noDuplicateReportsFromOverridingInterfaces_typeOverridesSomeMethodInMultipleInterfaces() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 implements I1 {
+    m(A a);
+}
+
+class Base {}
+
+class T1 implements I2 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+''');
+  }
+
+  void test_nullCoalescingOperator() {
+    checkFile('''
+class A {}
+class C<T> {}
+main() {
+  A a, b;
+  a ??= new A();
+  b = b ?? new A();
+
+  // downwards inference
+  C<int> c, d;
+  c ??= /*info:INFERRED_TYPE_ALLOCATION*/new C();
+  d = d ?? /*info:INFERRED_TYPE_ALLOCATION*/new C();
+}
+''');
+  }
+
+  void test_privateOverride() {
+    addFile(
+        '''
+import 'main.dart' as main;
+
+class Base {
+  var f1;
+  var _f2;
+  var _f3;
+  get _f4 => null;
+
+  int _m1() => null;
+}
+
+class GrandChild extends main.Child {
+  /*severe:INVALID_FIELD_OVERRIDE*/var _f2;
+  /*severe:INVALID_FIELD_OVERRIDE*/var _f3;
+  var _f4;
+
+  /*severe:INVALID_METHOD_OVERRIDE*/String
+      /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/_m1() => null;
+}
+''',
+        name: '/helper.dart');
+    checkFile('''
+import 'helper.dart' as helper;
+
+class Child extends helper.Base {
+  /*severe:INVALID_FIELD_OVERRIDE*/var f1;
+  var _f2;
+  var _f4;
+
+  String _m1() => null;
+}
+''');
+  }
+
+  void test_redirectingConstructor() {
+    checkFile('''
+class A {
+  A(A x) {}
+  A.two() : this(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+}
+''');
+  }
+
+  void test_relaxedCasts() {
+    checkFile('''
+class A {}
+
+class L<T> {}
+class M<T> extends L<T> {}
+//     L<dynamic|Object>
+//    /              \
+// M<dynamic|Object>  L<A>
+//    \              /
+//          M<A>
+// In normal Dart, there are additional edges
+//  from M<A> to M<dynamic>
+//  from L<A> to M<dynamic>
+//  from L<A> to L<dynamic>
+void main() {
+  L lOfDs;
+  L<Object> lOfOs;
+  L<A> lOfAs;
+
+  M mOfDs;
+  M<Object> mOfOs;
+  M<A> mOfAs;
+
+  {
+    lOfDs = mOfDs;
+    lOfDs = mOfOs;
+    lOfDs = mOfAs;
+    lOfDs = lOfDs;
+    lOfDs = lOfOs;
+    lOfDs = lOfAs;
+    lOfDs = new L(); // Reset type propagation.
+  }
+  {
+    lOfOs = mOfDs;
+    lOfOs = mOfOs;
+    lOfOs = mOfAs;
+    lOfOs = lOfDs;
+    lOfOs = lOfOs;
+    lOfOs = lOfAs;
+    lOfOs = new L<Object>(); // Reset type propagation.
+  }
+  {
+    lOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
+    lOfAs = /*warning:INVALID_ASSIGNMENT*/mOfOs;
+    lOfAs = mOfAs;
+    lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
+    lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
+    lOfAs = lOfAs;
+    lOfAs = new L<A>(); // Reset type propagation.
+  }
+  {
+    mOfDs = mOfDs;
+    mOfDs = mOfOs;
+    mOfDs = mOfAs;
+    mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
+    mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
+    mOfDs = /*warning:DOWN_CAST_COMPOSITE*/lOfAs;
+    mOfDs = new M(); // Reset type propagation.
+  }
+  {
+    mOfOs = mOfDs;
+    mOfOs = mOfOs;
+    mOfOs = mOfAs;
+    mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
+    mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
+    mOfOs = /*warning:INVALID_ASSIGNMENT*/lOfAs;
+    mOfOs = new M<Object>(); // Reset type propagation.
+  }
+  {
+    mOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
+    mOfAs = /*info:DOWN_CAST_IMPLICIT*/mOfOs;
+    mOfAs = mOfAs;
+    mOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
+    mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
+    mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfAs;
+  }
+}
+''');
+  }
+
+  void test_setterOverride_fuzzyArrows() {
+    checkFile('''
+typedef void ToVoid<T>(T x);
+class F {
+  void set f(ToVoid<dynamic> x) {}
+  void set g(ToVoid<int> x) {}
+  void set h(dynamic x) {}
+  void set i(int x) {}
+}
+
+class G extends F {
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f(ToVoid<int> x) {}
+  void set g(ToVoid<dynamic> x) {}
+  void set h(int x) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set i(dynamic x) {}
+}
+
+class H implements F {
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f(ToVoid<int> x) {}
+  void set g(ToVoid<dynamic> x) {}
+  void set h(int x) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set i(dynamic x) {}
+}
+ ''');
+  }
+
+  void test_setterReturnTypes() {
+    checkFile('''
+void voidFn() => null;
+class A {
+  set a(y) => 4;
+  set b(y) => voidFn();
+  void set c(y) => /*warning:RETURN_OF_INVALID_TYPE*/4;
+  void set d(y) => voidFn();
+  /*warning:NON_VOID_RETURN_FOR_SETTER*/int set e(y) => 4;
+  /*warning:NON_VOID_RETURN_FOR_SETTER*/int set f(y) =>
+      /*warning:RETURN_OF_INVALID_TYPE*/voidFn();
+  set g(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
+  void set h(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
+  /*warning:NON_VOID_RETURN_FOR_SETTER*/int set i(y) {return 4;}
+}
+''');
+  }
+
+  void test_setterSetterOverride() {
+    checkFile('''
+class A {}
+class B extends A {}
+class C extends B {}
+
+abstract class Base {
+  void set f1(B value);
+  void set f2(B value);
+  void set f3(B value);
+  void set f4(B value);
+  void set f5(B value);
+}
+
+class Child extends Base {
+  void set f1(A value) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  void set f3(value) {}
+  /*severe:INVALID_METHOD_OVERRIDE*/void set f4(dynamic value) {}
+  set f5(B value) {}
+}
+''');
+  }
+
+  void test_superCallPlacement() {
+    checkFile('''
+class Base {
+  var x;
+  Base() : x = print('Base.1') { print('Base.2'); }
+}
+
+class Derived extends Base {
+  var y, z;
+  Derived()
+      : y = print('Derived.1'),
+        /*severe:INVALID_SUPER_INVOCATION*/super(),
+        z = print('Derived.2') {
+    print('Derived.3');
+  }
+}
+
+class Valid extends Base {
+  var y, z;
+  Valid()
+      : y = print('Valid.1'),
+        z = print('Valid.2'),
+        super() {
+    print('Valid.3');
+  }
+}
+
+class AlsoValid extends Base {
+  AlsoValid() : super();
+}
+
+main() => new Derived();
+''');
+  }
+
+  void test_superclassOverrideOfGrandInterface_interfaceOfAbstractSuperclass() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+abstract class Base implements I1 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+
+class T1 extends Base {
+    // we consider the base class incomplete because it is
+    // abstract, so we report the error here too.
+    // TODO(sigmund): consider tracking overrides in a fine-grain
+    // manner, then this and the double-overrides would not be
+    // reported.
+    /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
+}
+''');
+  }
+
+  void test_superclassOverrideOfGrandInterface_interfaceOfConcreteSuperclass() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+
+class Base implements I1 {
+  /*severe:INVALID_METHOD_OVERRIDE*/m(
+      /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
+}
+
+class T1 extends Base {
+    m(B a) {}
+}
+''');
+  }
+
+  void test_superclassOverrideOfGrandInterface_interfaceOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 implements I1 {}
+
+class Base {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I2 {}
+''');
+  }
+
+  void test_superclassOverrideOfGrandInterface_mixinOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class M1 {
+    m(A a);
+}
+abstract class I2 extends Object with M1 {}
+
+class Base {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base
+    implements I2 {}
+''');
+  }
+
+  void test_superclassOverrideOfGrandInterface_superclassOfInterfaceOfChild() {
+    checkFile('''
+class A {}
+class B {}
+
+abstract class I1 {
+    m(A a);
+}
+abstract class I2 extends I1 {}
+
+class Base {
+    m(B a) {}
+}
+
+class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
+    /*severe:INVALID_METHOD_OVERRIDE*/extends Base
+    implements I2 {}
+''');
+  }
+
+  void test_superConstructor() {
+    checkFile('''
+class A { A(A x) {} }
+class B extends A {
+  B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+}
+''');
+  }
+
+  void test_ternaryOperator() {
+    checkFile('''
+abstract class Comparable<T> {
+  int compareTo(T other);
+  static int compare(Comparable a, Comparable b) => a.compareTo(b);
+}
+typedef int Comparator<T>(T a, T b);
+
+typedef bool _Predicate<T>(T value);
+
+class SplayTreeMap<K, V> {
+  Comparator<K> _comparator;
+  _Predicate _validKey;
+
+  // The warning on assigning to _comparator is legitimate. Since K has
+  // no bound, all we know is that it's object. _comparator's function
+  // type is effectively:              (Object, Object) -> int
+  // We are assigning it a fn of type: (Comparable, Comparable) -> int
+  // There's no telling if that will work. For example, consider:
+  //
+  //     new SplayTreeMap<Uri>();
+  //
+  // This would end up calling .compareTo() on a Uri, which doesn't
+  // define that since it doesn't implement Comparable.
+  SplayTreeMap([int compare(K key1, K key2),
+                bool isValidKey(potentialKey)])
+    : _comparator = /*warning:DOWN_CAST_COMPOSITE*/(compare == null) ? Comparable.compare : compare,
+      _validKey = (isValidKey != null) ? isValidKey : ((v) => true) {
+    _Predicate<Object> v = (isValidKey != null)
+        ? isValidKey : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
+
+    v = (isValidKey != null)
+         ? v : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
+  }
+}
+void main() {
+  Object obj = 42;
+  dynamic dyn = 42;
+  int i = 42;
+
+  // Check the boolean conversion of the condition.
+  print(/*warning:NON_BOOL_CONDITION*/i ? false : true);
+  print((/*info:DOWN_CAST_IMPLICIT*/obj) ? false : true);
+  print((/*info:DYNAMIC_CAST*/dyn) ? false : true);
+}
+''');
+  }
+
+  void test_typeCheckingLiterals() {
+    checkFile('''
+test() {
+  num n = 3;
+  int i = 3;
+  String s = "hello";
+  {
+     List<int> l = <int>[i];
+     l = <int>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
+     l = <int>[/*info:DOWN_CAST_IMPLICIT*/n];
+     l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
+  }
+  {
+     List l = /*info:INFERRED_TYPE_LITERAL*/[i];
+     l = /*info:INFERRED_TYPE_LITERAL*/[s];
+     l = /*info:INFERRED_TYPE_LITERAL*/[n];
+     l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s];
+  }
+  {
+     Map<String, int> m = <String, int>{s: i};
+     m = <String, int>{s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
+     m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n};
+     m = <String, int>{s: i,
+                       s: /*info:DOWN_CAST_IMPLICIT*/n,
+                       s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
+  }
+ // TODO(leafp): We can't currently test for key errors since the
+ // error marker binds to the entire entry.
+  {
+     Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i};
+     m = /*info:INFERRED_TYPE_LITERAL*/{s: s};
+     m = /*info:INFERRED_TYPE_LITERAL*/{s: n};
+     m = /*info:INFERRED_TYPE_LITERAL*/
+         {s: i,
+          s: n,
+          s: s};
+     m = /*info:INFERRED_TYPE_LITERAL*/
+         {i: s,
+          n: s,
+          s: s};
+  }
+}
+''');
+  }
+
+  void test_typePromotionFromDynamic() {
+    checkFile(r'''
+f() {
+  dynamic x;
+  if (x is int) {
+    int y = x;
+    String z = /*warning:INVALID_ASSIGNMENT*/x;
+  }
+}
+g() {
+  Object x;
+  if (x is int) {
+    int y = x;
+    String z = /*warning:INVALID_ASSIGNMENT*/x;
+  }
+}
+''');
+  }
+
+  void test_typeSubtyping_assigningClass() {
+    checkFile('''
+class A {}
+class B extends A {}
+
+void main() {
+   dynamic y;
+   Object o;
+   int i = 0;
+   double d = 0.0;
+   num n;
+   A a;
+   B b;
+   y = a;
+   o = a;
+   i = /*warning:INVALID_ASSIGNMENT*/a;
+   d = /*warning:INVALID_ASSIGNMENT*/a;
+   n = /*warning:INVALID_ASSIGNMENT*/a;
+   a = a;
+   b = /*info:DOWN_CAST_IMPLICIT*/a;
+}
+''');
+  }
+
+  void test_typeSubtyping_assigningSubclass() {
+    checkFile('''
+class A {}
+class B extends A {}
+class C extends A {}
+
+void main() {
+   dynamic y;
+   Object o;
+   int i = 0;
+   double d = 0.0;
+   num n;
+   A a;
+   B b;
+   C c;
+   y = b;
+   o = b;
+   i = /*warning:INVALID_ASSIGNMENT*/b;
+   d = /*warning:INVALID_ASSIGNMENT*/b;
+   n = /*warning:INVALID_ASSIGNMENT*/b;
+   a = b;
+   b = b;
+   c = /*warning:INVALID_ASSIGNMENT*/b;
+}
+''');
+  }
+
+  void test_typeSubtyping_dynamicDowncasts() {
+    checkFile('''
+class A {}
+class B extends A {}
+
+void main() {
+   dynamic y;
+   Object o;
+   int i = 0;
+   double d = 0.0;
+   num n;
+   A a;
+   B b;
+   o = y;
+   i = /*info:DYNAMIC_CAST*/y;
+   d = /*info:DYNAMIC_CAST*/y;
+   n = /*info:DYNAMIC_CAST*/y;
+   a = /*info:DYNAMIC_CAST*/y;
+   b = /*info:DYNAMIC_CAST*/y;
+}
+''');
+  }
+
+  void test_typeSubtyping_dynamicIsTop() {
+    checkFile('''
+class A {}
+class B extends A {}
+
+void main() {
+   dynamic y;
+   Object o;
+   int i = 0;
+   double d = 0.0;
+   num n;
+   A a;
+   B b;
+   y = o;
+   y = i;
+   y = d;
+   y = n;
+   y = a;
+   y = b;
+}
+''');
+  }
+
+  void test_typeSubtyping_interfaces() {
+    checkFile('''
+class A {}
+class B extends A {}
+class C extends A {}
+class D extends B implements C {}
+
+void main() {
+   A top;
+   B left;
+   C right;
+   D bot;
+   {
+     top = top;
+     top = left;
+     top = right;
+     top = bot;
+   }
+   {
+     left = /*info:DOWN_CAST_IMPLICIT*/top;
+     left = left;
+     left = /*warning:INVALID_ASSIGNMENT*/right;
+     left = bot;
+   }
+   {
+     right = /*info:DOWN_CAST_IMPLICIT*/top;
+     right = /*warning:INVALID_ASSIGNMENT*/left;
+     right = right;
+     right = bot;
+   }
+   {
+     bot = /*info:DOWN_CAST_IMPLICIT*/top;
+     bot = /*info:DOWN_CAST_IMPLICIT*/left;
+     bot = /*info:DOWN_CAST_IMPLICIT*/right;
+     bot = bot;
+   }
+}
+''');
+  }
+
+  void test_unaryOperators() {
+    checkFile('''
+class A {
+  A operator ~() => null;
+  A operator +(int x) => null;
+  A operator -(int x) => null;
+  A operator -() => null;
+}
+
+foo() => new A();
+
+test() {
+  A a = new A();
+  var c = foo();
+  dynamic d;
+
+  ~a;
+  (/*info:DYNAMIC_INVOKE*/~d);
+
+  !/*warning:NON_BOOL_NEGATION_EXPRESSION*/a;
+  !/*info:DYNAMIC_CAST*/d;
+
+  -a;
+  (/*info:DYNAMIC_INVOKE*/-d);
+
+  ++a;
+  --a;
+  (/*info:DYNAMIC_INVOKE*/++d);
+  (/*info:DYNAMIC_INVOKE*/--d);
+
+  a++;
+  a--;
+  (/*info:DYNAMIC_INVOKE*/d++);
+  (/*info:DYNAMIC_INVOKE*/d--);
+}''');
+  }
+
+  void test_unboundRedirectingConstructor() {
+    // This is a regression test for https://github.com/dart-lang/sdk/issues/25071
+    checkFile('''
+class Foo {
+  Foo() : /*severe:REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR*/this.init();
+}
+ ''');
+  }
+
+  void test_unboundTypeName() {
+    checkFile('''
+void main() {
+   /*warning:UNDEFINED_CLASS should be error*/AToB y;
+}
+''');
+  }
+
+  void test_unboundVariable() {
+    checkFile('''
+void main() {
+   dynamic y = /*warning:UNDEFINED_IDENTIFIER should be error*/unboundVariable;
+}
+''');
+  }
+
+  void test_voidSubtyping() {
+    // Regression test for https://github.com/dart-lang/sdk/issues/25069
+    checkFile('''
+typedef int Foo();
+void foo() {}
+void main () {
+  Foo x = /*warning:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo();
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index a686740..46e7434e 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -449,6 +449,29 @@
     expect(f.type.toString(), '() → Iterable<num>');
   }
 
+  void test_bottom() {
+    // When a type is inferred from the expression `null`, the inferred type is
+    // `dynamic`, but the inferred type of the initializer is `bottom`.
+    // TODO(paulberry): Is this intentional/desirable?
+    var mainUnit = checkFile('''
+var v = null;
+''');
+    var v = mainUnit.topLevelVariables[0];
+    expect(v.type.toString(), 'dynamic');
+    expect(v.initializer.type.toString(), '() → <bottom>');
+  }
+
+  void test_bottom_inClosure() {
+    // When a closure's return type is inferred from the expression `null`, the
+    // inferred type is `dynamic`.
+    var mainUnit = checkFile('''
+var v = () => null;
+''');
+    var v = mainUnit.topLevelVariables[0];
+    expect(v.type.toString(), '() → dynamic');
+    expect(v.initializer.type.toString(), '() → () → dynamic');
+  }
+
   void test_canInferAlsoFromStaticAndInstanceFieldsFlagOn() {
     addFile(
         '''
@@ -479,6 +502,32 @@
 ''');
   }
 
+  void test_circularReference_viaClosures() {
+    var mainUnit = checkFile('''
+var x = () => y;
+var y = () => x;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    var y = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(y.name, 'y');
+    expect(x.type.toString(), 'dynamic');
+    expect(y.type.toString(), 'dynamic');
+  }
+
+  void test_circularReference_viaClosures_initializerTypes() {
+    var mainUnit = checkFile('''
+var x = () => y;
+var y = () => x;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    var y = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(y.name, 'y');
+    expect(x.initializer.returnType.toString(), '() → dynamic');
+    expect(y.initializer.returnType.toString(), '() → dynamic');
+  }
+
   void test_conflictsCanHappen() {
     checkFile('''
 class I1 {
@@ -1268,6 +1317,14 @@
     expect(x.type.toString(), 'int');
   }
 
+  void test_futureThen() {
+    checkFile('''
+import 'dart:async';
+Future f;
+Future<int> t1 = f.then((_) => new Future<int>.value(42));
+''');
+  }
+
   void test_genericMethods_basicDownwardInference() {
     checkFile(r'''
 /*=T*/ f/*<S, T>*/(/*=S*/ s) => null;
@@ -2551,6 +2608,19 @@
     expect(x.type.toString(), 'Map<String, () → int>');
   }
 
+  void test_inferredType_opAssignToProperty() {
+    var mainUnit = checkFile('''
+class C {
+  num n;
+}
+C f() => null;
+var x = (f().n *= null);
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'num');
+  }
+
   void test_inferredType_opAssignToProperty_prefixedIdentifier() {
     var mainUnit = checkFile('''
 class C {
@@ -2578,19 +2648,6 @@
     expect(x.type.toString(), 'num');
   }
 
-  void test_inferredType_opAssignToProperty() {
-    var mainUnit = checkFile('''
-class C {
-  num n;
-}
-C f() => null;
-var x = (f().n *= null);
-''');
-    var x = mainUnit.topLevelVariables[0];
-    expect(x.name, 'x');
-    expect(x.type.toString(), 'num');
-  }
-
   void test_inferredType_opAssignToProperty_viaInterface() {
     var mainUnit = checkFile('''
 class I {
@@ -2605,6 +2662,42 @@
     expect(x.type.toString(), 'num');
   }
 
+  void test_inferredType_viaClosure_multipleLevelsOfNesting() {
+    var mainUnit = checkFile('''
+class C {
+  static final f = (bool b) => (int i) => /*info:INFERRED_TYPE_LITERAL*/{i: b};
+}
+''');
+    var f = mainUnit.getType('C').fields[0];
+    expect(f.type.toString(), '(bool) → (int) → Map<int, bool>');
+  }
+
+  void test_inferredType_viaClosure_typeDependsOnArgs() {
+    var mainUnit = checkFile('''
+class C {
+  static final f = (bool b) => b;
+}
+''');
+    var f = mainUnit.getType('C').fields[0];
+    expect(f.type.toString(), '(bool) → bool');
+  }
+
+  void test_inferredType_viaClosure_typeIndependentOfArgs_field() {
+    var mainUnit = checkFile('''
+class C {
+  static final f = (bool b) => 1;
+}
+''');
+    var f = mainUnit.getType('C').fields[0];
+    expect(f.type.toString(), '(bool) → int');
+  }
+
+  void test_inferredType_viaClosure_typeIndependentOfArgs_topLevel() {
+    var mainUnit = checkFile('final f = (bool b) => 1;');
+    var f = mainUnit.topLevelVariables[0];
+    expect(f.type.toString(), '(bool) → int');
+  }
+
   void test_inferStaticsTransitively() {
     addFile(
         '''
@@ -3274,6 +3367,54 @@
     expect(x.type.toString(), 'Map<dynamic, dynamic>');
   }
 
+  void test_methodCall_withTypeArguments_instanceMethod() {
+    var mainUnit = checkFile('''
+class C {
+  D/*<T>*/ f/*<T>*/() => null;
+}
+class D<T> {}
+var f = new C().f/*<int>*/();
+''');
+    var v = mainUnit.topLevelVariables[0];
+    expect(v.type.toString(), 'D<int>');
+  }
+
+  void test_methodCall_withTypeArguments_instanceMethod_identifierSequence() {
+    var mainUnit = checkFile('''
+class C {
+  D/*<T>*/ f/*<T>*/() => null;
+}
+class D<T> {}
+C c;
+var f = c.f/*<int>*/();
+''');
+    var v = mainUnit.topLevelVariables[1];
+    expect(v.name, 'f');
+    expect(v.type.toString(), 'D<int>');
+  }
+
+  void test_methodCall_withTypeArguments_staticMethod() {
+    var mainUnit = checkFile('''
+class C {
+  static D/*<T>*/ f/*<T>*/() => null;
+}
+class D<T> {}
+var f = C.f/*<int>*/();
+''');
+    var v = mainUnit.topLevelVariables[0];
+    expect(v.type.toString(), 'D<int>');
+  }
+
+  void test_methodCall_withTypeArguments_topLevelFunction() {
+    var mainUnit = checkFile('''
+D/*<T>*/ f/*<T>*/() => null;
+class D<T> {}
+var g = f/*<int>*/();
+''');
+    var v = mainUnit.topLevelVariables[0];
+    expect(v.type.toString(), 'D<int>');
+  }
+
   void test_noErrorWhenDeclaredTypeIsNumAndAssignedNull() {
     checkFile('''
 test1() {
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index 6e5b83b..079bda1 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -66,8 +66,10 @@
   AnalysisOptionsImpl options = context.analysisOptions as AnalysisOptionsImpl;
   options.strongMode = true;
   options.strongModeHints = true;
+  var mockSdk = new MockSdk();
+  mockSdk.context.analysisOptions.strongMode = true;
   context.sourceFactory =
-      new SourceFactory([new DartUriResolver(new MockSdk()), uriResolver]);
+      new SourceFactory([new DartUriResolver(mockSdk), uriResolver]);
 
   // Run the checker on /main.dart.
   Source mainSource = uriResolver.resolveAbsolute(new Uri.file('/main.dart'));
diff --git a/pkg/analyzer/tool/task_dependency_graph/tasks.dot b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
index 402efa5..e134a09 100644
--- a/pkg/analyzer/tool/task_dependency_graph/tasks.dot
+++ b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
@@ -99,6 +99,8 @@
   GenerateLintsTask -> LINTS
   HINTS -> LibraryUnitErrorsTask
   HINTS [shape=box]
+  IGNORE_INFO -> DartErrorsTask
+  IGNORE_INFO [shape=box]
   IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
   IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
   IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
@@ -189,7 +191,6 @@
   MODIFICATION_TIME -> VerifyUnitTask
   MODIFICATION_TIME [shape=box]
   PARSED_UNIT -> BuildCompilationUnitElementTask
-  PARSED_UNIT -> DartErrorsTask
   PARSED_UNIT [shape=box]
   PARSE_ERRORS -> dartErrorsForSource
   PARSE_ERRORS [shape=box]
@@ -322,6 +323,7 @@
   SOURCE_KIND [shape=box]
   STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
   STRONG_MODE_ERRORS [shape=box]
+  ScanDartTask -> IGNORE_INFO
   ScanDartTask -> LINE_INFO
   ScanDartTask -> SCAN_ERRORS
   ScanDartTask -> TOKEN_STREAM
diff --git a/pkg/analyzer2dart/bin/analyzer2dart.dart b/pkg/analyzer2dart/bin/analyzer2dart.dart
deleted file mode 100644
index 9f372c1..0000000
--- a/pkg/analyzer2dart/bin/analyzer2dart.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/** The entry point for the command-line version analyzer2dart. */
-library analyzer2dart.cmdline;
-
-import 'dart:io';
-
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:compiler/src/source_file_provider.dart';
-
-import '../lib/src/closed_world.dart';
-import '../lib/src/driver.dart';
-import '../lib/src/converted_world.dart';
-import '../lib/src/dart_backend.dart';
-
-void main(List<String> args) {
-  // TODO(paulberry): hacky
-  String path = args[0];
-
-  PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-  DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
-  // TODO(johnniwinther): Support user specified output Uri.
-  // TODO(johnniwinther): Integrate messaging.
-  RandomAccessFileOutputProvider outputProvider =
-      new RandomAccessFileOutputProvider(
-          Uri.base.resolve('out.dart'),
-          Uri.base.resolve('out.dart.map'),
-          onInfo: (message) => print(message),
-          onFailure: (message) {
-            print(message);
-            exit(1);
-          });
-
-  Driver analyzer2Dart = new Driver(provider, sdk, outputProvider);
-
-  // Tell the analysis server about the root
-  Source source = analyzer2Dart.setRoot(path);
-
-  // Get the library element associated with the source.
-  FunctionElement entryPointElement = analyzer2Dart.resolveEntryPoint(source);
-
-  // TODO(brianwilkerson,paulberry,johnniwinther): Perform tree-growing by
-  // visiting the ast and feeding the dependencies into a work queue (enqueuer).
-  ClosedWorld world = analyzer2Dart.computeWorld(entryPointElement);
-
-  // TODO(brianwilkerson,paulberry,johnniwinther): Convert the ast into cps by
-  // visiting the ast and invoking the ir builder.
-  // TODO(johnniwinther): Convert the analyzer element model into the dart2js
-  // element model to fit the needs of the cps encoding above.
-  ConvertedWorld convertedWorld = convertWorld(world);
-
-  // TODO(johnniwinther): Feed the cps ir into the new dart2dart backend to
-  // generate dart file(s).
-  compileToDart(analyzer2Dart, convertedWorld);
-}
-
diff --git a/pkg/analyzer2dart/lib/src/closed_world.dart b/pkg/analyzer2dart/lib/src/closed_world.dart
deleted file mode 100644
index 8f91658..0000000
--- a/pkg/analyzer2dart/lib/src/closed_world.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.closedWorld;
-
-import 'dart:collection';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-
-/**
- * Container for the elements and AST nodes which have been determined by
- * tree shaking to be reachable by the program being compiled.
- */
-class ClosedWorld {
-  /// The core types of this world.
-  final TypeProvider typeProvider;
-
-  /// Returns the main function of this closed world compilation.
-  final FunctionElement mainFunction;
-
-  // TODO(paulberry): is it a problem to hold on to all the AST's for the
-  // duration of tree shaking & CPS generation?
-
-  /**
-   * Methods, toplevel functions, etc. that are reachable.
-   */
-  Map<ExecutableElement, Declaration> executableElements =
-      new HashMap<ExecutableElement, Declaration>();
-
-  /**
-   * Fields that are reachable.
-   */
-  Map<FieldElement, VariableDeclaration> fields =
-      new HashMap<FieldElement, VariableDeclaration>();
-
-  /**
-   * Top-level variables that are reachable.
-   */
-  // TODO(johnniwinther): Is there value in splitting fields and top-level
-  // variables?
-  Map<TopLevelVariableElement, VariableDeclaration> variables =
-      new HashMap<TopLevelVariableElement, VariableDeclaration>();
-
-  /**
-   * Classes that are instantiated from reachable code.
-   *
-   * TODO(paulberry): Also keep track of classes that are reachable but not
-   * instantiated (because they are extended or mixed in)
-   */
-  Map<ClassElement, ClassDeclaration> instantiatedClasses =
-      new HashMap<ClassElement, ClassDeclaration>();
-
-  ClosedWorld(this.typeProvider, this.mainFunction);
-}
diff --git a/pkg/analyzer2dart/lib/src/converted_world.dart b/pkg/analyzer2dart/lib/src/converted_world.dart
deleted file mode 100644
index 600487a..0000000
--- a/pkg/analyzer2dart/lib/src/converted_world.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.convertedWorld;
-
-import 'dart:collection';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:compiler/src/dart_types.dart' as dart2js;
-import 'package:compiler/src/elements/elements.dart' as dart2js;
-import 'package:analyzer/src/generated/element.dart' as analyzer;
-import 'package:compiler/src/cps_ir/cps_ir_nodes.dart' as ir;
-
-import 'closed_world.dart';
-import 'element_converter.dart';
-import 'cps_generator.dart';
-import 'util.dart';
-
-/// A [ClosedWorld] converted to the dart2js element model.
-abstract class ConvertedWorld {
-  Iterable<dart2js.LibraryElement> get libraries;
-  Iterable<dart2js.AstElement> get resolvedElements;
-  Iterable<dart2js.ClassElement> get instantiatedClasses;
-  dart2js.FunctionElement get mainFunction;
-  ir.Node getIr(dart2js.Element element);
-  dart2js.DartTypes get dartTypes;
-}
-
-class _ConvertedWorldImpl implements ConvertedWorld {
-  final dart2js.FunctionElement mainFunction;
-  Map<dart2js.AstElement, ir.Node> executableElements =
-      new HashMap<dart2js.AstElement, ir.Node>();
-  final List<dart2js.ClassElement> instantiatedClasses =
-      <dart2js.ClassElement>[];
-
-  _ConvertedWorldImpl(this.mainFunction);
-
-  // TODO(johnniwinther): Add all used libraries and all SDK libraries to the
-  // set of libraries in the converted world.
-  Iterable<dart2js.LibraryElement> get libraries => [mainFunction.library];
-
-  Iterable<dart2js.AstElement> get resolvedElements => executableElements.keys;
-
-  ir.Node getIr(dart2js.Element element) => executableElements[element];
-
-  final dart2js.DartTypes dartTypes = new _DartTypes();
-}
-
-ConvertedWorld convertWorld(ClosedWorld closedWorld) {
-  ElementConverter converter = new ElementConverter();
-  _ConvertedWorldImpl convertedWorld = new _ConvertedWorldImpl(
-      converter.convertElement(closedWorld.mainFunction));
-
-  void convert(analyzer.Element analyzerElement, AstNode node) {
-    // Skip conversion of SDK sources since we don't generate code for it
-    // anyway.
-    if (analyzerElement.source.isInSystemLibrary) return;
-
-    dart2js.AstElement dart2jsElement =
-        converter.convertElement(analyzerElement);
-    CpsElementVisitor visitor = new CpsElementVisitor(converter, node);
-    ir.Node cpsNode = analyzerElement.accept(visitor);
-    convertedWorld.executableElements[dart2jsElement] = cpsNode;
-    if (cpsNode == null && !analyzerElement.isSynthetic) {
-      String message =
-         'No CPS node generated for $analyzerElement (${node.runtimeType}).';
-      reportSourceMessage(analyzerElement.source, node, message);
-      throw new UnimplementedError(message);
-    }
-  }
-
-  void convertClass(analyzer.ClassElement analyzerElement, _) {
-    // Skip conversion of SDK sources since we don't generate code for it
-    // anyway.
-    if (analyzerElement.source.isInSystemLibrary) return;
-    convertedWorld.instantiatedClasses.add(
-        converter.convertElement(analyzerElement));
-  }
-
-  closedWorld.executableElements.forEach(convert);
-  closedWorld.variables.forEach(convert);
-  closedWorld.fields.forEach(convert);
-  closedWorld.instantiatedClasses.forEach(convertClass);
-
-  return convertedWorld;
-}
-
-// TODO(johnniwinther): Implement [coreTypes] using [TypeProvider].
-class _DartTypes implements dart2js.DartTypes {
-  @override
-  get coreTypes => throw new UnsupportedError("coreTypes");
-
-  @override
-  bool isSubtype(dart2js.DartType t, dart2js.DartType s) {
-    throw new UnsupportedError("isSubtype");
-  }
-}
\ No newline at end of file
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
deleted file mode 100644
index 1e5bb6d..0000000
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ /dev/null
@@ -1,589 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.cps_generator;
-
-import 'package:analyzer/analyzer.dart';
-
-import 'package:compiler/src/dart_types.dart' as dart2js;
-import 'package:compiler/src/elements/elements.dart' as dart2js;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/element.dart' as analyzer;
-
-import 'package:compiler/src/constant_system_dart.dart'
-    show DART_CONSTANT_SYSTEM;
-import 'package:compiler/src/cps_ir/cps_ir_nodes.dart' as ir;
-import 'package:compiler/src/cps_ir/cps_ir_builder.dart';
-import 'package:compiler/src/universe/universe.dart';
-
-import 'semantic_visitor.dart';
-import 'element_converter.dart';
-import 'util.dart';
-import 'identifier_semantics.dart';
-
-/// Visitor that converts the AST node of an analyzer element into a CPS ir
-/// node.
-class CpsElementVisitor extends analyzer.SimpleElementVisitor<ir.Node> {
-  final ElementConverter converter;
-  final AstNode node;
-
-  CpsElementVisitor(this.converter, this.node);
-
-  @override
-  ir.FunctionDefinition visitFunctionElement(analyzer.FunctionElement element) {
-    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
-    FunctionDeclaration functionDeclaration = node;
-    return visitor.handleFunctionDeclaration(
-        element, functionDeclaration.functionExpression.body);
-  }
-
-  @override
-  ir.FunctionDefinition visitMethodElement(analyzer.MethodElement element) {
-    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
-    MethodDeclaration methodDeclaration = node;
-    return visitor.handleFunctionDeclaration(element, methodDeclaration.body);
-  }
-
-  @override
-  ir.FieldDefinition visitTopLevelVariableElement(
-      analyzer.TopLevelVariableElement element) {
-    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
-    VariableDeclaration variableDeclaration = node;
-    return visitor.handleFieldDeclaration(element, variableDeclaration);
-  }
-
-  @override
-  ir.RootNode visitConstructorElement(analyzer.ConstructorElement element) {
-    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
-    if (!element.isFactory) {
-      ConstructorDeclaration constructorDeclaration = node;
-      FunctionBody body;
-      if (constructorDeclaration != null) {
-        body = constructorDeclaration.body;
-      } else {
-        assert(element.isSynthetic);
-      }
-      return visitor.handleConstructorDeclaration(element, body);
-    }
-    // TODO(johnniwinther): Support factory constructors.
-    return null;
-  }
-}
-
-/// Visitor that converts analyzer AST nodes into CPS ir nodes.
-class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
-    with IrBuilderMixin<AstNode> {
-  /// Promote the type of [irBuilder] to [DartIrBuilder].
-  /// The JS backend requires closure conversion which we do not support yet.
-  DartIrBuilder get irBuilder => super.irBuilder;
-  final analyzer.Element element;
-  final ElementConverter converter;
-
-  CpsGeneratingVisitor(this.converter, this.element);
-
-  Source get currentSource => element.source;
-
-  analyzer.LibraryElement get currentLibrary => element.library;
-
-  ir.Node visit(AstNode node) => node.accept(this);
-
-  ir.ConstructorDefinition handleConstructorDeclaration(
-      analyzer.ConstructorElement constructor, FunctionBody body) {
-    dart2js.ConstructorElement element = converter.convertElement(constructor);
-    return withBuilder(
-        new DartIrBuilder(DART_CONSTANT_SYSTEM,
-                          element,
-                          // TODO(johnniwinther): Support closure variables.
-                          new Set<dart2js.Local>()),
-        () {
-      irBuilder.buildFunctionHeader(
-          constructor.parameters.map(converter.convertElement));
-      // Visit the body directly to avoid processing the signature as
-      // expressions.
-      // Call to allow for `body == null` in case of synthesized constructors.
-      build(body);
-      return irBuilder.makeConstructorDefinition(const [], const []);
-    });
-  }
-
-  ir.FieldDefinition handleFieldDeclaration(
-      analyzer.PropertyInducingElement field, VariableDeclaration node) {
-    dart2js.FieldElement element = converter.convertElement(field);
-    return withBuilder(
-        new DartIrBuilder(DART_CONSTANT_SYSTEM,
-                          element,
-                          // TODO(johnniwinther): Support closure variables.
-                          new Set<dart2js.Local>()),
-        () {
-      irBuilder.buildFieldInitializerHeader();
-      ir.Primitive initializer = build(node.initializer);
-      return irBuilder.makeFieldDefinition(initializer);
-    });
-  }
-
-  ir.FunctionDefinition handleFunctionDeclaration(
-      analyzer.ExecutableElement function, FunctionBody body) {
-    dart2js.FunctionElement element = converter.convertElement(function);
-    return withBuilder(
-        new DartIrBuilder(DART_CONSTANT_SYSTEM,
-                          element,
-                          // TODO(johnniwinther): Support closure variables.
-                          new Set<dart2js.Local>()),
-        () {
-      irBuilder.buildFunctionHeader(
-          function.parameters.map(converter.convertElement));
-      // Visit the body directly to avoid processing the signature as
-      // expressions.
-      visit(body);
-      return irBuilder.makeFunctionDefinition(const []);
-    });
-  }
-
-  @override
-  ir.Primitive visitFunctionExpression(FunctionExpression node) {
-    return irBuilder.buildFunctionExpression(
-        handleFunctionDeclaration(node.element, node.body));
-  }
-
-  @override
-  ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {
-    return handleFunctionDeclaration(
-        node.element, node.functionExpression.body);
-  }
-
-  @override
-  visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    FunctionDeclaration functionDeclaration = node.functionDeclaration;
-    analyzer.FunctionElement function = functionDeclaration.element;
-    dart2js.FunctionElement element = converter.convertElement(function);
-    ir.FunctionDefinition definition = handleFunctionDeclaration(
-        function, functionDeclaration.functionExpression.body);
-    irBuilder.declareLocalFunction(element, definition);
-  }
-
-  List<ir.Primitive> visitArguments(ArgumentList argumentList) {
-    List<ir.Primitive> arguments = <ir.Primitive>[];
-    for (Expression argument in argumentList.arguments) {
-      ir.Primitive value = build(argument);
-      if (value == null) {
-        giveUp(argument,
-            'Unsupported argument: $argument (${argument.runtimeType}).');
-      }
-      arguments.add(value);
-    }
-    return arguments;
-  }
-
-  @override
-  ir.Node visitMethodInvocation(MethodInvocation node) {
-    // Overridden to avoid eager visits of the receiver and arguments.
-    return handleMethodInvocation(node);
-  }
-
-  @override
-  ir.Primitive visitDynamicInvocation(MethodInvocation node,
-                                      AccessSemantics semantics) {
-    // TODO(johnniwinther): Handle implicit `this`.
-    ir.Primitive receiver = build(semantics.target);
-    List<ir.Primitive> arguments = visitArguments(node.argumentList);
-    return irBuilder.buildDynamicInvocation(
-        receiver,
-        createSelectorFromMethodInvocation(
-            node.argumentList, node.methodName.name),
-        arguments);
-  }
-
-  @override
-  ir.Primitive visitStaticMethodInvocation(MethodInvocation node,
-                                           AccessSemantics semantics) {
-    analyzer.Element staticElement = semantics.element;
-    dart2js.Element element = converter.convertElement(staticElement);
-    List<ir.Primitive> arguments = visitArguments(node.argumentList);
-    return irBuilder.buildStaticFunctionInvocation(
-        element,
-        createCallStructureFromMethodInvocation(node.argumentList),
-        arguments);
-  }
-
-  @override
-  ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
-    return handleLocalAccess(node, semantics);
-  }
-
-  ir.Primitive handleLocalInvocation(MethodInvocation node,
-                                     AccessSemantics semantics) {
-    analyzer.Element staticElement = semantics.element;
-    dart2js.Element element = converter.convertElement(staticElement);
-    List<ir.Definition> arguments = visitArguments(node.argumentList);
-    CallStructure callStructure = createCallStructureFromMethodInvocation(
-        node.argumentList);
-    if (semantics.kind == AccessKind.LOCAL_FUNCTION) {
-      return irBuilder.buildLocalFunctionInvocation(
-          element, callStructure, arguments);
-    } else {
-      return irBuilder.buildLocalVariableInvocation(
-        element, callStructure, arguments);
-    }
-  }
-
-  @override
-  ir.Node visitLocalVariableInvocation(MethodInvocation node,
-                                       AccessSemantics semantics) {
-    return handleLocalInvocation(node, semantics);
-  }
-
-  @override
-  ir.Primitive visitLocalFunctionInvocation(MethodInvocation node,
-                                            AccessSemantics semantics) {
-    return handleLocalInvocation(node, semantics);
-  }
-
-  @override
-  ir.Primitive visitFunctionExpressionInvocation(
-      FunctionExpressionInvocation node) {
-    ir.Primitive target = build(node.function);
-    List<ir.Definition> arguments = visitArguments(node.argumentList);
-    return irBuilder.buildCallInvocation(
-        target,
-        createCallStructureFromMethodInvocation(node.argumentList),
-        arguments);
-  }
-
-  @override
-  ir.Primitive visitInstanceCreationExpression(
-      InstanceCreationExpression node) {
-    analyzer.Element staticElement = node.staticElement;
-    if (staticElement != null) {
-      dart2js.Element element = converter.convertElement(staticElement);
-      dart2js.DartType type = converter.convertType(node.staticType);
-      List<ir.Primitive> arguments = visitArguments(node.argumentList);
-      return irBuilder.buildConstructorInvocation(
-          element,
-          createCallStructureFromMethodInvocation(node.argumentList),
-          type,
-          arguments);
-    }
-    return giveUp(node, "Unresolved constructor invocation.");
-  }
-
-  @override
-  ir.Constant visitNullLiteral(NullLiteral node) {
-    return irBuilder.buildNullConstant();
-  }
-
-  @override
-  ir.Constant visitBooleanLiteral(BooleanLiteral node) {
-    return irBuilder.buildBooleanConstant(node.value);
-  }
-
-  @override
-  ir.Constant visitDoubleLiteral(DoubleLiteral node) {
-    return irBuilder.buildDoubleConstant(node.value);
-  }
-
-  @override
-  ir.Constant visitIntegerLiteral(IntegerLiteral node) {
-    return irBuilder.buildIntegerConstant(node.value);
-  }
-
-  @override
-  visitAdjacentStrings(AdjacentStrings node) {
-    String value = node.stringValue;
-    if (value != null) {
-      return irBuilder.buildStringConstant(value);
-    }
-    giveUp(node, "Non constant adjacent strings.");
-  }
-
-  @override
-  ir.Constant visitSimpleStringLiteral(SimpleStringLiteral node) {
-    return irBuilder.buildStringConstant(node.value);
-  }
-
-  @override
-  visitStringInterpolation(StringInterpolation node) {
-    giveUp(node, "String interpolation.");
-  }
-
-  @override
-  visitReturnStatement(ReturnStatement node) {
-    irBuilder.buildReturn(build(node.expression));
-  }
-
-  @override
-  ir.Node visitPropertyAccess(PropertyAccess node) {
-    // Overridden to avoid eager visits of the receiver.
-    return handlePropertyAccess(node);
-  }
-
-  @override
-  ir.Node visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
-    return handleLocalAccess(node, semantics);
-  }
-
-  @override
-  ir.Node visitParameterAccess(AstNode node, AccessSemantics semantics) {
-    return handleLocalAccess(node, semantics);
-  }
-
-  @override
-  visitVariableDeclaration(VariableDeclaration node) {
-    // TODO(johnniwinther): Handle constant local variables.
-    ir.Node initialValue = build(node.initializer);
-    irBuilder.declareLocalVariable(
-        converter.convertElement(node.element),
-        initialValue: initialValue);
-  }
-
-  dart2js.Element getLocal(AstNode node, AccessSemantics semantics) {
-    analyzer.Element element = semantics.element;
-    dart2js.Element target = converter.convertElement(element);
-    assert(invariant(node, target.isLocal, '$target expected to be local.'));
-    return target;
-  }
-
-  ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
-    dart2js.Element local = getLocal(node, semantics);
-    if (semantics.kind == AccessKind.LOCAL_FUNCTION) {
-      return irBuilder.buildLocalFunctionGet(local);
-    } else {
-      return irBuilder.buildLocalVariableGet(local);
-    }
-  }
-
-  ir.Primitive handleLocalAssignment(AssignmentExpression node,
-                                     AccessSemantics semantics) {
-    if (node.operator.lexeme != '=') {
-      return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
-    }
-    return irBuilder.buildLocalVariableSet(
-        getLocal(node, semantics),
-        build(node.rightHandSide));
-  }
-
-  @override
-  ir.Node visitAssignmentExpression(AssignmentExpression node) {
-    // Avoid eager visiting of left and right hand side.
-    return handleAssignmentExpression(node);
-  }
-
-  @override
-  ir.Node visitLocalVariableAssignment(AssignmentExpression node,
-                                       AccessSemantics semantics) {
-    return handleLocalAssignment(node, semantics);
-  }
-
-  @override
-  ir.Node visitParameterAssignment(AssignmentExpression node,
-                                   AccessSemantics semantics) {
-    return handleLocalAssignment(node, semantics);
-  }
-
-  @override
-  ir.Node visitStaticFieldAssignment(AssignmentExpression node,
-                                     AccessSemantics semantics) {
-    if (node.operator.lexeme != '=') {
-      return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
-    }
-    analyzer.Element element = semantics.element;
-    dart2js.Element target = converter.convertElement(element);
-    // TODO(johnniwinther): Selector information should be computed in the
-    // [TreeShaker] and shared with the [CpsGeneratingVisitor].
-    assert(invariant(node, target.isTopLevel || target.isStatic,
-                     '$target expected to be top-level or static.'));
-    return irBuilder.buildStaticFieldSet(target, build(node.rightHandSide));
-  }
-
-  @override
-  ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) {
-    // TODO(johnniwinther): Handle implicit `this`.
-    ir.Primitive receiver = build(semantics.target);
-    return irBuilder.buildDynamicGet(receiver,
-        new Selector.getter(semantics.identifier.name,
-                            converter.convertElement(element.library)));
-  }
-
-  @override
-  ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
-    analyzer.Element element = semantics.element;
-    dart2js.Element target = converter.convertElement(element);
-    // TODO(johnniwinther): Selector information should be computed in the
-    // [TreeShaker] and shared with the [CpsGeneratingVisitor].
-    assert(invariant(node, target.isTopLevel || target.isStatic,
-                     '$target expected to be top-level or static.'));
-    return irBuilder.buildStaticFieldLazyGet(target, null);
-  }
-
-  ir.Primitive handleBinaryExpression(BinaryExpression node,
-                                      String op) {
-    ir.Primitive left = build(node.leftOperand);
-    ir.Primitive right = build(node.rightOperand);
-    Selector selector = new Selector.binaryOperator(op);
-    return irBuilder.buildDynamicInvocation(
-        left, selector, <ir.Primitive>[right]);
-  }
-
-  ir.Node handleLazyOperator(BinaryExpression node, {bool isLazyOr: false}) {
-    return irBuilder.buildLogicalOperator(
-        build(node.leftOperand),
-        subbuild(node.rightOperand),
-        isLazyOr: isLazyOr);
-  }
-
-  @override
-  ir.Node visitBinaryExpression(BinaryExpression node) {
-    // TODO(johnniwinther,paulberry,brianwilkerson): The operator should be
-    // available through an enum.
-    String op = node.operator.lexeme;
-    switch (op) {
-    case '||':
-    case '&&':
-      return handleLazyOperator(node, isLazyOr: op == '||');
-    case '!=':
-      return irBuilder.buildNegation(handleBinaryExpression(node, '=='));
-    default:
-      return handleBinaryExpression(node, op);
-    }
-  }
-
-  @override
-  ir.Node visitConditionalExpression(ConditionalExpression node) {
-    return irBuilder.buildConditional(
-        build(node.condition),
-        subbuild(node.thenExpression),
-        subbuild(node.elseExpression));
-  }
-
-  @override
-  visitIfStatement(IfStatement node) {
-    irBuilder.buildIf(
-        build(node.condition),
-        subbuild(node.thenStatement),
-        subbuild(node.elseStatement));
-  }
-
-  @override
-  visitBlock(Block node) {
-    irBuilder.buildBlock(node.statements, build);
-  }
-
-  @override
-  ir.Node visitListLiteral(ListLiteral node) {
-    dart2js.InterfaceType type = converter.convertType(node.staticType);
-    // TODO(johnniwinther): Use `build` instead of `(e) => build(e)` when issue
-    // 18630 has been resolved.
-    Iterable<ir.Primitive> values = node.elements.map((e) => build(e));
-    return irBuilder.buildListLiteral(type, values);
-  }
-
-  @override
-  ir.Node visitMapLiteral(MapLiteral node) {
-    dart2js.InterfaceType type = converter.convertType(node.staticType);
-    return irBuilder.buildMapLiteral(
-        type,
-        node.entries.map((e) => e.key),
-        node.entries.map((e) => e.value),
-        build);
-  }
-
-  @override
-  visitForStatement(ForStatement node) {
-    // TODO(johnniwinther): Support `for` as a jump target.
-    List<dart2js.LocalElement> loopVariables = <dart2js.LocalElement>[];
-    SubbuildFunction buildInitializer;
-    if (node.variables != null) {
-      buildInitializer = subbuild(node.variables);
-      for (VariableDeclaration variable in node.variables.variables) {
-        loopVariables.add(converter.convertElement(variable.element));
-      }
-    } else {
-      buildInitializer = subbuild(node.initialization);
-    }
-    irBuilder.buildFor(buildInitializer: buildInitializer,
-                       buildCondition: subbuild(node.condition),
-                       buildBody: subbuild(node.body),
-                       buildUpdate: subbuildSequence(node.updaters),
-                       loopVariables: loopVariables);
-  }
-
-  @override
-  visitWhileStatement(WhileStatement node) {
-    // TODO(johnniwinther): Support `while` as a jump target.
-    irBuilder.buildWhile(buildCondition: subbuild(node.condition),
-                         buildBody: subbuild(node.body));
-  }
-
-  @override
-  visitDeclaredIdentifier(DeclaredIdentifier node) {
-    giveUp(node, "Unexpected node: DeclaredIdentifier");
-  }
-
-  @override
-  visitForEachStatement(ForEachStatement node) {
-    SubbuildFunction buildVariableDeclaration;
-    dart2js.Element variableElement;
-    Selector variableSelector;
-    if (node.identifier != null) {
-       AccessSemantics accessSemantics =
-           node.identifier.accept(ACCESS_SEMANTICS_VISITOR);
-       if (accessSemantics.kind == AccessKind.DYNAMIC) {
-         variableSelector = new Selector.setter(
-             node.identifier.name, converter.convertElement(currentLibrary));
-       } else if (accessSemantics.element != null) {
-         variableElement = converter.convertElement(accessSemantics.element);
-         variableSelector = new Selector.setter(
-             variableElement.name,
-             converter.convertElement(accessSemantics.element.library));
-       } else {
-         giveUp(node, 'For-in of unresolved variable: $accessSemantics');
-       }
-    } else {
-      assert(invariant(
-          node, node.loopVariable != null, "Loop variable expected"));
-      variableElement = converter.convertElement(node.loopVariable.element);
-      buildVariableDeclaration = (IrBuilder builder) {
-        builder.declareLocalVariable(variableElement);
-      };
-    }
-    // TODO(johnniwinther): Support `for-in` as a jump target.
-    irBuilder.buildForIn(
-        buildExpression: subbuild(node.iterable),
-        buildVariableDeclaration: buildVariableDeclaration,
-        variableElement: variableElement,
-        variableSelector: variableSelector,
-        buildBody: subbuild(node.body));
-  }
-  @override
-  ir.Primitive visitIsExpression(IsExpression node) {
-    return irBuilder.buildTypeOperator(
-        visit(node.expression),
-        converter.convertType(node.type.type),
-        isTypeTest: true,
-        isNotCheck: node.notOperator != null);
-  }
-
-  @override
-  ir.Primitive visitAsExpression(AsExpression node) {
-    return irBuilder.buildTypeOperator(
-        visit(node.expression),
-        converter.convertType(node.type.type),
-        isTypeTest: false);
-  }
-
-  @override
-  visitTryStatement(TryStatement node) {
-    List<CatchClauseInfo> catchClauseInfos = <CatchClauseInfo>[];
-    for (CatchClause catchClause in node.catchClauses) {
-      catchClauseInfos.add(new CatchClauseInfo(
-          exceptionVariable: converter.convertElement(
-              catchClause.exceptionParameter.staticElement),
-          buildCatchBlock: subbuild(catchClause.body)));
-
-    }
-    irBuilder.buildTry(
-        tryStatementInfo: new TryStatementInfo(),
-        buildTryBlock: subbuild(node.body),
-        catchClauseInfos: catchClauseInfos);
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/dart_backend.dart b/pkg/analyzer2dart/lib/src/dart_backend.dart
deleted file mode 100644
index 317fd2c..0000000
--- a/pkg/analyzer2dart/lib/src/dart_backend.dart
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.dart_backend;
-
-import 'package:compiler/src/constant_system_dart.dart';
-import 'package:compiler/src/constants/constant_system.dart';
-import 'package:compiler/src/dart_backend/dart_backend.dart';
-import 'package:compiler/src/dart2jslib.dart';
-import 'package:compiler/src/dart_types.dart';
-import 'package:compiler/src/elements/elements.dart';
-
-import 'driver.dart';
-import 'converted_world.dart';
-
-void compileToDart(Driver driver, ConvertedWorld convertedWorld) {
-  DiagnosticListener listener = new Listener();
-  DartOutputter outputter = new DartOutputter(listener, driver.outputProvider);
-  ElementAstCreationContext context = new _ElementAstCreationContext(
-      listener, convertedWorld.dartTypes);
-  outputter.assembleProgram(
-    libraries: convertedWorld.libraries,
-    instantiatedClasses: convertedWorld.instantiatedClasses,
-    resolvedElements: convertedWorld.resolvedElements,
-    mainFunction: convertedWorld.mainFunction,
-    computeElementAst: (Element element) {
-      return DartBackend.createElementAst(
-          context,
-          element,
-          convertedWorld.getIr(element));
-    },
-    shouldOutput: (Element element) => !element.isSynthesized,
-    isSafeToRemoveTypeDeclarations: (_) => false);
-}
-
-class _ElementAstCreationContext implements ElementAstCreationContext {
-  final Listener listener;
-
-  @override
-  final DartTypes dartTypes;
-
-  _ElementAstCreationContext(this.listener, this.dartTypes);
-
-  @override
-  ConstantSystem get constantSystem => DART_CONSTANT_SYSTEM;
-
-  @override
-  InternalErrorFunction get internalError => listener.internalError;
-
-  @override
-  void traceCompilation(String name) {
-    // Do nothing.
-  }
-
-  @override
-  void traceGraph(String title, irObject) {
-    // Do nothing.
-  }
-}
-
-class Listener implements DiagnosticListener {
-
-  @override
-  void internalError(Spannable spannable, message) {
-    throw new UnimplementedError(message);
-  }
-
-  @override
-  void log(message) {
-    // TODO: implement log
-  }
-
-  @override
-  void reportError(Spannable node,
-                   MessageKind errorCode,
-                   [Map arguments = const {}]) {
-    // TODO: implement reportError
-  }
-
-  @override
-  void reportHint(Spannable node,
-                  MessageKind errorCode,
-                  [Map arguments = const {}]) {
-    // TODO: implement reportHint
-  }
-
-  @override
-  void reportInfo(Spannable node,
-                  MessageKind errorCode,
-                  [Map arguments = const {}]) {
-    // TODO: implement reportInfo
-  }
-
-  @override
-  void reportWarning(Spannable node,
-                     MessageKind errorCode,
-                     [Map arguments = const {}]) {
-    // TODO: implement reportWarning
-  }
-
-  @override
-  spanFromSpannable(Spannable node) {
-    // TODO: implement spanFromSpannable
-  }
-
-  @override
-  withCurrentElement(element, f()) {
-    // TODO: implement withCurrentElement
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/driver.dart b/pkg/analyzer2dart/lib/src/driver.dart
deleted file mode 100644
index 9707356..0000000
--- a/pkg/analyzer2dart/lib/src/driver.dart
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.driver;
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-
-import 'package:compiler/compiler.dart';
-
-import 'closed_world.dart';
-import 'tree_shaker.dart';
-
-/**
- * Top level driver for Analyzer2Dart.
- */
-class Driver {
-  final ResourceProvider resourceProvider;
-  final AnalysisContext context;
-  final CompilerOutputProvider outputProvider;
-
-  Driver(this.resourceProvider, DartSdk sdk, this.outputProvider)
-      : context = AnalysisEngine.instance.createAnalysisContext() {
-    // Set up the source factory.
-    // TODO(paulberry): do we want to use ExplicitPackageUriResolver?
-    List<UriResolver> uriResolvers = [
-        new FileUriResolver(),
-        new DartUriResolver(sdk) /* ,
-        new PackageUriResolver(packagesDirectories) */
-    ];
-    context.sourceFactory = new SourceFactory(uriResolvers);
-  }
-
-  /**
-   * Compute the closed world that is reachable from an entry point.
-   */
-  ClosedWorld computeWorld(FunctionElement entryPointElement) {
-    InternalAnalysisContext analysisContext = context;
-    TreeShaker treeShaker =
-        new TreeShaker(analysisContext.typeProvider, entryPointElement);
-    return treeShaker.shake();
-  }
-
-  /**
-   * Given a source, resolve it and return its entry point.
-   */
-  FunctionElement resolveEntryPoint(Source source) {
-    // Get the library element associated with the source.
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-
-    // Get the resolved AST for main
-    FunctionElement entryPointElement = libraryElement.entryPoint;
-    if (entryPointElement == null) {
-      throw new Exception('No main()!');
-    }
-    return entryPointElement;
-  }
-
-  /**
-   * Add the given file as the root of analysis, and return the corresponding
-   * source.
-   */
-  Source setRoot(String path) {
-    File file = resourceProvider.getResource(path);
-    Source source = file.createSource();
-    // add the Source
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(source);
-    context.applyChanges(changeSet);
-    // return the Source
-    return source;
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/element_converter.dart b/pkg/analyzer2dart/lib/src/element_converter.dart
deleted file mode 100644
index 666124e..0000000
--- a/pkg/analyzer2dart/lib/src/element_converter.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/// Convertion of elements between the analyzer element model and the dart2js
-/// element model.
-
-library analyzer2dart.element_converter;
-
-import 'package:compiler/src/elements/elements.dart' as dart2js;
-import 'package:compiler/src/util/util.dart' as util;
-import 'package:compiler/src/dart_types.dart' as dart2js;
-import 'package:analyzer/src/generated/element.dart' as analyzer;
-import 'package:analyzer/src/generated/utilities_dart.dart';
-
-part 'modely.dart';
-
-class ElementConverter {
-  /// Map from analyzer elements to their equivalent dart2js elements.
-  Map<analyzer.Element, dart2js.Element> conversionMap =
-      <analyzer.Element, dart2js.Element>{};
-
-  /// Map from dart2js elements to their equivalent analyzer elements.
-  Map<dart2js.Element, analyzer.Element> inversionMap =
-      <dart2js.Element, analyzer.Element>{};
-
-  ElementConverterVisitor visitor;
-
-  ElementConverter() {
-    visitor = new ElementConverterVisitor(this);
-  }
-
-  dart2js.Element convertElement(analyzer.Element input) {
-    return conversionMap.putIfAbsent(input, () {
-      dart2js.Element output = convertElementInternal(input);
-      inversionMap[output] = input;
-      return output;
-    });
-  }
-
-  dart2js.FunctionType convertFunctionType(analyzer.FunctionType input) {
-    dart2js.DartType returnType = convertType(input.returnType);
-    List<dart2js.DartType> requiredParameterTypes =
-        input.normalParameterTypes.map(convertType).toList();
-    List<dart2js.DartType> positionalParameterTypes =
-            input.optionalParameterTypes.map(convertType).toList();
-    List<String> namedParameters =
-        input.namedParameterTypes.keys.toList()..sort();
-    List<dart2js.DartType> namedParameterTypes =
-        namedParameters.map((String name) {
-      return convertType(input.namedParameterTypes[name]);
-    }).toList();
-    return new dart2js.FunctionType.synthesized(
-        returnType,
-        requiredParameterTypes,
-        positionalParameterTypes,
-        namedParameters,
-        namedParameterTypes);
-  }
-
-  dart2js.DartType convertType(analyzer.DartType input) {
-    if (input.isVoid) {
-      return const dart2js.VoidType();
-    } else if (input.isDynamic) {
-      return const dart2js.DynamicType();
-    } else if (input is analyzer.TypeParameterType) {
-      return new dart2js.TypeVariableType(convertElement(input.element));
-    } else if (input is analyzer.InterfaceType) {
-      List<dart2js.DartType> typeArguments =
-          input.typeArguments.map(convertType).toList();
-      return new dart2js.InterfaceType(
-          convertElement(input.element), typeArguments);
-    } else if (input is analyzer.FunctionType) {
-      if (input.element is analyzer.FunctionTypeAliasElement) {
-        List<dart2js.DartType> typeArguments =
-            input.typeArguments.map(convertType).toList();
-        return new dart2js.ResolvedTypedefType(
-            convertElement(input.element),
-            typeArguments,
-            convertFunctionType(input));
-      } else {
-        assert(input.typeArguments.isEmpty);
-        return convertFunctionType(input);
-      }
-    }
-    throw new UnsupportedError(
-        "Conversion of $input (${input.runtimeType}) is not supported.");
-  }
-
-  analyzer.Element invertElement(dart2js.Element input) {
-    return inversionMap[input];
-  }
-
-  dart2js.Element convertElementInternal(analyzer.Element input) {
-    dart2js.Element output = input.accept(visitor);
-    if (output != null) return output;
-    throw new UnsupportedError(
-        "Conversion of $input (${input.runtimeType}) is not supported.");
-  }
-}
-
-/// Visitor that converts analyzer elements to dart2js elements.
-class ElementConverterVisitor
-    extends analyzer.SimpleElementVisitor<dart2js.Element> {
-  final ElementConverter converter;
-
-  ElementConverterVisitor(this.converter);
-
-  @override
-  dart2js.LibraryElement visitLibraryElement(analyzer.LibraryElement input) {
-    return new LibraryElementY(converter, input);
-  }
-
-  @override
-  dart2js.FunctionElement visitFunctionElement(analyzer.FunctionElement input) {
-    if (input.isStatic) {
-      return new TopLevelFunctionElementY(converter, input);
-    } else {
-      return new LocalFunctionElementY(converter, input);
-    }
-  }
-
-  @override
-  dart2js.ParameterElement visitParameterElement(
-      analyzer.ParameterElement input) {
-    return new ParameterElementY(converter, input);
-  }
-
-  @override
-  dart2js.ClassElement visitClassElement(analyzer.ClassElement input) {
-    return new ClassElementY(converter, input);
-  }
-
-  @override
-  dart2js.TypedefElement visitFunctionTypeAliasElement(
-      analyzer.FunctionTypeAliasElement input) {
-    return new TypedefElementY(converter, input);
-  }
-
-  @override
-  dart2js.FieldElement visitTopLevelVariableElement(
-      analyzer.TopLevelVariableElement input) {
-    return new TopLevelVariableElementY(converter, input);
-  }
-
-  @override
-  dart2js.Element visitPropertyAccessorElement(
-      analyzer.PropertyAccessorElement input) {
-    if (input.isSynthetic) {
-      return input.variable.accept(this);
-    }
-    return null;
-  }
-
-  @override
-  dart2js.Element visitLocalVariableElement(
-      analyzer.LocalVariableElement input) {
-    return new LocalVariableElementY(converter, input);
-  }
-
-  @override
-  dart2js.ConstructorElement visitConstructorElement(
-      analyzer.ConstructorElement input) {
-    return new ConstructorElementY(converter, input);
-  }
-
-  @override
-  dart2js.MethodElement visitMethodElement(analyzer.MethodElement input) {
-    return new InstanceMethodElementY(converter, input);
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/identifier_semantics.dart b/pkg/analyzer2dart/lib/src/identifier_semantics.dart
deleted file mode 100644
index a61cfa0..0000000
--- a/pkg/analyzer2dart/lib/src/identifier_semantics.dart
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/**
- * Code for classifying the semantics of identifiers appearing in a Dart file.
- */
-library analyzer2dart.identifierSemantics;
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/element.dart';
-
-// TODO(johnniwinther,paulberry): This should be a constant.
-final AccessSemanticsVisitor ACCESS_SEMANTICS_VISITOR =
-    new AccessSemanticsVisitor();
-
-/**
- * Enum representing the different kinds of destinations which a property
- * access or method or function invocation might refer to.
- */
-class AccessKind {
-  /**
-   * The destination of the access is an instance method, property, or field
-   * of a class, and thus must be determined dynamically.
-   */
-  static const AccessKind DYNAMIC = const AccessKind._('DYNAMIC');
-
-  /**
-   * The destination of the access is a function that is defined locally within
-   * an enclosing function or method.
-   */
-  static const AccessKind LOCAL_FUNCTION = const AccessKind._('LOCAL_FUNCTION');
-
-  /**
-   * The destination of the access is a variable that is defined locally within
-   * an enclosing function or method.
-   */
-  static const AccessKind LOCAL_VARIABLE = const AccessKind._('LOCAL_VARIABLE');
-
-  /**
-   * The destination of the access is a variable that is defined as a parameter
-   * to an enclosing function or method.
-   */
-  static const AccessKind PARAMETER = const AccessKind._('PARAMETER');
-
-  /**
-   * The destination of the access is a field that is defined statically within
-   * a class, or a top level variable within a library.
-   */
-  static const AccessKind STATIC_FIELD = const AccessKind._('STATIC_FIELD');
-
-  /**
-   * The destination of the access is a method that is defined statically
-   * within a class, or at top level within a library.
-   */
-  static const AccessKind STATIC_METHOD = const AccessKind._('STATIC_METHOD');
-
-  /**
-   * The destination of the access is a property getter/setter that is defined
-   * statically within a class, or at top level within a library.
-   */
-  static const AccessKind STATIC_PROPERTY =
-      const AccessKind._('STATIC_PROPERTY');
-
-  /**
-   * The destination of the access is a toplevel class, function typedef, mixin
-   * application, or the built-in type "dynamic".
-   */
-  static const AccessKind TOPLEVEL_TYPE = const AccessKind._('TOPLEVEL_TYPE');
-
-  /**
-   * The destination of the access is a type parameter of the enclosing class.
-   */
-  static const AccessKind TYPE_PARAMETER = const AccessKind._('TYPE_PARAMETER');
-
-  final String name;
-
-  const AccessKind._(this.name);
-
-  String toString() => name;
-}
-
-/**
- * Data structure used to classify the semantics of a property access or method
- * or function invocation.
- */
-// TODO(paulberry,johnniwinther): Support index operations in AccessSemantics.
-class AccessSemantics {
-  /**
-   * The kind of access.
-   */
-  final AccessKind kind;
-
-  /**
-   * The identifier being used to access the property, method, or function.
-   */
-  final SimpleIdentifier identifier;
-
-  /**
-   * The element being accessed, if statically known.  This will be null if
-   * [kind] is DYNAMIC or if the element is undefined (e.g. an attempt to
-   * access a non-existent static method in a class).
-   */
-  final Element element;
-
-  /**
-   * The class containing the element being accessed, if this is a static
-   * reference to an element in a class.  This will be null if [kind] is
-   * DYNAMIC, LOCAL_FUNCTION, LOCAL_VARIABLE, PARAMETER, TOPLEVEL_CLASS, or
-   * TYPE_PARAMETER, or if the element being accessed is defined at toplevel
-   * within a library.
-   *
-   * Note: it is possible for [classElement] to be non-null and for [element]
-   * to be null; for example this occurs if the element being accessed is a
-   * non-existent static method or field inside an existing class.
-   */
-  final ClassElement classElement;
-
-  // TODO(paulberry): would it also be useful to store the libraryElement?
-
-  /**
-   * When [kind] is DYNAMIC, the expression whose runtime type determines the
-   * class in which [identifier] should be looked up.  Null if the expression
-   * is implicit "this".
-   *
-   * When [kind] is not DYNAMIC, this field is always null.
-   */
-  final Expression target;
-
-  /**
-   * True if this is an invocation of a method, or a call on a property.
-   */
-  final bool isInvoke;
-
-  AccessSemantics.dynamic(this.identifier, this.target, {this.isInvoke: false})
-      : kind = AccessKind.DYNAMIC,
-        element = null,
-        classElement = null;
-
-  AccessSemantics.localFunction(this.identifier, this.element, {this.isInvoke:
-      false})
-      : kind = AccessKind.LOCAL_FUNCTION,
-        classElement = null,
-        target = null;
-
-  AccessSemantics.localVariable(this.identifier, this.element, {this.isInvoke:
-      false})
-      : kind = AccessKind.LOCAL_VARIABLE,
-        classElement = null,
-        target = null;
-
-  AccessSemantics.parameter(this.identifier, this.element, {this.isInvoke:
-      false})
-      : kind = AccessKind.PARAMETER,
-        classElement = null,
-        target = null;
-
-  AccessSemantics.staticField(this.identifier, this.element, this.classElement,
-      {this.isInvoke: false})
-      : kind = AccessKind.STATIC_FIELD,
-        target = null;
-
-  AccessSemantics.staticMethod(this.identifier, this.element, this.classElement,
-      {this.isInvoke: false})
-      : kind = AccessKind.STATIC_METHOD,
-        target = null;
-
-  AccessSemantics.staticProperty(this.identifier, this.element,
-      this.classElement, {this.isInvoke: false})
-      : kind = AccessKind.STATIC_PROPERTY,
-        target = null;
-
-  AccessSemantics.toplevelType(this.identifier, this.element, {this.isInvoke:
-      false})
-      : kind = AccessKind.TOPLEVEL_TYPE,
-        classElement = null,
-        target = null;
-
-  AccessSemantics.typeParameter(this.identifier, this.element, {this.isInvoke:
-      false})
-      : kind = AccessKind.TYPE_PARAMETER,
-        classElement = null,
-        target = null;
-
-  /**
-   * True if this is a read access to a property, or a method tear-off.  Note
-   * that both [isRead] and [isWrite] will be true in the case of a
-   * read-modify-write operation (e.g. "+=").
-   */
-  bool get isRead => !isInvoke && identifier.inGetterContext();
-
-  /**
-   * True if this is a write access to a property, or an (erroneous) attempt to
-   * write to a method.  Note that both [isRead] and [isWrite] will be true in
-   * the case of a read-modify-write operation (e.g. "+=").
-   */
-  bool get isWrite => identifier.inSetterContext();
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('AccessSemantics[');
-    sb.write('kind=$kind,');
-    if (isRead && isWrite) {
-      assert(!isInvoke);
-      sb.write('read/write,');
-    } else if (isRead) {
-      sb.write('read,');
-    } else if (isWrite) {
-      sb.write('write,');
-    } else if (isInvoke) {
-      sb.write('call,');
-    }
-    if (element != null) {
-      sb.write('element=');
-      if (classElement != null) {
-        sb.write('${classElement.name}.');
-      }
-      sb.write('${element}');
-    } else {
-      if (target == null) {
-        sb.write('target=this.$identifier');
-      } else {
-        sb.write('target=$target.$identifier');
-      }
-    }
-    sb.write(']');
-    return sb.toString();
-  }
-}
-
-// TODO(johnniwinther,paulberry): This should extend a non-recursive visitor.
-class AccessSemanticsVisitor extends RecursiveAstVisitor<AccessSemantics> {
-  /**
-   * Return the semantics for [node].
-   */
-  @override
-  AccessSemantics visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
-    Element staticElement = node.methodName.staticElement;
-    if (target == null) {
-      if (staticElement is FunctionElement) {
-        if (staticElement.enclosingElement is CompilationUnitElement) {
-          return new AccessSemantics.staticMethod(
-              node.methodName,
-              staticElement,
-              null,
-              isInvoke: true);
-        } else {
-          return new AccessSemantics.localFunction(
-              node.methodName,
-              staticElement,
-              isInvoke: true);
-        }
-      } else if (staticElement is MethodElement && staticElement.isStatic) {
-        return new AccessSemantics.staticMethod(
-            node.methodName,
-            staticElement,
-            staticElement.enclosingElement,
-            isInvoke: true);
-      } else if (staticElement is PropertyAccessorElement) {
-        if (staticElement.isSynthetic) {
-          if (staticElement.enclosingElement is CompilationUnitElement) {
-            return new AccessSemantics.staticField(
-                node.methodName,
-                staticElement.variable,
-                null,
-                isInvoke: true);
-          } else if (staticElement.isStatic) {
-            return new AccessSemantics.staticField(
-                node.methodName,
-                staticElement.variable,
-                staticElement.enclosingElement,
-                isInvoke: true);
-          }
-        } else {
-          if (staticElement.enclosingElement is CompilationUnitElement) {
-            return new AccessSemantics.staticProperty(
-                node.methodName,
-                staticElement,
-                null,
-                isInvoke: true);
-          } else if (staticElement.isStatic) {
-            return new AccessSemantics.staticProperty(
-                node.methodName,
-                staticElement,
-                staticElement.enclosingElement,
-                isInvoke: true);
-          }
-        }
-      } else if (staticElement is LocalVariableElement) {
-        return new AccessSemantics.localVariable(
-            node.methodName,
-            staticElement,
-            isInvoke: true);
-      } else if (staticElement is ParameterElement) {
-        return new AccessSemantics.parameter(
-            node.methodName,
-            staticElement,
-            isInvoke: true);
-      } else if (staticElement is TypeParameterElement) {
-        return new AccessSemantics.typeParameter(
-            node.methodName,
-            staticElement,
-            isInvoke: true);
-      } else if (staticElement is ClassElement ||
-          staticElement is FunctionTypeAliasElement ||
-          staticElement is DynamicElementImpl) {
-        return new AccessSemantics.toplevelType(
-            node.methodName,
-            staticElement,
-            isInvoke: true);
-      }
-    } else if (target is Identifier) {
-      Element targetStaticElement = target.staticElement;
-      if (targetStaticElement is PrefixElement) {
-        if (staticElement == null) {
-          return new AccessSemantics.dynamic(
-              node.methodName,
-              null,
-              isInvoke: true);
-        } else if (staticElement is PropertyAccessorElement) {
-          if (staticElement.isSynthetic) {
-            return new AccessSemantics.staticField(
-                node.methodName,
-                staticElement.variable,
-                null,
-                isInvoke: true);
-          } else {
-            return new AccessSemantics.staticProperty(
-                node.methodName,
-                staticElement,
-                null,
-                isInvoke: true);
-          }
-        } else if (staticElement is TypeParameterElement) {
-          return new AccessSemantics.typeParameter(
-              node.methodName,
-              staticElement,
-              isInvoke: true);
-        } else if (staticElement is ClassElement ||
-            staticElement is FunctionTypeAliasElement) {
-          return new AccessSemantics.toplevelType(
-              node.methodName,
-              staticElement,
-              isInvoke: true);
-        } else {
-          return new AccessSemantics.staticMethod(
-              node.methodName,
-              staticElement,
-              null,
-              isInvoke: true);
-        }
-      } else if (targetStaticElement is ClassElement) {
-        if (staticElement is PropertyAccessorElement) {
-          if (staticElement.isSynthetic) {
-            return new AccessSemantics.staticField(
-                node.methodName,
-                staticElement.variable,
-                targetStaticElement,
-                isInvoke: true);
-          } else {
-            return new AccessSemantics.staticProperty(
-                node.methodName,
-                staticElement,
-                targetStaticElement,
-                isInvoke: true);
-          }
-        } else {
-          return new AccessSemantics.staticMethod(
-              node.methodName,
-              staticElement,
-              targetStaticElement,
-              isInvoke: true);
-        }
-      }
-    }
-    return new AccessSemantics.dynamic(node.methodName, target, isInvoke: true);
-  }
-
-  /**
-   * Return the access semantics for [node].
-   */
-  @override
-  AccessSemantics visitPrefixedIdentifier(PrefixedIdentifier node) {
-    return _classifyPrefixed(node.prefix, node.identifier);
-  }
-
-  /**
-   * Return the access semantics for [node].
-   */
-  @override
-  AccessSemantics visitPropertyAccess(PropertyAccess node) {
-    if (node.target is Identifier) {
-      return _classifyPrefixed(node.target, node.propertyName);
-    } else {
-      return new AccessSemantics.dynamic(node.propertyName, node.realTarget);
-    }
-  }
-
-  /**
-   * Return the access semantics for [node].
-   *
-   * Note: if [node] is the right hand side of a [PropertyAccess] or
-   * [PrefixedIdentifier], or the method name of a [MethodInvocation], the return
-   * value is null, since the semantics are determined by the parent.  In
-   * practice these cases should never arise because the parent will visit the
-   * parent node before visiting this one.
-   */
-  @override
-  AccessSemantics visitSimpleIdentifier(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (node.inDeclarationContext()) {
-      // This identifier is a declaration, not a use.
-      return null;
-    }
-    if (parent is TypeName) {
-      // TODO(paulberry): do we need to handle this case?
-      return null;
-    }
-    if ((parent is PropertyAccess && parent.propertyName == node) ||
-        (parent is PrefixedIdentifier && parent.identifier == node) ||
-        (parent is MethodInvocation && parent.methodName == node)) {
-      // The access semantics are determined by the parent.
-      return null;
-    }
-    // TODO(paulberry): handle PrefixElement.
-    Element staticElement = node.staticElement;
-    if (staticElement is PropertyAccessorElement) {
-      if (staticElement.isSynthetic) {
-        if (staticElement.enclosingElement is CompilationUnitElement) {
-          return new AccessSemantics.staticField(
-              node,
-              staticElement.variable,
-              null);
-        } else if (staticElement.isStatic) {
-          return new AccessSemantics.staticField(
-              node,
-              staticElement.variable,
-              staticElement.enclosingElement);
-        }
-      } else {
-        if (staticElement.enclosingElement is CompilationUnitElement) {
-          return new AccessSemantics.staticProperty(node, staticElement, null);
-        } else if (staticElement.isStatic) {
-          return new AccessSemantics.staticProperty(
-              node,
-              staticElement,
-              staticElement.enclosingElement);
-        }
-      }
-    } else if (staticElement is LocalVariableElement) {
-      return new AccessSemantics.localVariable(node, staticElement);
-    } else if (staticElement is ParameterElement) {
-      return new AccessSemantics.parameter(node, staticElement);
-    } else if (staticElement is FunctionElement) {
-      if (staticElement.enclosingElement is CompilationUnitElement) {
-        return new AccessSemantics.staticMethod(node, staticElement, null);
-      } else {
-        return new AccessSemantics.localFunction(node, staticElement);
-      }
-    } else if (staticElement is MethodElement && staticElement.isStatic) {
-      return new AccessSemantics.staticMethod(
-          node,
-          staticElement,
-          staticElement.enclosingElement);
-    } else if (staticElement is TypeParameterElement) {
-      return new AccessSemantics.typeParameter(node, staticElement);
-    } else if (staticElement is ClassElement ||
-        staticElement is FunctionTypeAliasElement ||
-        staticElement is DynamicElementImpl) {
-      return new AccessSemantics.toplevelType(node, staticElement);
-    }
-    return new AccessSemantics.dynamic(node, null);
-  }
-
-  /**
-   * Helper function for classifying an expression of type
-   * Identifier.SimpleIdentifier.
-   */
-  AccessSemantics _classifyPrefixed(Identifier lhs, SimpleIdentifier rhs) {
-    Element lhsElement = lhs.staticElement;
-    Element rhsElement = rhs.staticElement;
-    if (lhsElement is PrefixElement) {
-      if (rhsElement is PropertyAccessorElement) {
-        if (rhsElement.isSynthetic) {
-          return new AccessSemantics.staticField(
-              rhs,
-              rhsElement.variable,
-              null);
-        } else {
-          return new AccessSemantics.staticProperty(rhs, rhsElement, null);
-        }
-      } else if (rhsElement is FunctionElement) {
-        return new AccessSemantics.staticMethod(rhs, rhsElement, null);
-      } else if (rhsElement is ClassElement ||
-          rhsElement is FunctionTypeAliasElement) {
-        return new AccessSemantics.toplevelType(rhs, rhsElement);
-      } else {
-        return new AccessSemantics.dynamic(rhs, null);
-      }
-    } else if (lhsElement is ClassElement) {
-      if (rhsElement is PropertyAccessorElement && rhsElement.isSynthetic) {
-        return new AccessSemantics.staticField(
-            rhs,
-            rhsElement.variable,
-            lhsElement);
-      } else if (rhsElement is MethodElement) {
-        return new AccessSemantics.staticMethod(rhs, rhsElement, lhsElement);
-      } else {
-        return new AccessSemantics.staticProperty(rhs, rhsElement, lhsElement);
-      }
-    } else {
-      return new AccessSemantics.dynamic(rhs, lhs);
-    }
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/modely.dart b/pkg/analyzer2dart/lib/src/modely.dart
deleted file mode 100644
index e865675..0000000
--- a/pkg/analyzer2dart/lib/src/modely.dart
+++ /dev/null
@@ -1,914 +0,0 @@
-// Copyright (c) 2014, 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.
-
-part of analyzer2dart.element_converter;
-
-
-/// Base [dart2js.Element] implementation for converted analyzer elements.
-class ElementY extends dart2js.Element {
-  final ElementConverter converter;
-  final analyzer.Element element;
-
-  @override
-  String get name => element.name;
-
-  ElementY(this.converter, this.element);
-
-  @override
-  dart2js.LibraryElement get implementationLibrary => library;
-
-  @override
-  dart2js.Element get origin => this;
-
-  @override
-  dart2js.Element get patch => null;
-
-  @override
-  dart2js.Element get declaration => this;
-
-  @override
-  dart2js.Element get implementation => this;
-
-  @override
-  bool get isPatch => false;
-
-  @override
-  bool get isPatched => false;
-
-  @override
-  bool get isDeclaration => true;
-
-  @override
-  bool get isImplementation => false;
-
-  @override
-  dart2js.LibraryElement get library {
-    return converter.convertElement(element.library);
-  }
-
-  @override
-  bool get isLocal => false;
-
-  @override
-  bool get isSynthesized => false;
-
-  unsupported(String method) {
-    throw new UnsupportedError(
-        "'$method' is unsupported on $this ($runtimeType)");
-  }
-
-
-  @override
-  bool get isFinal => unsupported('isFinal');
-
-  @override
-  bool get isStatic => unsupported('isStatic');
-
-  @override
-  bool isForeign(_) => unsupported('isForeign');
-
-  @override
-  bool get impliesType => unsupported('impliesType');
-
-  @override
-  bool get isOperator => unsupported('impliesType');
-
-  @override
-  get position => unsupported('position');
-
-  @override
-  computeType(_) => unsupported('computeType');
-
-  @override
-  get enclosingElement => unsupported('enclosingElement');
-
-  @override
-  accept(_, __) => unsupported('accept');
-
-  @override
-  void addMetadata(_) => unsupported('addMetadata');
-
-  @override
-  get analyzableElement => unsupported('analyzableElement');
-
-  @override
-  asFunctionElement() => unsupported('asFunctionElement');
-
-  @override
-  buildScope() => unsupported('buildScope');
-
-  @override
-  get compilationUnit => unsupported('compilationUnit');
-
-  @override
-  get contextClass => unsupported('contextClass');
-
-  @override
-  void diagnose(context, listener) => unsupported('diagnose');
-
-  @override
-  get enclosingClass => unsupported('enclosingClass');
-
-  @override
-  get enclosingClassOrCompilationUnit {
-    return unsupported('enclosingClassOrCompilationUnit');
-  }
-
-  @override
-  String get fixedBackendName => unsupported('fixedBackendName');
-
-  @override
-  bool get hasFixedBackendName => unsupported('hasFixedBackendName');
-
-  @override
-  bool get isAbstract => unsupported('isAbstract');
-
-  @override
-  bool get isAssignable => unsupported('isAssignable');
-
-  @override
-  bool get isClassMember => unsupported('isClassMember');
-
-  @override
-  bool get isClosure => unsupported('isClosure');
-
-  @override
-  bool get isConst => unsupported('isConst');
-
-  @override
-  bool get isDeferredLoaderGetter => unsupported('isDeferredLoaderGetter');
-
-  @override
-  bool get isFactoryConstructor => unsupported('isFactoryConstructor');
-
-  @override
-  bool get isInjected => unsupported('isInjected');
-
-  @override
-  bool get isInstanceMember => unsupported('isInstanceMember');
-
-  @override
-  bool get isMixinApplication => unsupported('isMixinApplication');
-
-  @override
-  bool get isNative => unsupported('isNative');
-
-  @override
-  bool get isTopLevel => unsupported('isTopLevel');
-
-  @override
-  get kind => unsupported('kind');
-
-  @override
-  get metadata => unsupported('metadata');
-
-  @override
-  get outermostEnclosingMemberOrTopLevel {
-    return unsupported('outermostEnclosingMemberOrTopLevel');
-  }
-
-  @override
-  void setNative(String name) => unsupported('setNative');
-
-  String toString() => '$kind($name)';
-}
-
-abstract class AnalyzableElementY
-    implements ElementY, dart2js.AnalyzableElement {
-  @override
-  bool get hasTreeElements => unsupported('hasTreeElements');
-
-  @override
-  get treeElements => unsupported('treeElements');
-}
-
-abstract class AstElementY implements ElementY, dart2js.AstElement {
-  @override
-  bool get hasNode => unsupported('hasNode');
-
-  @override
-  get node => unsupported('node');
-
-  @override
-  bool get hasResolvedAst => unsupported('hasResolvedAst');
-
-  @override
-  get resolvedAst => unsupported('resolvedAst');
-}
-
-class LibraryElementY extends ElementY with AnalyzableElementY
-    implements dart2js.LibraryElement {
-  analyzer.LibraryElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.LIBRARY;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isInternalLibrary => isPlatformLibrary && element.isPrivate;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isPlatformLibrary => element.isInSdk;
-
-  @override
-  bool get isDartCore => element.isDartCore;
-
-  LibraryElementY(ElementConverter converter, analyzer.LibraryElement element)
-      : super(converter, element);
-
-  @override
-  void addCompilationUnit(_) => unsupported('addCompilationUnit');
-
-  @override
-  void addImport(element, import, listener) => unsupported('addImport');
-
-  @override
-  void addMember(element, listener) => unsupported('addMember');
-
-  @override
-  void addTag(tag, listener) => unsupported('addTag');
-
-  @override
-  void addToScope(element, listener) => unsupported('addToScope');
-
-  @override
-  bool get canUseNative => unsupported('canUseNative');
-
-  @override
-  Uri get canonicalUri => unsupported('canonicalUri');
-
-  @override
-  int compareTo(other) => unsupported('compareTo');
-
-  @override
-  get compilationUnits => unsupported('compilationUnits');
-
-  @override
-  get entryCompilationUnit => unsupported('entryCompilationUnit');
-
-  @override
-  get exports => unsupported('exports');
-
-  @override
-  bool get exportsHandled => unsupported('exportsHandled');
-
-  @override
-  find(String elementName) => unsupported('find');
-
-  @override
-  findExported(String elementName) => unsupported('findExported');
-
-  @override
-  findLocal(String elementName) => unsupported('findLocal');
-
-  @override
-  void forEachExport(_) => unsupported('forEachExport');
-
-  @override
-  void forEachLocalMember(_) => unsupported('forEachLocalMember');
-
-  @override
-  getImportsFor(element) => unsupported('getImportsFor');
-
-  @override
-  getLibraryFromTag(tag) => unsupported('getLibraryFromTag');
-
-  @override
-  String getLibraryName() => unsupported('getLibraryName');
-
-  @override
-  String getLibraryOrScriptName() => unsupported('getLibraryOrScriptName');
-
-  @override
-  getNonPrivateElementsInScope() => unsupported('getNonPrivateElementsInScope');
-
-  @override
-  bool hasLibraryName() => unsupported('hasLibraryName');
-
-  @override
-  bool get isPackageLibrary => unsupported('isPackageLibrary');
-
-  @override
-  get libraryTag => unsupported('libraryTag');
-
-  @override
-  void set libraryTag(value) => unsupported('libraryTag');
-
-  @override
-  localLookup(elementName) => unsupported('localLookup');
-
-  @override
-  void recordResolvedTag(tag, library) => unsupported('recordResolvedTag');
-
-  @override
-  void setExports(exportedElements) => unsupported('setExports');
-
-  @override
-  get tags => unsupported('tags');
-}
-
-abstract class TopLevelElementMixin implements ElementY {
-  @override
-  bool get isClassMember => false;
-
-  @override
-  bool get isInstanceMember => false;
-
-  @override
-  bool get isTopLevel => true;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isFactoryConstructor => false;
-
-  @override
-  bool get isStatic {
-    // Semantic difference: Analyzer considers top-level and static class
-    // members to be static, dart2js only considers static class members to be
-    // static.
-    return false;
-  }
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isAbstract => false;
-
-  @override
-  dart2js.ClassElement get enclosingClass => null;
-}
-
-abstract class FunctionElementMixin
-    implements ElementY, dart2js.FunctionElement {
-  analyzer.ExecutableElement get element;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isExternal => false;
-
-  @override
-  bool get isConst => false;
-
-  @override
-  get abstractField => unsupported('abstractField');
-
-  @override
-  computeSignature(_) => unsupported('computeSignature');
-
-  @override
-  get memberContext => unsupported('memberContext');
-
-  @override
-  get functionSignature => unsupported('functionSignature');
-
-  @override
-  bool get hasFunctionSignature => unsupported('hasFunctionSignature');
-
-  @override
-  get asyncMarker => unsupported('asyncMarker');
-
-  @override
-  List<dart2js.ParameterElement> get parameters {
-    return element.parameters.map(converter.convertElement).toList();
-  }
-
-  @override
-  dart2js.FunctionType get type => converter.convertType(element.type);
-}
-
-class TopLevelFunctionElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         TopLevelElementMixin,
-         FunctionElementMixin,
-         MemberElementMixin
-    implements dart2js.MethodElement {
-  analyzer.FunctionElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
-
-  TopLevelFunctionElementY(ElementConverter converter,
-                           analyzer.FunctionElement element)
-      : super(converter, element);
-
-  @override
-  get nestedClosures => unsupported('nestedClosures');
-}
-
-class LocalFunctionElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         LocalElementMixin,
-         FunctionElementMixin
-    implements dart2js.LocalFunctionElement {
-  analyzer.FunctionElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
-
-  @override
-  bool get isAbstract => false;
-
-  @override
-  bool get isConst => false;
-
-  LocalFunctionElementY(ElementConverter converter,
-                        analyzer.FunctionElement element)
-      : super(converter, element);
-}
-
-class ParameterElementY extends ElementY
-    with AnalyzableElementY, AstElementY, VariableElementMixin
-    implements dart2js.ParameterElement {
-
-  analyzer.ParameterElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.PARAMETER;
-
-  @override
-  dart2js.DartType get type => converter.convertType(element.type);
-
-  @override
-  bool get isLocal => true;
-
-  @override
-  bool get isStatic => false;
-
-  @override
-  bool get isConst => false;
-
-  @override
-  bool get isNamed => element.parameterKind == ParameterKind.NAMED;
-
-  @override
-  bool get isOptional => element.parameterKind.isOptional;
-
-  ParameterElementY(ElementConverter converter,
-                    analyzer.ParameterElement element)
-      : super(converter, element) {
-    assert(!element.isInitializingFormal);
-  }
-
-  @override
-  get executableContext => unsupported('executableContext');
-
-  @override
-  get functionDeclaration => unsupported('functionDeclaration');
-
-  @override
-  get functionSignature => unsupported('functionSignature');
-}
-
-class TypeDeclarationElementY extends ElementY
-    with AnalyzableElementY, AstElementY
-    implements dart2js.TypeDeclarationElement {
-
-  TypeDeclarationElementY(ElementConverter converter,
-                          analyzer.Element element)
-      : super(converter, element);
-
-  @override
-  void ensureResolved(compiler) => unsupported('ensureResolved');
-
-  @override
-  bool get isResolved => unsupported('isResolved');
-
-  @override
-  get rawType => null;//unsupported('rawType');
-
-  @override
-  int get resolutionState => unsupported('resolutionState');
-
-  @override
-  get thisType => unsupported('thisType');
-
-  @override
-  get typeVariables => unsupported('typeVariables');
-}
-
-class ClassElementY extends TypeDeclarationElementY
-    implements dart2js.ClassElement {
-
-  analyzer.ClassElement get element => super.element;
-
-  dart2js.ElementKind get kind => dart2js.ElementKind.CLASS;
-
-  @override
-  bool get isObject => element.type.isObject;
-
-  // TODO(johnniwinther): Ensure the correct semantics.
-  // TODO(paulberry,brianwilkerson): [ClassElement.isTypedef] should probably
-  // be renamed to [ClassElement.isNamedMixinApplication].
-  @override
-  bool get isMixinApplication => element.isTypedef;
-
-  @override
-  bool get isUnnamedMixinApplication => false;
-
-  @override
-  bool get isEnumClass => element.isEnum;
-
-  @override
-  bool get isAbstract => element.isAbstract;
-
-  // TODO(johnniwinther): Semantic difference: Dart2js points to unnamed
-  // mixin applications, analyzer points to the type in the extends clause or
-  // Object if omitted.
-  @override
-  dart2js.DartType get supertype {
-    return element.supertype != null
-        ? converter.convertType(element.supertype)
-        : null;
-  }
-
-  @override
-  util.Link<dart2js.DartType> get interfaces {
-    // TODO(johnniwinther): Support interfaces.
-    return const util.Link<dart2js.DartType>();
-  }
-
-  // TODO(johnniwinther): Support generic classes.
-  @override
-  List<dart2js.DartType> get typeVariables => const [];
-
-  @override
-  bool get isStatic => false;
-
-  @override
-  bool get isTopLevel => true;
-
-  @override
-  dart2js.ClassElement get enclosingClass => this;
-
-  ClassElementY(ElementConverter converter, analyzer.ClassElement element)
-      : super(converter, element);
-
-  @override
-  void addBackendMember(element) => unsupported('addBackendMember');
-
-  @override
-  void addMember(element, listener) => unsupported('addMember');
-
-  @override
-  void addToScope(element, listener) => unsupported('addToScope');
-
-  @override
-  get allSupertypes => unsupported('allSupertypes');
-
-  @override
-  get allSupertypesAndSelf => unsupported('allSupertypesAndSelf');
-
-  @override
-  asInstanceOf(cls) => unsupported('asInstanceOf');
-
-  @override
-  get callType => unsupported('callType');
-
-  @override
-  computeTypeParameters(compiler) => unsupported('computeTypeParameters');
-
-  @override
-  get constructors => unsupported('constructors');
-
-  @override
-  void forEachBackendMember(f) => unsupported('forEachBackendMember');
-
-  @override
-  void forEachClassMember(f) => unsupported('forEachClassMember');
-
-  @override
-  void forEachInstanceField(f, {includeSuperAndInjectedMembers: false}) {
-    unsupported('forEachInstanceField');
-  }
-
-  @override
-  void forEachInterfaceMember(f) => unsupported('forEachInterfaceMember');
-
-  @override
-  void forEachLocalMember(f) => unsupported('forEachLocalMember');
-
-  @override
-  void forEachMember(f,
-                     {includeBackendMembers: false,
-                      includeSuperAndInjectedMembers: false}) {
-    unsupported('forEachMember');
-  }
-
-  @override
-  void forEachStaticField(f) => unsupported('forEachStaticField');
-
-  @override
-  bool get hasBackendMembers => unsupported('hasBackendMembers');
-
-  @override
-  bool get hasConstructor => unsupported('hasConstructor');
-
-  @override
-  bool hasFieldShadowedBy(fieldMember) => unsupported('hasFieldShadowedBy');
-
-  @override
-  bool get hasIncompleteHierarchy => unsupported('hasIncompleteHierarchy');
-
-  @override
-  bool get hasLocalScopeMembers => unsupported('hasLocalScopeMembers');
-
-  @override
-  int get hierarchyDepth => unsupported('hierarchyDepth');
-
-  @override
-  int get id => unsupported('id');
-
-  @override
-  bool implementsFunction(compiler) => unsupported('implementsFunction');
-
-  @override
-  bool implementsInterface(intrface) => unsupported('implementsInterface');
-
-  @override
-  bool get isProxy => unsupported('isProxy');
-
-  @override
-  bool isSubclassOf(cls) => unsupported('isSubclassOf');
-
-  @override
-  localLookup(String elementName) => unsupported('localLookup');
-
-  @override
-  lookupBackendMember(String memberName) => unsupported('lookupBackendMember');
-
-  @override
-  lookupClassMember(name) => unsupported('lookupClassMember');
-
-  @override
-  lookupConstructor(selector, [noMatch]) => unsupported('lookupConstructor');
-
-  @override
-  lookupInterfaceMember(name) => unsupported('lookupInterfaceMember');
-
-  @override
-  lookupLocalMember(String memberName) => unsupported('lookupLocalMember');
-
-  @override
-  lookupMember(String memberName) => unsupported('lookupMember');
-
-  @override
-  lookupByName(dart2js.Name  memberName) => unsupported('lookupByName');
-
-  @override
-  lookupSuperMember(String memberName) => unsupported('lookupSuperMember');
-
-  @override
-  lookupSuperMemberInLibrary(memberName, library) {
-    unsupported('lookupSuperMemberInLibrary');
-  }
-
-  @override
-  lookupSuperByName(dart2js.Name memberName) =>
-      unsupported('lookupSuperByName');
-
-  @override
-  String get nativeTagInfo => unsupported('nativeTagInfo');
-
-  @override
-  void reverseBackendMembers() => unsupported('reverseBackendMembers');
-
-  @override
-  dart2js.ClassElement get superclass => unsupported('superclass');
-
-  @override
-  int get supertypeLoadState => unsupported('supertypeLoadState');
-
-  @override
-  dart2js.ConstructorElement lookupDefaultConstructor() => unsupported('lookupDefaultConstructor');
-}
-
-class TypedefElementY extends TypeDeclarationElementY
-    implements dart2js.TypedefElement {
-
-  analyzer.FunctionTypeAliasElement get element => super.element;
-
-  dart2js.ElementKind get kind => dart2js.ElementKind.TYPEDEF;
-
-  TypedefElementY(ElementConverter converter,
-                  analyzer.FunctionTypeAliasElement element)
-      : super(converter, element);
-
-  @override
-  dart2js.DartType get alias => unsupported('alias');
-
-  @override
-  void checkCyclicReference(compiler) => unsupported('checkCyclicReference');
-
-  @override
-  get functionSignature => unsupported('functionSignature');
-}
-
-abstract class VariableElementMixin
-    implements ElementY, dart2js.VariableElement {
-  @override
-  get initializer => unsupported('initializer');
-
-  @override
-  get memberContext => unsupported('memberContext');
-
-  @override
-  get constant => unsupported('constant');
-}
-
-class TopLevelVariableElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         TopLevelElementMixin,
-         VariableElementMixin,
-         MemberElementMixin
-    implements dart2js.FieldElement {
-
-  analyzer.TopLevelVariableElement get element => super.element;
-
-  dart2js.ElementKind get kind => dart2js.ElementKind.FIELD;
-
-  @override
-  dart2js.DartType get type => converter.convertType(element.type);
-
-  @override
-  bool get isFinal => element.isFinal;
-
-  @override
-  bool get isConst => element.isConst;
-
-  TopLevelVariableElementY(ElementConverter converter,
-                           analyzer.TopLevelVariableElement element)
-      : super(converter, element);
-
-  @override
-  get nestedClosures => unsupported('nestedClosures');
-}
-
-abstract class LocalElementMixin implements ElementY, dart2js.LocalElement {
-
-  @override
-  bool get isLocal => true;
-
-  @override
-  bool get isInstanceMember => false;
-
-  @override
-  bool get isStatic => false;
-
-  @override
-  bool get isTopLevel => false;
-
-  @override
-  get executableContext => unsupported('executableContext');
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isFactoryConstructor => false;
-}
-
-class LocalVariableElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         LocalElementMixin,
-         VariableElementMixin
-    implements dart2js.LocalVariableElement {
-
-  analyzer.LocalVariableElement get element => super.element;
-
-  dart2js.ElementKind get kind => dart2js.ElementKind.VARIABLE;
-
-  @override
-  bool get isConst => element.isConst;
-
-  LocalVariableElementY(ElementConverter converter,
-                        analyzer.LocalVariableElement element)
-      : super(converter, element);
-
-  @override
-  dart2js.DartType get type => unsupported('type');
-}
-
-abstract class ClassMemberMixin implements ElementY {
-  analyzer.ClassMemberElement get element;
-
-  @override
-  dart2js.ClassElement get contextClass => enclosingClass;
-
-  @override
-  dart2js.ClassElement get enclosingClass {
-    return converter.convertElement(element.enclosingElement);
-  }
-
-  @override
-  bool get isClassMember => true;
-
-  @override
-  bool get isTopLevel => false;
-}
-
-class ConstructorElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         FunctionElementMixin,
-         ClassMemberMixin,
-         MemberElementMixin
-    implements dart2js.ConstructorElement {
-
-  analyzer.ConstructorElement get element => super.element;
-
-  // TODO(johnniwinther): Support redirecting/factory constructors.
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.GENERATIVE_CONSTRUCTOR;
-
-  // TODO(johnniwinther): Support factory constructors.
-  @override
-  bool get isFactoryConstructor => false;
-
-  // TODO(johnniwinther): Support redirecting factory constructors.
-  @override
-  bool get isRedirectingFactory => false;
-
-  // TODO(johnniwinther): Support redirecting generative constructors.
-  @override
-  bool get isRedirectingGenerative => false;
-
-  @override
-  bool get isStatic => false;
-
-  @override
-  bool get isSynthesized => element.isSynthetic;
-
-  ConstructorElementY(ElementConverter converter,
-                      analyzer.ConstructorElement element)
-      : super(converter, element);
-
-  @override
-  computeEffectiveTargetType(_) => unsupported('computeEffectiveTargetType');
-
-  @override
-  get definingConstructor => unsupported('definingConstructor');
-
-  @override
-  get effectiveTarget => unsupported('effectiveTarget');
-
-  @override
-  get immediateRedirectionTarget => unsupported('immediateRedirectionTarget');
-
-  @override
-  get nestedClosures => unsupported('nestedClosures');
-
-  @override
-  get constantConstructor => unsupported('constantConstructor');
-
-  @override
-  get isFromEnvironmentConstructor {
-    unsupported('isFromEnvironmentConstructor');
-  }
-
-  @override
-  bool get isCyclicRedirection => effectiveTarget.isRedirectingFactory;
-
-  // TODO(johnniwinther): implement redirectionDeferredPrefix
-  @override
-  dart2js.PrefixElement get redirectionDeferredPrefix => null;
-}
-
-class InstanceMethodElementY extends ElementY
-    with AnalyzableElementY,
-         AstElementY,
-         FunctionElementMixin,
-         ClassMemberMixin,
-         MemberElementMixin
-    implements dart2js.MethodElement {
-
-  analyzer.MethodElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
-
-  @override
-  bool get isStatic => element.isStatic;
-
-  @override
-  bool get isAbstract => element.isAbstract;
-
-  @override
-  bool get isFactoryConstructor => false;
-
-  @override
-  bool get isInstanceMember => true;
-
-  InstanceMethodElementY(ElementConverter converter,
-                         analyzer.MethodElement element)
-      : super(converter, element);
-
-  @override
-  get nestedClosures => unsupported('nestedClosures');
-}
-
-abstract class MemberElementMixin implements dart2js.MemberElement {
-  dart2js.Name get memberName => new dart2js.Name(name, library);
-}
diff --git a/pkg/analyzer2dart/lib/src/semantic_visitor.dart b/pkg/analyzer2dart/lib/src/semantic_visitor.dart
deleted file mode 100644
index b5edd6a..0000000
--- a/pkg/analyzer2dart/lib/src/semantic_visitor.dart
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.semantic_visitor;
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-import 'util.dart';
-import 'identifier_semantics.dart';
-
-/// An AST visitor which uses the [AccessSemantics] of invocations and accesses
-/// to fine-grain visitor methods.
-abstract class SemanticVisitor<R> extends RecursiveAstVisitor<R> {
-
-  Source get currentSource;
-
-  void reportMessage(AstNode node, String message) {
-    reportSourceMessage(currentSource, node, message);
-  }
-
-  giveUp(AstNode node, String message) {
-    reportMessage(node, message);
-    throw new UnimplementedError(message);
-  }
-
-  bool invariant(AstNode node, condition, String message) {
-    if (condition is Function) {
-      condition = condition();
-    }
-    if (!condition) {
-      reportMessage(node, message);
-      return false;
-    }
-    return true;
-  }
-
-  R visitDynamicInvocation(MethodInvocation node,
-                           AccessSemantics semantics) {
-    return giveUp(node, 'visitDynamicInvocation of $semantics');
-  }
-
-  R visitLocalFunctionInvocation(MethodInvocation node,
-                                 AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalFunctionInvocation of $semantics');
-  }
-
-  R visitLocalVariableInvocation(MethodInvocation node,
-                                 AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalVariableInvocation of $semantics');
-  }
-
-  R visitParameterInvocation(MethodInvocation node,
-                             AccessSemantics semantics) {
-    return giveUp(node, 'visitParameterInvocation of $semantics');
-  }
-
-  R visitStaticFieldInvocation(MethodInvocation node,
-                               AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticFieldInvocation of $semantics');
-  }
-
-  R visitStaticMethodInvocation(MethodInvocation node,
-                                AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticMethodInvocation of $semantics');
-  }
-
-  R visitStaticPropertyInvocation(MethodInvocation node,
-                                  AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticPropertyInvocation of $semantics');
-  }
-
-  @override
-  R visitMethodInvocation(MethodInvocation node) {
-    if (node.target != null) {
-      node.target.accept(this);
-    }
-    node.argumentList.accept(this);
-    return handleMethodInvocation(node);
-  }
-
-  R handleMethodInvocation(MethodInvocation node) {
-    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
-    switch (semantics.kind) {
-      case AccessKind.DYNAMIC:
-        return visitDynamicInvocation(node, semantics);
-      case AccessKind.LOCAL_FUNCTION:
-        return visitLocalFunctionInvocation(node, semantics);
-      case AccessKind.LOCAL_VARIABLE:
-        return visitLocalVariableInvocation(node, semantics);
-      case AccessKind.PARAMETER:
-        return visitParameterInvocation(node, semantics);
-      case AccessKind.STATIC_FIELD:
-        return visitStaticFieldInvocation(node, semantics);
-      case AccessKind.STATIC_METHOD:
-        return visitStaticMethodInvocation(node, semantics);
-      case AccessKind.STATIC_PROPERTY:
-        return visitStaticPropertyInvocation(node, semantics);
-      default:
-        // Unexpected access kind.
-        return giveUp(node,
-            'Unexpected ${semantics} in visitMethodInvocation.');
-    }
-  }
-
-  @override
-  R visitPropertyAccess(PropertyAccess node) {
-    if (node.target != null) {
-      node.target.accept(this);
-    }
-    return handlePropertyAccess(node);
-  }
-
-  R handlePropertyAccess(PropertyAccess node) {
-    return _handlePropertyAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
-  }
-
-  @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) {
-    node.prefix.accept(this);
-    return handlePrefixedIdentifier(node);
-  }
-
-  R handlePrefixedIdentifier(PrefixedIdentifier node) {
-    return _handlePropertyAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
-  }
-
-  @override
-  R visitSimpleIdentifier(SimpleIdentifier node) {
-    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
-    if (semantics != null) {
-      return _handlePropertyAccess(node, semantics);
-    } else {
-      return null;
-    }
-  }
-
-  R visitDynamicAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitDynamicAccess of $semantics');
-  }
-
-  R visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalFunctionAccess of $semantics');
-  }
-
-  R visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalVariableAccess of $semantics');
-  }
-
-  R visitParameterAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitParameterAccess of $semantics');
-  }
-
-  R visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticFieldAccess of $semantics');
-  }
-
-  R visitStaticMethodAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticMethodAccess of $semantics');
-  }
-
-  R visitStaticPropertyAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticPropertyAccess of $semantics');
-  }
-
-  R visitToplevelClassAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitToplevelClassAccess of $semantics');
-  }
-
-  R visitTypeParameterAccess(AstNode node, AccessSemantics semantics) {
-    return giveUp(node, 'visitTypeParameterAccess of $semantics');
-  }
-
-  R _handlePropertyAccess(AstNode node, AccessSemantics semantics) {
-    switch (semantics.kind) {
-      case AccessKind.DYNAMIC:
-        return visitDynamicAccess(node, semantics);
-      case AccessKind.LOCAL_FUNCTION:
-        return visitLocalFunctionAccess(node, semantics);
-      case AccessKind.LOCAL_VARIABLE:
-        return visitLocalVariableAccess(node, semantics);
-      case AccessKind.PARAMETER:
-        return visitParameterAccess(node, semantics);
-      case AccessKind.STATIC_FIELD:
-        return visitStaticFieldAccess(node, semantics);
-      case AccessKind.STATIC_METHOD:
-        return visitStaticMethodAccess(node, semantics);
-      case AccessKind.STATIC_PROPERTY:
-        return visitStaticPropertyAccess(node, semantics);
-      case AccessKind.TOPLEVEL_TYPE:
-        return visitToplevelClassAccess(node, semantics);
-      case AccessKind.TYPE_PARAMETER:
-        return visitTypeParameterAccess(node, semantics);
-      default:
-        // Unexpected access kind.
-        return giveUp(node,
-            'Unexpected ${semantics} in _handlePropertyAccess.');
-    }
-  }
-
-  R visitDynamicPropertyAssignment(AssignmentExpression node,
-                                   AccessSemantics semantics) {
-    return giveUp(node, 'visitDynamicPropertyAssignment of $semantics');
-  }
-
-  R visitLocalFunctionAssignment(AssignmentExpression node,
-                                 AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalFunctionAssignment of $semantics');
-  }
-
-  R visitLocalVariableAssignment(AssignmentExpression node,
-                                 AccessSemantics semantics) {
-    return giveUp(node, 'visitLocalVariableAssignment of $semantics');
-  }
-
-  R visitParameterAssignment(AssignmentExpression node,
-                             AccessSemantics semantics) {
-    return giveUp(node, 'visitParameterAssignment of $semantics');
-  }
-
-  R visitStaticFieldAssignment(AssignmentExpression node,
-                               AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticFieldAssignment of $semantics');
-  }
-
-  R visitStaticMethodAssignment(AssignmentExpression node,
-                                AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticMethodAssignment of $semantics');
-  }
-
-  R visitStaticPropertyAssignment(AssignmentExpression node,
-                                  AccessSemantics semantics) {
-    return giveUp(node, 'visitStaticPropertyAssignment of $semantics');
-  }
-
-  @override
-  R visitAssignmentExpression(AssignmentExpression node) {
-    super.visitAssignmentExpression(node);
-    return handleAssignmentExpression(node);
-  }
-
-  R handleAssignmentExpression(AssignmentExpression node) {
-    AccessSemantics semantics =
-        node.leftHandSide.accept(ACCESS_SEMANTICS_VISITOR);
-    if (semantics == null) {
-      return giveUp(node, 'handleAssignmentExpression with no AccessSemantics');
-    } else {
-      switch (semantics.kind) {
-        case AccessKind.DYNAMIC:
-          return visitDynamicPropertyAssignment(node, semantics);
-        case AccessKind.LOCAL_FUNCTION:
-          return visitLocalFunctionAssignment(node, semantics);
-        case AccessKind.LOCAL_VARIABLE:
-          return visitLocalVariableAssignment(node, semantics);
-        case AccessKind.PARAMETER:
-          return visitParameterAssignment(node, semantics);
-        case AccessKind.STATIC_FIELD:
-          return visitStaticFieldAssignment(node, semantics);
-        case AccessKind.STATIC_METHOD:
-          return visitStaticMethodAssignment(node, semantics);
-        case AccessKind.STATIC_PROPERTY:
-          return visitStaticPropertyAssignment(node, semantics);
-        default:
-          // Unexpected access kind.
-          return giveUp(node,
-              'Unexpected ${semantics} in _handlePropertyAccess.');
-      }
-    }
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
deleted file mode 100644
index 6b9eaa6..0000000
--- a/pkg/analyzer2dart/lib/src/tree_shaker.dart
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright (c) 2014, 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 analyzer2dart.treeShaker;
-
-import 'dart:collection';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:compiler/src/universe/universe.dart';
-
-import 'closed_world.dart';
-import 'util.dart';
-import 'semantic_visitor.dart';
-import 'identifier_semantics.dart';
-
-/**
- * The result of performing local reachability analysis on a method.
- */
-class MethodAnalysis {
-  /**
-   * The AST for the method.
-   */
-  final Declaration declaration;
-
-  /**
-   * The functions statically called by the method.
-   */
-  final List<ExecutableElement> calls = <ExecutableElement>[];
-
-  /**
-   * The fields and top-level variables statically accessed by the method.
-   */
-  // TODO(johnniwinther): Should we split this into reads and writes?
-  final List<PropertyInducingElement> accesses = <PropertyInducingElement>[];
-
-  /**
-   * The selectors used by the method to perform dynamic invocation.
-   */
-  final List<Selector> invokes = <Selector>[];
-
-  /**
-   * The classes that are instantiated by the method.
-   */
-  // TODO(johnniwinther,paulberry): Register instantiated types.
-  // TODO(johnniwinther,paulberry): Register checked types from is/as checks,
-  // catch clauses and (checked) type annotations.
-  final List<ClassElement> instantiates = <ClassElement>[];
-
-  MethodAnalysis(this.declaration);
-}
-
-/**
- * The result of performing local reachability analysis on a class.
- *
- * TODO(paulberry): Do we need to do any other analysis of classes?  (For
- * example, detect annotations that are relevant to mirrors, detect that a
- * class might be used for custom HTML elements, or collect inherited and
- * mixed-in classes).
- */
-class ClassAnalysis {
-  /**
-   * The AST for the class.
-   */
-  final ClassDeclaration declaration;
-
-  ClassAnalysis(this.declaration);
-}
-
-/**
- * This class is responsible for performing local analysis of the source code
- * to provide the information needed to do tree shaking.
- */
-class LocalReachabilityComputer {
-  /**
-   * Perform local reachability analysis of [method].
-   */
-  MethodAnalysis analyzeMethod(ExecutableElement method) {
-    Declaration declaration = method.node;
-    MethodAnalysis analysis = new MethodAnalysis(declaration);
-    if (declaration != null) {
-      declaration.accept(new TreeShakingVisitor(analysis));
-    } else if (method is ConstructorElement) {
-      // This constructor has no associated declaration in the AST.  Either it
-      // is a default constructor for an ordinary class, or it's a synthetic
-      // constructor associated with a mixin.  For now we assume it's a default
-      // constructor, in which case all we need to do is record the class as
-      // being instantiated by this method.  TODO(paulberry): handle the
-      // mixin case.
-      ClassElement instantiatedClass = method.enclosingElement;
-      analysis.instantiates.add(instantiatedClass);
-      if (instantiatedClass.supertype != null) {
-        ClassElement superClass = instantiatedClass.supertype.element;
-        ConstructorElement superConstructor = superClass.unnamedConstructor;
-        if (superConstructor != null) {
-          // TODO(johnniwinther): Register instantiated type and selector.
-          analysis.calls.add(superConstructor);
-        }
-      }
-    } else {
-      // This is an executable element with no associated declaration in the
-      // AST, and it's not a constructor.  TODO(paulberry): can this ever
-      // happen?
-      throw new UnimplementedError();
-    }
-    return analysis;
-  }
-
-  /**
-   * Perform local reachability analysis of [classElement].
-   */
-  ClassAnalysis analyzeClass(ClassElement classElement) {
-    return new ClassAnalysis(classElement.node);
-  }
-
-  /**
-   * Determine which members of [classElement] are matched by the given
-   * [selector].
-   *
-   * [methods] is populated with all the class methods which are matched by the
-   * selector, [accessors] with all the getters and setters which are matched
-   * by the selector, and [fields] with all the fields which are matched by the
-   * selector.
-   */
-  void getMatchingClassMembers(ClassElement classElement, Selector selector,
-      List<MethodElement> methods, List<PropertyAccessorElement> accessors,
-      List<PropertyInducingElement> fields) {
-    // TODO(paulberry): should we walk through superclasses and mixins as well
-    // here?  Or would it be better to make [TreeShaker] responsible for those
-    // relationships (since they are non-local)?  Consider making use of
-    // InheritanceManager to do this.
-    for (MethodElement method in classElement.methods) {
-      // TODO(paulberry): account for arity and named arguments when matching
-      // the selector against the method.
-      if (selector.name == method.name) {
-        methods.add(method);
-      }
-    }
-    if (selector.kind == SelectorKind.GETTER) {
-      for (PropertyAccessorElement accessor in classElement.accessors) {
-        if (accessor.isGetter && selector.name == accessor.name) {
-          if (accessor.isSynthetic) {
-            // This accessor is implied by the corresponding field declaration.
-            fields.add(accessor.variable);
-          } else {
-            accessors.add(accessor);
-          }
-        }
-      }
-    } else if (selector.kind == SelectorKind.SETTER) {
-      // accessor.name uses the convention that setter names end in '='.
-      String selectorNameWithEquals = '${selector.name}=';
-      for (PropertyAccessorElement accessor in classElement.accessors) {
-        if (accessor.isSetter && selectorNameWithEquals == accessor.name) {
-          if (accessor.isSynthetic) {
-            // This accessor is implied by the corresponding field declaration.
-            // TODO(paulberry): should we distinguish reads and writes?
-            fields.add(accessor.variable);
-          } else {
-            accessors.add(accessor);
-          }
-        }
-      }
-    }
-  }
-}
-
-/**
- * This class is responsible for driving the tree shaking process, and
- * and performing the global inferences necessary to determine which methods
- * in the source program are reachable.  It makes use of
- * [LocalReachabilityComputer] to do local analysis of individual classes and
- * methods.
- */
-class TreeShaker {
-  List<Element> _queue = <Element>[];
-  Set<Element> _alreadyEnqueued = new HashSet<Element>();
-  ClosedWorld _world;
-  Set<Selector> _selectors = new HashSet<Selector>();
-  final LocalReachabilityComputer _localComputer =
-      new LocalReachabilityComputer();
-
-  TreeShaker(TypeProvider typeProvider, FunctionElement mainFunction)
-      : _world = new ClosedWorld(typeProvider, mainFunction);
-
-  void _addElement(Element element) {
-    if (_alreadyEnqueued.add(element)) {
-      _queue.add(element);
-    }
-  }
-
-  void _addSelector(Selector selector) {
-    if (_selectors.add(selector)) {
-      // New selector, so match it against all class methods.
-      _world.instantiatedClasses.forEach((ClassElement element, AstNode node) {
-        _matchClassToSelector(element, selector);
-      });
-    }
-  }
-
-  void _matchClassToSelector(ClassElement classElement, Selector selector) {
-    List<MethodElement> methods = <MethodElement>[];
-    List<PropertyAccessorElement> accessors = <PropertyAccessorElement>[];
-    List<PropertyInducingElement> fields = <PropertyInducingElement>[];
-    _localComputer.getMatchingClassMembers(
-        classElement,
-        selector,
-        methods,
-        accessors,
-        fields);
-    methods.forEach(_addElement);
-    accessors.forEach(_addElement);
-    fields.forEach(_addElement);
-  }
-
-  ClosedWorld shake() {
-    _addElement(_world.mainFunction);
-    while (_queue.isNotEmpty) {
-      Element element = _queue.removeLast();
-      if (element is ExecutableElement) {
-        MethodAnalysis analysis = _localComputer.analyzeMethod(element);
-        _world.executableElements[element] = analysis.declaration;
-        analysis.calls.forEach(_addElement);
-        analysis.invokes.forEach(_addSelector);
-        analysis.instantiates.forEach(_addElement);
-        analysis.accesses.forEach(_addElement);
-      } else if (element is ClassElement) {
-        ClassAnalysis analysis = _localComputer.analyzeClass(element);
-        _world.instantiatedClasses[element] = analysis.declaration;
-        for (Selector selector in _selectors) {
-          _matchClassToSelector(element, selector);
-        }
-      } else if (element is FieldElement) {
-        VariableDeclaration declaration = element.node;
-        _world.fields[element] = declaration;
-      } else if (element is TopLevelVariableElement) {
-        VariableDeclaration declaration = element.node;
-        _world.variables[element] = declaration;
-      } else {
-        throw new Exception(
-            'Unexpected element type while tree shaking: '
-                '$element (${element.runtimeType})');
-      }
-    }
-    return _world;
-  }
-}
-
-class TreeShakingVisitor extends SemanticVisitor {
-  final MethodAnalysis analysis;
-
-  TreeShakingVisitor(this.analysis);
-
-  Source get currentSource => analysis.declaration.element.source;
-
-  @override
-  void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorElement staticElement = node.staticElement;
-    if (staticElement != null) {
-      analysis.calls.add(staticElement);
-    } else {
-      // TODO(paulberry): deal with this situation.  This can happen, for
-      // example, in the case "main() => new Unresolved();" (which is a
-      // warning, not an error).
-    }
-    super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  void visitDynamicInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    analysis.invokes.add(createSelectorFromMethodInvocation(
-        node.argumentList, node.methodName.name));
-  }
-
-  @override
-  void visitLocalFunctionInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitLocalVariableInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitParameterInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitStaticFieldInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    // Invocation of a static field.
-    analysis.accesses.add(semantics.element);
-    analysis.invokes.add(createSelectorFromMethodInvocation(
-        node.argumentList, 'call'));
-  }
-
-  @override
-  void visitStaticMethodInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    analysis.calls.add(semantics.element);
-  }
-
-  @override
-  void visitStaticPropertyInvocation(MethodInvocation node,
-      AccessSemantics semantics) {
-    // Invocation of a property.  TODO(paulberry): handle this.
-    super.visitStaticPropertyInvocation(node, semantics);
-  }
-
-  void handleDynamicAccess(AccessSemantics semantics) {
-    if (semantics.isRead) {
-      analysis.invokes.add(
-          new Selector.getter(semantics.identifier.name, null));
-    }
-    if (semantics.isWrite) {
-      // Selector.setter constructor uses the convention that setter names
-      // don't end in '='.
-      analysis.invokes.add(
-          new Selector.setter(semantics.identifier.name, null));
-    }
-  }
-
-  @override
-  void visitDynamicAccess(AstNode node, AccessSemantics semantics) {
-    handleDynamicAccess(semantics);
-  }
-
-  @override
-  void visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitParameterAccess(AstNode node, AccessSemantics semantics) {
-    // Locals don't need to be tree shaken.
-  }
-
-  @override
-  void visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
-    analysis.accesses.add(semantics.element);
-  }
-
-  @override
-  void visitStaticMethodAccess(AstNode node, AccessSemantics semantics) {
-    // Method tear-off.  TODO(paulberry): implement.
-    super.visitStaticMethodAccess(node, semantics);
-  }
-
-  @override
-  void visitStaticPropertyAccess(AstNode node, AccessSemantics semantics) {
-    // TODO(paulberry): implement.
-    super.visitStaticPropertyAccess(node, semantics);
-  }
-
-  @override
-  void visitConstructorDeclaration(ConstructorDeclaration node) {
-    // TODO(paulberry): handle parameter list.
-    node.initializers.accept(this);
-    node.body.accept(this);
-    if (node.factoryKeyword == null) {
-      // This is a generative constructor.  Figure out if it is redirecting.
-      // If it isn't, then the constructor instantiates the class so we need to
-      // add the class to analysis.instantiates.  (If it is redirecting, then
-      // we don't need to, because the redirected-to constructor will take care
-      // of that).
-      if (node.initializers.length != 1 || node.initializers[0] is! RedirectingConstructorInvocation) {
-        ClassElement classElement = node.element.enclosingElement;
-        analysis.instantiates.add(node.element.enclosingElement);
-        if (!node.initializers.any((i) => i is SuperConstructorInvocation)) {
-          if (classElement.supertype != null) {
-            ClassElement superClass = classElement.supertype.element;
-            ConstructorElement superConstructor = superClass.unnamedConstructor;
-            if (superConstructor != null) {
-              // TODO(johnniwinther): Register instantiated type and selector.
-              analysis.calls.add(superConstructor);
-            }
-          }
-        }
-      }
-    } else if (node.redirectedConstructor != null) {
-      if (node.redirectedConstructor.staticElement == null) {
-        // Factory constructor redirects to a non-existent constructor.
-        // TODO(paulberry): handle this.
-        throw new UnimplementedError();
-      } else {
-        analysis.calls.add(node.redirectedConstructor.staticElement);
-      }
-    }
-  }
-
-  @override
-  void
-      visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    // Note: we don't have to worry about node.staticElement being
-    // null, because that would have been detected by the analyzer and
-    // reported as a compile time error.
-    analysis.calls.add(node.staticElement);
-  }
-
-  @override
-  void handleAssignmentExpression(AssignmentExpression node) {
-    // Don't special-case assignment expressions.
-  }
-}
diff --git a/pkg/analyzer2dart/lib/src/util.dart b/pkg/analyzer2dart/lib/src/util.dart
deleted file mode 100644
index fd1c20b..0000000
--- a/pkg/analyzer2dart/lib/src/util.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2014, 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.
-
-// Utility function shared between different parts of analyzer2dart.
-
-library analyzer2dart.util;
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:compiler/src/elements/elements.dart' show PublicName;
-import 'package:compiler/src/universe/universe.dart';
-import 'package:compiler/src/io/source_file.dart';
-
-CallStructure createCallStructureFromMethodInvocation(ArgumentList node) {
-  int arity = 0;
-  List<String> namedArguments = <String>[];
-  for (Expression argument in node.arguments) {
-    if (argument is NamedExpression) {
-      namedArguments.add(argument.name.label.name);
-    } else {
-      arity++;
-    }
-  }
-  return new CallStructure(arity, namedArguments);
-}
-
-Selector createSelectorFromMethodInvocation(ArgumentList node,
-                                            String name) {
-  CallStructure callStructure = createCallStructureFromMethodInvocation(node);
-  // TODO(johnniwinther): Support private names.
-  return new Selector(SelectorKind.CALL, new PublicName(name), callStructure);
-}
-
-/// Prints [message] together with source code pointed to by [node] from
-/// [source].
-void reportSourceMessage(Source source, AstNode node, String message) {
-  SourceFile sourceFile =
-      new StringSourceFile.fromName(source.fullName, source.contents.data);
-
-  print(sourceFile.getLocationMessage(message, node.offset, node.end));
-}
diff --git a/pkg/analyzer2dart/test/driver_test.dart b/pkg/analyzer2dart/test/driver_test.dart
deleted file mode 100644
index 5807714..0000000
--- a/pkg/analyzer2dart/test/driver_test.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2014, 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 'mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:compiler/src/dart2jslib.dart' show NullSink;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/closed_world.dart';
-import '../lib/src/driver.dart';
-
-main() {
-  MemoryResourceProvider provider;
-  Driver driver;
-  setUp(() {
-    provider = new MemoryResourceProvider();
-    DartSdk sdk = new MockSdk();
-    driver = new Driver(provider, sdk, NullSink.outputProvider);
-  });
-
-  Source setFakeRoot(String contents) {
-    String path = '/root.dart';
-    provider.newFile(path, contents);
-    return driver.setRoot(path);
-  }
-
-  test('resolveEntryPoint', () {
-    String contents = 'main() {}';
-    Source source = setFakeRoot(contents);
-    FunctionElement element = driver.resolveEntryPoint(source);
-    expect(element.name, equals('main'));
-  });
-
-  test('computeWorld', () {
-    String contents = '''
-main() {
-  foo();
-}
-
-foo() {
-}
-
-bar() {
-}
-''';
-    Source source = setFakeRoot(contents);
-    FunctionElement entryPoint = driver.resolveEntryPoint(source);
-    ClosedWorld world = driver.computeWorld(entryPoint);
-    expect(world.executableElements, hasLength(2));
-    CompilationUnitElement compilationUnit =
-        entryPoint.getAncestor((e) => e is CompilationUnitElement);
-    Map<String, FunctionElement> functions = {};
-    for (FunctionElement functionElement in compilationUnit.functions) {
-      functions[functionElement.name] = functionElement;
-    }
-    FunctionElement mainElement = functions['main'];
-    expect(world.executableElements.keys, contains(mainElement));
-    FunctionDeclaration mainAst = world.executableElements[mainElement];
-    expect(mainAst.element, equals(mainElement));
-    FunctionElement fooElement = functions['foo'];
-    expect(world.executableElements.keys, contains(fooElement));
-    FunctionDeclaration fooAst = world.executableElements[fooElement];
-    expect(fooAst.element, equals(fooElement));
-    FunctionElement barElement = functions['bar'];
-    expect(
-        world.executableElements.keys,
-        isNot(contains(functions[barElement])));
-  });
-}
diff --git a/pkg/analyzer2dart/test/end2end_data.dart b/pkg/analyzer2dart/test/end2end_data.dart
deleted file mode 100644
index 20b680f..0000000
--- a/pkg/analyzer2dart/test/end2end_data.dart
+++ /dev/null
@@ -1,908 +0,0 @@
-// Copyright (c) 2014, 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 data for the end2end test.
-library test.end2end.data;
-
-import 'test_helper.dart';
-
-class TestSpec extends TestSpecBase {
-  final String output;
-
-  const TestSpec(String input, [String output])
-      : this.output = output != null ? output : input,
-        super(input);
-}
-
-const List<Group> TEST_DATA = const <Group>[
-  const Group('Empty main', const <TestSpec>[
-    const TestSpec('''
-main() {}
-'''),
-
-    const TestSpec('''
-main() {}
-foo() {}
-''', '''
-main() {}
-'''),
-  ]),
-  const Group('Simple call-chains', const <TestSpec>[
-    const TestSpec('''
-foo() {}
-main() {
-  foo();
-}
-'''),
-
-    const TestSpec('''
-bar() {}
-foo() {
-  bar();
-}
-main() {
-  foo();
-}
-'''),
-
-    const TestSpec('''
-bar() {
-  main();
-}
-foo() {
-  bar();
-}
-main() {
-  foo();
-}
-'''),
-
-  ]),
-  const Group('Literals', const <TestSpec>[
-    const TestSpec('''
-main() {
-  return 0;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return 1.5;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return true;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return false;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return "a";
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return "a" "b";
-}
-''', '''
-main() {
-  return "ab";
-}
-'''),
-  ]),
-
-  const Group('Parameters', const <TestSpec>[
-    const TestSpec('''
-main(args) {}
-'''),
-
-    const TestSpec('''
-main(a, b) {}
-'''),
-  ]),
-
-  const Group('Typed parameters', const <TestSpec>[
-    const TestSpec('''
-void main(args) {}
-'''),
-
-    const TestSpec('''
-main(int a, String b) {}
-'''),
-
-    const TestSpec('''
-main(Comparator a, List b) {}
-'''),
-
-    const TestSpec('''
-main(Comparator<dynamic> a, List<dynamic> b) {}
-''','''
-main(Comparator a, List b) {}
-'''),
-
-    const TestSpec('''
-main(Map a, Map<dynamic, List<int>> b) {}
-'''),
-  ]),
-
-  const Group('Pass arguments', const <TestSpec>[
-    const TestSpec('''
-foo(a) {}
-main() {
-  foo(null);
-}
-'''),
-
-    const TestSpec('''
-bar(b, c) {}
-foo(a) {}
-main() {
-  foo(null);
-  bar(0, "");
-}
-'''),
-
-    const TestSpec('''
-bar(b) {}
-foo(a) {
-  bar(a);
-}
-main() {
-  foo(null);
-}
-'''),
-  ]),
-
-  const Group('Top level field', const <TestSpec>[
-    const TestSpec('''
-var field;
-main(args) {
-  return field;
-}
-'''),
-
-    // TODO(johnniwinther): Eliminate unneeded `null` initializers.
-    const TestSpec('''
-var field = null;
-main(args) {
-  return field;
-}
-'''),
-
-    const TestSpec('''
-var field = 0;
-main(args) {
-  return field;
-}
-'''),
-
-    const TestSpec('''
-var field;
-main(args) {
-  field = args.length;
-  return field;
-}
-'''),
-  ]),
-
-  const Group('Local variables', const <TestSpec>[
-    const TestSpec('''
-main() {
-  var a;
-  return a;
-}
-''','''
-main() {}
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  return a;
-}
-''','''
-main() {
-  return 0;
-}
-'''),
-  ]),
-
-  const Group('Local variable writes', const <TestSpec>[
-    const TestSpec('''
-main() {
-  var a;
-  a = 10;
-  return a;
-}
-''', '''
-main() {
-  return 10;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  a = 10;
-  return a;
-}
-''', '''
-main() {
-  return 10;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  print(a);
-  a = "";
-  print(a);
-  return a;
-}
-''', '''
-main() {
-  var a;
-  print(0);
-  a = "";
-  print(a);
-  return a;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  print(a);
-  a = "";
-  print(a);
-  return a;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    a = "";
-  }
-  print(a);
-  return a;
-}
-''', '''
-main(a) {
-  print(a = a ? "" : a);
-  return a;
-}
-'''),
-  ]),
-
-  const Group('Dynamic access', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return a.foo;
-}
-'''),
-
-    const TestSpec('''
-main() {
-  var a = "";
-  return a.foo;
-}
-''','''
-main() {
-  return "".foo;
-}
-'''),
-  ]),
-
-  const Group('Dynamic invocation', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return a.foo(0);
-}
-'''),
-
-    const TestSpec('''
-main() {
-  var a = "";
-  return a.foo(0, 1);
-}
-''','''
-main() {
-  return "".foo(0, 1);
-}
-'''),
-  ]),
-
-  const Group('Binary expressions', const <TestSpec>[
-    const TestSpec('''
-main(a, b) {
-  return a + b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a - b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a * b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a / b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a ~/ b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a % b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a < b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a <= b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a > b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a >= b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a << b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a >> b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a & b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a | b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a ^ b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a == b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a != b;
-}
-''','''
-main(a, b) {
-  return !(a == b);
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a && b;
-}
-'''),
-
-    const TestSpec('''
-main(a, b) {
-  return a || b;
-}
-'''),
-  ]),
-
-  const Group('If statement', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  }
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-  }
-}
-''','''
-main(a) {
-  a ? print(0) : print(1);
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-    print(2);
-  }
-}
-'''),
-  ]),
-
-  const Group('Conditional expression', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return a ? print(0) : print(1);
-}
-'''),
-  ]),
-
-  // These test that unreachable statements are skipped within a block.
-  const Group('Block statements', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return 0;
-  return 1;
-}
-''', '''
-main(a) {
-  return 0;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    return 0;
-    return 1;
-  } else {
-    return 2;
-    return 3;
-  }
-}
-''', '''
-main(a) {
-  return a ? 0 : 2;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-    return 0;
-    return 1;
-  } else {
-    print(2);
-    return 2;
-    return 3;
-  }
-}
-''', '''
-main(a) {
-  if (a) {
-    print(0);
-    return 0;
-  } else {
-    print(2);
-    return 2;
-  }
-}
-'''),
-  ]),
-
-  const Group('List literal', const <TestSpec>[
-    const TestSpec('''
-main() {
-  return [];
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return <int>[];
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return <int>[0];
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return <int>[0, 1, a];
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return [0, [1], [a, <int>[3]]];
-}
-'''),
-  ]),
-
-  const Group('Constructor invocation', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  new Object();
-}
-'''),
-
-const TestSpec('''
-main(a) {
-  new Deprecated("");
-}
-'''),
-  ]),
-
-  const Group('Map literal', const <TestSpec>[
-    const TestSpec('''
-main() {
-  return {};
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return <int, String>{};
-}
-'''),
-
-    const TestSpec('''
-main() {
-  return <String, int>{"a": 0};
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return <String, int>{"a": 0, "b": 1, "c": a};
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return {0: "a", 1: {2: "b"}, a: {3: "c"}};
-}
-'''),
-  ]),
-  const Group('For loop', const <TestSpec>[
-    const TestSpec('''
-main() {
-  for (;;) {}
-}
-''', '''
-main() {
-  while (true) {}
-}
-'''),
-
-const TestSpec('''
-main() {
-  for (var i = 0; i < 10; i = i + 1) {
-    print(i);
-  }
-}
-''', '''
-main() {
-  var i = 0;
-  while (i < 10) {
-    print(i);
-    ++i;
-  }
-}
-'''),
-
-const TestSpec('''
-main(i) {
-  for (i = 0; i < 10; i = i + 1) {
-    print(i);
-  }
-}
-''', '''
-main(i) {
-  i = 0;
-  while (i < 10) {
-    print(i);
-    ++i;
-  }
-}
-'''),
-  ]),
-
-  const Group('While loop', const <TestSpec>[
-    const TestSpec('''
-main() {
-  while (true) {}
-}
-'''),
-
-const TestSpec('''
-main() {
-  var i = 0;
-  while (i < 10) {
-    print(i);
-    i = i + 1;
-  }
-}''', '''
-main() {
-  var i = 0;
-  while (i < 10) {
-    print(i);
-    ++i;
-  }
-}'''),
-  ]),
-
-  const Group('Type operators', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return a is String;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return a is List<String>;
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  return a is Comparator<String>;
-}
-'''),
-
-  const TestSpec('''
-main(a) {
-  return a is! String;
-}
-''', '''
-main(a) {
-  return !(a is String);
-}
-'''),
-
-const TestSpec('''
-main(a) {
-  return a as String;
-}
-'''),
-  ]),
-
-  const Group('For in loop', const <TestSpec>[
-// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
-// fields.
-    const TestSpec('''
-main(a) {
-  for (var i in a) {
-    print(i);
-  }
-}
-''', '''
-main(a) {
-  var v0 = a.iterator;
-  while (v0.moveNext()) {
-    print(v0.current);
-  }
-}'''),
-
-    const TestSpec('''
-main(a) {
-  for (var i in a) {
-    print(i);
-    i = 0;
-    print(i);
-  }
-}
-''', '''
-main(a) {
-  var v0 = a.iterator;
-  while (v0.moveNext()) {
-    print(v0.current);
-    print(0);
-  }
-}
-'''),
-
-    const TestSpec('''
-main(a) {
-  var i;
-  for (i in a) {
-    print(i);
-  }
-}
-''', '''
-main(a) {
-  var v0 = a.iterator;
-  while (v0.moveNext()) {
-    print(v0.current);
-  }
-}
-'''),
-  ]),
-
-  const Group('Local functions', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  local() {}
-  return local();
-}
-''', '''
-main(a) {
-  return (() {})();
-}
-'''),
-
-  const TestSpec('''
-main(a) {
-  local() {}
-  var l = local;
-  return l();
-}
-''', '''
-main(a) {
-  return (() {})();
-}
-'''),
-
-  const TestSpec('''
-main(a) {
-  return () {}();
-}
-''', '''
-main(a) {
-  return (() {})();
-}
-'''),
-
-  const TestSpec('''
-main(a) {
-  var c = a ? () { return 0; } : () { return 1; };
-  return c();
-}
-''', '''
-main(a) {
-  return (a ? () {
-    return 0;
-  } : () {
-    return 1;
-  })();
-}
-'''),
-  ]),
-
-  const Group('Constructors', const <TestSpec>[
-    const TestSpec('''
-class C {}
-main() {
-  return new C();
-}
-'''),
-
-    const TestSpec('''
-class C {
-  C() {}
-}
-main() {
-  return new C();
-}
-'''),
-
-    const TestSpec('''
-class B {}
-class C extends B {
-  C() {}
-}
-main() {
-  return new C();
-}
-'''),
-
-    const TestSpec('''
-class B {
-  B() {}
-}
-class C extends B {}
-main() {
-  return new C();
-}
-'''),
-  ]),
-
-  const Group('Instance method', const <TestSpec>[
-    const TestSpec('''
-class C {
-  C() {}
-  foo() {}
-}
-main() {
-  return new C().foo();
-}
-'''),
-  ]),
-
-  const Group('Try-catch', const <TestSpec>[
-    const TestSpec('''
-main() {
-  try {} catch (e) {}
-}
-''',
-// TODO(kmillikin): Remove the unused stack trace parameter.
-'''
-main() {
-  try {} catch (e, v0) {}
-}
-'''),
-
-    const TestSpec('''
-main() {
-  try {
-    return;
-  } catch (e) {}
-}
-''',
-// TODO(kmillikin): Remove the unused stack trace parameter and unneeded return
-// statement(s).
-'''
-main() {
-  try {
-    return null;
-  } catch (e, v0) {
-    return null;
-  }
-}
-'''),
-  ]),
-];
diff --git a/pkg/analyzer2dart/test/end2end_test.dart b/pkg/analyzer2dart/test/end2end_test.dart
deleted file mode 100644
index 18fe84a..0000000
--- a/pkg/analyzer2dart/test/end2end_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/// End-to-end test of the analyzer2dart compiler.
-library test.end2end;
-
-import 'mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/closed_world.dart';
-import '../lib/src/driver.dart';
-import '../lib/src/converted_world.dart';
-import '../lib/src/dart_backend.dart';
-
-import 'test_helper.dart' hide TestSpec;
-import 'output_helper.dart';
-import 'end2end_data.dart';
-
-main(List<String> args) {
-  performTests(TEST_DATA, unittester, checkResult, args);
-}
-
-checkResult(TestSpec result) {
-  String input = result.input;
-  String expectedOutput = result.output.trim();
-
-  CollectingOutputProvider outputProvider = new CollectingOutputProvider();
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-  DartSdk sdk = new MockSdk();
-  Driver driver = new Driver(provider, sdk, outputProvider);
-  String rootFile = '/root.dart';
-  provider.newFile(rootFile, input);
-  Source rootSource = driver.setRoot(rootFile);
-  FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
-  ClosedWorld world = driver.computeWorld(entryPoint);
-  ConvertedWorld convertedWorld = convertWorld(world);
-  compileToDart(driver, convertedWorld);
-  String output = outputProvider.output.text.trim();
-  expect(output, equals(expectedOutput));
-}
diff --git a/pkg/analyzer2dart/test/identifier_semantics_test.dart b/pkg/analyzer2dart/test/identifier_semantics_test.dart
deleted file mode 100644
index 0801e7a..0000000
--- a/pkg/analyzer2dart/test/identifier_semantics_test.dart
+++ /dev/null
@@ -1,2536 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer2dart/src/identifier_semantics.dart';
-import 'package:unittest/unittest.dart';
-
-import 'mock_sdk.dart';
-
-main() {
-  test('Call function defined at top level', () {
-    Helper helper = new Helper('''
-g() {}
-
-f() {
-  g();
-}
-''');
-    helper.checkStaticMethod('g()', null, 'g', true, isInvoke: true);
-  });
-
-  test('Call function defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.g();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-g() {}
-''');
-    helper.checkStaticMethod('l.g()', null, 'g', true, isInvoke: true);
-  });
-
-  test('Call method defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static g() {}
-
-  f() {
-    g();
-  }
-}
-''');
-    helper.checkStaticMethod('g()', 'A', 'g', true, isInvoke: true);
-  });
-
-  test('Call method defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static g() {}
-}
-f() {
-  A.g();
-}
-''');
-    helper.checkStaticMethod('A.g()', 'A', 'g', true, isInvoke: true);
-  });
-
-  test(
-      'Call method defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.g();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static g() {}
-}
-''');
-    helper.checkStaticMethod('l.A.g()', 'A', 'g', true, isInvoke: true);
-  });
-
-  test('Call method defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-
-  f() {
-    g();
-  }
-}
-''');
-    helper.checkDynamic('g()', null, 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-}
-f(A a) {
-  a.g();
-}
-''');
-    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-}
-A h() => null;
-f() {
-  h().g();
-}
-''');
-    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  a.g();
-}
-''');
-    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-f() {
-  h().g();
-}
-''');
-    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
-  });
-
-  test('Call method defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  g() {}
-  g();
-}
-''');
-    helper.checkLocalFunction('g()', 'g', isInvoke: true);
-  });
-
-  test('Call method undefined at top level', () {
-    Helper helper = new Helper('''
-f() {
-  g();
-}
-''');
-    // Undefined top level invocations are treated as dynamic.
-    // TODO(paulberry): not sure if this is a good idea.  In general, when such
-    // a call appears inside an instance method, it is dynamic, because "this"
-    // might be an instance of a derived class that implements g().  However,
-    // in this case, we are not inside an instance method, so we know that the
-    // target is undefined.
-    helper.checkDynamic('g()', null, 'g', isInvoke: true);
-  });
-
-  test('Call method undefined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.g();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-''');
-    // Undefined top level invocations are treated as dynamic.
-    // TODO(paulberry): not sure if this is a good idea, for similar reasons to
-    // the case above.
-    helper.checkDynamic('l.g()', null, 'g', isInvoke: true);
-  });
-
-  test('Call method undefined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {}
-
-f() {
-  A.g();
-}
-''');
-    helper.checkStaticMethod('A.g()', 'A', 'g', false, isInvoke: true);
-  });
-
-  test(
-      'Call method undefined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.g();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkStaticMethod('l.A.g()', 'A', 'g', false, isInvoke: true);
-  });
-
-  test('Call method undefined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  f() {
-    g();
-  }
-}
-''');
-    helper.checkDynamic('g()', null, 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method undefined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-f(A a) {
-  a.g();
-}
-''');
-    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
-  });
-
-  test(
-      'Call method undefined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-A h() => null;
-
-f() {
-  h().g();
-}
-''');
-    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
-  });
-
-  test('Call variable defined at top level', () {
-    Helper helper = new Helper('''
-var x;
-
-f() {
-  x();
-}
-''');
-    helper.checkStaticField('x()', null, 'x', isInvoke: true);
-  });
-
-  test('Call variable defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.x();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-var x;
-''');
-    helper.checkStaticField('l.x()', null, 'x', isInvoke: true);
-  });
-
-  test('Call field defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-
-  f() {
-    return x();
-  }
-}
-''');
-    helper.checkStaticField('x()', 'A', 'x', isInvoke: true);
-  });
-
-  test('Call field defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-}
-
-f() {
-  return A.x();
-}
-''');
-    helper.checkStaticField('A.x()', 'A', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call field defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.x();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static var x;
-}
-''');
-    helper.checkStaticField('l.A.x()', 'A', 'x', isInvoke: true);
-  });
-
-  test('Call field defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-
-  f() {
-    return x();
-  }
-}
-''');
-    helper.checkDynamic('x()', null, 'x', isInvoke: true);
-  });
-
-  test(
-      'Call field defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-f(A a) {
-  return a.x();
-}
-''');
-    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call field defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-A h() => null;
-
-f() {
-  return h().x();
-}
-''');
-    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call field defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  return a.x();
-}
-''');
-    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call field defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  return h().x();
-}
-''');
-    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
-  });
-
-  test('Call variable defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  var x;
-  return x();
-}
-''');
-    helper.checkLocalVariable('x()', 'x', isInvoke: true);
-  });
-
-  test('Call variable defined in parameter', () {
-    Helper helper = new Helper('''
-f(x) {
-  return x();
-}
-''');
-    helper.checkParameter('x()', 'x', isInvoke: true);
-  });
-
-  test('Call accessor defined at top level', () {
-    Helper helper = new Helper('''
-get x => null;
-
-f() {
-  return x();
-}
-''');
-    helper.checkStaticProperty('x()', null, 'x', true, isInvoke: true);
-  });
-
-  test('Call accessor defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.x();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-get x => null;
-''');
-    helper.checkStaticProperty('l.x()', null, 'x', true, isInvoke: true);
-  });
-
-  test('Call accessor defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static get x => null;
-
-  f() {
-    return x();
-  }
-}
-''');
-    helper.checkStaticProperty('x()', 'A', 'x', true, isInvoke: true);
-  });
-
-  test('Call accessor defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static get x => null;
-}
-
-f() {
-  return A.x();
-}
-''');
-    helper.checkStaticProperty('A.x()', 'A', 'x', true, isInvoke: true);
-  });
-
-  test(
-      'Call accessor defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.x();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static get x => null;
-}
-''');
-    helper.checkStaticProperty('l.A.x()', 'A', 'x', true, isInvoke: true);
-  });
-
-  test('Call accessor defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-
-  f() {
-    return x();
-  }
-}
-''');
-    helper.checkDynamic('x()', null, 'x', isInvoke: true);
-  });
-
-  test(
-      'Call accessor defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-}
-
-f(A a) {
-  return a.x();
-}
-''');
-    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call accessor defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-}
-
-A h() => null;
-
-f() {
-  return h().x();
-}
-''');
-    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call accessor defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  return a.x();
-}
-''');
-    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
-  });
-
-  test(
-      'Call accessor defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  return h().x();
-}
-''');
-    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
-  });
-
-  test('Call class defined at top level', () {
-    Helper helper = new Helper('''
-class A {}
-
-f() {
-  A();
-}
-''');
-    helper.checkTypeReference(
-        'A()',
-        'A',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call class defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkTypeReference(
-        'l.A()',
-        'A',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call dynamic type undefined at toplevel', () {
-    Helper helper = new Helper('''
-f() {
-  dynamic();
-}
-''');
-    // Since it is legal to define a toplevel function or a class member called
-    // dynamic, "dynamic()" must be treated as a dynamic access to a function
-    // called "dynamic".
-    helper.checkDynamic('dynamic()', null, 'dynamic', isInvoke: true);
-  });
-
-  test('Call function typedef defined at top level', () {
-    Helper helper = new Helper('''
-typedef F();
-
-f() {
-  F();
-}
-''');
-    helper.checkTypeReference(
-        'F()',
-        'F',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call function typedef defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.F();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-typedef F();
-''');
-    helper.checkTypeReference(
-        'l.F()',
-        'F',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call mixin application defined at top level', () {
-    Helper helper = new Helper('''
-class A {}
-class B {}
-class C = A with B;
-
-f() {
-  C();
-}
-''');
-    helper.checkTypeReference(
-        'C()',
-        'C',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call mixin application defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.C();
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-class B {}
-class C = A with B;
-''');
-    helper.checkTypeReference(
-        'l.C()',
-        'C',
-        AccessKind.TOPLEVEL_TYPE,
-        isInvoke: true);
-  });
-
-  test('Call type parameter of enclosing class', () {
-    Helper helper = new Helper('''
-class A<T, U> {
-  f() {
-    U();
-  }
-}
-''');
-    helper.checkTypeReference(
-        'U()',
-        'U',
-        AccessKind.TYPE_PARAMETER,
-        isInvoke: true);
-  });
-
-  test('Get function defined at top level', () {
-    Helper helper = new Helper('''
-g() {}
-
-f() {
-  return g;
-}
-''');
-    helper.checkStaticMethod('g', null, 'g', true, isRead: true);
-  });
-
-  test('Get function defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.g;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-g() {}
-''');
-    helper.checkStaticMethod('l.g', null, 'g', true, isRead: true);
-  });
-
-  test('Get method defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static g() {}
-
-  f() {
-    return g;
-  }
-}
-''');
-    helper.checkStaticMethod('g', 'A', 'g', true, isRead: true);
-  });
-
-  test('Get method defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static g() {}
-}
-f() {
-  return A.g;
-}
-''');
-    helper.checkStaticMethod('A.g', 'A', 'g', true, isRead: true);
-  });
-
-  test(
-      'Get method defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.g;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static g() {}
-}
-''');
-    helper.checkStaticMethod('l.A.g', 'A', 'g', true, isRead: true);
-  });
-
-  test('Get method defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-
-  f() {
-    return g;
-  }
-}
-''');
-    helper.checkDynamic('g', null, 'g', isRead: true);
-  });
-
-  test(
-      'Get method defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-}
-f(A a) {
-  return a.g;
-}
-''');
-    helper.checkDynamic('a.g', 'a', 'g', isRead: true);
-  });
-
-  test(
-      'Get method defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  g() {}
-}
-A h() => null;
-f() {
-  return h().g;
-}
-''');
-    helper.checkDynamic('h().g', 'h()', 'g', isRead: true);
-  });
-
-  test('Get method defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  g() {}
-  return g;
-}
-''');
-    helper.checkLocalFunction('g', 'g', isRead: true);
-  });
-
-  test('Get variable defined at top level', () {
-    Helper helper = new Helper('''
-var x;
-
-f() {
-  return x;
-}
-''');
-    helper.checkStaticField('x', null, 'x', isRead: true);
-  });
-
-  test('Get variable defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-var x;
-''');
-    helper.checkStaticField('l.x', null, 'x', isRead: true);
-  });
-
-  test('Get field defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-
-  f() {
-    return x;
-  }
-}
-''');
-    helper.checkStaticField('x', 'A', 'x', isRead: true);
-  });
-
-  test('Get field defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-}
-
-f() {
-  return A.x;
-}
-''');
-    helper.checkStaticField('A.x', 'A', 'x', isRead: true);
-  });
-
-  test(
-      'Get field defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static var x;
-}
-''');
-    helper.checkStaticField('l.A.x', 'A', 'x', isRead: true);
-  });
-
-  test('Get field defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-
-  f() {
-    return x;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true);
-  });
-
-  test(
-      'Get field defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-f(A a) {
-  return a.x;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
-  });
-
-  test(
-      'Get field defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-A h() => null;
-
-f() {
-  return h().x;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
-  });
-
-  test(
-      'Get field defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  return a.x;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
-  });
-
-  test(
-      'Get field defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  return h().x;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
-  });
-
-  test('Get variable defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  var x;
-  return x;
-}
-''');
-    helper.checkLocalVariable('x', 'x', isRead: true);
-  });
-
-  test('Get variable defined in parameter', () {
-    Helper helper = new Helper('''
-f(x) {
-  return x;
-}
-''');
-    helper.checkParameter('x', 'x', isRead: true);
-  });
-
-  test('Get accessor defined at top level', () {
-    Helper helper = new Helper('''
-get x => null;
-
-f() {
-  return x;
-}
-''');
-    helper.checkStaticProperty('x', null, 'x', true, isRead: true);
-  });
-
-  test('Get accessor defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-get x => null;
-''');
-    helper.checkStaticProperty('l.x', null, 'x', true, isRead: true);
-  });
-
-  test('Get accessor defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static get x => null;
-
-  f() {
-    return x;
-  }
-}
-''');
-    helper.checkStaticProperty('x', 'A', 'x', true, isRead: true);
-  });
-
-  test('Get accessor defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static get x => null;
-}
-
-f() {
-  return A.x;
-}
-''');
-    helper.checkStaticProperty('A.x', 'A', 'x', true, isRead: true);
-  });
-
-  test(
-      'Get accessor defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static get x => null;
-}
-''');
-    helper.checkStaticProperty('l.A.x', 'A', 'x', true, isRead: true);
-  });
-
-  test('Get accessor defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-
-  f() {
-    return x;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-}
-
-f(A a) {
-  return a.x;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  get x => null;
-}
-
-A h() => null;
-
-f() {
-  return h().x;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  return a.x;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  return h().x;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
-  });
-
-  test('Get accessor undefined at top level', () {
-    Helper helper = new Helper('''
-f() {
-  return x;
-}
-''');
-    // Undefined top level property accesses are treated as dynamic.
-    // TODO(paulberry): not sure if this is a good idea.  In general, when such
-    // an access appears inside an instance method, it is dynamic, because
-    // "this" might be an instance of a derived class that implements x.
-    // However, in this case, we are not inside an instance method, so we know
-    // that the target is undefined.
-    helper.checkDynamic('x', null, 'x', isRead: true);
-  });
-
-  test('Get accessor undefined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-''');
-    // Undefined top level property accesses are treated as dynamic.
-    // TODO(paulberry): not sure if this is a good idea, for similar reasons to
-    // the case above.
-    helper.checkDynamic('l.x', null, 'x', isRead: true);
-  });
-
-  test('Get accessor undefined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {}
-
-f() {
-  return A.x;
-}
-''');
-    helper.checkStaticProperty('A.x', 'A', 'x', false, isRead: true);
-  });
-
-  test(
-      'Get accessor undefined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  return l.A.x;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkStaticProperty('l.A.x', 'A', 'x', false, isRead: true);
-  });
-
-  test('Get accessor undefined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  f() {
-    return x;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor undefined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-f(A a) {
-  return a.x;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
-  });
-
-  test(
-      'Get accessor undefined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-A h() => null;
-
-f() {
-  return h().x;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
-  });
-
-  test('Get class defined at top level', () {
-    Helper helper = new Helper('''
-class A {}
-var t = A;
-''');
-    helper.checkTypeReference('A', 'A', AccessKind.TOPLEVEL_TYPE, isRead: true);
-  });
-
-  test('Get class defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-var t = l.A;
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkTypeReference(
-        'l.A',
-        'A',
-        AccessKind.TOPLEVEL_TYPE,
-        isRead: true);
-  });
-
-  test('Get dynamic type', () {
-    Helper helper = new Helper('''
-var t = dynamic;
-''');
-    helper.checkTypeReference(
-        'dynamic',
-        'dynamic',
-        AccessKind.TOPLEVEL_TYPE,
-        isRead: true);
-  });
-
-  test('Get function typedef defined at top level', () {
-    Helper helper = new Helper('''
-typedef F();
-var t = F;
-''');
-    helper.checkTypeReference('F', 'F', AccessKind.TOPLEVEL_TYPE, isRead: true);
-  });
-
-  test('Get function typedef defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-var t = l.F;
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-typedef F();
-''');
-    helper.checkTypeReference(
-        'l.F',
-        'F',
-        AccessKind.TOPLEVEL_TYPE,
-        isRead: true);
-  });
-
-  test('Get mixin application defined at top level', () {
-    Helper helper = new Helper('''
-class A {}
-class B {}
-class C = A with B;
-var t = C;
-''');
-    helper.checkTypeReference('C', 'C', AccessKind.TOPLEVEL_TYPE, isRead: true);
-  });
-
-  test('Get mixin application defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-var t = l.C;
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-class B {}
-class C = A with B;
-''');
-    helper.checkTypeReference(
-        'l.C',
-        'C',
-        AccessKind.TOPLEVEL_TYPE,
-        isRead: true);
-  });
-
-  test('Get type parameter of enclosing class', () {
-    Helper helper = new Helper('''
-class A<T, U> {
-  f() {
-    var t = U;
-  }
-}
-''');
-    helper.checkTypeReference(
-        'U',
-        'U',
-        AccessKind.TYPE_PARAMETER,
-        isRead: true);
-  });
-
-  test('Set variable defined at top level', () {
-    Helper helper = new Helper('''
-var x;
-
-f() {
-  x = 1;
-}
-''');
-    helper.checkStaticField('x', null, 'x', isWrite: true);
-  });
-
-  test('Set variable defined at top level in foreach loop', () {
-    Helper helper = new Helper('''
-var x;
-
-f() {
-  for (x in []) {}
-}
-''');
-    helper.checkStaticField('x', null, 'x', isWrite: true);
-  });
-
-  test('Set variable defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-var x;
-''');
-    helper.checkStaticField('l.x', null, 'x', isWrite: true);
-  });
-
-  test('Set field defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-
-  f() {
-    x = 1;
-  }
-}
-''');
-    helper.checkStaticField('x', 'A', 'x', isWrite: true);
-  });
-
-  test(
-      'Set field defined statically in class from inside class in foreach' + ' loop',
-      () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-
-  f() {
-    for (x in []) {}
-  }
-}
-''');
-    helper.checkStaticField('x', 'A', 'x', isWrite: true);
-  });
-
-  test('Set field defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-}
-
-f() {
-  A.x = 1;
-}
-''');
-    helper.checkStaticField('A.x', 'A', 'x', isWrite: true);
-  });
-
-  test(
-      'Set field defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static var x;
-}
-''');
-    helper.checkStaticField('l.A.x', 'A', 'x', isWrite: true);
-  });
-
-  test('Set field defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-
-  f() {
-    x = 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set field defined dynamically in class from inside class in foreach' + ' loop',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-
-  f() {
-    for (x in []) {}
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set field defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-f(A a) {
-  a.x = 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
-  });
-
-  test(
-      'Set field defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-A h() => null;
-
-f() {
-  h().x = 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
-  });
-
-  test('Set variable defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  var x;
-  x = 1;
-}
-''');
-    helper.checkLocalVariable('x', 'x', isWrite: true);
-  });
-
-  test('Set variable defined locally in foreach loop', () {
-    Helper helper = new Helper('''
-f() {
-  var x;
-  for (x in []) {}
-}
-''');
-    helper.checkLocalVariable('x', 'x', isWrite: true);
-  });
-
-  test('Set variable defined in parameter', () {
-    Helper helper = new Helper('''
-f(x) {
-  x = 1;
-}
-''');
-    helper.checkParameter('x', 'x', isWrite: true);
-  });
-
-  test('Set variable defined in parameter in foreach loop', () {
-    Helper helper = new Helper('''
-f(x) {
-  for (x in []) {}
-}
-''');
-    helper.checkParameter('x', 'x', isWrite: true);
-  });
-
-  test('Set accessor defined at top level', () {
-    Helper helper = new Helper('''
-set x(value) {};
-
-f() {
-  x = 1;
-}
-''');
-    helper.checkStaticProperty('x', null, 'x', true, isWrite: true);
-  });
-
-  test('Set accessor defined at top level in foreach loop', () {
-    Helper helper = new Helper('''
-set x(value) {};
-
-f() {
-  for (x in []) {}
-}
-''');
-    helper.checkStaticProperty('x', null, 'x', true, isWrite: true);
-  });
-
-  test('Set accessor defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-set x(value) {};
-''');
-    helper.checkStaticProperty('l.x', null, 'x', true, isWrite: true);
-  });
-
-  test('Set accessor defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static set x(value) {}
-
-  f() {
-    x = 1;
-  }
-}
-''');
-    helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
-  });
-
-  test(
-      'Set accessor defined statically in class from inside class in' +
-          ' foreach loop',
-      () {
-    Helper helper = new Helper('''
-class A {
-  static set x(value) {}
-
-  f() {
-    for (x in []) {}
-  }
-}
-''');
-    helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
-  });
-
-  test('Set accessor defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static set x(value) {}
-}
-
-f() {
-  A.x = 1;
-}
-''');
-    helper.checkStaticProperty('A.x', 'A', 'x', true, isWrite: true);
-  });
-
-  test(
-      'Set accessor defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static set x(value) {}
-}
-''');
-    helper.checkStaticProperty('l.A.x', 'A', 'x', true, isWrite: true);
-  });
-
-  test('Set accessor defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-
-  f() {
-    x = 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor defined dynamically in class from inside class in' +
-          ' foreach loop',
-      () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-
-  f() {
-    for (x in []) {}
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-}
-
-f(A a) {
-  a.x = 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-}
-
-A h() => null;
-
-f() {
-  h().x = 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  a.x = 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  h().x = 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
-  });
-
-  test('Set accessor undefined at top level', () {
-    Helper helper = new Helper('''
-f() {
-  x = 1;
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test('Set accessor undefined at top level in foreach loop', () {
-    Helper helper = new Helper('''
-f() {
-  for (x in []) {}
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test('Set accessor undefined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-''');
-    helper.checkDynamic('l.x', null, 'x', isWrite: true);
-  });
-
-  test('Set accessor undefined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {}
-
-f() {
-  A.x = 1;
-}
-''');
-    helper.checkStaticProperty('A.x', 'A', 'x', false, isWrite: true);
-  });
-
-  test(
-      'Set accessor undefined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x = 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkStaticProperty('l.A.x', 'A', 'x', false, isWrite: true);
-  });
-
-  test('Set accessor undefined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  f() {
-    x = 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor undefined dynamically in class from inside class in' +
-          ' foreach loop',
-      () {
-    Helper helper = new Helper('''
-class A {
-  f() {
-    for (x in []) {}
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor undefined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-f(A a) {
-  a.x = 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
-  });
-
-  test(
-      'Set accessor undefined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-A h() => null;
-
-f() {
-  h().x = 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
-  });
-
-  test('RMW variable defined at top level', () {
-    Helper helper = new Helper('''
-var x;
-
-f() {
-  x += 1;
-}
-''');
-    helper.checkStaticField('x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW variable defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-var x;
-''');
-    helper.checkStaticField('l.x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW field defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-
-  f() {
-    x += 1;
-  }
-}
-''');
-    helper.checkStaticField('x', 'A', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW field defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static var x;
-}
-
-f() {
-  A.x += 1;
-}
-''');
-    helper.checkStaticField('A.x', 'A', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW field defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static var x;
-}
-''');
-    helper.checkStaticField('l.A.x', 'A', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW field defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-
-  f() {
-    x += 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW field defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-f(A a) {
-  a.x += 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW field defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  var x;
-}
-
-A h() => null;
-
-f() {
-  h().x += 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW variable defined locally', () {
-    Helper helper = new Helper('''
-f() {
-  var x;
-  x += 1;
-}
-''');
-    helper.checkLocalVariable('x', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW variable defined in parameter', () {
-    Helper helper = new Helper('''
-f(x) {
-  x += 1;
-}
-''');
-    helper.checkParameter('x', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW accessor defined at top level', () {
-    Helper helper = new Helper('''
-set x(value) {};
-
-f() {
-  x += 1;
-}
-''');
-    helper.checkStaticProperty(
-        'x',
-        null,
-        'x',
-        true,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test('RMW accessor defined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-set x(value) {};
-''');
-    helper.checkStaticProperty(
-        'l.x',
-        null,
-        'x',
-        true,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test('RMW accessor defined statically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  static set x(value) {}
-
-  f() {
-    x += 1;
-  }
-}
-''');
-    helper.checkStaticProperty(
-        'x',
-        'A',
-        'x',
-        true,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test('RMW accessor defined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {
-  static set x(value) {}
-}
-
-f() {
-  A.x += 1;
-}
-''');
-    helper.checkStaticProperty(
-        'A.x',
-        'A',
-        'x',
-        true,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test(
-      'RMW accessor defined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {
-  static set x(value) {}
-}
-''');
-    helper.checkStaticProperty(
-        'l.A.x',
-        'A',
-        'x',
-        true,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test('RMW accessor defined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-
-  f() {
-    x += 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor defined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-}
-
-f(A a) {
-  a.x += 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor defined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {
-  set x(value) {}
-}
-
-A h() => null;
-
-f() {
-  h().x += 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor defined dynamically in class from outside class via dynamic var',
-      () {
-    Helper helper = new Helper('''
-f(a) {
-  a.x += 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor defined dynamically in class from outside class via dynamic expression',
-      () {
-    Helper helper = new Helper('''
-h() => null;
-
-f() {
-  h().x += 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW accessor undefined at top level', () {
-    Helper helper = new Helper('''
-f() {
-  x += 1;
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW accessor undefined at top level via prefix', () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-''');
-    helper.checkDynamic('l.x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test('RMW accessor undefined statically in class from outside class', () {
-    Helper helper = new Helper('''
-class A {}
-
-f() {
-  A.x += 1;
-}
-''');
-    helper.checkStaticProperty(
-        'A.x',
-        'A',
-        'x',
-        false,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test(
-      'RMW accessor undefined statically in class from outside class via prefix',
-      () {
-    Helper helper = new Helper('''
-import 'lib.dart' as l;
-
-f() {
-  l.A.x += 1;
-}
-''');
-    helper.addFile('/lib.dart', '''
-library lib;
-
-class A {}
-''');
-    helper.checkStaticProperty(
-        'l.A.x',
-        'A',
-        'x',
-        false,
-        isRead: true,
-        isWrite: true);
-  });
-
-  test('RMW accessor undefined dynamically in class from inside class', () {
-    Helper helper = new Helper('''
-class A {
-  f() {
-    x += 1;
-  }
-}
-''');
-    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor undefined dynamically in class from outside class via typed var',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-f(A a) {
-  a.x += 1;
-}
-''');
-    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
-  });
-
-  test(
-      'RMW accessor undefined dynamically in class from outside class via typed expression',
-      () {
-    Helper helper = new Helper('''
-class A {}
-
-A h() => null;
-
-f() {
-  h().x += 1;
-}
-''');
-    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
-  });
-}
-
-typedef void AccessHandler(Expression node, AccessSemantics semantics);
-
-class Helper {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
-  Source rootSource;
-  AnalysisContext context;
-
-  Helper(String rootContents) {
-    DartSdk sdk = new MockSdk();
-    String rootFile = '/root.dart';
-    File file = provider.newFile(rootFile, rootContents);
-    rootSource = file.createSource();
-    context = AnalysisEngine.instance.createAnalysisContext();
-    // Set up the source factory.
-    List<UriResolver> uriResolvers = [
-        new ResourceUriResolver(provider),
-        new DartUriResolver(sdk)];
-    context.sourceFactory = new SourceFactory(uriResolvers);
-    // add the Source
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(rootSource);
-    context.applyChanges(changeSet);
-  }
-
-  LibraryElement get libraryElement {
-    return context.computeLibraryElement(rootSource);
-  }
-
-  void addFile(String path, String contents) {
-    provider.newFile(path, contents);
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a dynamic method invocation.
-   */
-  void checkDynamic(String expectedSource, String expectedTarget,
-      String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke:
-      false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.DYNAMIC));
-      if (expectedTarget == null) {
-        expect(semantics.target, isNull);
-      } else {
-        expect(semantics.target.toSource(), equals(expectedTarget));
-      }
-      expect(semantics.identifier.name, equals(expectedName));
-      expect(semantics.element, isNull);
-      expect(semantics.classElement, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a local function invocation.
-   */
-  void checkLocalFunction(String expectedSource, String expectedName,
-      {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION));
-      expect(semantics.identifier.name, equals(expectedName));
-      expect(semantics.element.displayName, equals(expectedName));
-      expect(semantics.classElement, isNull);
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a local variable access.
-   */
-  void checkLocalVariable(String expectedSource, String expectedName,
-      {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.LOCAL_VARIABLE));
-      expect(semantics.element.name, equals(expectedName));
-      expect(semantics.classElement, isNull);
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as a
-   * parameter access.
-   */
-  void checkParameter(String expectedSource, String expectedName, {bool isRead:
-      false, bool isWrite: false, bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.PARAMETER));
-      expect(semantics.element.name, equals(expectedName));
-      expect(semantics.classElement, isNull);
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a static field element reference.
-   */
-  void checkStaticField(String expectedSource, String expectedClass,
-      String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke:
-      false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (Expression node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.STATIC_FIELD));
-      expect(semantics.identifier.name, equals(expectedName));
-      expect(semantics.element.displayName, equals(expectedName));
-      if (expectedClass == null) {
-        expect(semantics.classElement, isNull);
-      } else {
-        expect(semantics.classElement, isNotNull);
-        expect(semantics.classElement.displayName, equals(expectedClass));
-      }
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a static method.
-   */
-  void checkStaticMethod(String expectedSource, String expectedClass,
-      String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
-      bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.STATIC_METHOD));
-      expect(semantics.identifier.name, equals(expectedName));
-      if (expectedClass == null) {
-        expect(semantics.classElement, isNull);
-        if (defined) {
-          expect(semantics.element, new isInstanceOf<FunctionElement>());
-        }
-      } else {
-        expect(semantics.classElement, isNotNull);
-        expect(semantics.classElement.displayName, equals(expectedClass));
-        if (defined) {
-          expect(semantics.element, new isInstanceOf<MethodElement>());
-        }
-      }
-      if (defined) {
-        expect(semantics.element.displayName, equals(expectedName));
-      } else {
-        expect(semantics.element, isNull);
-      }
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as
-   * a static property access.
-   */
-  void checkStaticProperty(String expectedSource, String expectedClass,
-      String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
-      bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (Expression node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY));
-      expect(semantics.identifier.name, equals(expectedName));
-      if (expectedClass == null) {
-        expect(semantics.classElement, isNull);
-      } else {
-        expect(semantics.classElement, isNotNull);
-        expect(semantics.classElement.displayName, equals(expectedClass));
-      }
-      if (defined) {
-        expect(semantics.element.displayName, equals(expectedName));
-      } else {
-        expect(semantics.element, isNull);
-      }
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, equals(isWrite));
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-
-  /**
-   * Verify that the node represented by [expectedSource] is classified as a
-   * reference to a toplevel class or a type parameter.
-   */
-  void checkTypeReference(String expectedSource, String expectedName,
-      AccessKind expectedKind, {bool isRead: false, bool isInvoke: false}) {
-    TestVisitor visitor = new TestVisitor();
-    int count = 0;
-    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
-      count++;
-      expect(node.toSource(), equals(expectedSource));
-      expect(semantics.kind, equals(expectedKind));
-      expect(semantics.element.name, equals(expectedName));
-      expect(semantics.classElement, isNull);
-      expect(semantics.target, isNull);
-      expect(semantics.isRead, equals(isRead));
-      expect(semantics.isWrite, isFalse);
-      expect(semantics.isInvoke, equals(isInvoke));
-    };
-    libraryElement.unit.accept(visitor);
-    expect(count, equals(1));
-  }
-}
-
-/**
- * Visitor class used to run the tests.
- */
-class TestVisitor extends RecursiveAstVisitor {
-  AccessHandler onAccess;
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
-  }
-
-  @override
-  visitPrefixedIdentifier(PrefixedIdentifier node) {
-    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
-  }
-
-  @override
-  visitPropertyAccess(PropertyAccess node) {
-    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
-  }
-
-  @override
-  visitSimpleIdentifier(SimpleIdentifier node) {
-    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
-    if (semantics != null) {
-      onAccess(node, semantics);
-    }
-  }
-}
diff --git a/pkg/analyzer2dart/test/mock_sdk.dart b/pkg/analyzer2dart/test/mock_sdk.dart
deleted file mode 100644
index 8cebd44..0000000
--- a/pkg/analyzer2dart/test/mock_sdk.dart
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright (c) 2014, 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 testing.mock_sdk;
-
-import 'package:analyzer/file_system/file_system.dart' as resource;
-import 'package:analyzer/file_system/memory_file_system.dart' as resource;
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-
-class MockSdk implements DartSdk {
-  static const _MockSdkLibrary LIB_CORE =
-      const _MockSdkLibrary('core', '/lib/core/core.dart', '''
-library dart.core;
-
-class Object {
-  bool operator ==(other) => identical(this, other);
-}
-
-class Function {}
-class StackTrace {}
-class Symbol {}
-class Type {}
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-class String implements Comparable<String> {
-  bool get isEmpty => false;
-  bool get isNotEmpty => false;
-  int get length => 0;
-}
-
-class bool extends Object {}
-abstract class num implements Comparable<num> {
-  bool operator <(num other);
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  num operator /(num other);
-  int toInt();
-}
-abstract class int extends num {
-  bool get isEven => false;
-  int operator -();
-}
-class double extends num {}
-class DateTime extends Object {}
-class Null extends Object {}
-
-class Deprecated extends Object {
-  final String expires;
-  const Deprecated(this.expires);
-}
-const Object deprecated = const Deprecated("next release");
-
-abstract class Iterable<E> {}
-
-abstract class List<E> extends Object implements Iterable {
-  void add(E value);
-  E operator [](int index);
-  void operator []=(int index, E value);
-}
-class Map<K, V> extends Object {}
-
-external bool identical(Object a, Object b);
-
-void print(Object object) {}
-
-typedef int Comparator<T>(T a, T b);
-''');
-
-  static const _MockSdkLibrary LIB_ASYNC =
-      const _MockSdkLibrary('async', '/lib/async/async.dart', '''
-library dart.async;
-class Future<T> {
-  static Future wait(List<Future> futures) => null;
-}
-
-class Stream<T> {}
-''');
-
-  static const _MockSdkLibrary LIB_MATH =
-      const _MockSdkLibrary('math', '/lib/math/math.dart', '''
-library dart.math;
-const double E = 2.718281828459045;
-const double PI = 3.1415926535897932;
-num min(num a, num b) => 0;
-num max(num a, num b) => 0;
-class Random {}
-''');
-
-  static const _MockSdkLibrary LIB_HTML =
-      const _MockSdkLibrary('html', '/lib/html/dartium/html_dartium.dart', '''
-library dart.html;
-class HtmlElement {}
-''');
-
-  static const List<SdkLibrary> LIBRARIES = const [
-      LIB_CORE,
-      LIB_ASYNC,
-      LIB_MATH,
-      LIB_HTML,];
-
-  final resource.MemoryResourceProvider provider =
-      new resource.MemoryResourceProvider();
-
-  /**
-   * The [AnalysisContext] which is used for all of the sources.
-   */
-  InternalAnalysisContext _analysisContext;
-
-  MockSdk() {
-    LIBRARIES.forEach((_MockSdkLibrary library) {
-      provider.newFile(library.path, library.content);
-    });
-  }
-
-  @override
-  AnalysisContext get context {
-    if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext();
-      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
-      _analysisContext.sourceFactory = factory;
-      ChangeSet changeSet = new ChangeSet();
-      for (String uri in uris) {
-        Source source = factory.forUri(uri);
-        changeSet.addedSource(source);
-      }
-      _analysisContext.applyChanges(changeSet);
-    }
-    return _analysisContext;
-  }
-
-  @override
-  List<SdkLibrary> get sdkLibraries => LIBRARIES;
-
-  @override
-  String get sdkVersion => throw unimplemented;
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-
-  @override
-  List<String> get uris {
-    List<String> uris = <String>[];
-    for (SdkLibrary library in LIBRARIES) {
-      uris.add('dart:' + library.shortName);
-    }
-    return uris;
-  }
-
-  @override
-  Source fromFileUri(Uri uri) {
-    String filePath = uri.path;
-    String libPath = '/lib';
-    if (!filePath.startsWith("$libPath/")) {
-      return null;
-    }
-    for (SdkLibrary library in LIBRARIES) {
-      String libraryPath = library.path;
-      if (filePath.replaceAll('\\', '/') == libraryPath) {
-        String path = library.shortName;
-        try {
-          resource.File file = provider.getResource(uri.path);
-          Uri dartUri = new Uri(scheme: 'dart', path: library.shortName);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-      if (filePath.startsWith("$libraryPath/")) {
-        String pathInLibrary = filePath.substring(libraryPath.length + 1);
-        String path = '${library.shortName}/${pathInLibrary}';
-        try {
-          resource.File file = provider.getResource(uri.path);
-          Uri dartUri = new Uri(scheme: 'dart', path: path);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) {
-    // getSdkLibrary() is only used to determine whether a library is internal
-    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
-    // return null.
-    return null;
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    const Map<String, String> uriToPath = const {
-      "dart:core": "/lib/core/core.dart",
-      "dart:html": "/lib/html/dartium/html_dartium.dart",
-      "dart:async": "/lib/async/async.dart",
-      "dart:math": "/lib/math/math.dart"
-    };
-
-    String path = uriToPath[dartUri];
-    if (path != null) {
-      resource.File file = provider.getResource(path);
-      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
-      return file.createSource(uri);
-    }
-
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    throw unimplemented;
-  }
-}
-
-
-class _MockSdkLibrary implements SdkLibrary {
-  final String shortName;
-  final String path;
-  final String content;
-
-  const _MockSdkLibrary(this.shortName, this.path, this.content);
-
-  @override
-  String get category => throw unimplemented;
-
-  @override
-  bool get isDart2JsLibrary => throw unimplemented;
-
-  @override
-  bool get isDocumented => throw unimplemented;
-
-  @override
-  bool get isImplementation => throw unimplemented;
-
-  @override
-  bool get isInternal => throw unimplemented;
-
-  @override
-  bool get isShared => throw unimplemented;
-
-  @override
-  bool get isVmLibrary => throw unimplemented;
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-}
diff --git a/pkg/analyzer2dart/test/output_helper.dart b/pkg/analyzer2dart/test/output_helper.dart
deleted file mode 100644
index 5a3f6b4..0000000
--- a/pkg/analyzer2dart/test/output_helper.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/// Helper classes for testing compiler output.
-library test.output_helper;
-
-import 'dart:async';
-
-
-class CollectingOutputProvider {
-  StringBufferSink output;
-
-  EventSink<String> call(String name, String extension) {
-    return output = new StringBufferSink();
-  }
-}
-
-class StringBufferSink implements EventSink<String> {
-  StringBuffer sb = new StringBuffer();
-
-  void add(String text) {
-    sb.write(text);
-  }
-
-  void addError(errorEvent, [StackTrace stackTrace]) {}
-
-  void close() {}
-
-  String get text => sb.toString();
-}
-
diff --git a/pkg/analyzer2dart/test/sexpr_data.dart b/pkg/analyzer2dart/test/sexpr_data.dart
deleted file mode 100644
index e7d00ae..0000000
--- a/pkg/analyzer2dart/test/sexpr_data.dart
+++ /dev/null
@@ -1,1549 +0,0 @@
-// Copyright (c) 2014, 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 data for sexpr_test.
-library test.sexpr.data;
-
-import 'test_helper.dart';
-
-class TestSpec extends TestSpecBase {
-  // A [String] or a [Map<String, String>].
-  final output;
-
-  /// True if the test should be skipped when testing analyzer2dart.
-  final bool skipInAnalyzerFrontend;
-
-  const TestSpec(String input, this.output,
-                 {this.skipInAnalyzerFrontend: false}) : super(input);
-}
-
-const List<Group> TEST_DATA = const [
-  const Group('Empty main', const [
-    const TestSpec('''
-main() {}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-foo() {}
-main() {
-  foo();
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (LetPrim (v1 (Constant (Null)))
-        (InvokeContinuation return (v1)))))
-    (InvokeStatic foo () k0)))
-''')
-  ]),
-
-  const Group('Literals', const [
-    const TestSpec('''
-main() {
-  return 0;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 1.5;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Double 1.5)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return true;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Bool true)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return false;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Bool false)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return "a";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (String "a")))
-    (InvokeContinuation return (v0))))
-'''),
-  ]),
-
-  const Group('Parameters', const [
-    const TestSpec('''
-main(args) {}
-''', '''
-(FunctionDefinition main () (args) return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main(a, b) {}
-''', '''
-(FunctionDefinition main () (a b) return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''),
-  ]),
-
-  const Group('Pass arguments', const [
-    const TestSpec('''
-foo(a) {}
-main() {
-  foo(null);
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (LetCont ((k0 (v1)
-        (LetPrim (v2 (Constant (Null)))
-          (InvokeContinuation return (v2)))))
-      (InvokeStatic foo (v0) k0))))
-'''),
-
-    const TestSpec('''
-bar(b, c) {}
-foo(a) {}
-main() {
-  foo(null);
-  bar(0, "");
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (LetCont ((k0 (v1)
-        (LetPrim (v2 (Constant (Int 0)))
-          (LetPrim (v3 (Constant (String "")))
-            (LetCont ((k1 (v4)
-                (LetPrim (v5 (Constant (Null)))
-                  (InvokeContinuation return (v5)))))
-              (InvokeStatic bar (v2 v3) k1))))))
-      (InvokeStatic foo (v0) k0))))
-'''),
-
-    const TestSpec('''
-foo(a) {}
-main() {
-  return foo(null);
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (LetCont ((k0 (v1)
-        (InvokeContinuation return (v1))))
-      (InvokeStatic foo (v0) k0))))
-'''),
-  ]),
-
-  const Group('Local variables', const [
-    const TestSpec('''
-main() {
-  var a;
-  return a;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  return a;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return a;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (InvokeContinuation return (a)))
-'''),
-    ]),
-
-  const Group('Local variable writes', const <TestSpec>[
-    const TestSpec('''
-main() {
-  var a;
-  a = 10;
-  return a;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Null)))
-    (LetPrim (v1 (Constant (Int 10)))
-      (InvokeContinuation return (v1)))))
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  a = 10;
-  return a;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (Int 10)))
-      (InvokeContinuation return (v1)))))
-'''),
-
-    const TestSpec('''
-main() {
-  var a = 0;
-  print(a);
-  a = "";
-  print(a);
-  return a;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((k0 (v1)
-        (LetPrim (v2 (Constant (String "")))
-          (LetCont ((k1 (v3)
-              (InvokeContinuation return (v2))))
-            (InvokeStatic print (v2) k1)))))
-      (InvokeStatic print (v0) k0))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  print(a);
-  a = "";
-  print(a);
-  return a;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetPrim (v1 (Constant (String "")))
-        (LetCont ((k1 (v2)
-            (InvokeContinuation return (v1))))
-          (InvokeStatic print (v1) k1)))))
-    (InvokeStatic print (a) k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    a = "";
-  }
-  print(a);
-  return a;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetCont ((k1 (v1)
-          (InvokeContinuation return (v0))))
-        (InvokeStatic print (v0) k1))))
-    (LetCont ((k2 ()
-        (LetPrim (v2 (Constant (String "")))
-          (InvokeContinuation k0 (v2))))
-              (k3 ()
-        (InvokeContinuation k0 (a))))
-      (Branch (IsTrue a) k2 k3))))
-'''),
-  ]),
-
-  const Group('Dynamic access', const [
-    const TestSpec('''
-main(a) {
-  return a.foo;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (InvokeMethod a foo () k0)))
-'''),
-
-    const TestSpec('''
-main() {
-  var a = "";
-  return a.foo;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (String "")))
-    (LetCont ((k0 (v1)
-        (InvokeContinuation return (v1))))
-      (InvokeMethod v0 foo () k0))))
-'''),
-    ]),
-
-  const Group('Dynamic invocation', const [
-    const TestSpec('''
-main(a) {
-  return a.foo(0);
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((k0 (v1)
-        (InvokeContinuation return (v1))))
-      (InvokeMethod a foo (v0) k0))))
-'''),
-
-    const TestSpec('''
-main() {
-  var a = "";
-  return a.foo(0, 1);
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (String "")))
-    (LetPrim (v1 (Constant (Int 0)))
-      (LetPrim (v2 (Constant (Int 1)))
-        (LetCont ((k0 (v3)
-            (InvokeContinuation return (v3))))
-          (InvokeMethod v0 foo (v1 v2) k0))))))
-'''),
-    ]),
-
-  const Group('Binary expressions', const [
-    const TestSpec('''
-main() {
-  return 0 + "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 + (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 - "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 - (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 * "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 * (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 / "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 / (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 ~/ "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 ~/ (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 < "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 < (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 <= "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 <= (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 > "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 > (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 >= "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 >= (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 << "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 << (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 >> "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 >> (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 & "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 & (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 | "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 | (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 ^ "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 ^ (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 == "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (InvokeContinuation return (v2))))
-        (InvokeMethod v0 == (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 != "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (LetCont ((k1 (v3)
-              (InvokeContinuation return (v3))))
-            (LetCont ((k2 ()
-                (LetPrim (v4 (Constant (Bool false)))
-                  (InvokeContinuation k1 (v4))))
-                      (k3 ()
-                (LetPrim (v5 (Constant (Bool true)))
-                  (InvokeContinuation k1 (v5)))))
-              (Branch (IsTrue v2) k2 k3)))))
-        (InvokeMethod v0 == (v1) k0)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 && "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((k0 (v1)
-        (InvokeContinuation return (v1))))
-      (LetCont ((k1 ()
-          (LetPrim (v2 (Constant (String "")))
-            (LetCont ((k2 ()
-                (LetPrim (v3 (Constant (Bool true)))
-                  (InvokeContinuation k0 (v3))))
-                      (k3 ()
-                (LetPrim (v4 (Constant (Bool false)))
-                  (InvokeContinuation k0 (v4)))))
-              (Branch (IsTrue v2) k2 k3))))
-                (k4 ()
-          (LetPrim (v5 (Constant (Bool false)))
-            (InvokeContinuation k0 (v5)))))
-        (Branch (IsTrue v0) k1 k4)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 || "";
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((k0 (v1)
-        (InvokeContinuation return (v1))))
-      (LetCont ((k1 ()
-          (LetPrim (v2 (Constant (Bool true)))
-            (InvokeContinuation k0 (v2))))
-                (k2 ()
-          (LetPrim (v3 (Constant (String "")))
-            (LetCont ((k3 ()
-                (LetPrim (v4 (Constant (Bool true)))
-                  (InvokeContinuation k0 (v4))))
-                      (k4 ()
-                (LetPrim (v5 (Constant (Bool false)))
-                  (InvokeContinuation k0 (v5)))))
-              (Branch (IsTrue v3) k3 k4)))))
-        (Branch (IsTrue v0) k1 k2)))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 + "" * 2;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetPrim (v2 (Constant (Int 2)))
-        (LetCont ((k0 (v3)
-            (LetCont ((k1 (v4)
-                (InvokeContinuation return (v4))))
-              (InvokeMethod v0 + (v3) k1))))
-          (InvokeMethod v1 * (v2) k0))))))
-'''),
-
-    const TestSpec('''
-main() {
-  return 0 * "" + 2;
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "")))
-      (LetCont ((k0 (v2)
-          (LetPrim (v3 (Constant (Int 2)))
-            (LetCont ((k1 (v4)
-                (InvokeContinuation return (v4))))
-              (InvokeMethod v2 + (v3) k1)))))
-        (InvokeMethod v0 * (v1) k0)))))
-'''),
-    ]),
-
-  const Group('If statement', const [
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0)))))
-    (LetCont ((k1 ()
-        (LetPrim (v1 (Constant (Int 0)))
-          (LetCont ((k2 (v2)
-              (InvokeContinuation k0 ())))
-            (InvokeStatic print (v1) k2))))
-              (k3 ()
-        (InvokeContinuation k0 ())))
-      (Branch (IsTrue a) k1 k3))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0)))))
-    (LetCont ((k1 ()
-        (LetPrim (v1 (Constant (Int 0)))
-          (LetCont ((k2 (v2)
-              (InvokeContinuation k0 ())))
-            (InvokeStatic print (v1) k2))))
-              (k3 ()
-        (LetPrim (v3 (Constant (Int 1)))
-          (LetCont ((k4 (v4)
-              (InvokeContinuation k0 ())))
-            (InvokeStatic print (v3) k4)))))
-      (Branch (IsTrue a) k1 k3))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-    print(2);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0)))))
-    (LetCont ((k1 ()
-        (LetPrim (v1 (Constant (Int 0)))
-          (LetCont ((k2 (v2)
-              (InvokeContinuation k0 ())))
-            (InvokeStatic print (v1) k2))))
-              (k3 ()
-        (LetPrim (v3 (Constant (Int 1)))
-          (LetCont ((k4 (v4)
-              (LetPrim (v5 (Constant (Int 2)))
-                (LetCont ((k5 (v6)
-                    (InvokeContinuation k0 ())))
-                  (InvokeStatic print (v5) k5)))))
-            (InvokeStatic print (v3) k4)))))
-      (Branch (IsTrue a) k1 k3))))
-'''),
-    ]),
-
-  const Group('Conditional expression', const [
-    const TestSpec('''
-main(a) {
-  return a ? print(0) : print(1);
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (LetCont ((k1 ()
-        (LetPrim (v1 (Constant (Int 0)))
-          (LetCont ((k2 (v2)
-              (InvokeContinuation k0 (v2))))
-            (InvokeStatic print (v1) k2))))
-              (k3 ()
-        (LetPrim (v3 (Constant (Int 1)))
-          (LetCont ((k4 (v4)
-              (InvokeContinuation k0 (v4))))
-            (InvokeStatic print (v3) k4)))))
-      (Branch (IsTrue a) k1 k3))))
-'''),
-    ]),
-
-
-  // These test that unreachable statements are skipped within a block.
-  const Group('Block statements', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return 0;
-  return 1;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    return 0;
-    return 1;
-  } else {
-    return 2;
-    return 3;
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Int 0)))
-        (InvokeContinuation return (v0))))
-            (k1 ()
-      (LetPrim (v1 (Constant (Int 2)))
-        (InvokeContinuation return (v1)))))
-    (Branch (IsTrue a) k0 k1)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  if (a) {
-    print(0);
-    return 0;
-    return 1;
-  } else {
-    print(2);
-    return 2;
-    return 3;
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Int 0)))
-        (LetCont ((k1 (v1)
-            (LetPrim (v2 (Constant (Int 0)))
-              (InvokeContinuation return (v2)))))
-          (InvokeStatic print (v0) k1))))
-            (k2 ()
-      (LetPrim (v3 (Constant (Int 2)))
-        (LetCont ((k3 (v4)
-            (LetPrim (v5 (Constant (Int 2)))
-              (InvokeContinuation return (v5)))))
-          (InvokeStatic print (v3) k3)))))
-    (Branch (IsTrue a) k0 k2)))
-'''),
-  ]),
-
-  const Group('Constructor invocation', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  new Object();
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetPrim (v1 (Constant (Null)))
-        (InvokeContinuation return (v1)))))
-    (InvokeConstructor Object () k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  new Deprecated("");
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (String "")))
-    (LetCont ((k0 (v1)
-        (LetPrim (v2 (Constant (Null)))
-          (InvokeContinuation return (v2)))))
-      (InvokeConstructor Deprecated (v0) k0))))
-'''),
-  ]),
-
-  const Group('List literal', const <TestSpec>[
-    const TestSpec('''
-main() {
-  return [];
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (LiteralList ()))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return [0];
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (LiteralList (v0)))
-      (InvokeContinuation return (v1)))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return [0, 1, a];
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (Int 1)))
-      (LetPrim (v2 (LiteralList (v0 v1 a)))
-        (InvokeContinuation return (v2))))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return [0, [1], [a, [3]]];
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (Int 1)))
-      (LetPrim (v2 (LiteralList (v1)))
-        (LetPrim (v3 (Constant (Int 3)))
-          (LetPrim (v4 (LiteralList (v3)))
-            (LetPrim (v5 (LiteralList (a v4)))
-              (LetPrim (v6 (LiteralList (v0 v2 v5)))
-                (InvokeContinuation return (v6))))))))))
-'''),
-  ]),
-
-  const Group('Map literal', const <TestSpec>[
-    const TestSpec('''
-main() {
-  return {};
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (LiteralMap () ()))
-    (InvokeContinuation return (v0))))
-'''),
-
-    const TestSpec('''
-main() {
-  return {"a": 0};
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (String "a")))
-    (LetPrim (v1 (Constant (Int 0)))
-      (LetPrim (v2 (LiteralMap (v0) (v1)))
-        (InvokeContinuation return (v2))))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return {"a": 0, "b": 1, "c": a};
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (String "a")))
-    (LetPrim (v1 (Constant (Int 0)))
-      (LetPrim (v2 (Constant (String "b")))
-        (LetPrim (v3 (Constant (Int 1)))
-          (LetPrim (v4 (Constant (String "c")))
-            (LetPrim (v5 (LiteralMap (v0 v2 v4) (v1 v3 a)))
-              (InvokeContinuation return (v5)))))))))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return {0: "a", 1: {2: "b"}, a: {3: "c"}};
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetPrim (v1 (Constant (String "a")))
-      (LetPrim (v2 (Constant (Int 1)))
-        (LetPrim (v3 (Constant (Int 2)))
-          (LetPrim (v4 (Constant (String "b")))
-            (LetPrim (v5 (LiteralMap (v3) (v4)))
-              (LetPrim (v6 (Constant (Int 3)))
-                (LetPrim (v7 (Constant (String "c")))
-                  (LetPrim (v8 (LiteralMap (v6) (v7)))
-                    (LetPrim (v9 (LiteralMap (v0 v2 a) (v1 v5 v8)))
-                      (InvokeContinuation return (v9)))))))))))))
-'''),
-  ]),
-
-  const Group('For loop', const <TestSpec>[
-    const TestSpec('''
-main() {
-  for (;;) {}
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetCont ((rec k0 ()
-      (LetPrim (v0 (Constant (Bool true)))
-        (LetCont ((k1 ()
-            (LetPrim (v1 (Constant (Null)))
-              (InvokeContinuation return (v1))))
-                  (k2 ()
-            (InvokeContinuation rec k0 ())))
-          (Branch (IsTrue v0) k2 k1)))))
-    (InvokeContinuation k0 ())))
-'''),
-
-const TestSpec('''
-main() {
-  for (var i = 0; i < 10; i = i + 1) {
-    print(i);
-  }
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((rec k0 (v1)
-        (LetPrim (v2 (Constant (Int 10)))
-          (LetCont ((k1 (v3)
-              (LetCont ((k2 ()
-                  (LetPrim (v4 (Constant (Null)))
-                    (InvokeContinuation return (v4))))
-                        (k3 ()
-                  (LetCont ((k4 (v5)
-                      (LetPrim (v6 (Constant (Int 1)))
-                        (LetCont ((k5 (v7)
-                            (InvokeContinuation rec k0 (v7))))
-                          (InvokeMethod v1 + (v6) k5)))))
-                    (InvokeStatic print (v1) k4))))
-                (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1)))))
-      (InvokeContinuation k0 (v0)))))
-'''),
-
-const TestSpec('''
-main(i) {
-  for (i = 0; i < 10; i = i + 1) {
-    print(i);
-  }
-}
-''', '''
-(FunctionDefinition main () (i) return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((rec k0 (v1)
-        (LetPrim (v2 (Constant (Int 10)))
-          (LetCont ((k1 (v3)
-              (LetCont ((k2 ()
-                  (LetPrim (v4 (Constant (Null)))
-                    (InvokeContinuation return (v4))))
-                        (k3 ()
-                  (LetCont ((k4 (v5)
-                      (LetPrim (v6 (Constant (Int 1)))
-                        (LetCont ((k5 (v7)
-                            (InvokeContinuation rec k0 (v7))))
-                          (InvokeMethod v1 + (v6) k5)))))
-                    (InvokeStatic print (v1) k4))))
-                (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1)))))
-      (InvokeContinuation k0 (v0)))))
-'''),
-  ]),
-
-  const Group('While loop', const <TestSpec>[
-    const TestSpec('''
-main() {
-  while (true) {}
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetCont ((rec k0 ()
-      (LetPrim (v0 (Constant (Bool true)))
-        (LetCont ((k1 ()
-            (LetPrim (v1 (Constant (Null)))
-              (InvokeContinuation return (v1))))
-                  (k2 ()
-            (InvokeContinuation rec k0 ())))
-          (Branch (IsTrue v0) k2 k1)))))
-    (InvokeContinuation k0 ())))
-'''),
-
-const TestSpec('''
-main() {
-  var i = 0;
-  while (i < 10) {
-    print(i);
-    i = i + 1;
-  }
-}
-''', '''
-(FunctionDefinition main () () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (LetCont ((rec k0 (v1)
-        (LetPrim (v2 (Constant (Int 10)))
-          (LetCont ((k1 (v3)
-              (LetCont ((k2 ()
-                  (LetPrim (v4 (Constant (Null)))
-                    (InvokeContinuation return (v4))))
-                        (k3 ()
-                  (LetCont ((k4 (v5)
-                      (LetPrim (v6 (Constant (Int 1)))
-                        (LetCont ((k5 (v7)
-                            (InvokeContinuation rec k0 (v7))))
-                          (InvokeMethod v1 + (v6) k5)))))
-                    (InvokeStatic print (v1) k4))))
-                (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1)))))
-      (InvokeContinuation k0 (v0)))))
-'''),
-  ]),
-
-  const Group('Type operators', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  return a is String;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (TypeOperator is a String () k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return a is List<String>;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (TypeOperator is a List<String> () k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  return a is Comparator<String>;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (TypeOperator is a Comparator<String> () k0)))
-'''),
-
-  const TestSpec('''
-main(a) {
-  return a is! String;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetCont ((k1 (v1)
-          (InvokeContinuation return (v1))))
-        (LetCont ((k2 ()
-            (LetPrim (v2 (Constant (Bool false)))
-              (InvokeContinuation k1 (v2))))
-                  (k3 ()
-            (LetPrim (v3 (Constant (Bool true)))
-              (InvokeContinuation k1 (v3)))))
-          (Branch (IsTrue v0) k2 k3)))))
-    (TypeOperator is a String () k0)))
-'''),
-
-const TestSpec('''
-main(a) {
-  return a as String;
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (TypeOperator as a String () k0)))
-'''),
-  ]),
-
-  const Group('For in loop', const <TestSpec>[
-// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
-// fields.
-    const TestSpec('''
-main(a) {
-  for (var i in a) {
-    print(i);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetCont ((rec k1 (v1)
-          (LetCont ((k2 (v2)
-              (LetCont ((k3 ()
-                  (LetPrim (v3 (Constant (Null)))
-                    (InvokeContinuation return (v3))))
-                        (k4 ()
-                  (LetPrim (v4 (Constant (Null)))
-                    (LetCont ((k5 (v5)
-                        (LetCont ((k6 (v6)
-                            (InvokeContinuation rec k1 (v1))))
-                          (InvokeStatic print (v5) k6))))
-                      (InvokeMethod v0 current () k5)))))
-                (Branch (IsTrue v2) k4 k3))))
-            (InvokeMethod v0 moveNext () k2))))
-        (InvokeContinuation k1 (a)))))
-    (InvokeMethod a iterator () k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  for (var i in a) {
-    print(i);
-    i = 0;
-    print(i);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetCont ((rec k1 (v1)
-          (LetCont ((k2 (v2)
-              (LetCont ((k3 ()
-                  (LetPrim (v3 (Constant (Null)))
-                    (InvokeContinuation return (v3))))
-                        (k4 ()
-                  (LetPrim (v4 (Constant (Null)))
-                    (LetCont ((k5 (v5)
-                        (LetCont ((k6 (v6)
-                            (LetPrim (v7 (Constant (Int 0)))
-                              (LetCont ((k7 (v8)
-                                  (InvokeContinuation rec k1 (v1))))
-                                (InvokeStatic print (v7) k7)))))
-                          (InvokeStatic print (v5) k6))))
-                      (InvokeMethod v0 current () k5)))))
-                (Branch (IsTrue v2) k4 k3))))
-            (InvokeMethod v0 moveNext () k2))))
-        (InvokeContinuation k1 (a)))))
-    (InvokeMethod a iterator () k0)))
-'''),
-
-    const TestSpec('''
-main(a) {
-  var i;
-  for (i in a) {
-    print(i);
-  }
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (Constant (Null)))
-    (LetCont ((k0 (v1)
-        (LetCont ((rec k1 (v2 v3)
-            (LetCont ((k2 (v4)
-                (LetCont ((k3 ()
-                    (LetPrim (v5 (Constant (Null)))
-                      (InvokeContinuation return (v5))))
-                          (k4 ()
-                    (LetCont ((k5 (v6)
-                        (LetCont ((k6 (v7)
-                            (InvokeContinuation rec k1 (v2 v6))))
-                          (InvokeStatic print (v6) k6))))
-                      (InvokeMethod v1 current () k5))))
-                  (Branch (IsTrue v4) k4 k3))))
-              (InvokeMethod v1 moveNext () k2))))
-          (InvokeContinuation k1 (a v0)))))
-      (InvokeMethod a iterator () k0))))
-'''),
-  ]),
-
-  const Group('Local functions', const <TestSpec>[
-    const TestSpec('''
-main(a) {
-  local() {}
-  return local();
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (CreateFunction
-      (FunctionDefinition local () () return
-        (LetPrim (v1 (Constant (Null)))
-          (InvokeContinuation return (v1))))))
-    (LetCont ((k0 (v2)
-        (InvokeContinuation return (v2))))
-      (InvokeMethod v0 call () k0))))
-'''),
-
-  const TestSpec('''
-main(a) {
-  local() {}
-  var l = local;
-  return l();
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (CreateFunction
-      (FunctionDefinition local () () return
-        (LetPrim (v1 (Constant (Null)))
-          (InvokeContinuation return (v1))))))
-    (LetCont ((k0 (v2)
-        (InvokeContinuation return (v2))))
-      (InvokeMethod v0 call () k0))))
-'''),
-
-  const TestSpec('''
-main(a) {
-  return () {}();
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetPrim (v0 (CreateFunction
-      (FunctionDefinition  () () return
-        (LetPrim (v1 (Constant (Null)))
-          (InvokeContinuation return (v1))))))
-    (LetCont ((k0 (v2)
-        (InvokeContinuation return (v2))))
-      (InvokeMethod v0 call () k0))))
-'''),
-
-  const TestSpec('''
-main(a) {
-  var c = a ? () { return 0; } : () { return 1; }
-  return c();
-}
-''', '''
-(FunctionDefinition main () (a) return
-  (LetCont ((k0 (v0)
-      (LetCont ((k1 (v1)
-          (InvokeContinuation return (v1))))
-        (InvokeMethod v0 call () k1))))
-    (LetCont ((k2 ()
-        (LetPrim (v2 (CreateFunction
-            (FunctionDefinition  () () return
-              (LetPrim (v3 (Constant (Int 0)))
-                (InvokeContinuation return (v3))))))
-          (InvokeContinuation k0 (v2))))
-              (k3 ()
-        (LetPrim (v4 (CreateFunction
-            (FunctionDefinition  () () return
-              (LetPrim (v5 (Constant (Int 1)))
-                (InvokeContinuation return (v5))))))
-          (InvokeContinuation k0 (v4)))))
-      (Branch (IsTrue a) k2 k3))))
-'''),
-  ]),
-
-  const Group('Top level field', const <TestSpec>[
-    const TestSpec('''
-var field;
-main(args) {
-  return field;
-}
-''', const {
-      'main': '''
-(FunctionDefinition main () (args) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (GetLazyStatic field k0)))
-''',
-      'field': '''
-(FieldDefinition field)
-'''}),
-
-    const TestSpec('''
-var field = null;
-main(args) {
-  return field;
-}
-''', const {
-      'main': '''
-(FunctionDefinition main () (args) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (GetLazyStatic field k0)))
-''',
-      'field': '''
-(FieldDefinition field () return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-
-    const TestSpec('''
-var field = 0;
-main(args) {
-  return field;
-}
-''', const {
-      'main': '''
-(FunctionDefinition main () (args) return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (GetLazyStatic field k0)))
-''',
-      'field': '''
-(FieldDefinition field () return
-  (LetPrim (v0 (Constant (Int 0)))
-    (InvokeContinuation return (v0))))
-'''}),
-
-    const TestSpec('''
-var field;
-main(args) {
-  field = args.length;
-  return field;
-}
-''', '''
-(FunctionDefinition main () (args) return
-  (LetCont ((k0 (v0)
-      (SetStatic field v0
-        (LetCont ((k1 (v1)
-            (InvokeContinuation return (v1))))
-          (GetLazyStatic field k1)))))
-    (InvokeMethod args length () k0)))
-'''),
-  ]),
-
-  const Group('Closure variables', const <TestSpec>[
-    const TestSpec('''
-main(x,foo) {
-  print(x);
-  getFoo() => foo;
-  print(getFoo());
-}
-''', '''
-(FunctionDefinition main () (x foo) return
-  (LetCont ((k0 (v0)
-      (LetPrim (v1 (CreateFunction
-          (FunctionDefinition getFoo () () return
-            (LetPrim (v2 (GetMutableVariable foo))
-              (InvokeContinuation return (v2))))))
-        (LetCont ((k1 (v3)
-            (LetCont ((k2 (v4)
-                (LetPrim (v5 (Constant (Null)))
-                  (InvokeContinuation return (v5)))))
-              (InvokeStatic print (v3) k2))))
-          (InvokeMethod v1 call () k1)))))
-    (InvokeStatic print (x) k0)))
-''', skipInAnalyzerFrontend: true)
-  ]),
-
-  const Group('Constructors', const <TestSpec>[
-    const TestSpec('''
-class C {}
-main() {
-  return new C();
-}
-''',
-    const {
-'main': '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (InvokeConstructor C () k0)))
-''',
-'C.':  '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-
-    const TestSpec('''
-class C {
-  C() {}
-}
-main() {
-  return new C();
-}
-''',
-    const {
-'main': '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (InvokeConstructor C () k0)))
-''',
-'C.': '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-
-    const TestSpec('''
-class B {}
-class C extends B {
-  C() {}
-}
-main() {
-  return new C();
-}
-''',
-    const {
-'main': '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (InvokeConstructor C () k0)))
-''',
-'B.':  '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-''',
-'C.': '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-
-    const TestSpec('''
-class B {
-  B() {}
-}
-class C extends B {}
-main() {
-  return new C();
-}
-''',
-    const {
-'main': '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (InvokeContinuation return (v0))))
-    (InvokeConstructor C () k0)))
-''',
-'B.': '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-''',
-'C.':  '''
-(ConstructorDefinition (this) () return (
-    )
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-  ]),
-
-  const Group('Instance method', const <TestSpec>[
-    const TestSpec('''
-class C {
-  C() {}
-  foo() {}
-}
-main() {
-  return new C().foo();
-}
-''',
-    const {
-'main': '''
-(FunctionDefinition main () () return
-  (LetCont ((k0 (v0)
-      (LetCont ((k1 (v1)
-          (InvokeContinuation return (v1))))
-        (InvokeMethod v0 foo () k1))))
-    (InvokeConstructor C () k0)))
-''',
-'C.foo': '''
-(FunctionDefinition foo (this) () return
-  (LetPrim (v0 (Constant (Null)))
-    (InvokeContinuation return (v0))))
-'''}),
-  ]),
-
-
-  const Group('Try-catch', const <TestSpec>[
-    const TestSpec('''
-main() {
-  try {} catch (e) {}
-}
-''',
-'''
-(FunctionDefinition main () () return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0)))))
-    (LetHandler ((v1 v2)
-        (InvokeContinuation k0 ()))
-      (InvokeContinuation k0 ()))))
-'''),
-
-    const TestSpec('''
-main() {
-  try {
-    return;
-  } catch (e) {}
-}
-''',
-'''
-(FunctionDefinition main () () return
-  (LetCont ((k0 ()
-      (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0)))))
-    (LetHandler ((v1 v2)
-        (InvokeContinuation k0 ()))
-      (LetPrim (v3 (Constant (Null)))
-        (InvokeContinuation return (v3))))))
-'''),
-  ]),
-];
diff --git a/pkg/analyzer2dart/test/sexpr_test.dart b/pkg/analyzer2dart/test/sexpr_test.dart
deleted file mode 100644
index 2c8da58..0000000
--- a/pkg/analyzer2dart/test/sexpr_test.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/// Unittest test of the CPS ir generated by the analyzer2dart compiler.
-
-import 'mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:compiler/src/cps_ir/cps_ir_nodes.dart';
-import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart';
-import 'package:compiler/src/elements/elements.dart' as dart2js;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/closed_world.dart';
-import '../lib/src/driver.dart';
-import '../lib/src/converted_world.dart';
-import 'output_helper.dart';
-import 'test_helper.dart';
-import 'sexpr_data.dart';
-
-main(List<String> args) {
-  performTests(TEST_DATA, unittester, checkResult, args);
-}
-
-checkResult(TestSpec result) {
-  if (result.skipInAnalyzerFrontend) return;
-  String input = result.input.trim();
-  CollectingOutputProvider outputProvider = new CollectingOutputProvider();
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-  DartSdk sdk = new MockSdk();
-  Driver driver = new Driver(provider, sdk, outputProvider);
-  String rootFile = '/root.dart';
-  provider.newFile(rootFile, input);
-  Source rootSource = driver.setRoot(rootFile);
-  FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
-  ClosedWorld world = driver.computeWorld(entryPoint);
-  ConvertedWorld convertedWorld = convertWorld(world);
-
-  void checkOutput(String elementName,
-                   dart2js.Element element,
-                   String expectedOutput) {
-    RootNode ir = convertedWorld.getIr(element);
-    if (expectedOutput == null) {
-      expect(ir, isNull,
-          reason: "\nInput:\n${result.input}\n"
-                  "No CPS IR expected for $element");
-    } else {
-      expect(ir, isNotNull,
-          reason: "\nInput:\n${result.input}\n"
-                  "No CPS IR for $element");
-      expectedOutput = expectedOutput.trim();
-      String output = ir.accept(new SExpressionStringifier());
-      expect(output, equals(expectedOutput),
-          reason: "\nInput:\n${result.input}\n"
-                  "Expected for '$elementName':\n$expectedOutput\n"
-                  "Actual for '$elementName':\n$output\n");
-    }
-  }
-
-  if (result.output is String) {
-    checkOutput('main', convertedWorld.mainFunction, result.output);
-  } else {
-    assert(result.output is Map<String, String>);
-    dart2js.LibraryElement mainLibrary = convertedWorld.mainFunction.library;
-    result.output.forEach((String elementName, String output) {
-      bool found = false;
-      List<String> names = <String>[];
-      convertedWorld.resolvedElements.forEach((dart2js.Element element) {
-        if (element.library == mainLibrary) {
-          String name = element.name;
-          if (element.enclosingClass != null) {
-            name = '${element.enclosingClass.name}.$name';
-          }
-          if (name == elementName) {
-            checkOutput(elementName, element, output);
-            found = true;
-          }
-          names.add(name);
-        }
-      });
-      expect(found, isTrue, reason: "'$elementName' not found in $names.");
-    });
-  }
-}
-
diff --git a/pkg/analyzer2dart/test/test_helper.dart b/pkg/analyzer2dart/test/test_helper.dart
deleted file mode 100644
index 86a52b0..0000000
--- a/pkg/analyzer2dart/test/test_helper.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2014, 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.
-
-/// Helpers for defining input/output based unittests through (constant) data.
-
-import 'package:unittest/unittest.dart';
-
-/// A unittest group with a name and a list of input/output results.
-class Group {
-  final String name;
-  final List<TestSpecBase> results;
-
-  const Group(this.name, this.results);
-}
-
-/// A [input] for which a certain processing result is expected.
-class TestSpecBase {
-  final String input;
-
-  const TestSpecBase(this.input);
-}
-
-typedef TestGroup(Group group, RunTest check);
-typedef RunTest(TestSpecBase result);
-
-/// Test [data] using [testGroup] and [check].
-void performTests(List<Group> data,
-                  TestGroup testGroup,
-                  RunTest runTest,
-                  List<String> groupsToRun) {
-  for (Group group in data) {
-    if (groupsToRun.isNotEmpty &&
-        !groupsToRun.contains(group.name)) {
-      // Skip this group.
-      continue;
-    }
-    testGroup(group, runTest);
-  }
-}
-
-/// Test group using unittest.
-unittester(Group group, RunTest runTest) {
-  test(group.name, () {
-    for (TestSpecBase result in group.results) {
-      runTest(result);
-    }
-  });
-}
\ No newline at end of file
diff --git a/pkg/analyzer2dart/test/tree_shaker_test.dart b/pkg/analyzer2dart/test/tree_shaker_test.dart
deleted file mode 100644
index cedb449..0000000
--- a/pkg/analyzer2dart/test/tree_shaker_test.dart
+++ /dev/null
@@ -1,546 +0,0 @@
-// Copyright (c) 2014, 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 'mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:compiler/src/dart2jslib.dart' show NullSink;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/closed_world.dart';
-import '../lib/src/driver.dart';
-
-main() {
-  test('Toplevel function', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  foo();
-}
-foo() {
-}
-''');
-    helper.assertHasFunction('main');
-    helper.assertHasFunction('foo');
-  });
-
-  test('Toplevel field read', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  return foo;
-}
-var foo;
-var bar;
-''');
-    helper.assertHasFunction('main');
-    helper.assertHasVariable('foo');
-    helper.assertNoVariable('bar');
-  });
-
-  test('Toplevel field write', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  foo = 1;
-}
-var foo;
-var bar;
-''');
-    helper.assertHasFunction('main');
-    helper.assertHasVariable('foo');
-    helper.assertNoVariable('bar');
-  });
-
-  test('Toplevel field invocation', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  return foo();
-}
-var foo;
-var bar;
-''');
-    helper.assertHasFunction('main');
-    helper.assertHasVariable('foo');
-    helper.assertNoVariable('bar');
-  });
-
-  test('Member field invocation', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  void call() {}
-  void baz() {}
-}
-main() {
-  new A();
-  foo();
-}
-var foo;
-var bar;
-''');
-    helper.assertHasFunction('main');
-    helper.assertHasVariable('foo');
-    helper.assertNoVariable('bar');
-    helper.assertHasInstantiatedClass('A');
-    helper.assertHasMethod('A.call');
-    helper.assertNoMethod('A.baz');
-  });
-
-  test('Class instantiation', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  var x = new A();
-}
-class A {}
-class B {}
-''');
-    helper.assertHasInstantiatedClass('A');
-    helper.assertNoInstantiatedClass('B');
-  });
-
-  test('Super class instantiation', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  var x = new B();
-}
-class A {}
-class B extends A {}
-''');
-    helper.assertHasInstantiatedClass('A');
-    helper.assertHasInstantiatedClass('B');
-  });
-
-  test('Method invocation', () {
-    var helper = new TreeShakerTestHelper('''
-main() {
-  var x = new A().foo();
-}
-class A {
-  foo() {}
-  bar() {}
-}
-class B {
-  foo() {}
-  bar() {}
-}
-''');
-    helper.assertHasMethod('A.foo');
-    helper.assertNoMethod('A.bar');
-    helper.assertNoMethod('B.foo');
-    helper.assertNoMethod('B.bar');
-  });
-
-  test('Method invocation on dynamic', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  m1() {}
-  m2() {}
-}
-foo(dynamic x) {
-  x.m1();
-}
-main() {
-  foo(new A());
-}
-''');
-    helper.assertHasMethod('A.m1');
-    helper.assertNoMethod('A.m2');
-  });
-
-  test('Method invocation on dynamic via cascade', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  m1() {}
-  m2() {}
-}
-foo(dynamic x) {
-  x..m1()..m2();
-}
-main() {
-  foo(new A());
-}
-''');
-    helper.assertHasMethod('A.m1');
-    helper.assertHasMethod('A.m2');
-  });
-
-  test('Getter usage', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  get g1 => null;
-  get g2 => null;
-  set g1(x) {}
-  set g2(x) {}
-}
-class B {
-  get g1 => null;
-  get g2 => null;
-  set g1(x) {}
-  set g2(x) {}
-}
-main() {
-  new A().g1;
-}
-''');
-    helper.assertHasGetter('A.g1');
-    helper.assertNoGetter('A.g2');
-    helper.assertNoGetter('B.g1');
-    helper.assertNoGetter('B.g2');
-    helper.assertNoSetter('A.g1');
-    helper.assertNoSetter('A.g2');
-    helper.assertNoSetter('B.g1');
-    helper.assertNoSetter('B.g2');
-  });
-
-  test('Setter usage', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  get g1 => null;
-  get g2 => null;
-  set g1(x) {}
-  set g2(x) {}
-}
-class B {
-  get g1 => null;
-  get g2 => null;
-  set g1(x) {}
-  set g2(x) {}
-}
-main() {
-  new A().g1 = 1;
-}
-''');
-    helper.assertHasSetter('A.g1');
-    helper.assertNoSetter('A.g2');
-    helper.assertNoSetter('B.g1');
-    helper.assertNoSetter('B.g2');
-    helper.assertNoGetter('A.g1');
-    helper.assertNoGetter('A.g2');
-    helper.assertNoGetter('B.g1');
-    helper.assertNoGetter('B.g2');
-  });
-
-  test('Field read', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  var f1;
-  var f2;
-}
-class B {
-  var f1;
-  var f2;
-}
-main() {
-  new A().f1;
-}
-''');
-    helper.assertHasField('A.f1');
-    helper.assertNoField('A.f2');
-    helper.assertNoField('B.f1');
-    helper.assertNoField('B.f2');
-  });
-
-  test('Field write', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  var f1;
-  var f2;
-}
-class B {
-  var f1;
-  var f2;
-}
-main() {
-  new A().f1 = 1;
-}
-''');
-    helper.assertHasField('A.f1');
-    helper.assertNoField('A.f2');
-    helper.assertNoField('B.f1');
-    helper.assertNoField('B.f2');
-  });
-
-  test('Ordinary constructor with initializer list', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  A() : x = f();
-  var x;
-  foo() {}
-}
-f() {}
-main() {
-  new A().foo();
-}
-''');
-    helper.assertHasMethod('A.foo');
-    helper.assertHasFunction('f');
-  });
-
-  test('Redirecting constructor', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  A.a1() : this.a2();
-  A.a2();
-  foo() {}
-}
-main() {
-  new A.a1().foo();
-}
-''');
-    helper.assertHasMethod('A.foo');
-  });
-
-  test('Factory constructor', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  factory A() {
-    return new B();
-  }
-  foo() {}
-}
-class B {
-  B();
-  foo() {}
-}
-main() {
-  new A().foo();
-}
-''');
-    helper.assertHasMethod('B.foo');
-    helper.assertNoMethod('A.foo');
-  });
-
-  test('Redirecting factory constructor', () {
-    var helper = new TreeShakerTestHelper('''
-class A {
-  factory A() = B;
-  foo() {}
-}
-class B {
-  B();
-  foo() {}
-}
-main() {
-  new A().foo();
-}
-''');
-    helper.assertHasMethod('B.foo');
-    helper.assertNoMethod('A.foo');
-  });
-}
-
-class TreeShakerTestHelper {
-  /**
-   * The name of the root file.
-   */
-  String rootFile = '/root.dart';
-
-  /**
-   * ClosedWorld that resulted from tree shaking.
-   */
-  ClosedWorld world;
-
-  /**
-   * Functions contained in [world], indexed by name.
-   */
-  Map<String, FunctionDeclaration> functions = <String, FunctionDeclaration>{};
-
-  /**
-   * Methods contained in [world], indexed by className.methodName.
-   */
-  Map<String, MethodDeclaration> methods = <String, MethodDeclaration>{};
-
-  /**
-   * Getters contained in [world], indexed by className.propertyName.
-   */
-  Map<String, MethodDeclaration> getters = <String, MethodDeclaration>{};
-
-  /**
-   * Setters contained in [world], indexed by className.propertyName.
-   */
-  Map<String, MethodDeclaration> setters = <String, MethodDeclaration>{};
-
-  /**
-   * Fields contained in [world], indexed by className.fieldName.
-   */
-  Map<String, VariableDeclaration> fields = <String, VariableDeclaration>{};
-
-  /**
-   * Top level variables contained in [world], indexed by name.
-   */
-  Map<String, VariableDeclaration> variables = <String, VariableDeclaration>{};
-
-  /**
-   * Classes instantiated in [world], indexed by name.
-   */
-  Map<String, ClassDeclaration> instantiatedClasses = <String,
-      ClassDeclaration>{};
-
-  /**
-   * Create a TreeShakerTestHelper based on the given file contents.
-   */
-  TreeShakerTestHelper(String contents) {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    DartSdk sdk = new MockSdk();
-    Driver driver = new Driver(provider, sdk, NullSink.outputProvider);
-    provider.newFile(rootFile, contents);
-    Source rootSource = driver.setRoot(rootFile);
-    FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
-    world = driver.computeWorld(entryPoint);
-    world.executableElements.forEach(
-        (ExecutableElement element, Declaration node) {
-      if (element is FunctionElement) {
-        FunctionDeclaration declaration = node as FunctionDeclaration;
-        expect(declaration, isNotNull);
-        expect(declaration.element, equals(element));
-        functions[element.name] = declaration;
-      } else if (element is MethodElement) {
-        MethodDeclaration declaration = node as MethodDeclaration;
-        expect(declaration, isNotNull);
-        expect(declaration.element, equals(element));
-        methods['${element.enclosingElement.name}.${element.name}'] =
-            declaration;
-      } else if (element is PropertyAccessorElement) {
-        MethodDeclaration declaration = node as MethodDeclaration;
-        expect(declaration, isNotNull);
-        expect(declaration.element, equals(element));
-        if (declaration.isGetter) {
-          getters['${element.enclosingElement.name}.${element.name}'] =
-              declaration;
-        } else if (declaration.isSetter) {
-          setters['${element.enclosingElement.name}.${element.displayName}'] =
-              declaration;
-        } else {
-          fail('Unexpected property accessor (neither getter nor setter)');
-        }
-      }
-    });
-    world.instantiatedClasses.forEach(
-        (ClassElement element, ClassDeclaration declaration) {
-      expect(declaration, isNotNull);
-      expect(declaration.element, equals(element));
-      instantiatedClasses[element.name] = declaration;
-    });
-    world.fields.forEach(
-        (FieldElement element, VariableDeclaration declaration) {
-      expect(declaration, isNotNull);
-      expect(declaration.element, equals(element));
-      fields['${element.enclosingElement.name}.${element.name}'] = declaration;
-    });
-    world.variables.forEach(
-        (TopLevelVariableElement element, VariableDeclaration declaration) {
-      expect(declaration, isNotNull);
-      expect(declaration.element, equals(element));
-      variables['${element.name}'] = declaration;
-    });
-  }
-
-  /**
-   * Asserts that [world] contains a field with the given qualified name.
-   */
-  void assertHasField(String qualifiedName) {
-    expect(fields, contains(qualifiedName));
-  }
-
-  /**
-   * Asserts that [world] contains a top level variable with the given name.
-   */
-  void assertHasVariable(String name) {
-    expect(variables, contains(name));
-  }
-
-  /**
-   * Asserts that [world] contains a top-level function with the given name.
-   */
-  void assertHasFunction(String name) {
-    expect(functions, contains(name));
-  }
-
-  /**
-   * Asserts that [world] contains a getter with the given qualified name.
-   */
-  void assertHasGetter(String qualifiedName) {
-    expect(getters, contains(qualifiedName));
-  }
-
-  /**
-   * Asserts that [world] contains a setter with the given qualified name.
-   */
-  void assertHasSetter(String qualifiedName) {
-    expect(setters, contains(qualifiedName));
-  }
-
-  /**
-   * Asserts that [world] instantiates a class with the given name.
-   */
-  void assertHasInstantiatedClass(String name) {
-    expect(instantiatedClasses, contains(name));
-  }
-
-  /**
-   * Asserts that [world] contains a method with the given qualified name.
-   *
-   * [qualifiedName] - the qualified name in form 'className.methodName'.
-   */
-  void assertHasMethod(String qualifiedName) {
-    expect(methods, contains(qualifiedName));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a field with the given qualified
-   * name.
-   */
-  void assertNoField(String qualifiedName) {
-    expect(fields, isNot(contains(qualifiedName)));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a top level variable with the given
-   * name.
-   */
-  void assertNoVariable(String name) {
-    expect(variables, isNot(contains(name)));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a top-level function with the given
-   * name.
-   */
-  void assertNoFunction(String name) {
-    expect(functions, isNot(contains(name)));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a getter with the given qualified
-   * name.
-   */
-  void assertNoGetter(String qualifiedName) {
-    expect(getters, isNot(contains(qualifiedName)));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a setter with the given qualified
-   * name.
-   */
-  void assertNoSetter(String qualifiedName) {
-    expect(setters, isNot(contains(qualifiedName)));
-  }
-
-  /**
-   * Asserts that [world] doesn't instantiate a class with the given name.
-   */
-  void assertNoInstantiatedClass(String name) {
-    expect(instantiatedClasses, isNot(contains(name)));
-  }
-
-  /**
-   * Asserts that [world] doesn't contain a method with the given qualified
-   * name.
-   *
-   * [qualifiedName] - the qualified name in form 'className.methodName'.
-   */
-  void assertNoMethod(String qualifiedName) {
-    expect(methods, isNot(contains(qualifiedName)));
-  }
-}
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 6c4fbcd..12b39df 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
+import 'package:analyzer_cli/src/incremental_analyzer.dart';
 import 'package:analyzer_cli/src/options.dart';
 import 'package:path/path.dart' as pathos;
 
@@ -38,6 +39,8 @@
 
   final AnalysisContext context;
 
+  final IncrementalAnalysisSession incrementalSession;
+
   /// Accumulated analysis statistics.
   final AnalysisStats stats;
 
@@ -60,8 +63,8 @@
   /// specified the "--package-warnings" option.
   String _selfPackageName;
 
-  AnalyzerImpl(this.context, this.librarySource, this.options, this.stats,
-      this.startTime);
+  AnalyzerImpl(this.context, this.incrementalSession, this.librarySource,
+      this.options, this.stats, this.startTime);
 
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
   ErrorSeverity get maxErrorSeverity {
@@ -135,6 +138,7 @@
     var units = new Set<CompilationUnitElement>();
     var libraries = new Set<LibraryElement>();
     addLibrarySources(library, libraries, units);
+    incrementalSession?.setAnalyzedSources(sources);
   }
 
   /// Setup local fields such as the analysis context for analysis.
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 4d80c61..b776d51 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -37,6 +37,7 @@
 import 'package:analyzer_cli/src/analyzer_impl.dart';
 import 'package:analyzer_cli/src/build_mode.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
+import 'package:analyzer_cli/src/incremental_analyzer.dart';
 import 'package:analyzer_cli/src/options.dart';
 import 'package:analyzer_cli/src/perf_report.dart';
 import 'package:analyzer_cli/starter.dart';
@@ -86,6 +87,8 @@
   /// creation.
   CommandLineOptions _previousOptions;
 
+  IncrementalAnalysisSession incrementalSession;
+
   @override
   EmbeddedResolverProvider embeddedUriResolverProvider;
 
@@ -217,6 +220,8 @@
       libUris.add(source.uri);
     }
 
+    incrementalSession?.finish();
+
     // Check that each part has a corresponding source in the input list.
     for (Source part in parts) {
       bool found = false;
@@ -297,6 +302,9 @@
     if (options.enableSuperMixins != _previousOptions.enableSuperMixins) {
       return false;
     }
+    if (options.incrementalCachePath != _previousOptions.incrementalCachePath) {
+      return false;
+    }
     return true;
   }
 
@@ -510,6 +518,8 @@
         _chooseUriResolutionPolicy(options, embedderMap, packageInfo);
 
     _context.sourceFactory = sourceFactory;
+
+    incrementalSession = configureIncrementalAnalysis(options, context);
   }
 
   /// Return discovered packagespec, or `null` if none is found.
@@ -618,7 +628,7 @@
   ErrorSeverity _runAnalyzer(Source source, CommandLineOptions options) {
     int startTime = currentTimeMillis();
     AnalyzerImpl analyzer =
-        new AnalyzerImpl(_context, source, options, stats, startTime);
+        new AnalyzerImpl(_context, incrementalSession, source, options, stats, startTime);
     var errorSeverity = analyzer.analyzeSync();
     if (errorSeverity == ErrorSeverity.ERROR) {
       exitCode = errorSeverity.ordinal;
diff --git a/pkg/analyzer_cli/lib/src/incremental_analyzer.dart b/pkg/analyzer_cli/lib/src/incremental_analyzer.dart
new file mode 100644
index 0000000..f9d8d4c
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/incremental_analyzer.dart
@@ -0,0 +1,223 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer_cli.src.incremental_analyzer;
+
+import 'dart:io' as io;
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/incremental_cache.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:analyzer_cli/src/options.dart';
+
+/**
+ * If the given [options] enables incremental analysis and [context] and Dart
+ * SDK implementations support incremental analysis, configure it for the
+ * given [context] and return the handle to work with it.
+ */
+IncrementalAnalysisSession configureIncrementalAnalysis(
+    CommandLineOptions options, AnalysisContext context) {
+  String cachePath = options.incrementalCachePath;
+  DartSdk sdk = context.sourceFactory.dartSdk;
+  // If supported implementations, configure for incremental analysis.
+  if (cachePath != null &&
+      context is InternalAnalysisContext &&
+      sdk is DirectoryBasedDartSdk) {
+    context.typeProvider = sdk.context.typeProvider;
+    // Set the result provide from the cache.
+    CacheStorage storage = new FolderCacheStorage(
+        PhysicalResourceProvider.INSTANCE.getFolder(cachePath),
+        '${io.pid}.temp');
+    List<int> configSalt = <int>[
+      context.analysisOptions.encodeCrossContextOptions()
+    ];
+    IncrementalCache cache = new IncrementalCache(storage, context, configSalt);
+    context.resultProvider = new _CacheBasedResultProvider(context, cache);
+    // Listen for new libraries to put into the cache.
+    _IncrementalAnalysisSession session =
+        new _IncrementalAnalysisSession(options, context, cache);
+    context
+        .onResultChanged(LIBRARY_ELEMENT1)
+        .listen((ResultChangedEvent event) {
+      if (event.wasComputed) {
+        session.newLibrarySources.add(event.target.source);
+      }
+    });
+    return session;
+  }
+  // Incremental analysis cannot be used.
+  return null;
+}
+
+/**
+ * Interface that is exposed to the clients of incremental analysis.
+ */
+abstract class IncrementalAnalysisSession {
+  /**
+   * Finish tasks required after incremental analysis - save results into the
+   * cache, evict old results, etc.
+   */
+  void finish();
+
+  /**
+   * Sets the set of [Source]s analyzed in the context, both explicit and
+   * implicit, for which errors might be requested.  This set is used to compute
+   * containing libraries for every source in the context.
+   */
+  void setAnalyzedSources(Iterable<Source> sources);
+}
+
+/**
+ * The [ResultProvider] that provides results from [IncrementalCache].
+ */
+class _CacheBasedResultProvider extends ResynthesizerResultProvider {
+  final IncrementalCache cache;
+
+  final Set<Source> sourcesWithSummaries = new Set<Source>();
+  final Set<Source> sourcesWithoutSummaries = new Set<Source>();
+  final Set<String> addedLibraryBundleIds = new Set<String>();
+
+  _CacheBasedResultProvider(InternalAnalysisContext context, this.cache)
+      : super(context, new SummaryDataStore(<String>[])) {
+    AnalysisContext sdkContext = context.sourceFactory.dartSdk.context;
+    createResynthesizer(sdkContext, sdkContext.typeProvider);
+  }
+
+  @override
+  bool compute(CacheEntry entry, ResultDescriptor result) {
+    AnalysisTarget target = entry.target;
+    // Source based results.
+    if (target is Source) {
+      if (result == SOURCE_KIND) {
+        SourceKind kind = cache.getSourceKind(target);
+        if (kind != null) {
+          entry.setValue(result, kind, TargetedResult.EMPTY_LIST);
+          return true;
+        } else {
+          return false;
+        }
+      }
+      if (result == INCLUDED_PARTS) {
+        List<Source> parts = cache.getLibraryParts(target);
+        if (parts != null) {
+          entry.setValue(result, parts, TargetedResult.EMPTY_LIST);
+          return true;
+        } else {
+          return false;
+        }
+      }
+      if (result == DART_ERRORS) {
+        List<Source> librarySources = context.getLibrariesContaining(target);
+        List<List<AnalysisError>> errorList = <List<AnalysisError>>[];
+        for (Source librarySource in librarySources) {
+          List<AnalysisError> errors =
+              cache.getSourceErrorsInLibrary(librarySource, target);
+          if (errors == null) {
+            return false;
+          }
+          errorList.add(errors);
+        }
+        List<AnalysisError> mergedErrors = AnalysisError.mergeLists(errorList);
+        // Filter the errors.
+        IgnoreInfo ignoreInfo = context.getResult(target, IGNORE_INFO);
+        LineInfo lineInfo = context.getResult(target, LINE_INFO);
+        List<AnalysisError> filteredErrors =
+            DartErrorsTask.filterIgnored(mergedErrors, ignoreInfo, lineInfo);
+        // Set the result.
+        entry.setValue(result, filteredErrors, TargetedResult.EMPTY_LIST);
+        return true;
+      }
+    }
+    return super.compute(entry, result);
+  }
+
+  @override
+  bool hasResultsForSource(Source source) {
+    // Check cache states.
+    if (sourcesWithSummaries.contains(source)) {
+      return true;
+    }
+    if (sourcesWithoutSummaries.contains(source)) {
+      return false;
+    }
+    // Try to load bundles.
+    List<LibraryBundleWithId> bundles = cache.getLibraryClosureBundles(source);
+    if (bundles == null) {
+      sourcesWithoutSummaries.add(source);
+      return false;
+    }
+    // Fill the resynthesizer.
+    sourcesWithSummaries.add(source);
+    for (LibraryBundleWithId bundleWithId in bundles) {
+      if (addedLibraryBundleIds.add(bundleWithId.id)) {
+        addBundle(null, bundleWithId.bundle);
+      }
+    }
+    return true;
+  }
+}
+
+class _IncrementalAnalysisSession implements IncrementalAnalysisSession {
+  final CommandLineOptions commandLineOptions;
+  final AnalysisContext context;
+  final IncrementalCache cache;
+
+  final Set<Source> newLibrarySources = new Set<Source>();
+
+  _IncrementalAnalysisSession(
+      this.commandLineOptions, this.context, this.cache);
+
+  @override
+  void finish() {
+    // Finish computing new libraries and put them into the cache.
+    for (Source librarySource in newLibrarySources) {
+      if (!commandLineOptions.machineFormat) {
+        print('Compute library element for $librarySource');
+      }
+      _putLibrary(librarySource);
+    }
+  }
+
+  @override
+  void setAnalyzedSources(Iterable<Source> sources) {
+    for (Source source in sources) {
+      SourceKind kind = context.computeKindOf(source);
+      if (kind == SourceKind.LIBRARY) {
+        context.computeResult(source, LINE_INFO);
+        context.computeResult(source, IGNORE_INFO);
+        context.computeResult(source, INCLUDED_PARTS);
+      }
+    }
+  }
+
+  void _putLibrary(Source librarySource) {
+    LibraryElement libraryElement =
+        context.computeResult(librarySource, LIBRARY_ELEMENT);
+    try {
+      cache.putLibrary(libraryElement);
+    } catch (e) {
+      return;
+    }
+    // Write errors for the library units.
+    for (CompilationUnitElement unit in libraryElement.units) {
+      Source unitSource = unit.source;
+      List<AnalysisError> errors = context.computeResult(
+          new LibrarySpecificUnit(librarySource, unitSource),
+          LIBRARY_UNIT_ERRORS);
+      cache.putSourceErrorsInLibrary(librarySource, unitSource, errors);
+    }
+  }
+}
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 5a2e939..4cd4c6c 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -112,6 +112,9 @@
   /// Whether to use machine format for error display
   final bool machineFormat;
 
+  /// The path to the root folder of the incremental cache.
+  final String incrementalCachePath;
+
   /// The path to the package root
   final String packageRootPath;
 
@@ -176,6 +179,7 @@
         lints = args['lints'],
         log = args['log'],
         machineFormat = args['machine'] || args['format'] == 'machine',
+        incrementalCachePath = args['incremental-cache-path'],
         packageConfigPath = args['packages'],
         packageRootPath = args['package-root'],
         perfReport = args['x-perf-report'],
@@ -351,6 +355,13 @@
           allowMultiple: true,
           splitCommas: false)
       //
+      // Incremental analysis.
+      //
+      ..addOption('incremental-cache-path',
+          help: 'The path to the folder with information to support '
+              'incremental analysis, e.g. summary files, errors, etc.',
+          hide: true)
+      //
       // Build mode.
       //
       ..addFlag('persistent_worker',
diff --git a/pkg/compiler/bin/resolver.dart b/pkg/compiler/bin/resolver.dart
new file mode 100644
index 0000000..aa70e4d
--- /dev/null
+++ b/pkg/compiler/bin/resolver.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:compiler/src/apiimpl.dart';
+import 'package:compiler/src/dart2js.dart';
+import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/null_compiler_output.dart';
+import 'package:compiler/src/source_file_provider.dart';
+import 'package:compiler/src/options.dart';
+import 'package:compiler/src/serialization/json_serializer.dart';
+import 'package:package_config/discovery.dart';
+
+main(var argv) async {
+  var parser = new ArgParser();
+  parser.addOption('deps', abbr: 'd', allowMultiple: true);
+  parser.addOption('out', abbr: 'o');
+  parser.addOption('library-root', abbr: 'l');
+  var args = parser.parse(argv);
+
+  var resolutionInputs = args['deps']
+      .map((uri) => currentDirectory.resolve(nativeToUriPath(uri)))
+      .toList();
+  var root = args['library-root'];
+  var libraryRoot = root == null
+      ? Platform.script.resolve('../../../sdk/')
+      : currentDirectory.resolve(nativeToUriPath(root));
+  var options = new CompilerOptions(
+      libraryRoot: libraryRoot,
+      resolveOnly: true,
+      resolutionInputs: resolutionInputs,
+      packagesDiscoveryProvider: findPackages);
+  var inputProvider = new CompilerSourceFileProvider();
+  var outputProvider = const NullCompilerOutput();
+  var diagnostics = new FormattingDiagnosticHandler(inputProvider);
+
+  var compiler =
+      new CompilerImpl(inputProvider, outputProvider, diagnostics, options);
+
+  var inputs = args.rest
+      .map((uri) => currentDirectory.resolve(nativeToUriPath(uri)))
+      .toList();
+
+  await compiler.setupSdk();
+  await compiler.setupPackages(inputs.first);
+
+  for (var library in inputs) {
+    await compiler.libraryLoader.loadLibrary(library);
+  }
+
+  for (var library in inputs) {
+    compiler.fullyEnqueueLibrary(compiler.libraryLoader.lookupLibrary(library),
+        compiler.enqueuer.resolution);
+  }
+
+  compiler.processQueue(compiler.enqueuer.resolution, null);
+
+  var librariesToSerialize =
+      inputs.map((lib) => compiler.libraryLoader.lookupLibrary(lib)).toList();
+
+  var serializer =
+      compiler.serialization.createSerializer(librariesToSerialize);
+  var text = serializer.toText(const JsonSerializationEncoder());
+
+  var outFile = args['out'] ?? 'out.data';
+
+  await new File(outFile).writeAsString(text);
+}
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 013e997..bf08051 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -65,6 +65,7 @@
   // account).
   static const String genericMethodSyntax = '--generic-method-syntax';
   static const String resolveOnly = '--resolve-only';
+  static const String initializingFormalAccess = '--initializing-formal-access';
 }
 
 class Option {
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 9860b08..8a26860 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -251,4 +251,6 @@
     registry = new CodegenRegistry(compiler, element);
     return compiler.codegen(this, world);
   }
+
+  String toString() => 'CodegenWorkItem(${resolvedAst.element})';
 }
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 7380911..97b5b2d 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -257,6 +257,9 @@
   /// Computes the [WorldImpact] for [element].
   WorldImpact computeWorldImpact(Element element);
 
+  WorldImpact transformResolutionImpact(
+      Element element, ResolutionImpact resolutionImpact);
+
   /// Removes the [WorldImpact] for [element] from the resolution cache. Later
   /// calls to [getWorldImpact] or [computeWorldImpact] returns an empty impact.
   void uncacheWorldImpact(Element element);
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 9bab3a5..bbabcf9 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -104,6 +104,9 @@
 
   /// Returns the compile-time constant value of [metadata].
   ConstantValue getConstantValueForMetadata(MetadataAnnotation metadata);
+
+  /// Register that [element] needs lazy initialization.
+  void registerLazyStatic(FieldElement element);
 }
 
 /// Interface for the task that compiles the constant environments for the
@@ -142,6 +145,8 @@
    *
    * Invariant: The keys in this map are declarations.
    */
+  // TODO(johnniwinther): Make this purely internal when no longer used by
+  // poi/forget_element_test.
   final Map<VariableElement, ConstantExpression> initialVariableValues =
       new Map<VariableElement, ConstantExpression>();
 
@@ -922,10 +927,7 @@
       assert(normalizedArguments != null);
       concreteArguments = normalizedArguments;
     }
-
-    if (constructor == compiler.intEnvironment ||
-        constructor == compiler.boolEnvironment ||
-        constructor == compiler.stringEnvironment) {
+    if (constructor.isFromEnvironmentConstructor) {
       return createFromEnvironmentConstant(node, constructedType, constructor,
           callStructure, normalizedArguments, concreteArguments);
     } else {
@@ -969,7 +971,7 @@
       return null;
     }
 
-    if (constructor == compiler.intEnvironment &&
+    if (constructor.isIntFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isInt)) {
       DartType type = defaultValue.getType(coreTypes);
       reporter.reportErrorMessage(
@@ -979,7 +981,7 @@
       return null;
     }
 
-    if (constructor == compiler.boolEnvironment &&
+    if (constructor.isBoolFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isBool)) {
       DartType type = defaultValue.getType(coreTypes);
       reporter.reportErrorMessage(
@@ -989,7 +991,7 @@
       return null;
     }
 
-    if (constructor == compiler.stringEnvironment &&
+    if (constructor.isStringFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isString)) {
       DartType type = defaultValue.getType(coreTypes);
       reporter.reportErrorMessage(
@@ -1009,13 +1011,13 @@
       if (concreteArguments.length > 1) {
         defaultValue = concreteArguments[1].expression;
       }
-      if (constructor == compiler.intEnvironment) {
+      if (constructor.isIntFromEnvironmentConstructor) {
         expression =
             new IntFromEnvironmentConstantExpression(name, defaultValue);
-      } else if (constructor == compiler.boolEnvironment) {
+      } else if (constructor.isBoolFromEnvironmentConstructor) {
         expression =
             new BoolFromEnvironmentConstantExpression(name, defaultValue);
-      } else if (constructor == compiler.stringEnvironment) {
+      } else if (constructor.isStringFromEnvironmentConstructor) {
         expression =
             new StringFromEnvironmentConstantExpression(name, defaultValue);
       }
@@ -1025,11 +1027,11 @@
 
     if (value == null) {
       return createEvaluatedConstant(defaultValue);
-    } else if (constructor == compiler.intEnvironment) {
+    } else if (constructor.isIntFromEnvironmentConstructor) {
       int number = int.parse(value, onError: (_) => null);
       return createEvaluatedConstant(
           (number == null) ? defaultValue : constantSystem.createInt(number));
-    } else if (constructor == compiler.boolEnvironment) {
+    } else if (constructor.isBoolFromEnvironmentConstructor) {
       if (value == 'true') {
         return createEvaluatedConstant(constantSystem.createBool(true));
       } else if (value == 'false') {
@@ -1038,7 +1040,7 @@
         return createEvaluatedConstant(defaultValue);
       }
     } else {
-      assert(constructor == compiler.stringEnvironment);
+      assert(constructor.isStringFromEnvironmentConstructor);
       return createEvaluatedConstant(
           constantSystem.createString(new DartString.literal(value)));
     }
@@ -1182,6 +1184,9 @@
       if (parameter.isInitializingFormal) {
         InitializingFormalElement initializingFormal = parameter;
         updateFieldValue(node, initializingFormal.fieldElement, argument);
+        if (compiler.options.enableInitializingFormalAccess) {
+          definitions[parameter] = argument;
+        }
       } else {
         potentiallyCheckType(parameter, argument);
         definitions[parameter] = argument;
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 7f7a37f..234c7e1 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -209,15 +209,6 @@
   Element loadLibraryFunction;
   Element functionApplyMethod;
 
-  /// The [int.fromEnvironment] constructor.
-  ConstructorElement intEnvironment;
-
-  /// The [bool.fromEnvironment] constructor.
-  ConstructorElement boolEnvironment;
-
-  /// The [String.fromEnvironment] constructor.
-  ConstructorElement stringEnvironment;
-
   // TODO(zarah): Remove this map and incorporate compile-time errors
   // in the model.
   /// Tracks elements with compile-time errors.
@@ -623,12 +614,6 @@
       mirrorSystemGetNameFunction = cls.lookupLocalMember('getName');
     } else if (mirrorsUsedClass == cls) {
       mirrorsUsedConstructor = cls.constructors.head;
-    } else if (coreClasses.intClass == cls) {
-      intEnvironment = cls.lookupConstructor(Identifiers.fromEnvironment);
-    } else if (coreClasses.stringClass == cls) {
-      stringEnvironment = cls.lookupConstructor(Identifiers.fromEnvironment);
-    } else if (coreClasses.boolClass == cls) {
-      boolEnvironment = cls.lookupConstructor(Identifiers.fromEnvironment);
     }
   }
 
@@ -2022,13 +2007,20 @@
         // Only analyze nodes with a corresponding [TreeElements].
         compiler.checker.check(element);
       }
-      WorldImpact worldImpact = compiler.backend.impactTransformer
-          .transformResolutionImpact(resolutionImpact);
-      return worldImpact;
+      return transformResolutionImpact(element, resolutionImpact);
     });
   }
 
   @override
+  WorldImpact transformResolutionImpact(
+      Element element, ResolutionImpact resolutionImpact) {
+    WorldImpact worldImpact = compiler.backend.impactTransformer
+        .transformResolutionImpact(resolutionImpact);
+    _worldImpactCache[element] = worldImpact;
+    return worldImpact;
+  }
+
+  @override
   void uncacheWorldImpact(Element element) {
     assert(invariant(element, element.isDeclaration,
         message: "Element $element must be the declaration."));
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 3b4317f..2deb866 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -549,7 +549,7 @@
 
   @override
   void _createStructuredText(StringBuffer sb) {
-    sb.write('Constructored(type=$type,constructor=$target,'
+    sb.write('Constructed(type=$type,constructor=$target,'
         'callStructure=$callStructure,arguments=[');
     String delimiter = '';
     for (ConstantExpression value in arguments) {
@@ -561,6 +561,8 @@
   }
 
   Map<FieldElement, ConstantExpression> computeInstanceFields() {
+    assert(invariant(target, target.constantConstructor != null,
+        message: "No constant constructor computed for $target."));
     return target.constantConstructor
         .computeInstanceFields(arguments, callStructure);
   }
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 64bb70a..7d19ec0 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -338,6 +338,7 @@
     new OptionHandler(Flags.allowMockCompilation, passThrough),
     new OptionHandler(Flags.fastStartup, passThrough),
     new OptionHandler(Flags.genericMethodSyntax, passThrough),
+    new OptionHandler(Flags.initializingFormalAccess, passThrough),
     new OptionHandler('${Flags.minify}|-m', implyCompilation),
     new OptionHandler(Flags.preserveUris, passThrough),
     new OptionHandler('--force-strip=.*', setStrip),
diff --git a/pkg/compiler/lib/src/dart_backend/backend.dart b/pkg/compiler/lib/src/dart_backend/backend.dart
index 9a1162e..371eed6 100644
--- a/pkg/compiler/lib/src/dart_backend/backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend.dart
@@ -540,4 +540,9 @@
     constantCompiler.constantValueMap
         .addAll(task.constantCompiler.constantValueMap);
   }
+
+  @override
+  void registerLazyStatic(FieldElement element) {
+    // Do nothing.
+  }
 }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 18e85ad..0f4f8d7 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -349,6 +349,13 @@
         // See dartbug.com/26406 for context.
         treeElements
             .forEachConstantNode((Node node, ConstantExpression expression) {
+          if (compiler.serialization.isDeserialized(analyzableElement)) {
+            if (!expression.isImplicit && !expression.isPotential) {
+              // Enforce evaluation of [expression].
+              backend.constants.getConstantValue(expression);
+            }
+          }
+
           // Explicitly depend on the backend constants.
           if (backend.constants.hasConstantValue(expression)) {
             ConstantValue value =
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index ad689fd..8ddc535 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -665,6 +665,7 @@
       MessageKind.DUPLICATE_DEFINITION: const MessageTemplate(
           MessageKind.DUPLICATE_DEFINITION,
           "Duplicate definition of '#{name}'.",
+          options: const ["--initializing-formal-access"],
           howToFix: "Try to rename or remove this definition.",
           examples: const [
             """
@@ -676,7 +677,16 @@
 main() {
   new C();
 }
+""",
+            """
+class C {
+  int x;
+  C(this.x, int x);
+}
 
+main() {
+  new C(4, 2);
+}
 """
           ]),
 
diff --git a/pkg/compiler/lib/src/elements/common.dart b/pkg/compiler/lib/src/elements/common.dart
index 6c9a013..0020393 100644
--- a/pkg/compiler/lib/src/elements/common.dart
+++ b/pkg/compiler/lib/src/elements/common.dart
@@ -6,7 +6,7 @@
 
 library elements.common;
 
-import '../common/names.dart' show Names, Uris;
+import '../common/names.dart' show Identifiers, Names, Uris;
 import '../core_types.dart' show CoreClasses;
 import '../dart_types.dart' show DartType, InterfaceType, FunctionType;
 import '../util/util.dart' show Link;
@@ -594,3 +594,48 @@
     });
   }
 }
+
+abstract class AbstractFieldElementCommon implements AbstractFieldElement {
+  @override
+  bool get isInstanceMember {
+    return isClassMember && !isStatic;
+  }
+
+  @override
+  bool get isAbstract {
+    return getter != null && getter.isAbstract ||
+        setter != null && setter.isAbstract;
+  }
+}
+
+abstract class ConstructorElementCommon implements ConstructorElement {
+  @override
+  bool get isFromEnvironmentConstructor {
+    return name == Identifiers.fromEnvironment &&
+        library.isDartCore &&
+        (enclosingClass.name == 'bool' ||
+            enclosingClass.name == 'int' ||
+            enclosingClass.name == 'String');
+  }
+
+  @override
+  bool get isIntFromEnvironmentConstructor {
+    return name == Identifiers.fromEnvironment &&
+        library.isDartCore &&
+        enclosingClass.name == 'int';
+  }
+
+  @override
+  bool get isBoolFromEnvironmentConstructor {
+    return name == Identifiers.fromEnvironment &&
+        library.isDartCore &&
+        enclosingClass.name == 'bool';
+  }
+
+  @override
+  bool get isStringFromEnvironmentConstructor {
+    return name == Identifiers.fromEnvironment &&
+        library.isDartCore &&
+        enclosingClass.name == 'String';
+  }
+}
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index dc708d0..e5338de 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -1067,7 +1067,7 @@
 ///
 /// Normal parameter that introduce a local variable are modeled by
 /// [LocalParameterElement] whereas initializing formals, that is parameter of
-/// the form `this.x`, are modeled by [InitializingFormalParameter].
+/// the form `this.x`, are modeled by [InitializingFormalElement].
 abstract class ParameterElement extends Element
     implements VariableElement, FormalElement, LocalElement {
   /// Use [functionDeclaration] instead.
@@ -1092,7 +1092,7 @@
 /// A formal parameter in a constructor that directly initializes a field.
 ///
 /// For example: `A(this.field)`.
-abstract class InitializingFormalElement extends ParameterElement {
+abstract class InitializingFormalElement extends LocalParameterElement {
   /// The field initialized by this initializing formal.
   FieldElement get fieldElement;
 
@@ -1324,6 +1324,15 @@
   /// `int.fromEnvironment`, or `String.fromEnvironment`.
   bool get isFromEnvironmentConstructor;
 
+  /// `true` if this constructor is `int.fromEnvironment`.
+  bool get isIntFromEnvironmentConstructor;
+
+  /// `true` if this constructor is `bool.fromEnvironment`.
+  bool get isBoolFromEnvironmentConstructor;
+
+  /// `true` if this constructor is `String.fromEnvironment`.
+  bool get isStringFromEnvironmentConstructor;
+
   /// Use [enclosingClass] instead.
   @deprecated
   get enclosingElement;
@@ -1490,6 +1499,8 @@
 
   Element lookupSuperMemberInLibrary(String memberName, LibraryElement library);
 
+  // TODO(johnniwinther): Clean up semantics. Can the default constructor take
+  // optional arguments? Must it be resolved?
   ConstructorElement lookupDefaultConstructor();
   ConstructorElement lookupConstructor(String name);
 
@@ -1526,6 +1537,10 @@
 abstract class MixinApplicationElement extends ClassElement {
   ClassElement get mixin;
   InterfaceType get mixinType;
+
+  /// If this is an unnamed mixin application [subclass] is the subclass for
+  /// which this mixin application is created.
+  ClassElement get subclass;
 }
 
 /// Enum declaration.
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index 2381d64..e1fd271 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -206,7 +206,9 @@
   }
 }
 
-class ErroneousElementX extends ElementX implements ErroneousElement {
+class ErroneousElementX extends ElementX
+    with ConstructorElementCommon
+    implements ErroneousElement {
   final MessageKind messageKind;
   final Map messageArguments;
 
@@ -284,9 +286,6 @@
   }
 
   @override
-  bool get isFromEnvironmentConstructor => false;
-
-  @override
   List<DartType> get typeVariables => unsupported();
 }
 
@@ -1820,7 +1819,11 @@
 
   MemberElement get memberContext => enclosingElement;
 
-  bool get isLocal => false;
+  @override
+  bool get isFinal => true;
+
+  @override
+  bool get isLocal => true;
 }
 
 class ErroneousInitializingFormalElementX extends ParameterElementX
@@ -1845,7 +1848,9 @@
   DynamicType get type => const DynamicType();
 }
 
-class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
+class AbstractFieldElementX extends ElementX
+    with AbstractFieldElementCommon
+    implements AbstractFieldElement {
   GetterElementX getter;
   SetterElementX setter;
 
@@ -1888,18 +1893,9 @@
     }
   }
 
-  bool get isInstanceMember {
-    return isClassMember && !isStatic;
-  }
-
   accept(ElementVisitor visitor, arg) {
     return visitor.visitAbstractFieldElement(this, arg);
   }
-
-  bool get isAbstract {
-    return getter != null && getter.isAbstract ||
-        setter != null && setter.isAbstract;
-  }
 }
 
 // TODO(johnniwinther): [FunctionSignature] should be merged with
@@ -2170,21 +2166,13 @@
     }
   }
 
-  bool get isFromEnvironmentConstructor {
-    return name == 'fromEnvironment' &&
-        library.isDartCore &&
-        (enclosingClass.name == 'bool' ||
-            enclosingClass.name == 'int' ||
-            enclosingClass.name == 'String');
-  }
-
   /// Returns the empty list of type variables by default.
   @override
   List<DartType> get typeVariables => functionSignature.typeVariables;
 }
 
 abstract class ConstructorElementX extends FunctionElementX
-    with ConstantConstructorMixin
+    with ConstantConstructorMixin, ConstructorElementCommon
     implements ConstructorElement {
   bool isRedirectingGenerative = false;
 
@@ -2995,7 +2983,6 @@
   ClassElement get mixin => mixinType != null ? mixinType.element : null;
 
   bool get isMixinApplication => true;
-  bool get isUnnamedMixinApplication => node is! NamedMixinApplication;
   bool get hasConstructor => !constructors.isEmpty;
   bool get hasLocalScopeMembers => !constructors.isEmpty;
 
@@ -3053,14 +3040,20 @@
   Modifiers get modifiers => node.modifiers;
 
   DeclarationSite get declarationSite => this;
+
+  ClassElement get subclass => null;
 }
 
 class UnnamedMixinApplicationElementX extends MixinApplicationElementX {
   final Node node;
+  final ClassElement subclass;
 
   UnnamedMixinApplicationElementX(
-      String name, CompilationUnitElement enclosing, int id, this.node)
-      : super(name, enclosing, id);
+      String name, ClassElement subclass, int id, this.node)
+      : this.subclass = subclass,
+        super(name, subclass.compilationUnit, id);
+
+  bool get isUnnamedMixinApplication => true;
 
   bool get isAbstract => true;
 }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 2bc3670..ea9e893 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -494,15 +494,18 @@
     }
 
     Compiler compiler = inferrer.compiler;
-    if (element.declaration == compiler.intEnvironment) {
-      giveUp(inferrer);
-      return compiler.typesTask.intType.nullable();
-    } else if (element.declaration == compiler.boolEnvironment) {
-      giveUp(inferrer);
-      return compiler.typesTask.boolType.nullable();
-    } else if (element.declaration == compiler.stringEnvironment) {
-      giveUp(inferrer);
-      return compiler.typesTask.stringType.nullable();
+    if (element.isConstructor) {
+      ConstructorElement constructor = element;
+      if (constructor.isIntFromEnvironmentConstructor) {
+        giveUp(inferrer);
+        return compiler.typesTask.intType.nullable();
+      } else if (constructor.isBoolFromEnvironmentConstructor) {
+        giveUp(inferrer);
+        return compiler.typesTask.boolType.nullable();
+      } else if (constructor.isStringFromEnvironmentConstructor) {
+        giveUp(inferrer);
+        return compiler.typesTask.stringType.nullable();
+      }
     }
     return null;
   }
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index da3efb5..6077e6d 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -132,28 +132,18 @@
         element, definitions,
         isConst: isConst, checkType: checkType);
     if (!isConst && value == null) {
-      lazyStatics.add(element);
+      registerLazyStatic(element);
     }
     return value;
   }
 
-  void addCompileTimeConstantForEmission(ConstantValue constant) {
-    compiledConstants.add(constant);
+  @override
+  void registerLazyStatic(FieldElement element) {
+    lazyStatics.add(element);
   }
 
-  /**
-   * Returns an [Iterable] of static non final fields that need to be
-   * initialized. The fields list must be evaluated in order since they might
-   * depend on each other.
-   */
-  Iterable<VariableElement> getStaticNonFinalFieldsForEmission() {
-    return initialVariableValues.keys.where((element) {
-      return element.kind == ElementKind.FIELD &&
-          !element.isInstanceMember &&
-          !element.modifiers.isFinal &&
-          // The const fields are all either emitted elsewhere or inlined.
-          !element.modifiers.isConst;
-    });
+  void addCompileTimeConstantForEmission(ConstantValue constant) {
+    compiledConstants.add(constant);
   }
 
   List<VariableElement> getLazilyInitializedFieldsForEmission() {
@@ -189,15 +179,6 @@
     return result;
   }
 
-  ConstantValue getInitialValueFor(VariableElement element) {
-    ConstantExpression initialValue =
-        initialVariableValues[element.declaration];
-    if (initialValue == null) {
-      reporter.internalError(element, "No initial value for given element.");
-    }
-    return getConstantValue(initialValue);
-  }
-
   ConstantExpression compileNode(Node node, TreeElements elements,
       {bool enforceConst: true}) {
     return compileNodeWithDefinitions(node, elements, isConst: enforceConst);
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index f3d2b4c..410d1c8 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -349,11 +349,12 @@
   @override
   ConstantValue createSymbol(Compiler compiler, String text) {
     // TODO(johnniwinther): Create a backend agnostic value.
-    InterfaceType type = compiler.coreTypes.symbolType;
+    JavaScriptBackend backend = compiler.backend;
+    ClassElement symbolClass = backend.helpers.symbolImplementationClass;
+    InterfaceType type = symbolClass.rawType;
     ConstantValue argument = createString(new DartString.literal(text));
     Map<FieldElement, ConstantValue> fields = <FieldElement, ConstantValue>{};
-    JavaScriptBackend backend = compiler.backend;
-    backend.helpers.symbolImplementationClass.forEachInstanceField(
+    symbolClass.forEachInstanceField(
         (ClassElement enclosingClass, FieldElement field) {
       fields[field] = argument;
     });
diff --git a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
index b3b4354..faf8539 100644
--- a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
+++ b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
@@ -9,7 +9,7 @@
  */
 class TypeVariableHandler {
   final Compiler _compiler;
-  FunctionElement _typeVariableConstructor;
+  ConstructorElement _typeVariableConstructor;
 
   /**
    * Set to 'true' on first encounter of a class with type variables.
@@ -77,43 +77,23 @@
     for (TypeVariableType currentTypeVariable in cls.typeVariables) {
       TypeVariableElement typeVariableElement = currentTypeVariable.element;
 
-      AstConstant name = new AstConstant(
-          typeVariableElement,
-          typeVariableElement.node,
-          new StringConstantExpression(currentTypeVariable.name),
-          _backend.constantSystem
-              .createString(new DartString.literal(currentTypeVariable.name)));
       jsAst.Expression boundIndex =
           _metadataCollector.reifyType(typeVariableElement.bound);
       ConstantValue boundValue = new SyntheticConstantValue(
           SyntheticConstantKind.TYPEVARIABLE_REFERENCE, boundIndex);
       ConstantExpression boundExpression =
           new SyntheticConstantExpression(boundValue);
-      AstConstant bound = new AstConstant(typeVariableElement,
-          typeVariableElement.node, boundExpression, boundValue);
-      AstConstant type = new AstConstant(
-          typeVariableElement,
-          typeVariableElement.node,
-          new TypeConstantExpression(cls.rawType),
-          _backend.constantSystem.createType(_backend.compiler, cls.rawType));
-      List<AstConstant> arguments = [type, name, bound];
+      ConstantExpression constant = new ConstructedConstantExpression(
+          _typeVariableConstructor.enclosingClass.thisType,
+          _typeVariableConstructor,
+          const CallStructure.unnamed(3), [
+        new TypeConstantExpression(cls.rawType),
+        new StringConstantExpression(currentTypeVariable.name),
+        new SyntheticConstantExpression(boundValue)
+      ]);
 
-      // TODO(johnniwinther): Support a less front-end specific creation of
-      // constructed constants.
-      AstConstant constant =
-          CompileTimeConstantEvaluator.makeConstructedConstant(
-              _compiler,
-              _backend.constants,
-              typeVariableElement,
-              typeVariableElement.node,
-              typeVariableType,
-              _typeVariableConstructor,
-              typeVariableType,
-              _typeVariableConstructor,
-              const CallStructure.unnamed(3),
-              arguments,
-              arguments);
-      ConstantValue value = constant.value;
+      _backend.constants.evaluate(constant);
+      ConstantValue value = _backend.constants.getConstantValue(constant);
       _backend.registerCompileTimeConstant(value, _compiler.globalDependencies);
       _backend.addCompileTimeConstantForEmission(value);
       _backend.constants.addCompileTimeConstantForEmission(value);
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 0e02c6c..5bd1cb1 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -614,9 +614,9 @@
     // If the outputUnit does not contain any static non-final fields, then
     // [fields] is `null`.
     if (fields != null) {
-      for (Element element in fields) {
+      for (FieldElement element in fields) {
         reporter.withCurrentElement(element, () {
-          ConstantValue constant = handler.getInitialValueFor(element);
+          ConstantValue constant = handler.getConstantValue(element.constant);
           parts.add(buildInitialization(element, constantReference(constant)));
         });
       }
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 6c76418..a32f462 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -282,18 +282,21 @@
       list.add(element);
     }
 
-    Iterable<VariableElement> staticNonFinalFields = handler
-        .getStaticNonFinalFieldsForEmission()
-        .where(compiler.codegenWorld.allReferencedStaticFields.contains);
+    Iterable<Element> fields = compiler.codegenWorld.allReferencedStaticFields
+        .where((FieldElement field) {
+      if (!field.isConst) {
+        return field.isField &&
+            !field.isInstanceMember &&
+            !field.isFinal &&
+            field.constant != null;
+      } else {
+        // We also need to emit static const fields if they are available for
+        // reflection.
+        return backend.isAccessibleByReflection(field);
+      }
+    });
 
-    Elements.sortedByPosition(staticNonFinalFields).forEach(addToOutputUnit);
-
-    // We also need to emit static const fields if they are available for
-    // reflection.
-    compiler.codegenWorld.allReferencedStaticFields
-        .where((FieldElement field) => field.isConst)
-        .where(backend.isAccessibleByReflection)
-        .forEach(addToOutputUnit);
+    Elements.sortedByPosition(fields).forEach(addToOutputUnit);
   }
 
   void computeNeededLibraries() {
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 b779ef7..1f81f6d 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
@@ -260,9 +260,9 @@
     return staticNonFinalFields.map(_buildStaticField).toList(growable: false);
   }
 
-  StaticField _buildStaticField(Element element) {
+  StaticField _buildStaticField(FieldElement element) {
     JavaScriptConstantCompiler handler = backend.constants;
-    ConstantValue initialValue = handler.getInitialValueFor(element);
+    ConstantValue initialValue = handler.getConstantValue(element.constant);
     // TODO(zarah): The holder should not be registered during building of
     // a static field.
     _registry.registerHolder(namer.globalObjectForConstant(initialValue),
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 3a2e2a3..9da31d6 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -131,7 +131,7 @@
  * point to the 'packages' folder.
  *
  */
-abstract class LibraryLoaderTask implements CompilerTask {
+abstract class LibraryLoaderTask implements LibraryProvider, CompilerTask {
   factory LibraryLoaderTask(
       ResolvedUriTranslator uriTranslator,
       ScriptLoader scriptLoader,
@@ -145,9 +145,6 @@
   /// Returns all libraries that have been loaded.
   Iterable<LibraryElement> get libraries;
 
-  /// Looks up the library with the [canonicalUri].
-  LibraryElement lookupLibrary(Uri canonicalUri);
-
   /// Loads the library specified by the [resolvedUri] and returns its
   /// [LibraryElement].
   ///
@@ -176,6 +173,14 @@
   Future<Null> resetLibraries(ReuseLibrariesFunction reuseLibraries);
 }
 
+/// Interface for an entity that provide libraries. For instance from normal
+/// library loading or from deserialization.
+// TODO(johnniwinther): Use this to integrate deserialized libraries better.
+abstract class LibraryProvider {
+  /// Looks up the library with the [canonicalUri].
+  LibraryElement lookupLibrary(Uri canonicalUri);
+}
+
 /// Handle for creating synthesized/patch libraries during library loading.
 abstract class LibraryLoader {
   /// This method must be called when a new synthesized/patch library has been
@@ -299,9 +304,15 @@
 
   final DiagnosticReporter reporter;
 
-  _LibraryLoaderTask(this.uriTranslator, this.scriptLoader,
-      this.scanner, this.deserializer, this.listener, this.environment,
-      this.reporter, Measurer measurer)
+  _LibraryLoaderTask(
+      this.uriTranslator,
+      this.scriptLoader,
+      this.scanner,
+      this.deserializer,
+      this.listener,
+      this.environment,
+      this.reporter,
+      Measurer measurer)
       : super(measurer);
 
   String get name => 'LibraryLoader';
@@ -1384,8 +1395,6 @@
       suffixChainMap[library] = const <Link<Uri>>[];
       List<Link<Uri>> suffixes = [];
       if (targetUri != canonicalUri) {
-        LibraryDependencyNode node = nodeMap[library];
-
         /// Process the import (or export) of [importedLibrary].
         void processLibrary(LibraryElement importedLibrary) {
           bool suffixesArePrecomputed =
@@ -1416,12 +1425,12 @@
           }
         }
 
-        for (ImportLink import in node.imports.reverse()) {
+        for (ImportElement import in library.imports) {
           processLibrary(import.importedLibrary);
           if (aborted) return;
         }
-        for (LibraryElement exportedLibrary in node.exports.reverse()) {
-          processLibrary(exportedLibrary);
+        for (ExportElement export in library.exports) {
+          processLibrary(export.exportedLibrary);
           if (aborted) return;
         }
       } else {
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index e15f185..f38ccc4 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -520,12 +520,23 @@
             .isSubtype(type, backend.listImplementation.rawType)) {
           backend.registerInstantiatedType(type, world, registry);
         }
+        // TODO(johnniwinther): Improve spec string precision to handle type
+        // arguments and implements relations that preserve generics. Currently
+        // we cannot distinguish between `List`, `List<dynamic>`, and
+        // `List<int>` and take all to mean `List<E>`; in effect not including
+        // any native subclasses of generic classes.
+        // TODO(johnniwinther,sra): Find and replace uses of `List` with the
+        // actual implementation classes such as `JSArray` et al.
+        enqueueUnusedClassesMatching((ClassElement nativeClass) {
+          InterfaceType nativeType = nativeClass.thisType;
+          InterfaceType specType = type.element.thisType;
+          return compiler.types.isSubtype(nativeType, specType);
+        }, cause, 'subtypeof($type)');
+      } else if (type.isDynamic) {
+        enqueueUnusedClassesMatching((_) => true, cause, 'subtypeof($type)');
+      } else {
+        assert(type is VoidType);
       }
-      assert(type is DartType);
-      enqueueUnusedClassesMatching(
-          (nativeClass) => compiler.types.isSubtype(nativeClass.thisType, type),
-          cause,
-          'subtypeof($type)');
     }
 
     // Give an info so that library developers can compile with -v to find why
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index e839a17..2d235c1 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -149,6 +149,10 @@
   /// methods where type arguments are passed.
   final bool enableGenericMethodSyntax;
 
+  /// Support access to initializing formal constructor arguments, e.g., the
+  /// use of `x` to initialize `y` in `C(this.x) : y = x`.
+  final bool enableInitializingFormalAccess;
+
   /// Whether the user specified a flag to allow the use of dart:mirrors. This
   /// silences a warning produced by the compiler.
   final bool enableExperimentalMirrors;
@@ -292,6 +296,8 @@
         enableAssertMessage: _hasOption(options, Flags.enableAssertMessage),
         enableGenericMethodSyntax:
             _hasOption(options, Flags.genericMethodSyntax),
+        enableInitializingFormalAccess:
+            _hasOption(options, Flags.initializingFormalAccess),
         enableExperimentalMirrors:
             _hasOption(options, Flags.enableExperimentalMirrors),
         enableMinification: _hasOption(options, Flags.minify),
@@ -361,6 +367,7 @@
       bool emitJavaScript: true,
       bool enableAssertMessage: false,
       bool enableGenericMethodSyntax: false,
+      bool enableInitializingFormalAccess: false,
       bool enableExperimentalMirrors: false,
       bool enableMinification: false,
       bool enableNativeLiveTypeAnalysis: true,
@@ -434,6 +441,7 @@
         emitJavaScript: emitJavaScript,
         enableAssertMessage: enableAssertMessage,
         enableGenericMethodSyntax: enableGenericMethodSyntax,
+        enableInitializingFormalAccess: enableInitializingFormalAccess,
         enableExperimentalMirrors: enableExperimentalMirrors,
         enableMinification: enableMinification,
         enableNativeLiveTypeAnalysis: enableNativeLiveTypeAnalysis,
@@ -487,6 +495,7 @@
       this.emitJavaScript: true,
       this.enableAssertMessage: false,
       this.enableGenericMethodSyntax: false,
+      this.enableInitializingFormalAccess: false,
       this.enableExperimentalMirrors: false,
       this.enableMinification: false,
       this.enableNativeLiveTypeAnalysis: false,
diff --git a/pkg/compiler/lib/src/parser/partial_parser.dart b/pkg/compiler/lib/src/parser/partial_parser.dart
index 67f320d..514a058 100644
--- a/pkg/compiler/lib/src/parser/partial_parser.dart
+++ b/pkg/compiler/lib/src/parser/partial_parser.dart
@@ -49,7 +49,8 @@
       }
       if (identical(value, '=') ||
           identical(value, '?') ||
-          identical(value, ':')) {
+          identical(value, ':') ||
+          identical(value, '??')) {
         var nextValue = token.next.stringValue;
         if (identical(nextValue, 'const')) {
           token = token.next;
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index e136a14..87c00a8 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -303,11 +303,8 @@
     String superName = supertype.name;
     String mixinName = mixinType.name;
     MixinApplicationElementX mixinApplication =
-        new UnnamedMixinApplicationElementX(
-            "${superName}+${mixinName}",
-            element.compilationUnit,
-            compiler.idGenerator.getNextFreeId(),
-            node);
+        new UnnamedMixinApplicationElementX("${superName}+${mixinName}",
+            element, compiler.idGenerator.getNextFreeId(), node);
     // Create synthetic type variables for the mixin application.
     List<DartType> typeVariables = <DartType>[];
     int index = 0;
diff --git a/pkg/compiler/lib/src/resolution/class_members.dart b/pkg/compiler/lib/src/resolution/class_members.dart
index 6cbbf70..7c28777 100644
--- a/pkg/compiler/lib/src/resolution/class_members.dart
+++ b/pkg/compiler/lib/src/resolution/class_members.dart
@@ -824,8 +824,30 @@
   /// includes `call`.
   Iterable<String> computedMemberNames;
 
+  bool _interfaceMembersAreClassMembers;
+
+  /// Compute value of the [_interfaceMembersAreClassMembers] for this class
+  /// and its superclasses.
+  void _computeInterfaceMembersAreClassMembers(Resolution resolution) {
+    if (_interfaceMembersAreClassMembers == null) {
+      ensureResolved(resolution);
+      ClassMemberMixin superclass = this.superclass;
+      if (superclass != null) {
+        superclass._computeInterfaceMembersAreClassMembers(resolution);
+      }
+      if ((superclass != null &&
+              (!superclass.interfaceMembersAreClassMembers ||
+                  superclass.isMixinApplication)) ||
+          !interfaces.isEmpty) {
+        _interfaceMembersAreClassMembers = false;
+      } else {
+        _interfaceMembersAreClassMembers = true;
+      }
+    }
+  }
+
   /// If `true` interface members are the non-static class member.
-  bool interfaceMembersAreClassMembers = true;
+  bool get interfaceMembersAreClassMembers => _interfaceMembersAreClassMembers;
 
   Map<Name, Member> classMembers;
   Map<Name, MemberSignature> interfaceMembers;
@@ -834,18 +856,8 @@
   /// this class.
   MembersCreator _prepareCreator(Resolution resolution) {
     if (classMembers == null) {
-      ensureResolved(resolution);
+      _computeInterfaceMembersAreClassMembers(resolution);
       classMembers = new Map<Name, Member>();
-
-      if (interfaceMembersAreClassMembers) {
-        ClassMemberMixin superclass = this.superclass;
-        if ((superclass != null &&
-                (!superclass.interfaceMembersAreClassMembers ||
-                    superclass.isMixinApplication)) ||
-            !interfaces.isEmpty) {
-          interfaceMembersAreClassMembers = false;
-        }
-      }
       if (!interfaceMembersAreClassMembers) {
         interfaceMembers = new Map<Name, MemberSignature>();
       }
@@ -864,6 +876,9 @@
   /// and private names.
   void computeClassMember(
       Resolution resolution, String name, Setlet<Name> names) {
+    // TODO(johnniwinther): Should we assert that the class has been resolved
+    // instead?
+    ensureResolved(resolution);
     if (isMemberComputed(name)) return;
     if (Name.isPrivateName(name)) {
       names
@@ -887,6 +902,9 @@
   }
 
   void computeAllClassMembers(Resolution resolution) {
+    // TODO(johnniwinther): Should we assert that the class has been resolved
+    // instead?
+    ensureResolved(resolution);
     if (areAllMembersComputed()) return;
     MembersCreator creator = _prepareCreator(resolution);
     creator.computeAllMembers();
diff --git a/pkg/compiler/lib/src/resolution/member_impl.dart b/pkg/compiler/lib/src/resolution/member_impl.dart
index 7597d36..8c4eb1c 100644
--- a/pkg/compiler/lib/src/resolution/member_impl.dart
+++ b/pkg/compiler/lib/src/resolution/member_impl.dart
@@ -138,13 +138,17 @@
   }
 
   DeclaredMember inheritFrom(InterfaceType newInstance) {
-    assert(() {
+    assert(invariant(declaration.element, () {
       // Assert that if [instance] contains type variables, then these are
       // defined in the declaration of [newInstance] and will therefore be
       // substituted into the context of [newInstance] in the created member.
       ClassElement contextClass = Types.getClassContext(instance);
       return contextClass == null || contextClass == newInstance.element;
-    });
+    }, message: () {
+      return "Context mismatch: Context class "
+          "${Types.getClassContext(instance)} from $instance does match "
+          "the new instance $newInstance.";
+    }));
     return _newInheritedMember(newInstance);
   }
 
@@ -169,7 +173,7 @@
 
   String toString() {
     StringBuffer sb = new StringBuffer();
-    printOn(sb, instance);
+    printOn(sb, type);
     return sb.toString();
   }
 }
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index b69287a..3658a7d 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -17,10 +17,10 @@
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
     show
-        BaseFunctionElementX,
         ConstructorElementX,
         ErroneousElementX,
         FunctionElementX,
+        InitializingFormalElementX,
         JumpTargetX,
         LocalFunctionElementX,
         LocalParameterElementX,
@@ -444,6 +444,11 @@
       // fields they reference are visible, but must be resolved independently.
       if (element.isInitializingFormal) {
         registry.useElement(parameterNode, element);
+        if (compiler.options.enableInitializingFormalAccess) {
+          InitializingFormalElementX initializingFormalElementX = element;
+          defineLocalVariable(parameterNode, initializingFormalElementX);
+          addToScope(initializingFormalElementX);
+        }
       } else {
         LocalParameterElementX parameterElement = element;
         defineLocalVariable(parameterNode, parameterElement);
@@ -886,6 +891,8 @@
       } else {
         return new StaticAccess.parameter(target);
       }
+    } else if (target.isInitializingFormal) {
+      return new StaticAccess.finalParameter(target);
     } else if (target.isVariable) {
       if (target.isFinal || target.isConst) {
         return new StaticAccess.finalLocalVariable(target);
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index 4ea5aff..9317d30 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -359,8 +359,21 @@
     // TODO(johnniwinther): Share the resolved type between all variables
     // declared in the same declaration.
     if (tree.type != null) {
-      element.variables.type = visitor.resolveTypeAnnotation(tree.type);
-    } else {
+      DartType type = visitor.resolveTypeAnnotation(tree.type);
+      assert(invariant(
+          element,
+          element.variables.type == null ||
+              // Crude check but we have no equivalence relation that
+              // equates malformed types, like matching creations of type
+              // `Foo<Unresolved>`.
+              element.variables.type.toString() == type.toString(),
+          message: "Unexpected type computed for $element. "
+              "Was ${element.variables.type}, computed $type."));
+      element.variables.type = type;
+    } else if (element.variables.type == null) {
+      // Only assign the dynamic type if the element has no known type. This
+      // happens for enum fields where the type is known but is not in the
+      // synthesized AST.
       element.variables.type = const DynamicType();
     }
 
diff --git a/pkg/compiler/lib/src/serialization/element_serialization.dart b/pkg/compiler/lib/src/serialization/element_serialization.dart
index ab10cc8..b115ae0 100644
--- a/pkg/compiler/lib/src/serialization/element_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/element_serialization.dart
@@ -478,6 +478,7 @@
     }
     SerializerUtil.serializeParentRelation(element, encoder);
     encoder.setBool(Key.IS_EXTERNAL, element.isExternal);
+    encoder.setBool(Key.IS_ABSTRACT, element.isAbstract);
     if (element.isLocal) {
       LocalFunctionElement localFunction = element;
       encoder.setElement(
diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
index ab8f78e..563783f 100644
--- a/pkg/compiler/lib/src/serialization/equivalence.dart
+++ b/pkg/compiler/lib/src/serialization/equivalence.dart
@@ -383,9 +383,31 @@
 
   @override
   bool visitClassElement(ClassElement element1, ClassElement element2) {
-    return strategy.test(
-            element1, element2, 'name', element1.name, element2.name) &&
-        visit(element1.library, element2.library);
+    if (!strategy.test(
+        element1,
+        element2,
+        'isUnnamedMixinApplication',
+        element1.isUnnamedMixinApplication,
+        element2.isUnnamedMixinApplication)) {
+      return false;
+    }
+    if (element1.isUnnamedMixinApplication) {
+      MixinApplicationElement mixin1 = element1;
+      MixinApplicationElement mixin2 = element2;
+      return strategy.testElements(
+              mixin1, mixin2, 'subclass', mixin1.subclass, mixin2.subclass) &&
+          // Using the [mixinType] is more precise but requires the test to
+          // handle self references: The identity of a type variable is based on
+          // its type declaration and if [mixin1] is generic the [mixinType]
+          // will contain the type variables declared by [mixin1], i.e.
+          // `abstract class Mixin<T> implements MixinType<T> {}`
+          strategy.testElements(
+              mixin1, mixin2, 'mixin', mixin1.mixin, mixin2.mixin);
+    } else {
+      return strategy.test(
+              element1, element2, 'name', element1.name, element2.name) &&
+          visit(element1.library, element2.library);
+    }
   }
 
   bool checkMembers(Element element1, Element element2) {
diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart
index 36ec45c..a03ef2f 100644
--- a/pkg/compiler/lib/src/serialization/modelz.dart
+++ b/pkg/compiler/lib/src/serialization/modelz.dart
@@ -301,7 +301,9 @@
   }
 }
 
-class AbstractFieldElementZ extends ElementZ implements AbstractFieldElement {
+class AbstractFieldElementZ extends ElementZ
+    with AbstractFieldElementCommon
+    implements AbstractFieldElement {
   final String name;
   final GetterElementZ getter;
   final SetterElementZ setter;
@@ -346,6 +348,18 @@
 
   @override
   ClassElement get enclosingClass => _canonicalElement.enclosingClass;
+
+  @override
+  bool get isClassMember => _canonicalElement.isClassMember;
+
+  @override
+  bool get isInstanceMember => _canonicalElement.isInstanceMember;
+
+  @override
+  bool get isStatic => _canonicalElement.isStatic;
+
+  @override
+  bool get isTopLevel => _canonicalElement.isTopLevel;
 }
 
 class LibraryElementZ extends DeserializedElementZ
@@ -468,7 +482,9 @@
 
   @override
   Iterable<ImportElement> getImportsFor(Element element) {
-    return _unsupported('getImportsFor');
+    // TODO(johnniwinther): Serialize this to support deferred access to
+    // serialized entities.
+    return <ImportElement>[];
   }
 
   String toString() {
@@ -568,6 +584,9 @@
   SourceSpan get sourcePosition => new SourceSpan(script.resourceUri, 0, 0);
 
   @override
+  bool get isTopLevel => false;
+
+  @override
   accept(ElementVisitor visitor, arg) {
     return visitor.visitCompilationUnitElement(this, arg);
   }
@@ -669,6 +688,9 @@
 
   @override
   bool get isInstanceMember => true;
+
+  @override
+  bool get isClassMember => true;
 }
 
 abstract class StaticMemberMixin implements DeserializedElementZ {
@@ -677,6 +699,9 @@
 
   @override
   bool get isStatic => true;
+
+  @override
+  bool get isClassMember => true;
 }
 
 abstract class TypedElementMixin implements DeserializedElementZ, TypedElement {
@@ -810,7 +835,8 @@
   @override
   ConstructorElement lookupDefaultConstructor() {
     ConstructorElement constructor = lookupConstructor("");
-    if (constructor != null && constructor.parameters.isEmpty) {
+    if (constructor != null &&
+        constructor.functionSignature.requiredParameterCount == 0) {
       return constructor;
     }
     return null;
@@ -823,8 +849,10 @@
   void ensureResolved(Resolution resolution) {
     if (!_isResolved) {
       _isResolved = true;
-      class_members.MembersCreator
-          .computeClassMembersByName(resolution, this, Identifiers.call);
+      // TODO(johnniwinther): Avoid eager computation of all members. `call` is
+      // always needed, but the remaining should be computed on-demand or on
+      // type instantiation.
+      class_members.MembersCreator.computeAllClassMembers(resolution, this);
       resolution.registerClass(this);
     }
   }
@@ -946,6 +974,9 @@
 
   @override
   InterfaceType get mixinType => _mixinType ??= _decoder.getType(Key.MIXIN);
+
+  @override
+  ClassElement get subclass => null;
 }
 
 class UnnamedMixinApplicationElementZ extends ElementZ
@@ -959,26 +990,30 @@
         MixinApplicationElementCommon,
         MixinApplicationElementMixin {
   final String name;
-  final ClassElement _subclass;
-  final InterfaceType supertype;
-  final Link<DartType> interfaces;
+  final ClassElement subclass;
+  final InterfaceType _supertypeBase;
+  final InterfaceType _mixinBase;
+  InterfaceType _supertype;
+  Link<DartType> _interfaces;
   OrderedTypeSet _allSupertypesAndSelf;
   Link<ConstructorElement> _constructors;
 
   UnnamedMixinApplicationElementZ(
-      ClassElement subclass, InterfaceType supertype, InterfaceType mixin)
-      : this._subclass = subclass,
-        this.supertype = supertype,
-        this.interfaces = const Link<DartType>().prepend(mixin),
+      this.subclass, InterfaceType supertype, InterfaceType mixin)
+      : this._supertypeBase = supertype,
+        this._mixinBase = mixin,
         this.name = "${supertype.name}+${mixin.name}";
 
   @override
-  CompilationUnitElement get compilationUnit => _subclass.compilationUnit;
+  CompilationUnitElement get compilationUnit => subclass.compilationUnit;
 
   @override
   bool get isTopLevel => true;
 
   @override
+  bool get isAbstract => true;
+
+  @override
   bool get isUnnamedMixinApplication => true;
 
   Link<ConstructorElement> get constructors {
@@ -1005,7 +1040,7 @@
     // Create synthetic type variables for the mixin application.
     List<DartType> typeVariables = <DartType>[];
     int index = 0;
-    for (TypeVariableType type in _subclass.typeVariables) {
+    for (TypeVariableType type in subclass.typeVariables) {
       SyntheticTypeVariableElementZ typeVariableElement =
           new SyntheticTypeVariableElementZ(this, index, type.name);
       TypeVariableType typeVariable = new TypeVariableType(typeVariableElement);
@@ -1013,17 +1048,56 @@
       index++;
     }
     // Setup bounds on the synthetic type variables.
-    for (TypeVariableType type in _subclass.typeVariables) {
+    for (TypeVariableType type in subclass.typeVariables) {
       TypeVariableType typeVariable = typeVariables[type.element.index];
       SyntheticTypeVariableElementZ typeVariableElement = typeVariable.element;
       typeVariableElement._type = typeVariable;
       typeVariableElement._bound =
-          type.element.bound.subst(typeVariables, _subclass.typeVariables);
+          type.element.bound.subst(typeVariables, subclass.typeVariables);
     }
     return typeVariables;
   }
 
   @override
+  InterfaceType get supertype {
+    if (_supertype == null) {
+      // Substitute the type variables in [_supertypeBase] provided by
+      // [_subclass] with the type variables in this unnamed mixin application.
+      //
+      // For instance
+      //    class S<S.T> {}
+      //    class M<M.T> {}
+      //    class C<C.T> extends S<C.T> with M<C.T> {}
+      // the unnamed mixin application should be
+      //    abstract class S+M<S+M.T> extends S<S+M.T> implements M<S+M.T> {}
+      // but the supertype is provided as S<C.T> and we need to substitute S+M.T
+      // for C.T.
+      _supertype = _supertypeBase.subst(typeVariables, subclass.typeVariables);
+    }
+    return _supertype;
+  }
+
+  @override
+  Link<DartType> get interfaces {
+    if (_interfaces == null) {
+      // Substitute the type variables in [_mixinBase] provided by
+      // [_subclass] with the type variables in this unnamed mixin application.
+      //
+      // For instance
+      //    class S<S.T> {}
+      //    class M<M.T> {}
+      //    class C<C.T> extends S<C.T> with M<C.T> {}
+      // the unnamed mixin application should be
+      //    abstract class S+M<S+M.T> extends S<S+M.T> implements M<S+M.T> {}
+      // but the mixin is provided as M<C.T> and we need to substitute S+M.T
+      // for C.T.
+      _interfaces = const Link<DartType>()
+          .prepend(_mixinBase.subst(typeVariables, subclass.typeVariables));
+    }
+    return _interfaces;
+  }
+
+  @override
   accept(ElementVisitor visitor, arg) {
     return visitor.visitMixinApplicationElement(this, arg);
   }
@@ -1038,7 +1112,7 @@
   }
 
   @override
-  Element get enclosingElement => _subclass.enclosingElement;
+  Element get enclosingElement => subclass.enclosingElement;
 
   @override
   bool get isObject => false;
@@ -1053,10 +1127,10 @@
   InterfaceType get mixinType => interfaces.head;
 
   @override
-  int get sourceOffset => _subclass.sourceOffset;
+  int get sourceOffset => subclass.sourceOffset;
 
   @override
-  SourceSpan get sourcePosition => _subclass.sourcePosition;
+  SourceSpan get sourcePosition => subclass.sourcePosition;
 }
 
 class EnumClassElementZ extends ClassElementZ implements EnumClassElement {
@@ -1084,7 +1158,8 @@
         FunctionTypedElementMixin,
         ParametersMixin,
         TypedElementMixin,
-        MemberElementMixin
+        MemberElementMixin,
+        ConstructorElementCommon
     implements
         ConstructorElement,
         // TODO(johnniwinther): Sort out whether a constructor is a method.
@@ -1104,14 +1179,6 @@
   @override
   bool get isExternal => _decoder.getBool(Key.IS_EXTERNAL);
 
-  bool get isFromEnvironmentConstructor {
-    return name == 'fromEnvironment' &&
-        library.isDartCore &&
-        (enclosingClass.name == 'bool' ||
-            enclosingClass.name == 'int' ||
-            enclosingClass.name == 'String');
-  }
-
   ConstantConstructor get constantConstructor {
     if (isConst && _constantConstructor == null) {
       ObjectDecoder data =
@@ -1263,8 +1330,13 @@
 }
 
 class ForwardingConstructorElementZ extends ElementZ
-    with AnalyzableElementMixin, AstElementMixinZ
-    implements ConstructorElement {
+    with
+        AnalyzableElementMixin,
+        AstElementMixinZ
+    implements
+        ConstructorElement,
+        // TODO(johnniwinther): Sort out whether a constructor is a method.
+        MethodElement {
   final MixinApplicationElement enclosingClass;
   final ConstructorElement definingConstructor;
 
@@ -1293,6 +1365,9 @@
   bool get isConst => false;
 
   @override
+  bool get isClassMember => true;
+
+  @override
   ConstantConstructor get constantConstructor => null;
 
   @override
@@ -1332,6 +1407,15 @@
   bool get isFromEnvironmentConstructor => false;
 
   @override
+  bool get isIntFromEnvironmentConstructor => false;
+
+  @override
+  bool get isBoolFromEnvironmentConstructor => false;
+
+  @override
+  bool get isStringFromEnvironmentConstructor => false;
+
+  @override
   bool get isRedirectingFactory => false;
 
   @override
@@ -1493,6 +1577,9 @@
   }
 
   @override
+  bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
+
+  @override
   bool get isOperator => _decoder.getBool(Key.IS_OPERATOR);
 }
 
@@ -1594,6 +1681,9 @@
   }
 
   @override
+  bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
+
+  @override
   AsyncMarker get asyncMarker => AsyncMarker.SYNC;
 }
 
@@ -1634,6 +1724,9 @@
   }
 
   @override
+  bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
+
+  @override
   AsyncMarker get asyncMarker => AsyncMarker.SYNC;
 }
 
@@ -1960,7 +2053,7 @@
   ElementKind get kind => ElementKind.PARAMETER;
 }
 
-class InitializingFormalElementZ extends ParameterElementZ
+class InitializingFormalElementZ extends LocalParameterElementZ
     implements InitializingFormalElement {
   FieldElement _fieldElement;
 
@@ -1981,6 +2074,9 @@
 
   @override
   ElementKind get kind => ElementKind.INITIALIZING_FORMAL;
+
+  @override
+  bool get isLocal => true;
 }
 
 class LocalVariableElementZ extends DeserializedElementZ
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 74dd4a0..1b97c3d 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -5,9 +5,11 @@
 library dart2js.serialization;
 
 import '../common.dart';
+import '../common/resolution.dart';
 import '../constants/expressions.dart';
 import '../dart_types.dart';
 import '../elements/elements.dart';
+import '../library_loader.dart' show LibraryProvider;
 import '../util/enumset.dart';
 
 import 'constant_serialization.dart';
@@ -921,13 +923,17 @@
 /// Context for parallel deserialization.
 class DeserializationContext {
   final DiagnosticReporter reporter;
+  final Resolution resolution;
+  final LibraryProvider libraryProvider;
   Map<Uri, LibraryElement> _uriMap = <Uri, LibraryElement>{};
   List<Deserializer> deserializers = <Deserializer>[];
   List<DeserializerPlugin> plugins = <DeserializerPlugin>[];
 
-  DeserializationContext(this.reporter);
+  DeserializationContext(this.reporter, this.resolution, this.libraryProvider);
 
   LibraryElement lookupLibrary(Uri uri) {
+    // TODO(johnniwinther): Move this to the library loader by making a
+    // [Deserializer] a [LibraryProvider].
     return _uriMap.putIfAbsent(uri, () {
       Uri foundUri;
       LibraryElement foundLibrary;
@@ -949,6 +955,11 @@
       return foundLibrary;
     });
   }
+
+  LibraryElement findLibrary(Uri uri) {
+    LibraryElement library = lookupLibrary(uri);
+    return library ?? libraryProvider.lookupLibrary(uri);
+  }
 }
 
 /// Deserializer for a closed collection of libraries.
@@ -1024,7 +1035,7 @@
           decoder.getEnum(Key.KIND, SerializedElementKind.values);
       if (elementKind == SerializedElementKind.EXTERNAL_LIBRARY) {
         Uri uri = decoder.getUri(Key.URI);
-        element = context.lookupLibrary(uri);
+        element = context.findLibrary(uri);
         if (element == null) {
           throw new StateError("Missing library for $uri.");
         }
@@ -1047,6 +1058,7 @@
         }
       } else if (elementKind == SerializedElementKind.EXTERNAL_CLASS_MEMBER) {
         ClassElement cls = decoder.getElement(Key.CLASS);
+        cls.ensureResolved(context.resolution);
         String name = decoder.getString(Key.NAME);
         bool isGetter = decoder.getBool(Key.GETTER, isOptional: true);
         element = cls.lookupLocalMember(name);
@@ -1063,6 +1075,7 @@
         }
       } else if (elementKind == SerializedElementKind.EXTERNAL_CONSTRUCTOR) {
         ClassElement cls = decoder.getElement(Key.CLASS);
+        cls.ensureResolved(context.resolution);
         String name = decoder.getString(Key.NAME);
         element = cls.lookupConstructor(name);
         if (element == null) {
diff --git a/pkg/compiler/lib/src/serialization/system.dart b/pkg/compiler/lib/src/serialization/system.dart
index 8b54e98d..22ac66b 100644
--- a/pkg/compiler/lib/src/serialization/system.dart
+++ b/pkg/compiler/lib/src/serialization/system.dart
@@ -28,16 +28,15 @@
 
 class DeserializerSystemImpl extends DeserializerSystem {
   final Compiler _compiler;
+  final Resolution resolution;
   final DeserializationContext deserializationContext;
   final List<LibraryElement> deserializedLibraries = <LibraryElement>[];
   final ResolutionImpactDeserializer _resolutionImpactDeserializer;
   final ResolvedAstDeserializerPlugin _resolvedAstDeserializer;
-  final ImpactTransformer _impactTransformer;
 
-  factory DeserializerSystemImpl(
-      Compiler compiler, ImpactTransformer impactTransformer) {
-    DeserializationContext context =
-        new DeserializationContext(compiler.reporter);
+  factory DeserializerSystemImpl(Compiler compiler) {
+    DeserializationContext context = new DeserializationContext(
+        compiler.reporter, compiler.resolution, compiler.libraryLoader);
     DeserializerPlugin backendDeserializer =
         compiler.backend.serialization.deserializer;
     context.plugins.add(backendDeserializer);
@@ -48,14 +47,14 @@
         new ResolvedAstDeserializerPlugin(
             compiler.parsingContext, backendDeserializer);
     context.plugins.add(resolvedAstDeserializer);
-    return new DeserializerSystemImpl._(compiler, context, impactTransformer,
+    return new DeserializerSystemImpl._(compiler, compiler.resolution, context,
         resolutionImpactDeserializer, resolvedAstDeserializer);
   }
 
   DeserializerSystemImpl._(
       this._compiler,
+      this.resolution,
       this.deserializationContext,
-      this._impactTransformer,
       this._resolutionImpactDeserializer,
       this._resolvedAstDeserializer);
 
@@ -96,7 +95,7 @@
         element.enclosingClass.isUnnamedMixinApplication) {
       return true;
     }
-    return _resolutionImpactDeserializer.impactMap.containsKey(element);
+    return _resolutionImpactDeserializer.hasResolutionImpact(element);
   }
 
   @override
@@ -111,14 +110,15 @@
               "${element} not found in ${superclass}."));
       // TODO(johnniwinther): Compute callStructure. Currently not used.
       CallStructure callStructure;
-      return _resolutionImpactDeserializer.impactMap.putIfAbsent(element, () {
+      return _resolutionImpactDeserializer.registerResolutionImpact(element,
+          () {
         return new DeserializedResolutionImpact(staticUses: <StaticUse>[
           new StaticUse.superConstructorInvoke(
               superclassConstructor, callStructure)
         ]);
       });
     }
-    return _resolutionImpactDeserializer.impactMap[element];
+    return _resolutionImpactDeserializer.getResolutionImpact(element);
   }
 
   @override
@@ -129,7 +129,18 @@
     if (element is ExecutableElement) {
       getResolvedAst(element);
     }
-    return _impactTransformer.transformResolutionImpact(resolutionImpact);
+    if (element.isField && !element.isConst) {
+      FieldElement field = element;
+      if (field.isTopLevel || field.isStatic) {
+        if (field.constant == null) {
+          // TODO(johnniwinther): Find a cleaner way to do this. Maybe
+          // `Feature.LAZY_FIELD` of the resolution impact should be used
+          // instead.
+          _compiler.backend.constants.registerLazyStatic(element);
+        }
+      }
+    }
+    return resolution.transformResolutionImpact(element, resolutionImpact);
   }
 
   @override
@@ -158,7 +169,8 @@
 }
 
 class ResolutionImpactDeserializer extends DeserializerPlugin {
-  Map<Element, ResolutionImpact> impactMap = <Element, ResolutionImpact>{};
+  Map<Element, ObjectDecoder> _decoderMap = <Element, ObjectDecoder>{};
+  Map<Element, ResolutionImpact> _impactMap = <Element, ResolutionImpact>{};
   final DeserializerPlugin nativeDataDeserializer;
 
   ResolutionImpactDeserializer(this.nativeDataDeserializer);
@@ -167,10 +179,30 @@
   void onElement(Element element, ObjectDecoder getDecoder(String tag)) {
     ObjectDecoder decoder = getDecoder(WORLD_IMPACT_TAG);
     if (decoder != null) {
-      impactMap[element] = ImpactDeserializer.deserializeImpact(
-          element, decoder, nativeDataDeserializer);
+      _decoderMap[element] = decoder;
     }
   }
+
+  bool hasResolutionImpact(Element element) {
+    return _impactMap.containsKey(element) || _decoderMap.containsKey(element);
+  }
+
+  ResolutionImpact registerResolutionImpact(
+      Element element, ResolutionImpact ifAbsent()) {
+    return _impactMap.putIfAbsent(element, ifAbsent);
+  }
+
+  ResolutionImpact getResolutionImpact(Element element) {
+    return registerResolutionImpact(element, () {
+      ObjectDecoder decoder = _decoderMap[element];
+      if (decoder != null) {
+        _decoderMap.remove(element);
+        return ImpactDeserializer.deserializeImpact(
+            element, decoder, nativeDataDeserializer);
+      }
+      return null;
+    });
+  }
 }
 
 const String RESOLVED_AST_TAG = 'resolvedAst';
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 80d98d6..f57ade6 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -117,8 +117,7 @@
   void deserializeFromText(Uri sourceUri, String serializedData) {
     measure(() {
       if (deserializer == null) {
-        deserializer = new DeserializerSystemImpl(
-            compiler, compiler.backend.impactTransformer);
+        deserializer = new DeserializerSystemImpl(compiler);
       }
       DeserializerSystemImpl deserializerImpl = deserializer;
       DeserializationContext context = deserializerImpl.deserializationContext;
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 750357e..2a8ab08 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -40,7 +40,7 @@
         TypeDeclarationElement,
         TypedElement,
         VariableElement;
-import 'resolution/class_members.dart' show MembersCreator;
+import 'resolution/class_members.dart' show MembersCreator, ErroneousMember;
 import 'resolution/tree_elements.dart' show TreeElements;
 import 'tree/tree.dart';
 import 'util/util.dart' show Link, LinkBuilder;
@@ -733,7 +733,11 @@
         Name name, DartType unaliasedBound, InterfaceType interface) {
       MemberSignature member = lookupMemberSignature(memberName, interface);
       if (member != null) {
-        return new MemberAccess(member);
+        if (member is ErroneousMember) {
+          return const DynamicAccess();
+        } else {
+          return new MemberAccess(member);
+        }
       }
       if (name == const PublicName('call')) {
         if (unaliasedBound.isFunctionType) {
@@ -1057,7 +1061,10 @@
     } else if (element.isFunction) {
       // foo() where foo is a method in the same class.
       return createResolvedAccess(node, name, element);
-    } else if (element.isVariable || element.isParameter || element.isField) {
+    } else if (element.isVariable ||
+        element.isParameter ||
+        element.isField ||
+        element.isInitializingFormal) {
       // foo() where foo is a field in the same class.
       return createResolvedAccess(node, name, element);
     } else if (element.isGetter || element.isSetter) {
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 474ddfe..6d83624 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 0.12.2
+* Updated `@protected` to include implemented interfaces (linter#252).
+
 ## 0.12.1
 * Fixed markdown in dartdocs.
 
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index ff0f9b0..17f7f1f 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -69,8 +69,9 @@
 /// field) `m` in a class `C`. If the annotation is on a field it applies to the
 /// getter, and setter if appropriate, that are induced by the field. Indicates
 /// that `m` should only be invoked from instance methods of `C` or classes that
-/// extend or mix in `C`, either directly or indirectly. Additionally indicates
-/// that `m` should only be invoked on `this`, whether explicitly or implicitly.
+/// extend, implement or mix in `C`, either directly or indirectly. Additionally
+/// indicates that `m` should only be invoked on `this`, whether explicitly or
+/// implicitly.
 ///
 /// Tools, such as the analyzer, can provide feedback if
 ///
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index 82a1677..7daaa74 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 0.12.1
+version: 0.12.2
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 1366f47..fa11a2d 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -3,9 +3,9 @@
 # BSD-style license that can be found in the LICENSE file.
 
 samples/searchable_list: Pass, Slow
+third_party/pkg/scheduled_test: Fail # Issue 26585
 
 [ $use_repository_packages ]
-pkg/analyzer: PubGetError
 samples/third_party/angular_todo: Fail # angular needs to be updated
 
 [ $use_public_packages ]
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 6b16d99..7045187 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -1,5 +1,5 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
+// for details. All rights solveserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 library builtin;
@@ -10,6 +10,10 @@
 import 'dart:isolate';
 import 'dart:typed_data';
 
+// Embedder sets this to true if the --trace-loading flag was passed on the
+// command line.
+bool _traceLoading = false;
+
 
 // Before handling an embedder entrypoint we finalize the setup of the
 // dart:_builtin library.
@@ -52,40 +56,40 @@
 
 _getUriBaseClosure() => _uriBase;
 
-
 // Asynchronous loading of resources.
-// The embedder forwards most loading requests to this library.
-
-// See Dart_LibraryTag in dart_api.h
-const _Dart_kScriptTag = null;
-const _Dart_kImportTag = 0;
-const _Dart_kSourceTag = 1;
-const _Dart_kCanonicalizeUrl = 2;
-const _Dart_kResourceLoad = 3;
-
-// Embedder sets this to true if the --trace-loading flag was passed on the
-// command line.
-bool _traceLoading = false;
-
-// This is currently a build time flag only. We measure the time from the first
-// load request (opening the receive port) to completing the last load
-// request (closing the receive port). Future, deferred load operations will
-// add to this time.
-bool _timeLoading = false;
-Stopwatch _stopwatch;
+// The embedder forwards loading requests to the service isolate.
 
 // A port for communicating with the service isolate for I/O.
 SendPort _loadPort;
-// The receive port for a load request. Multiple sources can be fetched in
-// a single load request.
-RawReceivePort _dataPort;
-// A request id valid only for the current load cycle (while the number of
-// outstanding load requests is greater than 0). Can be reset when loading is
-// completed.
-int _reqId = 0;
-// An unordered hash map mapping from request id to a particular load request.
-// Once there are no outstanding load requests the current load has finished.
-HashMap _reqMap = new HashMap();
+
+// The isolateId used to communicate with the service isolate for I/O.
+int _isolateId;
+
+// Requests made to the service isolate over the load port.
+
+// Extra requests. Keep these in sync between loader.dart and builtin.dart.
+const _Dart_kInitLoader = 4;           // Initialize the loader.
+const _Dart_kResourceLoad = 5;         // Resource class support.
+const _Dart_kGetPackageRootUri = 6;    // Uri of the packages/ directory.
+const _Dart_kGetPackageConfigUri = 7;  // Uri of the .packages file.
+const _Dart_kResolvePackageUri = 8;    // Resolve a package: uri.
+
+// Make a request to the loader. Future will complete with result which is
+// either a Uri or a List<int>.
+Future _makeLoaderRequest(int tag, String uri) {
+  assert(_isolateId != null);
+  assert(_loadPort != null);
+  Completer completer = new Completer();
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (msg) {
+    // Close the port.
+    port.close();
+    completer.complete(msg);
+  };
+  _loadPort.send([_traceLoading, _isolateId, tag, port.sendPort, uri]);
+  return completer.future;
+}
+
 
 // The current working directory when the embedder was launched.
 Uri _workingDirectory;
@@ -93,29 +97,8 @@
 // package imports can be resolved relative to it. The root script is the basis
 // for the root library in the VM.
 Uri _rootScript;
-
-// Packages are either resolved looking up in a map or resolved from within a
-// package root.
-bool get _packagesReady =>
-    (_packageRoot != null) || (_packageMap != null) || (_packageError != null);
-// Error string set if there was an error resolving package configuration.
-// For example not finding a .packages file or packages/ directory, malformed
-// .packages file or any other related error.
-String _packageError = null;
-// The directory to look in to resolve "package:" scheme URIs. By detault it is
-// the 'packages' directory right next to the script.
-Uri _packageRoot = null; // Used to be _rootScript.resolve('packages/');
-// The map describing how certain package names are mapped to Uris.
-Uri _packageConfig = null;
-Map<String, Uri> _packageMap = null;
-
-// A list of pending packags which have been requested while resolving the
-// location of the package root or the contents of the package map.
-List<_LoadRequest> _pendingPackageLoads = [];
-
-// If we have outstanding loads or pending package loads waiting for resolution,
-// then we do have pending loads.
-bool _pendingLoads() => !_reqMap.isEmpty || !_pendingPackageLoads.isEmpty;
+// The package root set on the command line.
+Uri _packageRoot;
 
 // Special handling for Windows paths so that they are compatible with URI
 // handling.
@@ -128,47 +111,6 @@
   _print("* $_logId $msg");
 }
 
-// A class wrapping the load error message in an Error object.
-class _LoadError extends Error {
-  final _LoadRequest request;
-  final String message;
-  _LoadError(this.request, this.message);
-
-  String toString() {
-    var context = request._context;
-    if (context == null || context is! String) {
-      return 'Could not load "${request._uri}": $message';
-    } else {
-      return 'Could not import "${request._uri}" from "$context": $message';
-    }
-  }
-}
-
-// Class collecting all of the information about a particular load request.
-class _LoadRequest {
-  final int _id = _reqId++;
-  final int _tag;
-  final String _uri;
-  final Uri _resourceUri;
-  final _context;
-
-  _LoadRequest(this._tag, this._uri, this._resourceUri, this._context) {
-    assert(_reqMap[_id] == null);
-    _reqMap[_id] = this;
-  }
-
-  toString() => "LoadRequest($_id, $_tag, $_uri, $_resourceUri, $_context)";
-}
-
-
-// Native calls provided by the embedder.
-void _signalDoneLoading() native "Builtin_DoneLoading";
-void _loadScriptCallback(int tag, String uri, String libraryUri, Uint8List data)
-    native "Builtin_LoadSource";
-void _asyncLoadErrorCallback(uri, libraryUri, error)
-    native "Builtin_AsyncLoadError";
-
-
 _sanitizeWindowsPath(path) {
   // For Windows we need to massage the paths a bit according to
   // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
@@ -193,7 +135,6 @@
   return fixedPath;
 }
 
-
 _trimWindowsPath(path) {
   // Convert /X:/ to X:/.
   if (_isWindows == false) {
@@ -211,7 +152,6 @@
   return path;
 }
 
-
 // Ensure we have a trailing slash character.
 _enforceTrailingSlash(uri) {
   if (!uri.endsWith('/')) {
@@ -220,7 +160,6 @@
   return uri;
 }
 
-
 // Embedder Entrypoint:
 // The embedder calls this method with the current working directory.
 void _setWorkingDirectory(cwd) {
@@ -236,7 +175,6 @@
   }
 }
 
-
 // Embedder Entrypoint:
 // The embedder calls this method with a custom package root.
 _setPackageRoot(String packageRoot) {
@@ -246,15 +184,15 @@
   if (_traceLoading) {
     _log('Setting package root: $packageRoot');
   }
-  packageRoot = _enforceTrailingSlash(packageRoot);
   if (packageRoot.startsWith('file:') ||
       packageRoot.startsWith('http:') ||
       packageRoot.startsWith('https:')) {
+    packageRoot = _enforceTrailingSlash(packageRoot);
     _packageRoot = _workingDirectory.resolve(packageRoot);
   } else {
     packageRoot = _sanitizeWindowsPath(packageRoot);
     packageRoot = _trimWindowsPath(packageRoot);
-    _packageRoot = _workingDirectory.resolveUri(new Uri.file(packageRoot));
+    _packageRoot = _workingDirectory.resolveUri(new Uri.directory(packageRoot));
   }
   // Now that we have determined the packageRoot value being used, set it
   // up for use in Platform.packageRoot. This is only set when the embedder
@@ -266,265 +204,8 @@
   }
 }
 
-
-// Given a uri with a 'package' scheme, return a Uri that is prefixed with
-// the package root.
-Uri _resolvePackageUri(Uri uri) {
-  assert(uri.scheme == "package");
-  assert(_packagesReady);
-
-  if (!uri.host.isEmpty) {
-    var path = '${uri.host}${uri.path}';
-    var right = 'package:$path';
-    var wrong = 'package://$path';
-
-    throw "URIs using the 'package:' scheme should look like "
-          "'$right', not '$wrong'.";
-  }
-
-  if (_traceLoading) {
-    _log('Resolving package with uri path: ${uri.path}');
-  }
-  var resolvedUri;
-  if (_packageError != null) {
-    if (_traceLoading) {
-      _log("Resolving package with pending resolution error: $_packageError");
-    }
-    throw _packageError;
-  } else if (_packageRoot != null) {
-    resolvedUri = _packageRoot.resolve(uri.path);
-  } else {
-    var packageName = uri.pathSegments[0];
-    var mapping = _packageMap[packageName];
-    if (_traceLoading) {
-      _log("Mapped '$packageName' package to '$mapping'");
-    }
-    if (mapping == null) {
-      throw "No mapping for '$packageName' package when resolving '$uri'.";
-    }
-    var path;
-    if (uri.path.length > packageName.length) {
-      path = uri.path.substring(packageName.length + 1);
-    } else {
-      // Handle naked package resolution to the default package name:
-      // package:foo is equivalent to package:foo/foo.dart
-      assert(uri.path.length == packageName.length);
-      path = "$packageName.dart";
-    }
-    if (_traceLoading) {
-      _log("Path to be resolved in package: $path");
-    }
-    resolvedUri = mapping.resolve(path);
-  }
-  if (_traceLoading) {
-    _log("Resolved '$uri' to '$resolvedUri'.");
-  }
-  return resolvedUri;
-}
-
-
-// Resolves the script uri in the current working directory iff the given uri
-// did not specify a scheme (e.g. a path to a script file on the command line).
-Uri _resolveScriptUri(String scriptName) {
-  if (_traceLoading) {
-    _log("Resolving script: $scriptName");
-  }
-  if (_workingDirectory == null) {
-    throw 'No current working directory set.';
-  }
-  scriptName = _sanitizeWindowsPath(scriptName);
-
-  var scriptUri = Uri.parse(scriptName);
-  if (scriptUri.scheme == '') {
-    // Script does not have a scheme, assume that it is a path,
-    // resolve it against the working directory.
-    scriptUri = _workingDirectory.resolveUri(scriptUri);
-  }
-
-  // Remember the root script URI so that we can resolve packages based on
-  // this location.
-  _rootScript = scriptUri;
-
-  if (_traceLoading) {
-    _log('Resolved entry point to: $_rootScript');
-  }
-  return scriptUri;
-}
-
-
-void _finishLoadRequest(_LoadRequest req) {
-  if (req != null) {
-    // Now that we are done with loading remove the request from the map.
-    var tmp = _reqMap.remove(req._id);
-    assert(tmp == req);
-    if (_traceLoading) {
-      _log("Loading of ${req._uri} finished: "
-           "${_reqMap.length} requests remaining, "
-           "${_pendingPackageLoads.length} packages pending.");
-    }
-  }
-
-  if (!_pendingLoads() && (_dataPort != null)) {
-    _stopwatch.stop();
-    // Close the _dataPort now that there are no more requests outstanding.
-    if (_traceLoading || _timeLoading) {
-      _log("Closing loading port: ${_stopwatch.elapsedMilliseconds} ms");
-    }
-    _dataPort.close();
-    _dataPort = null;
-    _reqId = 0;
-    _signalDoneLoading();
-  }
-}
-
-
-void _handleLoaderReply(msg) {
-  int id = msg[0];
-  var dataOrError = msg[1];
-  assert((id >= 0) && (id < _reqId));
-  var req = _reqMap[id];
-  try {
-    if (dataOrError is Uint8List) {
-      // Successfully loaded the data.
-      if (req._tag == _Dart_kResourceLoad) {
-        Completer c = req._context;
-        c.complete(dataOrError);
-      } else {
-        // TODO: Currently a compilation error while loading the script is
-        // fatal for the isolate. _loadScriptCallback() does not return and
-        // the number of requests remains out of sync.
-        _loadScriptCallback(req._tag, req._uri, req._context, dataOrError);
-      }
-      _finishLoadRequest(req);
-    } else {
-      assert(dataOrError is String);
-      var error = new _LoadError(req, dataOrError.toString());
-      _asyncLoadError(req, error, null);
-    }
-  } catch(e, s) {
-    // Wrap inside a _LoadError unless we are already propagating a
-    // previous _LoadError.
-    var error = (e is _LoadError) ? e : new _LoadError(req, e.toString());
-    assert(req != null);
-    _asyncLoadError(req, error, s);
-  }
-}
-
-
-void _startLoadRequest(int tag, String uri, Uri resourceUri, context) {
-  if (_dataPort == null) {
-    if (_traceLoading) {
-      _log("Initializing load port.");
-    }
-    // Allocate the Stopwatch if necessary.
-    if (_stopwatch == null) {
-      _stopwatch = new Stopwatch();
-    }
-    assert(_dataPort == null);
-    _dataPort = new RawReceivePort(_handleLoaderReply);
-    _stopwatch.start();
-  }
-  // Register the load request and send it to the VM service isolate.
-  var req = new _LoadRequest(tag, uri, resourceUri, context);
-
-  assert(_dataPort != null);
-  var msg = new List(4);
-  msg[0] = _dataPort.sendPort;
-  msg[1] = _traceLoading;
-  msg[2] = req._id;
-  msg[3] = resourceUri.toString();
-  _loadPort.send(msg);
-
-  if (_traceLoading) {
-    _log("Loading of $resourceUri for $uri started with id: ${req._id}. "
-         "${_reqMap.length} requests remaining, "
-         "${_pendingPackageLoads.length} packages pending.");
-  }
-}
-
-
-RawReceivePort _packagesPort;
-
-void _handlePackagesReply(msg) {
-  // Make sure to close the _packagePort before any other action.
-  _packagesPort.close();
-  _packagesPort = null;
-
-  if (_traceLoading) {
-    _log("Got packages reply: $msg");
-  }
-  if (msg is String) {
-    if (_traceLoading) {
-      _log("Got failure response on package port: '$msg'");
-    }
-    // Remember the error message.
-    _packageError = msg;
-  } else if (msg is List) {
-    if (msg.length == 1) {
-      if (_traceLoading) {
-        _log("Received package root: '${msg[0]}'");
-      }
-      _packageRoot = Uri.parse(msg[0]);
-    } else {
-      // First entry contains the location of the loaded .packages file.
-      assert((msg.length % 2) == 0);
-      assert(msg.length >= 2);
-      assert(msg[1] == null);
-      _packageConfig = Uri.parse(msg[0]);
-      _packageMap = new Map<String, Uri>();
-      for (var i = 2; i < msg.length; i+=2) {
-        // TODO(iposva): Complain about duplicate entries.
-        _packageMap[msg[i]] = Uri.parse(msg[i+1]);
-      }
-      if (_traceLoading) {
-        _log("Setup package map: $_packageMap");
-      }
-    }
-  } else {
-    _packageError = "Bad type of packages reply: ${msg.runtimeType}";
-    if (_traceLoading) {
-      _log(_packageError);
-    }
-  }
-
-  // Resolve all pending package loads now that we know how to resolve them.
-  while (_pendingPackageLoads.length > 0) {
-    // Order does not matter as we queue all of the requests up right now.
-    var req = _pendingPackageLoads.removeLast();
-    // Call the registered closure, to handle the delayed action.
-    req();
-  }
-  // Reset the pending package loads to empty. So that we eventually can
-  // finish loading.
-  _pendingPackageLoads = [];
-  // Make sure that the receive port is closed if no other loads are pending.
-  _finishLoadRequest(null);
-}
-
-
-void _requestPackagesMap() {
-  assert(_packagesPort == null);
-  assert(_rootScript != null);
-  // Create a port to receive the packages map on.
-  _packagesPort = new RawReceivePort(_handlePackagesReply);
-  var sp = _packagesPort.sendPort;
-
-  var msg = new List(4);
-  msg[0] = sp;
-  msg[1] = _traceLoading;
-  msg[2] = -1;
-  msg[3] = _rootScript.toString();
-  _loadPort.send(msg);
-
-  if (_traceLoading) {
-    _log("Requested packages map for '$_rootScript'.");
-  }
-}
-
-
 // Embedder Entrypoint:
-// Request the load of a particular packages map.
-void _loadPackagesMap(String packagesParam) {
+void _setPackagesMap(String packagesParam) {
   if (!_setupCompleted) {
     _setupHooks();
   }
@@ -550,147 +231,36 @@
   if (_traceLoading) {
     _log('Resolved packages map to: $packagesUri');
   }
+}
 
-  // Request the loading and parsing of the packages map at the specified URI.
-  // Create a port to receive the packages map on.
-  assert(_packagesPort == null);
-  _packagesPort = new RawReceivePort(_handlePackagesReply);
-  var sp = _packagesPort.sendPort;
+// Resolves the script uri in the current working directory iff the given uri
+// did not specify a scheme (e.g. a path to a script file on the command line).
+String _resolveScriptUri(String scriptName) {
+  if (_traceLoading) {
+    _log("Resolving script: $scriptName");
+  }
+  if (_workingDirectory == null) {
+    throw 'No current working directory set.';
+  }
+  scriptName = _sanitizeWindowsPath(scriptName);
 
-  var msg = new List(4);
-  msg[0] = sp;
-  msg[1] = _traceLoading;
-  msg[2] = -2;
-  msg[3] = packagesUriStr;
-  _loadPort.send(msg);
+  var scriptUri = Uri.parse(scriptName);
+  if (scriptUri.scheme == '') {
+    // Script does not have a scheme, assume that it is a path,
+    // resolve it against the working directory.
+    scriptUri = _workingDirectory.resolveUri(scriptUri);
+  }
 
-  // Signal that the resolution of the packages map has started. But in this
-  // case it is not tied to a particular request.
-  _pendingPackageLoads.add(() {
-    // Nothing to be done beyond registering that there is pending package
-    // resolution requested by having an empty entry.
-    if (_traceLoading) {
-      _log("Skipping dummy deferred request.");
-    }
-  });
+  // Remember the root script URI so that we can resolve packages based on
+  // this location.
+  _rootScript = scriptUri;
 
   if (_traceLoading) {
-    _log("Requested packages map at '$packagesUri'.");
+    _log('Resolved entry point to: $_rootScript');
   }
+  return scriptUri.toString();
 }
 
-
-void _asyncLoadError(_LoadRequest req, _LoadError error, StackTrace stack) {
-  if (_traceLoading) {
-    _log("_asyncLoadError(${req._uri}), error: $error\nstack: $stack");
-  }
-  if (req._tag == _Dart_kResourceLoad) {
-    Completer c = req._context;
-    c.completeError(error, stack);
-  } else {
-    String libraryUri = req._context;
-    if (req._tag == _Dart_kImportTag) {
-      // When importing a library, the libraryUri is the imported
-      // uri.
-      libraryUri = req._uri;
-    }
-    _asyncLoadErrorCallback(req._uri, libraryUri, error);
-  }
-  _finishLoadRequest(req);
-}
-
-
-_loadDataFromLoadPort(int tag, String uri, Uri resourceUri, context) {
-  try {
-    _startLoadRequest(tag, uri, resourceUri, context);
-  } catch (e, s) {
-    if (_traceLoading) {
-      _log("Exception when communicating with service isolate: $e");
-    }
-    // Register a dummy load request so we can fail to load it.
-    var req = new _LoadRequest(tag, uri, resourceUri, context);
-
-    // Wrap inside a _LoadError unless we are already propagating a previously
-    // seen _LoadError.
-    var error = (e is _LoadError) ? e : new _LoadError(req, e.toString());
-    _asyncLoadError(req, error, s);
-  }
-}
-
-
-// Loading a package URI needs to first map the package name to a loadable
-// URI.
-_loadPackage(int tag, String uri, Uri resourceUri, context) {
-  if (_packagesReady) {
-    var resolvedUri;
-    try {
-      resolvedUri = _resolvePackageUri(resourceUri);
-    } catch (e, s) {
-      if (_traceLoading) {
-        _log("Exception ($e) when resolving package URI: $resourceUri");
-      }
-      // Register a dummy load request so we can fail to load it.
-      var req = new _LoadRequest(tag, uri, resourceUri, context);
-
-      // Wrap inside a _LoadError unless we are already propagating a previously
-      // seen _LoadError.
-      var error = (e is _LoadError) ? e : new _LoadError(req, e.toString());
-      _asyncLoadError(req, error, s);
-    }
-    _loadData(tag, uri, resolvedUri, context);
-  } else {
-    if (_pendingPackageLoads.isEmpty) {
-      // Package resolution has not been setup yet, and this is the first
-      // request for package resolution & loading.
-      _requestPackagesMap();
-    }
-    // Register the action of loading this package once the package resolution
-    // is ready.
-    _pendingPackageLoads.add(() {
-      if (_traceLoading) {
-        _log("Handling deferred package request: "
-             "$tag, $uri, $resourceUri, $context");
-      }
-      _loadPackage(tag, uri, resourceUri, context);
-    });
-    if (_traceLoading) {
-      _log("Pending package load of '$uri': "
-           "${_pendingPackageLoads.length} pending");
-    }
-  }
-}
-
-
-// Load the data associated with the resourceUri.
-_loadData(int tag, String uri, Uri resourceUri, context) {
-  if (resourceUri.scheme == 'package') {
-    // package based uris need to be resolved to the correct loadable location.
-    // The logic of which is handled seperately, and then _loadData is called
-    // recursively.
-    _loadPackage(tag, uri, resourceUri, context);
-  } else {
-    _loadDataFromLoadPort(tag, uri, resourceUri, context);
-  }
-}
-
-
-// Embedder Entrypoint:
-// Asynchronously loads script data through a http[s] or file uri.
-_loadDataAsync(int tag, String uri, String libraryUri) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  var resourceUri;
-  if (tag == _Dart_kScriptTag) {
-    resourceUri = _resolveScriptUri(uri);
-    uri = resourceUri.toString();
-  } else {
-    resourceUri = Uri.parse(uri);
-  }
-  _loadData(tag, uri, resourceUri, libraryUri);
-}
-
-
 // Embedder Entrypoint:
 // Function called by standalone embedder to resolve uris when the VM requests
 // Dart_kCanonicalizeUrl from the tag handler.
@@ -698,109 +268,20 @@
   if (!_setupCompleted) {
     _setupHooks();
   }
+
   if (_traceLoading) {
     _log('Resolving: $userString from $base');
   }
+
   var baseUri = Uri.parse(base);
   var result = baseUri.resolve(userString).toString();
   if (_traceLoading) {
     _log('Resolved $userString in $base to $result');
   }
+
   return result;
 }
 
-
-// Handling of access to the package root or package map from user code.
-_triggerPackageResolution(action) {
-  if (_packagesReady) {
-    // Packages are ready. Execute the action now.
-    action();
-  } else {
-    if (_pendingPackageLoads.isEmpty) {
-      // Package resolution has not been setup yet, and this is the first
-      // request for package resolution & loading.
-      _requestPackagesMap();
-    }
-    // Register the action for when the package resolution is ready.
-    _pendingPackageLoads.add(action);
-  }
-}
-
-
-Future<Uri> _getPackageRootFuture() {
-  if (_traceLoading) {
-    _log("Request for package root from user code.");
-  }
-  var completer = new Completer<Uri>();
-  _triggerPackageResolution(() {
-    completer.complete(_packageRoot);
-  });
-  return completer.future;
-}
-
-
-Future<Uri> _getPackageConfigFuture() {
-  if (_traceLoading) {
-    _log("Request for package config from user code.");
-  }
-  var completer = new Completer<Uri>();
-  _triggerPackageResolution(() {
-    completer.complete(_packageConfig);
-  });
-  return completer.future;
-}
-
-
-Future<Uri> _resolvePackageUriFuture(Uri packageUri) async {
-  if (_traceLoading) {
-    _log("Request for package Uri resolution from user code: $packageUri");
-  }
-  if (packageUri.scheme != "package") {
-    if (_traceLoading) {
-      _log("Non-package Uri, returning unmodified: $packageUri");
-    }
-    // Return the incoming parameter if not passed a package: URI.
-    return packageUri;
-  }
-
-  if (!_packagesReady) {
-    if (_traceLoading) {
-      _log("Trigger loading by requesting the package config.");
-    }
-    // Make sure to trigger package resolution.
-    var dummy = await _getPackageConfigFuture();
-  }
-  assert(_packagesReady);
-
-  var result;
-  try {
-    result = _resolvePackageUri(packageUri);
-  } catch (e, s) {
-    // Any error during resolution will resolve this package as not mapped,
-    // which is indicated by a null return.
-    if (_traceLoading) {
-      _log("Exception ($e) when resolving package URI: $packageUri");
-    }
-    result = null;
-  }
-  if (_traceLoading) {
-    _log("Resolved '$packageUri' to '$result'");
-  }
-  return result;
-}
-
-
-// Handling of Resource class by dispatching to the load port.
-Future<List<int>> _resourceReadAsBytes(Uri uri) {
-  var completer = new Completer<List<int>>();
-  // Request the load of the resource associating the completer as the context
-  // for the load.
-  _loadData(_Dart_kResourceLoad, uri.toString(), uri, completer);
-  // Return the future that will be triggered once the resource has been loaded.
-  return completer.future;
-}
-
-
 // Embedder Entrypoint (gen_snapshot):
 // Resolve relative paths relative to working directory.
 String _resolveInWorkingDirectory(String fileName) {
@@ -824,6 +305,11 @@
   return uri.toString();
 }
 
+// Only used by vm/cc unit tests.
+Uri _resolvePackageUri(Uri uri) {
+  assert(_packageRoot != null);
+  return _packageRoot.resolve(uri.path);
+}
 
 // Returns either a file path or a URI starting with http[s]:, as a String.
 String _filePathFromUri(String userUri) {
@@ -853,7 +339,6 @@
   }
 }
 
-
 // Embedder Entrypoint.
 _libraryFilePath(String libraryUri) {
   if (!_setupCompleted) {
@@ -869,7 +354,6 @@
   return _filePathFromUri(path);
 }
 
-
 // Register callbacks and hooks with the rest of the core libraries.
 _setupHooks() {
   _setupCompleted = true;
@@ -879,3 +363,54 @@
   VMLibraryHooks.packageConfigUriFuture = _getPackageConfigFuture;
   VMLibraryHooks.resolvePackageUriFuture = _resolvePackageUriFuture;
 }
+
+// Handling of Resource class by dispatching to the load port.
+Future<List<int>> _resourceReadAsBytes(Uri uri) async {
+  List response = await _makeLoaderRequest(_Dart_kResourceLoad, uri.toString());
+  if (response[3] is String) {
+    // Throw the error.
+    throw response[3];
+  } else {
+    return response[3];
+  }
+}
+
+Future<Uri> _getPackageRootFuture() {
+  if (_traceLoading) {
+    _log("Request for package root from user code.");
+  }
+  return _makeLoaderRequest(_Dart_kGetPackageRootUri, null);
+}
+
+Future<Uri> _getPackageConfigFuture() {
+  if (_traceLoading) {
+    _log("Request for package config from user code.");
+  }
+  assert(_loadPort != null);
+  return _makeLoaderRequest(_Dart_kGetPackageConfigUri, null);
+}
+
+Future<Uri> _resolvePackageUriFuture(Uri packageUri) async {
+  if (_traceLoading) {
+    _log("Request for package Uri resolution from user code: $packageUri");
+  }
+  if (packageUri.scheme != "package") {
+    if (_traceLoading) {
+      _log("Non-package Uri, returning unmodified: $packageUri");
+    }
+    // Return the incoming parameter if not passed a package: URI.
+    return packageUri;
+  }
+  var result = await _makeLoaderRequest(_Dart_kResolvePackageUri,
+                                        packageUri.toString());
+  if (result is! Uri) {
+    if (_traceLoading) {
+      _log("Exception when resolving package URI: $packageUri");
+    }
+    result = null;
+  }
+  if (_traceLoading) {
+    _log("Resolved '$packageUri' to '$result'");
+  }
+  return result;
+}
diff --git a/runtime/bin/builtin.h b/runtime/bin/builtin.h
index a4893d9..5029cf1 100644
--- a/runtime/bin/builtin.h
+++ b/runtime/bin/builtin.h
@@ -51,6 +51,11 @@
 
   static Dart_Handle SetLoadPort(Dart_Port port);
 
+  static Dart_Port LoadPort() {
+    ASSERT(load_port_ != ILLEGAL_PORT);
+    return load_port_;
+  }
+
  private:
   // Map specified URI to an actual file name from 'source_paths' and read
   // the file.
diff --git a/runtime/bin/builtin_common.cc b/runtime/bin/builtin_common.cc
index 678e48b..79713e1 100644
--- a/runtime/bin/builtin_common.cc
+++ b/runtime/bin/builtin_common.cc
@@ -23,13 +23,18 @@
 namespace bin {
 
 Dart_Handle Builtin::SetLoadPort(Dart_Port port) {
+  Dart_Handle builtin_lib =
+      Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
+  RETURN_IF_ERROR(builtin_lib);
+  // Set the _isolateId field.
+  Dart_Handle result = Dart_SetField(builtin_lib,
+                                     DartUtils::NewString("_isolateId"),
+                                     Dart_NewInteger(Dart_GetMainPortId()));
+  RETURN_IF_ERROR(result);
   load_port_ = port;
   ASSERT(load_port_ != ILLEGAL_PORT);
   Dart_Handle field_name = DartUtils::NewString("_loadPort");
   RETURN_IF_ERROR(field_name);
-  Dart_Handle builtin_lib =
-      Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
-  RETURN_IF_ERROR(builtin_lib);
   Dart_Handle send_port = Dart_GetField(builtin_lib, field_name);
   RETURN_IF_ERROR(send_port);
   if (!Dart_IsNull(send_port)) {
@@ -38,7 +43,7 @@
   }
   send_port = Dart_NewSendPort(load_port_);
   RETURN_IF_ERROR(send_port);
-  Dart_Handle result = Dart_SetField(builtin_lib, field_name, send_port);
+  result = Dart_SetField(builtin_lib, field_name, send_port);
   RETURN_IF_ERROR(result);
   return Dart_True();
 }
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index eb90ddf..f775ffc 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -47,6 +47,8 @@
     'io_buffer.cc',
     'io_buffer.h',
     'isolate_data.h',
+    'loader.cc',
+    'loader.h',
     'lockers.h',
     'thread.h',
     'thread_android.cc',
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index b7f418b..c0d6072 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -379,6 +379,17 @@
 }
 
 
+Dart_Handle DartUtils::ResolveScript(Dart_Handle url) {
+  const int kNumArgs = 1;
+  Dart_Handle dart_args[kNumArgs];
+  dart_args[0] = url;
+  return Dart_Invoke(DartUtils::BuiltinLib(),
+                     NewString("_resolveScriptUri"),
+                     kNumArgs,
+                     dart_args);
+}
+
+
 static Dart_Handle LoadDataAsync_Invoke(Dart_Handle tag,
                                         Dart_Handle url,
                                         Dart_Handle library_url) {
@@ -397,6 +408,9 @@
 Dart_Handle DartUtils::LibraryTagHandler(Dart_LibraryTag tag,
                                          Dart_Handle library,
                                          Dart_Handle url) {
+  if (tag == Dart_kCanonicalizeUrl) {
+    return Dart_DefaultCanonicalizeUrl(library, url);
+  }
   if (!Dart_IsLibrary(library)) {
     return Dart_NewApiError("not a library");
   }
@@ -420,10 +434,7 @@
 
   // Handle canonicalization, 'import' and 'part' of 'dart:' libraries.
   if (is_dart_scheme_url || is_dart_library) {
-    if (tag == Dart_kCanonicalizeUrl) {
-      // These will be handled internally.
-      return url;
-    } else if (tag == Dart_kImportTag) {
+    if (tag == Dart_kImportTag) {
       Builtin::BuiltinLibraryId id = Builtin::FindId(url_string);
       if (id == Builtin::kInvalidLibrary) {
         return NewError("The built-in library '%s' is not available"
@@ -452,11 +463,6 @@
     UNREACHABLE();
   }
 
-  if (tag == Dart_kCanonicalizeUrl) {
-    // Resolve the url within the context of the library's URL.
-    return ResolveUri(library_url, url);
-  }
-
   if (DartUtils::IsDartExtensionSchemeURL(url_string)) {
     // Load a native code shared library to use in a native extension
     if (tag != Dart_kImportTag) {
@@ -747,7 +753,7 @@
     Dart_Handle dart_args[kNumArgs];
     dart_args[0] = result;
     result = Dart_Invoke(DartUtils::BuiltinLib(),
-                         NewString("_loadPackagesMap"),
+                         NewString("_setPackagesMap"),
                          kNumArgs,
                          dart_args);
     RETURN_IF_ERROR(result);
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index b416a93..9c3bc72 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -200,6 +200,7 @@
   static Dart_Handle ResolveUriInWorkingDirectory(Dart_Handle script_uri);
   static Dart_Handle FilePathFromUri(Dart_Handle script_uri);
   static Dart_Handle ResolveUri(Dart_Handle library_url, Dart_Handle url);
+  static Dart_Handle ResolveScript(Dart_Handle url);
 
   // Sniffs the specified text_buffer to see if it contains the magic number
   // representing a script snapshot. If the text_buffer is a script snapshot
@@ -231,9 +232,10 @@
 
   static const uint8_t magic_number[];
 
+  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
+
  private:
   static Dart_Handle SetWorkingDirectory();
-  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
   static Dart_Handle PrepareBuiltinLibrary(Dart_Handle builtin_lib,
                                            Dart_Handle internal_lib,
                                            bool is_service_isolate,
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 3e18248..5d70175 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -63,7 +63,17 @@
 static const char* assembly_filename = NULL;
 static const char* instructions_blob_filename = NULL;
 static const char* rodata_blob_filename = NULL;
-static const char* package_root = NULL;
+
+
+// Value of the --package-root flag.
+// (This pointer points into an argv buffer and does not need to be
+// free'd.)
+static const char* commandline_package_root = NULL;
+
+// Value of the --packages flag.
+// (This pointer points into an argv buffer and does not need to be
+// free'd.)
+static const char* commandline_packages_file = NULL;
 
 
 // Global state which contains a pointer to the script name for which
@@ -249,7 +259,17 @@
     name = ProcessOption(option, "--package-root=");
   }
   if (name != NULL) {
-    package_root = name;
+    commandline_package_root = name;
+    return true;
+  }
+  return false;
+}
+
+
+static bool ProcessPackagesOption(const char* option) {
+  const char* name = ProcessOption(option, "--packages=");
+  if (name != NULL) {
+    commandline_packages_file = name;
     return true;
   }
   return false;
@@ -296,6 +316,7 @@
         ProcessEmbedderEntryPointsManifestOption(argv[i]) ||
         ProcessURLmappingOption(argv[i]) ||
         ProcessPackageRootOption(argv[i]) ||
+        ProcessPackagesOption(argv[i]) ||
         ProcessEnvironmentOption(argv[i])) {
       i += 1;
       continue;
@@ -312,6 +333,14 @@
     *script_name = NULL;
   }
 
+  // Verify consistency of arguments.
+  if ((commandline_package_root != NULL) &&
+      (commandline_packages_file != NULL)) {
+    Log::PrintErr("Specifying both a packages directory and a packages "
+                  "file is invalid.\n");
+    return -1;
+  }
+
   if (vm_isolate_snapshot_filename == NULL) {
     Log::PrintErr("No vm isolate snapshot output file specified.\n\n");
     return -1;
@@ -452,7 +481,7 @@
 
     // Run DartUtils::ResolveUri in context of uri resolver isolate.
     Dart_Handle result = DartUtils::ResolveUri(
-        DartUtils::NewString(library_uri), DartUtils::NewString(uri));
+      DartUtils::NewString(library_uri), DartUtils::NewString(uri));
     if (Dart_IsError(result)) {
       failed = true;
       result_string = strdup(Dart_GetError(result));
@@ -468,6 +497,7 @@
 }
 
 
+
 static Builtin::BuiltinLibraryId BuiltinId(const char* url) {
   if (DartUtils::IsDartBuiltinLibURL(url)) {
     return Builtin::kBuiltinLibrary;
@@ -645,6 +675,8 @@
 "    --package_root=<path>             Where to find packages, that is,      \n"
 "                                      package:...  imports.                 \n"
 "                                                                            \n"
+"    --packages=<packages_file>        Where to find a package spec file     \n"
+"                                                                            \n"
 "    --url_mapping=<mapping>           Uses the URL mapping(s) specified on  \n"
 "                                      the command line to load the          \n"
 "                                      libraries.                            \n"
@@ -1285,7 +1317,8 @@
     CHECK_RESULT(result);
 
     // Setup package root if specified.
-    result = DartUtils::SetupPackageRoot(package_root, NULL);
+    result = DartUtils::SetupPackageRoot(commandline_package_root,
+                                         commandline_packages_file);
     CHECK_RESULT(result);
 
     Dart_ExitScope();
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 6532fbc..a5e8bfb 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -14,6 +14,7 @@
 
 // Forward declaration.
 class EventHandler;
+class Loader;
 
 // Data associated with every isolate in the standalone VM
 // embedding. This is used to free external resources for each isolate
@@ -27,7 +28,8 @@
         package_root(NULL),
         packages_file(NULL),
         udp_receive_buffer(NULL),
-        builtin_lib_(NULL) {
+        builtin_lib_(NULL),
+        loader_(NULL) {
     if (package_root != NULL) {
       ASSERT(packages_file == NULL);
       this->package_root = strdup(package_root);
@@ -67,8 +69,20 @@
   char* packages_file;
   uint8_t* udp_receive_buffer;
 
+  // While loading a loader is associated with the isolate.
+  bool HasLoader() const { return loader_ != NULL; }
+  Loader* loader() const {
+    ASSERT(loader_ != NULL);
+    return loader_;
+  }
+  void set_loader(Loader* loader) {
+    ASSERT((loader_ == NULL) || (loader == NULL));
+    loader_ = loader;
+  }
+
  private:
   Dart_Handle builtin_lib_;
+  Loader* loader_;
 
   DISALLOW_COPY_AND_ASSIGN(IsolateData);
 };
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
new file mode 100644
index 0000000..f43cf30
--- /dev/null
+++ b/runtime/bin/loader.cc
@@ -0,0 +1,585 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+#include "bin/loader.h"
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "bin/extensions.h"
+#include "bin/lockers.h"
+#include "bin/utils.h"
+
+namespace dart {
+namespace bin {
+
+// Development flag.
+static bool trace_loader = false;
+
+Loader::Loader(IsolateData* isolate_data)
+    : port_(ILLEGAL_PORT),
+      isolate_data_(isolate_data),
+      error_(Dart_Null()),
+      monitor_(NULL),
+      pending_operations_(0),
+      results_(NULL),
+      results_length_(0),
+      results_capacity_(0) {
+  monitor_ = new Monitor();
+  ASSERT(isolate_data_ != NULL);
+  port_ = Dart_NewNativePort("Loader",
+                             Loader::NativeMessageHandler,
+                             false);
+  isolate_data_->set_loader(this);
+  AddLoader(port_, isolate_data_);
+}
+
+
+Loader::~Loader() {
+  ASSERT(port_ != ILLEGAL_PORT);
+  // Enter the monitor while we close the Dart port. After the Dart port is
+  // closed, no more results can be queued.
+  monitor_->Enter();
+  Dart_CloseNativePort(port_);
+  monitor_->Exit();
+  RemoveLoader(port_);
+  port_ = ILLEGAL_PORT;
+  isolate_data_->set_loader(NULL);
+  isolate_data_ = NULL;
+  delete monitor_;
+  monitor_ = NULL;
+  for (intptr_t i = 0; i < results_length_; i++) {
+    results_[i].Cleanup();
+  }
+  free(results_);
+  results_ = NULL;
+}
+
+
+// Copy the contents of |message| into an |IOResult|.
+void Loader::IOResult::Setup(Dart_CObject* message) {
+  ASSERT(message->type == Dart_CObject_kArray);
+  ASSERT(message->value.as_array.length == 4);
+  Dart_CObject* tag_message = message->value.as_array.values[0];
+  ASSERT(tag_message != NULL);
+  Dart_CObject* uri_message = message->value.as_array.values[1];
+  ASSERT(uri_message != NULL);
+  Dart_CObject* library_uri_message = message->value.as_array.values[2];
+  ASSERT(library_uri_message != NULL);
+  Dart_CObject* payload_message = message->value.as_array.values[3];
+  ASSERT(payload_message != NULL);
+
+  // Grab the tag.
+  ASSERT(tag_message->type == Dart_CObject_kInt32);
+  tag = tag_message->value.as_int32;
+
+  // Grab the uri id.
+  ASSERT(uri_message->type == Dart_CObject_kString);
+  uri = strdup(uri_message->value.as_string);
+
+  // Grab the library uri if one is present.
+  if (library_uri_message->type != Dart_CObject_kNull) {
+    ASSERT(library_uri_message->type == Dart_CObject_kString);
+    library_uri = strdup(library_uri_message->value.as_string);
+  } else {
+    library_uri = NULL;
+  }
+
+  // Grab the payload.
+  if (payload_message->type == Dart_CObject_kString) {
+    // Payload is an error message.
+    payload_length = strlen(payload_message->value.as_string);
+    payload =
+        reinterpret_cast<uint8_t*>(strdup(payload_message->value.as_string));
+  } else {
+    // Payload is the contents of a file.
+    ASSERT(payload_message->type == Dart_CObject_kTypedData);
+    ASSERT(payload_message->value.as_typed_data.type == Dart_TypedData_kUint8);
+    payload_length = payload_message->value.as_typed_data.length;
+    payload = reinterpret_cast<uint8_t*>(malloc(payload_length));
+    memmove(payload,
+            payload_message->value.as_typed_data.values,
+            payload_length);
+  }
+}
+
+
+void Loader::IOResult::Cleanup() {
+  free(uri);
+  free(library_uri);
+  free(payload);
+}
+
+
+// Send the Loader Initialization message to the service isolate. This
+// message is sent the first time a loader is constructed for an isolate and
+// seeds the service isolate with some initial state about this isolate.
+void Loader::Init(const char* package_root,
+                  const char* packages_file,
+                  const char* working_directory,
+                  const char* root_script_uri) {
+  // This port delivers loading messages to the service isolate.
+  Dart_Port loader_port = Builtin::LoadPort();
+  ASSERT(loader_port != ILLEGAL_PORT);
+
+  // Keep in sync with loader.dart.
+  const intptr_t _Dart_kInitLoader = 4;
+
+  Dart_Handle request = Dart_NewList(8);
+  Dart_ListSetAt(request, 0, trace_loader ? Dart_True() : Dart_False());
+  Dart_ListSetAt(request, 1, Dart_NewInteger(Dart_GetMainPortId()));
+  Dart_ListSetAt(request, 2, Dart_NewInteger(_Dart_kInitLoader));
+  Dart_ListSetAt(request, 3, Dart_NewSendPort(port_));
+  Dart_ListSetAt(request, 4,
+                 (package_root == NULL) ? Dart_Null() :
+                      Dart_NewStringFromCString(package_root));
+  Dart_ListSetAt(request, 5,
+                 (packages_file == NULL) ? Dart_Null() :
+                      Dart_NewStringFromCString(packages_file));
+  Dart_ListSetAt(request, 6,
+                      Dart_NewStringFromCString(working_directory));
+  Dart_ListSetAt(request, 7,
+                 (root_script_uri == NULL) ? Dart_Null() :
+                      Dart_NewStringFromCString(root_script_uri));
+
+  bool success = Dart_Post(loader_port, request);
+  ASSERT(success);
+}
+
+
+// Forward a request from the tag handler to the service isolate.
+void Loader::SendRequest(Dart_LibraryTag tag,
+                         Dart_Handle url,
+                         Dart_Handle library_url) {
+  // This port delivers loading messages to the service isolate.
+  Dart_Port loader_port = Builtin::LoadPort();
+  ASSERT(loader_port != ILLEGAL_PORT);
+
+  Dart_Handle request = Dart_NewList(6);
+  Dart_ListSetAt(request, 0, trace_loader ? Dart_True() : Dart_False());
+  Dart_ListSetAt(request, 1, Dart_NewInteger(Dart_GetMainPortId()));
+  Dart_ListSetAt(request, 2, Dart_NewInteger(tag));
+  Dart_ListSetAt(request, 3, Dart_NewSendPort(port_));
+
+  Dart_ListSetAt(request, 4, url);
+  Dart_ListSetAt(request, 5, library_url);
+
+  if (Dart_Post(loader_port, request)) {
+    MonitorLocker ml(monitor_);
+    pending_operations_++;
+  }
+}
+
+
+void Loader::QueueMessage(Dart_CObject* message) {
+  MonitorLocker ml(monitor_);
+  if (results_length_ == results_capacity_) {
+    // Grow to an initial capacity or double in size.
+    results_capacity_ = (results_capacity_ == 0) ? 4 : results_capacity_ * 2;
+    results_ =
+        reinterpret_cast<IOResult*>(
+            realloc(results_,
+                    sizeof(IOResult) * results_capacity_));
+    ASSERT(results_ != NULL);
+  }
+  ASSERT(results_ != NULL);
+  ASSERT(results_length_ < results_capacity_);
+  results_[results_length_].Setup(message);
+  results_length_++;
+  ml.Notify();
+}
+
+
+void Loader::BlockUntilComplete() {
+  MonitorLocker ml(monitor_);
+
+  while (true) {
+    // If |ProcessQueueLocked| returns false, we've hit an error and should
+    // stop loading.
+    if (!ProcessQueueLocked()) {
+      break;
+    }
+
+    // When |pending_operations_| hits 0, we are done loading.
+    if (pending_operations_ == 0) {
+      break;
+    }
+
+    // Wait to be notified about new I/O results.
+    ml.Wait();
+  }
+}
+
+
+bool Loader::ProcessResultLocked(Loader::IOResult* result) {
+  // A negative result tag indicates a loading error occurred in the service
+  // isolate. The payload is a C string of the error message.
+  if (result->tag < 0) {
+    error_ =
+        Dart_NewUnhandledExceptionError(
+            Dart_NewStringFromUTF8(result->payload,
+                                   result->payload_length));
+
+    return false;
+  }
+
+  // We have to copy everything we care about out of |result| because after
+  // dropping the lock below |result| may no longer valid.
+  Dart_Handle uri =
+      Dart_NewStringFromCString(reinterpret_cast<char*>(result->uri));
+  Dart_Handle library_uri = Dart_Null();
+  if (result->library_uri != NULL) {
+    library_uri =
+        Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri));
+  }
+  // Check for payload and load accordingly.
+  bool is_snapshot = false;
+  const uint8_t* payload = result->payload;
+  intptr_t payload_length = result->payload_length;
+  payload =
+      DartUtils::SniffForMagicNumber(payload,
+                                     &payload_length,
+                                     &is_snapshot);
+  Dart_Handle source = Dart_Null();
+  if (!is_snapshot) {
+    source = Dart_NewStringFromUTF8(result->payload,
+                                    result->payload_length);
+    if (Dart_IsError(source)) {
+      error_  = DartUtils::NewError("%s is not a valid UTF-8 script",
+                                    reinterpret_cast<char*>(result->uri));
+      return false;
+    }
+  }
+  intptr_t tag = result->tag;
+
+  // No touching.
+  result = NULL;
+
+  // We must drop the lock here because the tag handler may be recursively
+  // invoked and it will attempt to acquire the lock to queue more work.
+  monitor_->Exit();
+
+  Dart_Handle dart_result = Dart_Null();
+
+  switch (tag) {
+    case Dart_kImportTag:
+      dart_result = Dart_LoadLibrary(uri, source, 0, 0);
+    break;
+    case Dart_kSourceTag: {
+      ASSERT(library_uri != Dart_Null());
+      Dart_Handle library = Dart_LookupLibrary(library_uri);
+      ASSERT(!Dart_IsError(library));
+      dart_result = Dart_LoadSource(library, uri, source, 0, 0);
+    }
+    break;
+    case Dart_kScriptTag:
+      if (is_snapshot) {
+        dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length);
+      } else {
+        dart_result = Dart_LoadScript(uri, source, 0, 0);
+      }
+    break;
+    default:
+      UNREACHABLE();
+  }
+
+  // Re-acquire the lock before exiting the function (it was held before entry),
+  monitor_->Enter();
+  if (Dart_IsError(dart_result)) {
+    // Remember the error if we encountered one.
+    error_ = dart_result;
+    return false;
+  }
+
+  return true;
+}
+
+
+bool Loader::ProcessQueueLocked() {
+  bool hit_error = false;
+  for (intptr_t i = 0; i < results_length(); i++) {
+    if (!hit_error) {
+      hit_error = !ProcessResultLocked(&results_[i]);
+    }
+    pending_operations_--;
+    ASSERT(hit_error || (pending_operations_ >= 0));
+    results_[i].Cleanup();
+  }
+  results_length_ = 0;
+  return !hit_error;
+}
+
+
+static bool IsWindowsHost() {
+#if defined(TARGET_OS_WINDOWS)
+  return true;
+#else  // defined(TARGET_OS_WINDOWS)
+  return false;
+#endif  // defined(TARGET_OS_WINDOWS)
+}
+
+
+void Loader::InitForSnapshot(const char* snapshot_uri) {
+  IsolateData* isolate_data =
+      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+  ASSERT(isolate_data != NULL);
+  ASSERT(!isolate_data->HasLoader());
+  // Setup a loader. The constructor does a bunch of leg work.
+  Loader* loader = new Loader(isolate_data);
+  // Send the init message.
+  loader->Init(isolate_data->package_root,
+               isolate_data->packages_file,
+               DartUtils::original_working_directory,
+               snapshot_uri);
+  // Destroy the loader. The destructor does a bunch of leg work.
+  delete loader;
+}
+
+
+Dart_Handle Loader::LibraryTagHandler(Dart_LibraryTag tag,
+                                      Dart_Handle library,
+                                      Dart_Handle url) {
+  if (tag == Dart_kCanonicalizeUrl) {
+    return Dart_DefaultCanonicalizeUrl(library, url);
+  }
+  const char* url_string = NULL;
+  Dart_Handle result = Dart_StringToCString(url, &url_string);
+  if (Dart_IsError(result)) {
+    return result;
+  }
+
+  // Special case for handling dart: imports and parts.
+  if (tag != Dart_kScriptTag) {
+    // Grab the library's url.
+    Dart_Handle library_url = Dart_LibraryUrl(library);
+    const char* library_url_string = NULL;
+    result = Dart_StringToCString(library_url, &library_url_string);
+    if (Dart_IsError(result)) {
+      return result;
+    }
+
+    bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_string);
+    bool is_dart_library = DartUtils::IsDartSchemeURL(library_url_string);
+
+    if (is_dart_scheme_url || is_dart_library) {
+      return DartColonLibraryTagHandler(tag,
+                                        library,
+                                        url,
+                                        library_url_string,
+                                        url_string);
+    }
+  }
+
+  if (DartUtils::IsDartExtensionSchemeURL(url_string)) {
+    // Load a native code shared library to use in a native extension
+    if (tag != Dart_kImportTag) {
+      return DartUtils::NewError("Dart extensions must use import: '%s'",
+                                 url_string);
+    }
+    Dart_Handle library_url = Dart_LibraryUrl(library);
+    Dart_Handle library_file_path = DartUtils::LibraryFilePath(library_url);
+    const char* lib_path_str = NULL;
+    Dart_StringToCString(library_file_path, &lib_path_str);
+    const char* extension_path = DartUtils::RemoveScheme(url_string);
+    if (strchr(extension_path, '/') != NULL ||
+        (IsWindowsHost() && strchr(extension_path, '\\') != NULL)) {
+      return DartUtils::NewError(
+          "Relative paths for dart extensions are not supported: '%s'",
+          extension_path);
+    }
+    return Extensions::LoadExtension(lib_path_str,
+                                     extension_path,
+                                     library);
+  }
+
+  IsolateData* isolate_data =
+      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+  ASSERT(isolate_data != NULL);
+
+  // Grab this isolate's loader.
+  Loader* loader = NULL;
+
+  // The outer invocation of the tag handler for this isolate. We make the outer
+  // invocation block and allow any nested invocations to operate in parallel.
+  bool blocking_call = !isolate_data->HasLoader();
+
+  if (!isolate_data->HasLoader()) {
+    // The isolate doesn't have a loader -- this is the outer invocation which
+    // will block.
+
+    // Setup the loader. The constructor does a bunch of leg work.
+    loader = new Loader(isolate_data);
+    loader->Init(isolate_data->package_root,
+                 isolate_data->packages_file,
+                 DartUtils::original_working_directory,
+                 (tag == Dart_kScriptTag) ? url_string : NULL);
+  } else {
+    ASSERT(tag != Dart_kScriptTag);
+    // The isolate has a loader -- this is an inner invocation that will queue
+    // work with the service isolate.
+    // Use the existing loader.
+    loader = isolate_data->loader();
+  }
+  ASSERT(loader != NULL);
+  ASSERT(isolate_data->HasLoader());
+
+  loader->SendRequest(tag,
+                      url,
+                      (library != Dart_Null()) ?
+                          Dart_LibraryUrl(library) : Dart_Null());
+
+  if (blocking_call) {
+    // The outer invocation of the tag handler will block here until all nested
+    // invocations complete.
+    loader->BlockUntilComplete();
+
+    // Remember the error (if any).
+    Dart_Handle error = loader->error();
+    // Destroy the loader. The destructor does a bunch of leg work.
+    delete loader;
+
+    // An error occurred during loading.
+    if (Dart_IsError(error)) {
+      return error;
+    }
+
+    // Finalize loading. This will complete any futures for completed deferred
+    // loads.
+    error = Dart_FinalizeLoading(true);
+    if (Dart_IsError(error)) {
+      return error;
+    }
+  }
+  return Dart_Null();
+}
+
+
+Dart_Handle Loader::DartColonLibraryTagHandler(Dart_LibraryTag tag,
+                                               Dart_Handle library,
+                                               Dart_Handle url,
+                                               const char* library_url_string,
+                                               const char* url_string) {
+  // Handle canonicalization, 'import' and 'part' of 'dart:' libraries.
+  if (tag == Dart_kCanonicalizeUrl) {
+    // These will be handled internally.
+    return url;
+  } else if (tag == Dart_kImportTag) {
+    Builtin::BuiltinLibraryId id = Builtin::FindId(url_string);
+    if (id == Builtin::kInvalidLibrary) {
+      return DartUtils::NewError("The built-in library '%s' is not available"
+                                 " on the stand-alone VM.\n", url_string);
+    }
+    return Builtin::LoadLibrary(url, id);
+  } else {
+    ASSERT(tag == Dart_kSourceTag);
+    Builtin::BuiltinLibraryId id = Builtin::FindId(library_url_string);
+    if (id == Builtin::kInvalidLibrary) {
+      return DartUtils::NewError("The built-in library '%s' is not available"
+                                 " on the stand-alone VM. Trying to load"
+                                 " '%s'.\n", library_url_string, url_string);
+    }
+    // Prepend the library URI to form a unique script URI for the part.
+    intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
+    char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
+    snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
+    Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
+    free(part_uri);
+    return Dart_LoadSource(library,
+                           part_uri_obj,
+                           Builtin::PartSource(id, url_string), 0, 0);
+  }
+  // All cases should have been handled above.
+  UNREACHABLE();
+}
+
+
+Mutex Loader::loader_infos_lock_;
+Loader::LoaderInfo* Loader::loader_infos_ = NULL;
+intptr_t Loader::loader_infos_length_ = 0;
+intptr_t Loader::loader_infos_capacity_ = 0;
+
+
+// Add a mapping from |port| to |isolate_data| (really the loader). When a
+// native message arrives, we use this map to report the I/O result to the
+// correct loader.
+// This happens whenever an isolate begins loading.
+void Loader::AddLoader(Dart_Port port, IsolateData* isolate_data) {
+  MutexLocker ml(&loader_infos_lock_);
+  ASSERT(LoaderForLocked(port) == NULL);
+  if (loader_infos_length_ == loader_infos_capacity_) {
+    // Grow to an initial capacity or double in size.
+    loader_infos_capacity_ =
+        (loader_infos_capacity_ == 0) ? 4 : loader_infos_capacity_ * 2;
+    loader_infos_ =
+        reinterpret_cast<Loader::LoaderInfo*>(
+            realloc(loader_infos_,
+                    sizeof(Loader::LoaderInfo) * loader_infos_capacity_));
+    ASSERT(loader_infos_ != NULL);
+    // Initialize new entries.
+    for (intptr_t i = loader_infos_length_; i < loader_infos_capacity_; i++) {
+      loader_infos_[i].port = ILLEGAL_PORT;
+      loader_infos_[i].isolate_data = NULL;
+    }
+  }
+  ASSERT(loader_infos_length_ < loader_infos_capacity_);
+  loader_infos_[loader_infos_length_].port = port;
+  loader_infos_[loader_infos_length_].isolate_data = isolate_data;
+  loader_infos_length_++;
+  ASSERT(LoaderForLocked(port) != NULL);
+}
+
+
+// Remove |port| from the map.
+// This happens once an isolate has finished loading.
+void Loader::RemoveLoader(Dart_Port port) {
+  MutexLocker ml(&loader_infos_lock_);
+  const intptr_t index = LoaderIndexFor(port);
+  ASSERT(index >= 0);
+  const intptr_t last = loader_infos_length_ - 1;
+  ASSERT(last >= 0);
+  if (index != last) {
+    // Swap with the tail.
+    loader_infos_[index] = loader_infos_[last];
+  }
+  loader_infos_length_--;
+}
+
+
+intptr_t Loader::LoaderIndexFor(Dart_Port port) {
+  for (intptr_t i = 0; i < loader_infos_length_; i++) {
+    if (loader_infos_[i].port == port) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+
+Loader* Loader::LoaderForLocked(Dart_Port port) {
+  intptr_t index = LoaderIndexFor(port);
+  if (index < 0) {
+    return NULL;
+  }
+  return loader_infos_[index].isolate_data->loader();
+}
+
+
+Loader* Loader::LoaderFor(Dart_Port port) {
+  MutexLocker ml(&loader_infos_lock_);
+  return LoaderForLocked(port);
+}
+
+
+void Loader::NativeMessageHandler(Dart_Port dest_port_id,
+                                  Dart_CObject* message) {
+  MutexLocker ml(&loader_infos_lock_);
+  Loader* loader = LoaderForLocked(dest_port_id);
+  if (loader == NULL) {
+    return;
+  }
+  loader->QueueMessage(message);
+}
+
+}  // namespace bin
+}  // namespace dart
diff --git a/runtime/bin/loader.h b/runtime/bin/loader.h
new file mode 100644
index 0000000..bab237b
--- /dev/null
+++ b/runtime/bin/loader.h
@@ -0,0 +1,131 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef BIN_LOADER_H_
+#define BIN_LOADER_H_
+
+#include "bin/isolate_data.h"
+#include "include/dart_api.h"
+#include "include/dart_native_api.h"
+#include "platform/assert.h"
+#include "platform/globals.h"
+#include "bin/thread.h"
+
+namespace dart {
+namespace bin {
+
+class Loader {
+ public:
+  explicit Loader(IsolateData* isolate_data);
+  ~Loader();
+
+  static void InitForSnapshot(const char* snapshot_uri);
+
+  // A static tag handler that hides all usage of a loader for an isolate.
+  static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
+                                       Dart_Handle library,
+                                       Dart_Handle url);
+
+  Dart_Handle error() const {
+    return error_;
+  }
+
+ private:
+  // The port assigned to our native message handler.
+  Dart_Port port_;
+  // Each Loader is associated with an Isolate via its IsolateData.
+  IsolateData* isolate_data_;
+  // Remember the first error that occurs during loading.
+  Dart_Handle error_;
+
+  // This monitor is used to protect the pending operations count and the
+  // I/O result queue.
+  Monitor* monitor_;
+
+  // The number of operations dispatched to the service isolate for loading.
+  // Must be accessed with monitor_ held.
+  intptr_t pending_operations_;
+
+  // The result of an I/O request to the service isolate. Payload is either
+  // a UInt8Array or a C string containing an error message.
+  struct IOResult {
+    uint8_t* payload;
+    intptr_t payload_length;
+    char* library_uri;
+    char* uri;
+    int8_t tag;
+
+    void Setup(Dart_CObject* message);
+    void Cleanup();
+  };
+  // An array of I/O results queued from the service isolate.
+  IOResult* results_;
+  intptr_t results_length_;
+  intptr_t results_capacity_;
+
+  intptr_t results_length() {
+    return *static_cast<volatile intptr_t*>(&results_length_);
+  }
+
+  // Send the loader init request to the service isolate.
+  void Init(const char* package_root,
+            const char* packages_file,
+            const char* working_directory,
+            const char* root_script_uri);
+
+  // Send a request from the tag handler to the service isolate.
+  void SendRequest(Dart_LibraryTag tag,
+                   Dart_Handle url,
+                   Dart_Handle library_url);
+
+  /// Queue |message| and notify the loader that a message is available.
+  void QueueMessage(Dart_CObject* message);
+
+  /// Blocks the caller until the loader is finished.
+  void BlockUntilComplete();
+
+  /// Returns false if |result| is an error and the loader should quit.
+  bool ProcessResultLocked(IOResult* result);
+
+  /// Returns false if an error occurred and the loader should quit.
+  bool ProcessQueueLocked();
+
+  // Special inner tag handler for dart: uris.
+  static Dart_Handle DartColonLibraryTagHandler(Dart_LibraryTag tag,
+                                                Dart_Handle library,
+                                                Dart_Handle url,
+                                                const char* library_url_string,
+                                                const char* url_string);
+
+  // We use one native message handler callback for N loaders. The native
+  // message handler callback provides us with the Dart_Port which we use as a
+  // key into our map of active loaders from |port| to |isolate_data|.
+
+  // Static information to map Dart_Port back to the isolate in question.
+  struct LoaderInfo {
+    Dart_Port port;
+    IsolateData* isolate_data;
+  };
+
+  // The map of active loaders.
+  static Mutex loader_infos_lock_;
+  static LoaderInfo* loader_infos_;
+  static intptr_t loader_infos_length_;
+  static intptr_t loader_infos_capacity_;
+
+  static void AddLoader(Dart_Port port, IsolateData* data);
+  static void RemoveLoader(Dart_Port port);
+  static intptr_t LoaderIndexFor(Dart_Port port);
+  static Loader* LoaderFor(Dart_Port port);
+  static Loader* LoaderForLocked(Dart_Port port);
+
+  // This is the global callback for the native message handlers.
+  static void NativeMessageHandler(Dart_Port dest_port_id,
+                                   Dart_CObject* message);
+};
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // BIN_LOADER_H_
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 8823eda..6c8ca4b 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -17,6 +17,7 @@
 #include "bin/extensions.h"
 #include "bin/file.h"
 #include "bin/isolate_data.h"
+#include "bin/loader.h"
 #include "bin/log.h"
 #include "bin/platform.h"
 #include "bin/process.h"
@@ -690,7 +691,7 @@
                                                 int* exit_code) {
   ASSERT(script_uri != NULL);
 
-  const bool needs_load_port = !run_app_snapshot;
+  const bool needs_load_port = true;
 #if defined(PRODUCT)
   const bool run_service_isolate = needs_load_port;
 #else
@@ -726,7 +727,7 @@
   }
 
   // Set up the library tag handler for this isolate.
-  Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
+  Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
   CHECK_RESULT(result);
 
   if (Dart_IsServiceIsolate(isolate)) {
@@ -770,13 +771,15 @@
   if (run_app_snapshot) {
     result = DartUtils::SetupIOLibrary(script_uri);
     CHECK_RESULT(result);
+    Loader::InitForSnapshot(script_uri);
   } else {
     // Load the specified application script into the newly created isolate.
-    result = DartUtils::LoadScript(script_uri);
-    CHECK_RESULT(result);
-
-    // Run event-loop and wait for script loading to complete.
-    result = Dart_RunLoop();
+    Dart_Handle uri =
+        DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
+    CHECK_RESULT(uri);
+    result = Loader::LibraryTagHandler(Dart_kScriptTag,
+                                       Dart_Null(),
+                                       uri);
     CHECK_RESULT(result);
 
     Dart_TimelineEvent("LoadScript",
@@ -932,9 +935,11 @@
 }
 
 
-static const char* ServiceRequestError(Dart_Handle error) {
+static const char* InternalJsonRpcError(Dart_Handle error) {
   TextBuffer buffer(128);
-  buffer.Printf("{\"type\":\"Error\",\"text\":\"Internal error %s\"}",
+  buffer.Printf("{\"code\":-32603,"
+                "\"message\":\"Internal error\","
+                "\"details\": \"%s\"}",
                 Dart_GetError(error));
   return buffer.Steal();
 }
@@ -947,28 +952,32 @@
 };
 
 
-static const char* ServiceGetIOHandler(
+static bool ServiceGetIOHandler(
     const char* method,
     const char** param_keys,
     const char** param_values,
     intptr_t num_params,
-    void* user_data) {
+    void* user_data,
+    const char** response) {
   DartScope scope;
   // TODO(ajohnsen): Store the library/function in isolate data or user_data.
   Dart_Handle dart_io_str = Dart_NewStringFromCString("dart:io");
   if (Dart_IsError(dart_io_str)) {
-    return ServiceRequestError(dart_io_str);
+    *response = InternalJsonRpcError(dart_io_str);
+    return false;
   }
 
   Dart_Handle io_lib = Dart_LookupLibrary(dart_io_str);
   if (Dart_IsError(io_lib)) {
-    return ServiceRequestError(io_lib);
+    *response = InternalJsonRpcError(io_lib);
+    return false;
   }
 
   Dart_Handle handler_function_name =
       Dart_NewStringFromCString("_serviceObjectHandler");
   if (Dart_IsError(handler_function_name)) {
-    return ServiceRequestError(handler_function_name);
+    *response = InternalJsonRpcError(handler_function_name);
+    return false;
   }
 
   // TODO(johnmccutchan): paths is no longer used.  Update the io
@@ -983,15 +992,18 @@
   Dart_Handle args[] = {paths, keys, values};
   Dart_Handle result = Dart_Invoke(io_lib, handler_function_name, 3, args);
   if (Dart_IsError(result)) {
-    return ServiceRequestError(result);
+    *response = InternalJsonRpcError(result);
+    return false;
   }
 
   const char *json;
   result = Dart_StringToCString(result, &json);
   if (Dart_IsError(result)) {
-    return ServiceRequestError(result);
+    *response = InternalJsonRpcError(result);
+    return false;
   }
-  return strdup(json);
+  *response = strdup(json);
+  return true;
 }
 
 
@@ -1359,7 +1371,6 @@
         reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
     result = Dart_LibraryImportLibrary(
         isolate_data->builtin_lib(), root_lib, Dart_Null());
-#if !defined(PRODUCT)
     if (is_noopt ||
         (gen_snapshot_kind == kAppAfterRun) ||
         (gen_snapshot_kind == kAppAOT) ||
@@ -1374,7 +1385,6 @@
         exit(kErrorExitCode);
       }
     }
-#endif  // PRODUCT
 
     if (compile_all) {
       result = Dart_CompileAll();
@@ -1386,11 +1396,11 @@
         { "dart:_builtin", "::", "_getMainClosure" },
         { "dart:_builtin", "::", "_getPrintClosure" },
         { "dart:_builtin", "::", "_getUriBaseClosure" },
+        { "dart:_builtin", "::", "_resolveInWorkingDirectory" },
         { "dart:_builtin", "::", "_resolveUri" },
         { "dart:_builtin", "::", "_setWorkingDirectory" },
         { "dart:_builtin", "::", "_setPackageRoot" },
-        { "dart:_builtin", "::", "_loadPackagesMap" },
-        { "dart:_builtin", "::", "_loadDataAsync" },
+        { "dart:_builtin", "::", "_libraryFilePath" },
         { "dart:io", "::", "_makeUint8ListView" },
         { "dart:io", "::", "_makeDatagram" },
         { "dart:io", "::", "_setupHooks" },
@@ -1410,9 +1420,7 @@
         { "dart:io", "_ProcessStartStatus", "set:_errorMessage" },
         { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" },
         { "dart:io", "_SecureFilterImpl", "get:SIZE" },
-#if !defined(PRODUCT)
         { "dart:vmservice_io", "::", "main" },
-#endif  // !PRODUCT
         { NULL, NULL, NULL }  // Must be terminated with NULL entries.
       };
 
diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
index 7bec4a1..42bc6f9 100644
--- a/runtime/bin/vmservice/loader.dart
+++ b/runtime/bin/vmservice/loader.dart
@@ -4,6 +4,303 @@
 
 part of vmservice_io;
 
+_sanitizeWindowsPath(path) {
+  // For Windows we need to massage the paths a bit according to
+  // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
+  //
+  // Convert
+  // C:\one\two\three
+  // to
+  // /C:/one/two/three
+
+  if (_isWindows == false) {
+    // Do nothing when not running Windows.
+    return path;
+  }
+
+  var fixedPath = "${path.replaceAll('\\', '/')}";
+
+  if ((path.length > 2) && (path[1] == ':')) {
+    // Path begins with a drive letter.
+    return '/$fixedPath';
+  }
+
+  return fixedPath;
+}
+
+_trimWindowsPath(path) {
+  // Convert /X:/ to X:/.
+  if (_isWindows == false) {
+    // Do nothing when not running Windows.
+    return path;
+  }
+  if (!path.startsWith('/') || (path.length < 3)) {
+    return path;
+  }
+  // Match '/?:'.
+  if ((path[0] == '/') && (path[2] == ':')) {
+    // Remove leading '/'.
+    return path.substring(1);
+  }
+  return path;
+}
+
+// Ensure we have a trailing slash character.
+_enforceTrailingSlash(uri) {
+  if (!uri.endsWith('/')) {
+    return '$uri/';
+  }
+  return uri;
+}
+
+// State associated with the isolate that is used for loading.
+class IsolateLoaderState extends IsolateEmbedderData {
+  IsolateLoaderState(this.isolateId);
+
+  final int isolateId;
+
+  SendPort sp;
+
+  void init(String packageRootFlag,
+            String packagesConfigFlag,
+            String workingDirectory,
+            String rootScript) {
+    // _workingDirectory must be set first.
+    _workingDirectory = new Uri.directory(workingDirectory);
+    if (rootScript != null) {
+      _rootScript = Uri.parse(rootScript);
+    }
+    // If the --package-root flag was passed.
+    if (packageRootFlag != null) {
+      _setPackageRoot(packageRootFlag);
+    }
+    // If the --packages flag was passed.
+    if (packagesConfigFlag != null) {
+      _setPackagesConfig(packagesConfigFlag);
+    }
+  }
+
+  void cleanup() {
+    if (_packagesPort != null) {
+      _packagesPort.close();
+      _packagesPort = null;
+    }
+  }
+
+  // The working directory when the embedder started.
+  Uri _workingDirectory;
+
+  // The root script's uri.
+  Uri _rootScript;
+
+  bool _traceLoading = false;
+
+  // Packages are either resolved looking up in a map or resolved from within a
+  // package root.
+  bool get _packagesReady => (_packageRoot != null) ||
+                             (_packageMap != null) ||
+                             (_packageError != null);
+
+  // Error string set if there was an error resolving package configuration.
+  // For example not finding a .packages file or packages/ directory, malformed
+  // .packages file or any other related error.
+  String _packageError = null;
+
+  // The directory to look in to resolve "package:" scheme URIs. By default it
+  // is the 'packages' directory right next to the script.
+  Uri _packageRoot = null;
+
+  // The map describing how certain package names are mapped to Uris.
+  Uri _packageConfig = null;
+  Map<String, Uri> _packageMap = null;
+
+  _setPackageRoot(String packageRoot) {
+    packageRoot = _enforceTrailingSlash(packageRoot);
+    if (packageRoot.startsWith('file:') ||
+        packageRoot.startsWith('http:') ||
+        packageRoot.startsWith('https:')) {
+      _packageRoot = _workingDirectory.resolve(packageRoot);
+    } else {
+      packageRoot = _sanitizeWindowsPath(packageRoot);
+      packageRoot = _trimWindowsPath(packageRoot);
+      _packageRoot = _workingDirectory.resolveUri(new Uri.file(packageRoot));
+    }
+  }
+
+  _setPackagesConfig(String packagesParam) {
+    var packagesName = _sanitizeWindowsPath(packagesParam);
+    var packagesUri = Uri.parse(packagesName);
+    if (packagesUri.scheme == '') {
+      // Script does not have a scheme, assume that it is a path,
+      // resolve it against the working directory.
+      packagesUri = _workingDirectory.resolveUri(packagesUri);
+    }
+    _requestPackagesMap(packagesUri);
+    _pendingPackageLoads.add(() {
+      // Dummy action.
+    });
+  }
+
+  // Handling of access to the package root or package map from user code.
+  _triggerPackageResolution(action) {
+    if (_packagesReady) {
+      // Packages are ready. Execute the action now.
+      action();
+    } else {
+      if (_pendingPackageLoads.isEmpty) {
+        // Package resolution has not been setup yet, and this is the first
+        // request for package resolution & loading.
+        _requestPackagesMap();
+      }
+      // Register the action for when the package resolution is ready.
+      _pendingPackageLoads.add(action);
+    }
+  }
+
+  // A list of callbacks which should be invoked after the package map has been
+  // loaded.
+  List<Function> _pendingPackageLoads = [];
+
+  // Given a uri with a 'package' scheme, return a Uri that is prefixed with
+  // the package root.
+  Uri _resolvePackageUri(Uri uri) {
+    assert(uri.scheme == "package");
+    assert(_packagesReady);
+
+    if (!uri.host.isEmpty) {
+      var path = '${uri.host}${uri.path}';
+      var right = 'package:$path';
+      var wrong = 'package://$path';
+
+      throw "URIs using the 'package:' scheme should look like "
+            "'$right', not '$wrong'.";
+    }
+
+    if (_traceLoading) {
+      _log('Resolving package with uri path: ${uri.path}');
+    }
+    var resolvedUri;
+    if (_packageError != null) {
+      if (_traceLoading) {
+        _log("Resolving package with pending resolution error: $_packageError");
+      }
+      throw _packageError;
+    } else if (_packageRoot != null) {
+      resolvedUri = _packageRoot.resolve(uri.path);
+    } else {
+      var packageName = uri.pathSegments[0];
+      var mapping = _packageMap[packageName];
+      if (_traceLoading) {
+        _log("Mapped '$packageName' package to '$mapping'");
+      }
+      if (mapping == null) {
+        throw "No mapping for '$packageName' package when resolving '$uri'.";
+      }
+      var path;
+      if (uri.path.length > packageName.length) {
+        path = uri.path.substring(packageName.length + 1);
+      } else {
+        // Handle naked package resolution to the default package name:
+        // package:foo is equivalent to package:foo/foo.dart
+        assert(uri.path.length == packageName.length);
+        path = "$packageName.dart";
+      }
+      if (_traceLoading) {
+        _log("Path to be resolved in package: $path");
+      }
+      resolvedUri = mapping.resolve(path);
+    }
+    if (_traceLoading) {
+      _log("Resolved '$uri' to '$resolvedUri'.");
+    }
+    return resolvedUri;
+  }
+
+  RawReceivePort _packagesPort;
+
+  void _requestPackagesMap([Uri packageConfig]) {
+    assert(_packagesPort == null);
+    assert(_rootScript != null);
+    // Create a port to receive the packages map on.
+    _packagesPort = new RawReceivePort(_handlePackagesReply);
+    var sp = _packagesPort.sendPort;
+
+    if (packageConfig != null) {
+      // Explicitly specified .packages path.
+      _handlePackagesRequest(sp,
+                             _traceLoading,
+                             -2,
+                             packageConfig);
+    } else {
+      // Search for .packages or packages/ starting at the root script.
+      _handlePackagesRequest(sp,
+                             _traceLoading,
+                             -1,
+                             _rootScript);
+    }
+
+    if (_traceLoading) {
+      _log("Requested packages map for '$_rootScript'.");
+    }
+  }
+
+  void _handlePackagesReply(msg) {
+    assert(_packagesPort != null);
+    // Make sure to close the _packagePort before any other action.
+    _packagesPort.close();
+    _packagesPort = null;
+
+    if (_traceLoading) {
+      _log("Got packages reply: $msg");
+    }
+    if (msg is String) {
+      if (_traceLoading) {
+        _log("Got failure response on package port: '$msg'");
+      }
+      // Remember the error message.
+      _packageError = msg;
+    } else if (msg is List) {
+      if (msg.length == 1) {
+        if (_traceLoading) {
+          _log("Received package root: '${msg[0]}'");
+        }
+        _packageRoot = Uri.parse(msg[0]);
+      } else {
+        // First entry contains the location of the loaded .packages file.
+        assert((msg.length % 2) == 0);
+        assert(msg.length >= 2);
+        assert(msg[1] == null);
+        _packageConfig = Uri.parse(msg[0]);
+        _packageMap = new Map<String, Uri>();
+        for (var i = 2; i < msg.length; i+=2) {
+          // TODO(iposva): Complain about duplicate entries.
+          _packageMap[msg[i]] = Uri.parse(msg[i+1]);
+        }
+        if (_traceLoading) {
+          _log("Setup package map: $_packageMap");
+        }
+      }
+    } else {
+      _packageError = "Bad type of packages reply: ${msg.runtimeType}";
+      if (_traceLoading) {
+        _log(_packageError);
+      }
+    }
+
+    // Resolve all pending package loads now that we know how to resolve them.
+    while (_pendingPackageLoads.length > 0) {
+      // Order does not matter as we queue all of the requests up right now.
+      var req = _pendingPackageLoads.removeLast();
+      // Call the registered closure, to handle the delayed action.
+      req();
+    }
+    // Reset the pending package loads to empty. So that we eventually can
+    // finish loading.
+    _pendingPackageLoads = [];
+  }
+
+}
+
 _log(msg) {
   print("% $msg");
 }
@@ -11,19 +308,38 @@
 var _httpClient;
 
 // Send a response to the requesting isolate.
-void _sendResourceResponse(SendPort sp, int id, dynamic data) {
+void _sendResourceResponse(SendPort sp,
+                           int tag,
+                           Uri uri,
+                           String libraryUrl,
+                           dynamic data) {
   assert((data is List<int>) || (data is String));
-  var msg = new List(2);
-  msg[0] = id;
-  msg[1] = data;
+  var msg = new List(4);
+  if (data is String) {
+    // We encountered an error, flip the sign of the tag to indicate that.
+    tag = -tag;
+    if (libraryUrl == null) {
+      data = 'Could not load "$uri": $data';
+    } else {
+      data = 'Could not import "$uri" from "$libraryUrl": $data';
+    }
+  }
+  msg[0] = tag;
+  msg[1] = uri.toString();
+  msg[2] = libraryUrl;
+  msg[3] = data;
   sp.send(msg);
 }
 
-void _loadHttp(SendPort sp, int id, Uri uri) {
+void _loadHttp(SendPort sp,
+               int tag,
+               Uri uri,
+               Uri resolvedUri,
+               String libraryUrl) {
   if (_httpClient == null) {
     _httpClient = new HttpClient()..maxConnectionsPerHost = 6;
   }
-  _httpClient.getUrl(uri)
+  _httpClient.getUrl(resolvedUri)
     .then((HttpClientRequest request) => request.close())
     .then((HttpClientResponse response) {
       var builder = new BytesBuilder(copy: false);
@@ -31,37 +347,46 @@
           builder.add,
           onDone: () {
             if (response.statusCode != 200) {
-              var msg = "Failure getting $uri:\n"
+              var msg = "Failure getting $resolvedUri:\n"
                         "  ${response.statusCode} ${response.reasonPhrase}";
-              _sendResourceResponse(sp, id, msg);
+              _sendResourceResponse(sp, tag, uri, libraryUrl, msg);
             } else {
-              _sendResourceResponse(sp, id, builder.takeBytes());
+              _sendResourceResponse(sp, tag, uri, libraryUrl,
+                                    builder.takeBytes());
             }
           },
           onError: (e) {
-            _sendResourceResponse(sp, id, e.toString());
+            _sendResourceResponse(sp, tag, uri, libraryUrl, e.toString());
           });
     })
     .catchError((e) {
-      _sendResourceResponse(sp, id, e.toString());
+      _sendResourceResponse(sp, tag, uri, libraryUrl, e.toString());
     });
   // It's just here to push an event on the event loop so that we invoke the
   // scheduled microtasks.
   Timer.run(() {});
 }
 
-void _loadFile(SendPort sp, int id, Uri uri) {
-  var path = uri.toFilePath();
+void _loadFile(SendPort sp,
+               int tag,
+               Uri uri,
+               Uri resolvedUri,
+               String libraryUrl) {
+  var path = resolvedUri.toFilePath();
   var sourceFile = new File(path);
   sourceFile.readAsBytes().then((data) {
-    _sendResourceResponse(sp, id, data);
+    _sendResourceResponse(sp, tag, uri, libraryUrl, data);
   },
   onError: (e) {
-    _sendResourceResponse(sp, id, e.toString());
+    _sendResourceResponse(sp, tag, uri, libraryUrl, e.toString());
   });
 }
 
-void _loadDataUri(SendPort sp, int id, Uri uri) {
+void _loadDataUri(SendPort sp,
+                  int tag,
+                  Uri uri,
+                  Uri resolvedUri,
+                  String libraryUrl) {
   try {
     var mime = uri.data.mimeType;
     if ((mime != "application/dart") &&
@@ -74,25 +399,102 @@
       // The C++ portion of the embedder assumes UTF-8.
       throw "Only utf-8 or US-ASCII encodings are supported: $charset given.";
     }
-    _sendResourceResponse(sp, id, uri.data.contentAsBytes());
+    _sendResourceResponse(sp, tag, uri, libraryUrl, uri.data.contentAsBytes());
   } catch (e) {
-    _sendResourceResponse(sp, id, "Invalid data uri ($uri):\n  $e");
+    _sendResourceResponse(sp, tag, uri, libraryUrl,
+                          "Invalid data uri ($uri):\n  $e");
   }
 }
 
-_handleResourceRequest(SendPort sp, bool traceLoading, int id, Uri resource) {
-  if (resource.scheme == 'file') {
-    _loadFile(sp, id, resource);
-  } else if ((resource.scheme == 'http') || (resource.scheme == 'https')) {
-    _loadHttp(sp, id, resource);
-  } else if ((resource.scheme == 'data')) {
-    _loadDataUri(sp, id, resource);
+// Loading a package URI needs to first map the package name to a loadable
+// URI.
+_loadPackage(IsolateLoaderState loaderState,
+             SendPort sp,
+             bool traceLoading,
+             int tag,
+             Uri uri,
+             Uri resolvedUri,
+             String libraryUrl) {
+  if (loaderState._packagesReady) {
+    var resolvedUri;
+    try {
+      resolvedUri = loaderState._resolvePackageUri(uri);
+    } catch (e, s) {
+      if (traceLoading) {
+        _log("Exception ($e) when resolving package URI: $uri");
+      }
+      // Report error.
+      _sendResourceResponse(sp,
+                            tag,
+                            uri,
+                            libraryUrl,
+                            e.toString());
+      return;
+    }
+    // Recursively call with the new resolved uri.
+    _handleResourceRequest(loaderState,
+                           sp,
+                           traceLoading,
+                           tag,
+                           uri,
+                           resolvedUri,
+                           libraryUrl);
   } else {
-    _sendResourceResponse(sp, id,
-                          'Unknown scheme (${resource.scheme}) for $resource');
+    if (loaderState._pendingPackageLoads.isEmpty) {
+      // Package resolution has not been setup yet, and this is the first
+      // request for package resolution & loading.
+      loaderState._requestPackagesMap();
+    }
+    // Register the action of loading this package once the package resolution
+    // is ready.
+    loaderState._pendingPackageLoads.add(() {
+      _handleResourceRequest(loaderState,
+                             sp,
+                             traceLoading,
+                             tag,
+                             uri,
+                             uri,
+                             libraryUrl);
+    });
+    if (traceLoading) {
+      _log("Pending package load of '$uri': "
+           "${loaderState._pendingPackageLoads.length} pending");
+    }
   }
 }
 
+// TODO(johnmccutchan): This and most other top level functions in this file
+// should be turned into methods on the IsolateLoaderState class.
+_handleResourceRequest(IsolateLoaderState loaderState,
+                       SendPort sp,
+                       bool traceLoading,
+                       int tag,
+                       Uri uri,
+                       Uri resolvedUri,
+                       String libraryUrl) {
+  if (resolvedUri.scheme == 'file') {
+    _loadFile(sp, tag, uri, resolvedUri, libraryUrl);
+  } else if ((resolvedUri.scheme == 'http') ||
+             (resolvedUri.scheme == 'https')) {
+    _loadHttp(sp, tag, uri, resolvedUri, libraryUrl);
+  } else if ((resolvedUri.scheme == 'data')) {
+    _loadDataUri(sp, tag, uri, resolvedUri, libraryUrl);
+  } else if ((resolvedUri.scheme == 'package')) {
+    _loadPackage(loaderState,
+                 sp,
+                 traceLoading,
+                 tag,
+                 uri,
+                 resolvedUri,
+                 libraryUrl);
+  } else {
+    _sendResourceResponse(sp, tag,
+                          uri,
+                          libraryUrl,
+                          'Unknown scheme (${resolvedUri.scheme}) for '
+                          '$resolvedUri');
+  }
+}
 
 // Handling of packages requests. Finding and parsing of .packages file or
 // packages/ directories.
@@ -329,7 +731,6 @@
   }
 }
 
-
 Future<bool> _loadHttpPackagesFile(SendPort sp,
                                    bool traceLoading,
                                    Uri resource) async {
@@ -386,13 +787,16 @@
   }
 }
 
-
+// This code used to exist in a second isolate and so it uses a SendPort to
+// report it's return value. This could be refactored so that it returns it's
+// value and the caller could wait on the future rather than a message on
+// SendPort.
 _handlePackagesRequest(SendPort sp,
                        bool traceLoading,
-                       int id,
+                       int tag,
                        Uri resource) async {
   try {
-    if (id == -1) {
+    if (tag == -1) {
       if (resource.scheme == 'file') {
         _findPackagesFile(sp, traceLoading, resource);
       } else if ((resource.scheme == 'http') || (resource.scheme == 'https')) {
@@ -409,7 +813,7 @@
         sp.send("Unsupported scheme used to locate .packages file: "
                 "'$resource'.");
       }
-    } else if (id == -2) {
+    } else if (tag == -2) {
       if (traceLoading) {
         _log("Handling load of packages map: '$resource'.");
       }
@@ -432,7 +836,7 @@
                 "'$resource'.");
       }
     } else {
-      sp.send("Unknown packages request id: $id for '$resource'.");
+      sp.send("Unknown packages request tag: $tag for '$resource'.");
     }
   } catch (e, s) {
     if (traceLoading) {
@@ -442,21 +846,143 @@
   }
 }
 
+// Shutdown all active loaders by sending an error message.
+void shutdownLoaders() {
+  String message = 'Service shutdown';
+  if (_httpClient != null) {
+    _httpClient.close(force: true);
+    _httpClient = null;
+  }
+  isolateEmbedderData.values.toList().forEach((IsolateLoaderState ils) {
+    ils.cleanup();
+    assert(ils.sp != null);
+    _sendResourceResponse(ils.sp, 1, null, null, message);
+  });
+}
+
+// See Dart_LibraryTag in dart_api.h
+const _Dart_kCanonicalizeUrl = 0;      // Canonicalize the URL.
+const _Dart_kScriptTag = 1;            // Load the root script.
+const _Dart_kSourceTag = 2;            // Load a part source.
+const _Dart_kImportTag = 3;            // Import a library.
+
+// Extra requests. Keep these in sync between loader.dart and builtin.dart.
+const _Dart_kInitLoader = 4;           // Initialize the loader.
+const _Dart_kResourceLoad = 5;         // Resource class support.
+const _Dart_kGetPackageRootUri = 6;    // Uri of the packages/ directory.
+const _Dart_kGetPackageConfigUri = 7;  // Uri of the .packages file.
+const _Dart_kResolvePackageUri = 8;    // Resolve a package: uri.
 
 // External entry point for loader requests.
 _processLoadRequest(request) {
-  SendPort sp = request[0];
-  assert(sp != null);
-  bool traceLoading = request[1];
-  assert(traceLoading != null);
-  int id = request[2];
-  assert(id != null);
-  String resource = request[3];
-  assert(resource != null);
-  var uri = Uri.parse(resource);
-  if (id >= 0) {
-    _handleResourceRequest(sp, traceLoading, id, uri);
-  } else {
-    _handlePackagesRequest(sp, traceLoading, id, uri);
+  assert(request is List);
+  assert(request.length > 4);
+
+  // Should we trace loading?
+  bool traceLoading = request[0];
+
+  // This is the sending isolate's Dart_GetMainPortId().
+  int isolateId = request[1];
+
+  // The tag describing the operation.
+  int tag = request[2];
+
+  // The send port to send the response on.
+  SendPort sp = request[3];
+
+  // Grab the loader state for the requesting isolate.
+  IsolateLoaderState loaderState = isolateEmbedderData[isolateId];
+
+  // We are either about to initialize the loader, or, we already have.
+  assert((tag == _Dart_kInitLoader) || (loaderState != null));
+
+  // Handle the request specified in the tag.
+  switch (tag) {
+    case _Dart_kScriptTag: {
+      Uri uri = Uri.parse(request[4]);
+      // Remember the root script.
+      loaderState._rootScript = uri;
+      _handleResourceRequest(loaderState,
+                             sp,
+                             traceLoading,
+                             tag,
+                             uri,
+                             uri,
+                             null);
+    }
+    break;
+    case _Dart_kSourceTag:
+    case _Dart_kImportTag: {
+      // The url of the file being loaded.
+      var uri = Uri.parse(request[4]);
+      // The library that is importing/parting the file.
+      String libraryUrl = request[5];
+      _handleResourceRequest(loaderState,
+                             sp,
+                             traceLoading,
+                             tag,
+                             uri,
+                             uri,
+                             libraryUrl);
+    }
+    break;
+    case _Dart_kInitLoader: {
+      String packageRoot = request[4];
+      String packagesFile = request[5];
+      String workingDirectory = request[6];
+      String rootScript = request[7];
+      if (loaderState == null) {
+        loaderState = new IsolateLoaderState(isolateId);
+        isolateEmbedderData[isolateId] = loaderState;
+        loaderState.init(packageRoot,
+                         packagesFile,
+                         workingDirectory,
+                         rootScript);
+      }
+      loaderState.sp = sp;
+      assert(isolateEmbedderData[isolateId] == loaderState);
+    }
+    break;
+    case _Dart_kResourceLoad: {
+      Uri uri = Uri.parse(request[4]);
+      _handleResourceRequest(loaderState,
+                             sp,
+                             traceLoading,
+                             tag,
+                             uri,
+                             uri,
+                             null);
+    }
+    break;
+    case _Dart_kGetPackageRootUri:
+      loaderState._triggerPackageResolution(() {
+        // Respond with the package root (if any) after package resolution.
+        sp.send(loaderState._packageRoot);
+      });
+    break;
+    case _Dart_kGetPackageConfigUri:
+      loaderState._triggerPackageResolution(() {
+        // Respond with the packages config (if any) after package resolution.
+        sp.send(loaderState._packageConfig);
+      });
+    break;
+    case _Dart_kResolvePackageUri:
+      Uri uri = Uri.parse(request[4]);
+      loaderState._triggerPackageResolution(() {
+        // Respond with the resolved package uri after package resolution.
+        Uri resolvedUri;
+        try {
+          resolvedUri = loaderState._resolvePackageUri(uri);
+        } catch (e, s) {
+          if (traceLoading) {
+            _log("Exception ($e) when resolving package URI: $uri");
+          }
+          resolvedUri = null;
+        }
+        sp.send(resolvedUri);
+      });
+    break;
+    default:
+      _log('Unknown loader request tag=$tag from $isolateId');
   }
 }
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index ba82441..bfa99a6 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -39,6 +39,7 @@
 }
 
 Future cleanupCallback() async {
+  shutdownLoaders();
   // Cancel the sigquit subscription.
   if (_signalSubscription != null) {
     await _signalSubscription.cancel();
@@ -51,6 +52,10 @@
       print("Error in vm-service shutdown: $e\n$st\n");
     }
   }
+  if (_registerSignalHandlerTimer != null) {
+    _registerSignalHandlerTimer.cancel();
+    _registerSignalHandlerTimer = null;
+  }
   // Call out to embedder's shutdown callback.
   _shutdown();
 }
@@ -73,7 +78,10 @@
   }
 }
 
+Timer _registerSignalHandlerTimer;
+
 _registerSignalHandler() {
+  _registerSignalHandlerTimer = null;
   if (_signalWatch == null) {
     // Cannot register for signals.
     return;
@@ -88,6 +96,9 @@
 main() {
   // Set embedder hooks.
   VMServiceEmbedderHooks.cleanup = cleanupCallback;
+  // Always instantiate the vmservice object so that the exit message
+  // can be delivered and waiting loaders can be cancelled.
+  var service = new VMService();
   if (_autoStart) {
     _lazyServerBoot();
     server.startup();
@@ -95,12 +106,10 @@
     // scheduled microtasks.
     Timer.run(() {});
   }
-  // TODO(johnmccutchan): Fixup service isolate shutdown in the general case.
-  // See ServiceIsolate::KillServiceIsolate and ServiceIsolate::Shutdown.
   scriptLoadPort.handler = _processLoadRequest;
   // Register signal handler after a small delay to avoid stalling main
   // isolate startup.
-  new Timer(shortDelay, _registerSignalHandler);
+  _registerSignalHandlerTimer = new Timer(shortDelay, _registerSignalHandler);
   return scriptLoadPort;
 }
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index d019d4f..e27d70e 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2656,10 +2656,10 @@
 /* TODO(turnidge): Finish documenting this section. */
 
 typedef enum {
-  Dart_kImportTag = 0,
-  Dart_kSourceTag,
-  Dart_kCanonicalizeUrl,
+  Dart_kCanonicalizeUrl = 0,
   Dart_kScriptTag,
+  Dart_kSourceTag,
+  Dart_kImportTag,
 } Dart_LibraryTag;
 
 /* TODO(turnidge): Document. */
@@ -2684,15 +2684,35 @@
     Dart_LibraryTagHandler handler);
 
 /**
+ * Canonicalizes a url with respect to some library.
+ *
+ * The url is resolved with respect to the library's url and some url
+ * normalizations are performed.
+ *
+ * This canonicalization function should be sufficient for most
+ * embedders to implement the Dart_kCanonicalizeUrl tag.
+ *
+ * \param library The library relative to which the url is being
+ *                resolved.
+ * \param url The url being resolved and canonicalized.  This
+ *            parameter is a string handle.
+ *
+ * \return If no error occurs, a String object is returned.  Otherwise
+ *   an error handle is returned.
+ */
+DART_EXPORT Dart_Handle Dart_DefaultCanonicalizeUrl(Dart_Handle library,
+                                                    Dart_Handle url);
+
+/**
  * Loads the root script for the current isolate. The script can be
  * embedded in another file, for example in an html file.
  *
  * TODO(turnidge): Document.
  *
- * \line_offset is the number of text lines before the
+ * \param line_offset is the number of text lines before the
  *   first line of the Dart script in the containing file.
  *
- * \col_offset is the number of characters before the first character
+ * \param col_offset is the number of characters before the first character
  *   in the first line of the Dart script.
  */
 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index da43d94..961c444 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -752,22 +752,44 @@
  * a service request it can't handle and the service request command name
  * matches one of the embedder registered handlers.
  *
+ * The return value of the callback indicates whether the response
+ * should be used as a regular result or an error result.
+ * Specifically, if the callback returns true, a regular JSON-RPC
+ * response is built in the following way:
+ *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "result": <json_object>,
+ *   "id": <some sequence id>,
+ * }
+ *
+ * If the callback returns false, a JSON-RPC error is built like this:
+ *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "error": <json_object>,
+ *   "id": <some sequence id>,
+ * }
+ *
  * \param method The rpc method name.
  * \param param_keys Service requests can have key-value pair parameters. The
  *   keys and values are flattened and stored in arrays.
  * \param param_values The values associated with the keys.
  * \param num_params The length of the param_keys and param_values arrays.
  * \param user_data The user_data pointer registered with this handler.
+ * \param result A C string containing a valid JSON object. The returned
+ *   pointer will be freed by the VM by calling free.
  *
- * \return Returns a C string containing a valid JSON object. The returned
- * pointer will be freed by the VM by calling free.
+ * \return True if the result is a regular JSON-RPC response, false if the
+ *   result is a JSON-RPC error.
  */
-typedef const char* (*Dart_ServiceRequestCallback)(
+typedef bool (*Dart_ServiceRequestCallback)(
     const char* method,
     const char** param_keys,
     const char** param_values,
     intptr_t num_params,
-    void* user_data);
+    void* user_data,
+    const char** json_object);
 
 
 /**
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index 4f509da..9d5af28 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -46,19 +46,27 @@
 // second element is the Completer for the load request.
 var _outstandingLoadRequests = new List<List>();
 
-// Called from the VM when all outstanding load requests have
-// finished.
+// Called from the VM when an outstanding load request has finished.
 _completeDeferredLoads() {
+  // Determine which outstanding load requests have completed and complete
+  // their completer (with an error or true). For outstanding load requests
+  // which have not completed, remember them for next time in
+  // stillOutstandingLoadRequests.
+  var stillOutstandingLoadRequests = new List<List>();
   for (int i = 0; i < _outstandingLoadRequests.length; i++) {
     var prefix = _outstandingLoadRequests[i][0];
-    var completer = _outstandingLoadRequests[i][1];
-    var error = prefix._loadError();
-    if (error != null) {
-      completer.completeError(error);
+    if (prefix._load()) {
+      var completer = _outstandingLoadRequests[i][1];
+      var error = prefix._loadError();
+      if (error != null) {
+        completer.completeError(error);
+      } else {
+        prefix._invalidateDependentCode();
+        completer.complete(true);
+      }
     } else {
-      prefix._invalidateDependentCode();
-      completer.complete(true);
+      stillOutstandingLoadRequests.add(_outstandingLoadRequests[i]);
     }
   }
-  _outstandingLoadRequests.clear();
+  _outstandingLoadRequests = stillOutstandingLoadRequests;
 }
diff --git a/runtime/lib/symbol_patch.dart b/runtime/lib/symbol_patch.dart
index fdb6527..1a1b2bc 100644
--- a/runtime/lib/symbol_patch.dart
+++ b/runtime/lib/symbol_patch.dart
@@ -51,4 +51,9 @@
     }
     return result.toString();
   }
+
+  /* patch */ int get hashCode {
+    const arbitraryPrime = 664597;
+    return 0x1fffffff & (arbitraryPrime * _name.hashCode);
+  }
 }
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index ad0d89a..f37cacb 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -2886,12 +2886,10 @@
   Int32x4 withFlagY(bool y) native "Int32x4_setFlagY";
   Int32x4 withFlagZ(bool z) native "Int32x4_setFlagZ";
   Int32x4 withFlagW(bool w) native "Int32x4_setFlagW";
-  Float32x4 select(Float32x4 trueValue,
-                          Float32x4 falseValue) {
+  Float32x4 select(Float32x4 trueValue, Float32x4 falseValue) {
     return _select(trueValue, falseValue);
   }
-  Float32x4 _select(Float32x4 trueValue,
-                           Float32x4 falseValue)
+  Float32x4 _select(Float32x4 trueValue, Float32x4 falseValue)
       native "Int32x4_select";
 
   /// Mask passed to [shuffle] or [shuffleMix].
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index 502f510..9c4fc7f 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -9,6 +9,7 @@
 #include "vm/flags.h"
 #include "vm/growable_array.h"
 #include "vm/message.h"
+#include "vm/message_handler.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/port.h"
@@ -139,6 +140,9 @@
 DEFINE_NATIVE_ENTRY(VMService_OnExit, 0) {
   if (FLAG_trace_service) {
     OS::Print("vm-service: processed exit message.\n");
+    MessageHandler* message_handler = isolate->message_handler();
+    OS::Print("vm-service: live ports = %" Pd "\n",
+              message_handler->live_ports());
   }
   return Object::null();
 }
diff --git a/runtime/observatory/lib/elements.dart b/runtime/observatory/lib/elements.dart
index 4863c2c..9ee5cf2 100644
--- a/runtime/observatory/lib/elements.dart
+++ b/runtime/observatory/lib/elements.dart
@@ -43,6 +43,7 @@
 export 'package:observatory/src/elements/object_common.dart';
 export 'package:observatory/src/elements/object_view.dart';
 export 'package:observatory/src/elements/objectpool_view.dart';
+export 'package:observatory/src/elements/objectstore_view.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/observatory_element.dart';
 export 'package:observatory/src/elements/persistent_handles.dart';
diff --git a/runtime/observatory/lib/elements.html b/runtime/observatory/lib/elements.html
index 4e84fec..52b59b4 100644
--- a/runtime/observatory/lib/elements.html
+++ b/runtime/observatory/lib/elements.html
@@ -36,6 +36,7 @@
 <link rel="import" href="src/elements/object_common.html">
 <link rel="import" href="src/elements/object_view.html">
 <link rel="import" href="src/elements/objectpool_view.html">
+<link rel="import" href="src/elements/objectstore_view.html">
 <link rel="import" href="src/elements/observatory_application.html">
 <link rel="import" href="src/elements/observatory_element.html">
 <link rel="import" href="src/elements/persistent_handles.html">
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 0ffe385..7a034da 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -136,6 +136,7 @@
     _pageRegistry.add(new InspectPage(this));
     _pageRegistry.add(new ClassTreePage(this));
     _pageRegistry.add(new DebuggerPage(this));
+    _pageRegistry.add(new ObjectStorePage(this));
     _pageRegistry.add(new CpuProfilerPage(this));
     _pageRegistry.add(new TableCpuProfilerPage(this));
     _pageRegistry.add(new AllocationProfilerPage(this));
diff --git a/runtime/observatory/lib/src/app/page.dart b/runtime/observatory/lib/src/app/page.dart
index b2216e4..7f51a8e 100644
--- a/runtime/observatory/lib/src/app/page.dart
+++ b/runtime/observatory/lib/src/app/page.dart
@@ -199,6 +199,24 @@
   }
 }
 
+
+class ObjectStorePage extends SimplePage {
+  ObjectStorePage(app) : super('object-store', 'objectstore-view', app);
+
+  void _visit(Uri uri) {
+    super._visit(uri);
+    getIsolate(uri).then((isolate) {
+      isolate.getObjectStore().then((objectStore) {
+        if (element != null) {
+          /// Update the page.
+          ObjectStoreViewElement page = element;
+          page.objectStore = objectStore;
+        }
+      });
+    });
+  }
+}
+
 class CpuProfilerPage extends SimplePage {
   CpuProfilerPage(app) : super('profiler', 'cpu-profile', app);
 
diff --git a/runtime/observatory/lib/src/elements/isolate_view.html b/runtime/observatory/lib/src/elements/isolate_view.html
index 69c30ed..e7777a7 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.html
+++ b/runtime/observatory/lib/src/elements/isolate_view.html
@@ -94,6 +94,12 @@
               <div class="memberName">service protocol extensions</div>
               <div class="memberValue">{{ isolate.extensionRPCs }}</div>
             </div>
+            <div class="memberItem">
+              <div class="memberName">object store</div>
+              <div class="memberValue">
+                <a on-click="{{ goto }}" _href="{{ gotoLink('/object-store', isolate) }}">object store</a>
+              </div>
+            </div>
 
             <div class="memberItem">
               <div class="memberName">
diff --git a/runtime/observatory/lib/src/elements/objectstore_view.dart b/runtime/observatory/lib/src/elements/objectstore_view.dart
new file mode 100644
index 0000000..c5ff3bc
--- /dev/null
+++ b/runtime/observatory/lib/src/elements/objectstore_view.dart
@@ -0,0 +1,24 @@
+// 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.
+
+library objectstore_view_element;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+
+@CustomTag('objectstore-view')
+class ObjectStoreViewElement extends ObservatoryElement {
+  @published ObjectStore objectStore;
+
+  ObjectStoreViewElement.created() : super.created();
+
+  Future refresh() {
+    return objectStore.isolate.getObjectStore().then((newObjectStore) {
+      objectStore = newObjectStore;
+    });
+  }
+}
diff --git a/runtime/observatory/lib/src/elements/objectstore_view.html b/runtime/observatory/lib/src/elements/objectstore_view.html
new file mode 100644
index 0000000..a8d4d02
--- /dev/null
+++ b/runtime/observatory/lib/src/elements/objectstore_view.html
@@ -0,0 +1,46 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
+<link rel="import" href="view_footer.html">
+
+<polymer-element name="objectstore-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <vm-nav-menu vm="{{ objectStore.isolate.vm }}"></vm-nav-menu>
+      <isolate-nav-menu isolate="{{ objectStore.isolate }}" last="{{ true }}"></isolate-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content-centered-big">
+      <h1>
+        object store ({{ objectStore.fields.length }})
+      </h1>
+
+      <hr>
+
+      <div class="memberList">
+        <template repeat="{{ field in objectStore.fields }}">
+          <div class="memberItem">
+            <div class="memberName">{{ field.name }}</div>
+            <div class="memberValue"><any-service-ref ref="{{ field.value }}"></any-service-ref></div>
+          </div>
+        </template>
+      </div>
+    </div>
+
+    <view-footer></view-footer>
+ </template>
+</polymer-element>
+
+<script type="application/dart" src="library_view.dart"></script>
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index b0be812..bcaf2f8 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1636,6 +1636,14 @@
     return invokeRpc('getStack', {});
   }
 
+  Future<ObjectStore> getObjectStore() {
+    return invokeRpc('_getObjectStore', {}).then((map) {
+      ObjectStore objectStore = new ObjectStore._empty(this);
+      objectStore._update(map, false);
+      return objectStore;
+    });
+  }
+
   Future<ServiceObject> _eval(ServiceObject target,
                               String expression) {
     Map params = {
@@ -1744,6 +1752,36 @@
   String toString() => "Isolate($name)";
 }
 
+
+class NamedField {
+  final String name;
+  final ServiceObject value;
+  NamedField(this.name, this.value);
+}
+
+
+class ObjectStore extends ServiceObject {
+  @observable List<NamedField> fields = new List<NamedField>();
+
+  ObjectStore._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  void _update(ObservableMap map, bool mapIsRef) {
+    // Extract full properties.
+    _upgradeCollection(map, isolate);
+
+    if (mapIsRef) {
+      return;
+    }
+
+    fields.clear();
+    map['fields'].forEach((key, value) {
+      fields.add(new NamedField(key, value));
+    });
+    _loaded = true;
+  }
+}
+
+
 /// A [ServiceObject] which implements [ObservableMap].
 class ServiceMap extends ServiceObject implements ObservableMap {
   final ObservableMap _map = new ObservableMap();
diff --git a/runtime/observatory/observatory_sources.gypi b/runtime/observatory/observatory_sources.gypi
index 9c9baec..c2084e1 100644
--- a/runtime/observatory/observatory_sources.gypi
+++ b/runtime/observatory/observatory_sources.gypi
@@ -105,6 +105,8 @@
     'lib/src/elements/library_ref.html',
     'lib/src/elements/library_view.dart',
     'lib/src/elements/library_view.html',
+    'lib/src/elements/objectstore_view.dart',
+    'lib/src/elements/objectstore_view.html',
     'lib/src/elements/logging.dart',
     'lib/src/elements/logging.html',
     'lib/src/elements/megamorphiccache_view.dart',
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index e34859d..5debbc1 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -85,10 +85,6 @@
 [ $builder_tag == asan ]
 cc/CodeImmutability: Fail,OK # Address Sanitizer turns a crash into a failure.
 
-[ $arch == ia32 && $builder_tag == asan ]
-cc/Dart2JSCompileAll: Crash # Issue 26487 - stack overflow
-cc/Dart2JSCompilerStats: Crash # Issue 26487 - stack overflow
-
 [ $noopt ]
 dart/byte_array_test: Crash # Incompatible flag --disable_alloc_stubs_after_gc
 
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 78213cf..65e56de 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -45,6 +45,9 @@
   result.add_option("--package_root",
       action="store", type="string",
       help="path used to resolve package: imports.")
+  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",
@@ -112,6 +115,10 @@
   if options.package_root:
     script_args.append(''.join([ "--package_root=", options.package_root]))
 
+  # Pass along the packages if there is one.
+  if options.packages:
+    script_args.append(''.join([ "--packages=", options.packages]))
+
   # First setup the vm isolate and regular isolate snapshot output filename.
   script_args.append(''.join([ "--vm_isolate_snapshot=",
                                options.vm_output_bin ]))
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index 8b66e49..2507451 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -108,8 +108,6 @@
             VisitInstanceCall(call);
           }
         }
-      } else if (instr->IsPolymorphicInstanceCall()) {
-        SpecializePolymorphicInstanceCall(instr->AsPolymorphicInstanceCall());
       }
     }
     current_iterator_ = NULL;
@@ -268,37 +266,6 @@
 }
 
 
-void AotOptimizer::SpecializePolymorphicInstanceCall(
-    PolymorphicInstanceCallInstr* call) {
-  if (!FLAG_polymorphic_with_deopt) {
-    // Specialization adds receiver checks which can lead to deoptimization.
-    return;
-  }
-  if (!call->with_checks()) {
-    return;  // Already specialized.
-  }
-
-  const intptr_t receiver_cid =
-      call->PushArgumentAt(0)->value()->Type()->ToCid();
-  if (receiver_cid == kDynamicCid) {
-    return;  // No information about receiver was infered.
-  }
-
-  const ICData& ic_data = TrySpecializeICData(call->ic_data(), receiver_cid);
-  if (ic_data.raw() == call->ic_data().raw()) {
-    // No specialization.
-    return;
-  }
-
-  PolymorphicInstanceCallInstr* specialized =
-      new(Z) PolymorphicInstanceCallInstr(call->instance_call(),
-                                          ic_data,
-                                          /* with_checks = */ false,
-                                          /* complete = */ false);
-  call->ReplaceWith(specialized, current_iterator());
-}
-
-
 static BinarySmiOpInstr* AsSmiShiftLeftInstruction(Definition* d) {
   BinarySmiOpInstr* instr = d->AsBinarySmiOp();
   if ((instr != NULL) && (instr->op_kind() == Token::kSHL)) {
@@ -2148,6 +2115,11 @@
 // TODO(srdjan): Use ICData to check if always true or false.
 void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
   ASSERT(Token::IsTypeTestOperator(call->token_kind()));
+  // Guard against repeated speculative inlining.
+  if (!use_speculative_inlining_ ||
+      IsBlackListedForInlining(call->deopt_id())) {
+    return;
+  }
   Definition* left = call->ArgumentAt(0);
   Definition* type_args = NULL;
   AbstractType& type = AbstractType::ZoneHandle(Z);
@@ -2256,6 +2228,11 @@
 // TODO(srdjan): Apply optimizations as in ReplaceWithInstanceOf (TestCids).
 void AotOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) {
   ASSERT(Token::IsTypeCastOperator(call->token_kind()));
+  // Guard against repeated speculative inlining.
+  if (!use_speculative_inlining_ ||
+      IsBlackListedForInlining(call->deopt_id())) {
+    return;
+  }
   Definition* left = call->ArgumentAt(0);
   Definition* type_args = call->ArgumentAt(1);
   const AbstractType& type =
diff --git a/runtime/vm/aot_optimizer.h b/runtime/vm/aot_optimizer.h
index 97c996a..d608442 100644
--- a/runtime/vm/aot_optimizer.h
+++ b/runtime/vm/aot_optimizer.h
@@ -62,8 +62,6 @@
   bool TryCreateICData(InstanceCallInstr* call);
   const ICData& TrySpecializeICData(const ICData& ic_data, intptr_t cid);
 
-  void SpecializePolymorphicInstanceCall(PolymorphicInstanceCallInstr* call);
-
   bool TryReplaceWithIndexedOp(InstanceCallInstr* call);
 
   bool TryReplaceWithBinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index eeb831d..9832dae 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1126,7 +1126,33 @@
 }
 
 
+void Assembler::SetupDartSP() {
+  mov(SP, CSP);
+}
+
+
+void Assembler::RestoreCSP() {
+  mov(CSP, SP);
+}
+
+
 void Assembler::EnterFrame(intptr_t frame_size) {
+  // The ARM64 ABI requires at all times
+  //   - stack limit < CSP <= stack base
+  //   - CSP mod 16 = 0
+  //   - we do not access stack memory below CSP
+  // Pratically, this means we need to keep the C stack pointer ahead of the
+  // Dart stack pointer and 16-byte aligned for signal handlers. If we knew the
+  // real stack limit, we could just set CSP to a value near it during
+  // SetupDartSP, but we do not know the real stack limit for the initial
+  // thread or threads created by the embedder.
+  // TODO(26472): It would be safer to use CSP as the Dart stack pointer, but
+  // this requires adjustments to stack handling to maintain the 16-byte
+  // alignment.
+  const intptr_t kMaxDartFrameSize = 4096;
+  sub(TMP, SP, Operand(kMaxDartFrameSize));
+  andi(CSP, TMP, Immediate(~15));
+
   PushPair(LR, FP);
   mov(FP, SP);
 
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 735e07e..8080ab8 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -1349,18 +1349,12 @@
                            Register scratch2,
                            Label* miss);
 
+  void SetupDartSP();
+  void RestoreCSP();
+
   void EnterFrame(intptr_t frame_size);
   void LeaveFrame();
 
-  // When entering Dart code from C++, we copy the system stack pointer (CSP)
-  // to the Dart stack pointer (SP), and reserve a little space for the stack
-  // to grow.
-  void SetupDartSP(intptr_t reserved_space) {
-    ASSERT(Utils::IsAligned(reserved_space, 16));
-    mov(SP, CSP);
-    sub(CSP, CSP, Operand(reserved_space));
-  }
-
   void CheckCodePointer();
   void RestoreCodePointer();
 
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index ba0d646..7c7a620 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -390,12 +390,12 @@
 
 // Loads and Stores.
 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex));
   __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -407,13 +407,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ add(R2, SP, Operand(1));
   __ str(R1, Address(R2, -1));
   __ ldr(R0, Address(R2, -1));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -425,7 +425,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   // Largest negative offset that can fit in the signed 9-bit immediate field.
@@ -434,7 +434,7 @@
   __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex));
   // Correction.
   __ add(SP, SP, Operand(kWordSize));  // Restore SP.
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -446,14 +446,14 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ sub(SP, SP, Operand(512*kWordSize));
   __ str(R1, Address(SP, 512*kWordSize, Address::Offset));
   __ add(SP, SP, Operand(512*kWordSize));
   __ ldr(R0, Address(SP));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -465,7 +465,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ movz(R2, Immediate(0xfff8), 0);
@@ -476,7 +476,7 @@
   __ sub(SP, SP, Operand(kWordSize));
   __ ldr(R0, Address(SP));
   __ add(SP, SP, Operand(kWordSize));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -488,7 +488,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ movz(R2, Immediate(10), 0);
@@ -497,7 +497,7 @@
   __ str(R1, Address(SP, R2, UXTX, Address::Scaled));
   __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled));
   __ add(SP, SP, Operand(10*kWordSize));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -509,12 +509,12 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadImmediate(R1, 0xffffffff);
   __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord);
   __ ldr(R0, Address(SP), kWord);
   __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -526,13 +526,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadImmediate(R2, 43);
   __ LoadImmediate(R3, 42);
   __ stp(R2, R3, Address(SP, -2*kWordSize, Address::PairPreIndex));
   __ ldp(R0, R1, Address(SP, 2*kWordSize, Address::PairPostIndex));
   __ sub(R0, R0, Operand(R1));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -544,7 +544,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadImmediate(R2, 43);
   __ LoadImmediate(R3, 42);
   __ sub(SP, SP, Operand(4 * kWordSize));
@@ -552,7 +552,7 @@
   __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize));
   __ add(SP, SP, Operand(4 * kWordSize));
   __ sub(R0, R0, Operand(R1));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -564,7 +564,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(40), 0);
   __ movz(R1, Immediate(42), 0);
   __ Push(R0);
@@ -575,7 +575,7 @@
   __ cmp(TMP, Operand(0));
   __ b(&retry, NE);  // NE if context switch occurred between ldrex and strex.
   __ Pop(R0);  // 42
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -588,7 +588,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ movz(R0, Immediate(40), 0);
   __ movz(R1, Immediate(42), 0);
   __ Push(R0);
@@ -597,7 +597,7 @@
   __ stxr(TMP, R1, SP);  // IP == 1, failure
   __ Pop(R0);  // 40
   __ add(R0, R0, Operand(TMP));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -723,6 +723,24 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(AndImmCsp, assembler) {
+  // Note we must maintain the ARM64 ABI invariants on CSP here.
+  __ mov(TMP, CSP);
+  __ sub(TMP2, CSP, Operand(31));
+  __ andi(CSP, TMP2, Immediate(~15));
+  __ mov(R0, CSP);
+  __ sub(R0, TMP, Operand(R0));
+  __ mov(CSP, TMP);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AndImmCsp, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) {
   __ movz(R1, Immediate(43), 0);
   __ andi(R0, R1, Immediate(1));
@@ -1689,11 +1707,11 @@
 
 // Loading immediate values with the object pool.
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadImmediate(R0, 42);
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1704,11 +1722,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0xf1234123);
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1719,11 +1737,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0x4321f1234124);
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1734,11 +1752,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0x9287436598237465);
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1751,11 +1769,11 @@
 
 // LoadObject null.
 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadObject(R0, Object::null_object());
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1766,11 +1784,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadObject(R0, Bool::True());
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1781,11 +1799,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   __ LoadObject(R0, Bool::False());
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1940,11 +1958,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V1, 42.0);
   __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex));
   __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1956,13 +1974,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V1, 42.0);
   __ fcvtsd(V2, V1);
   __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex));
   __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex));
   __ fcvtds(V0, V3);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -1974,7 +1992,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V1, 21.0);
   __ LoadDImmediate(V2, 21.0);
   __ LoadImmediate(R1, 42);
@@ -1987,7 +2005,7 @@
   __ PopDouble(V0);
   __ PopDouble(V1);
   __ faddd(V0, V0, V1);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2160,7 +2178,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   __ AddImmediate(SP, SP, -1 * kWordSize);
@@ -2168,7 +2186,7 @@
   __ fstrd(V1, Address(R2, -1));
   __ fldrd(V0, Address(R2, -1));
   __ AddImmediate(SP, SP, 1 * kWordSize);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2180,7 +2198,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   // Largest negative offset that can fit in the signed 9-bit immediate field.
@@ -2189,7 +2207,7 @@
   __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex));
   // Correction.
   __ add(SP, SP, Operand(kWordSize));  // Restore SP.
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2201,14 +2219,14 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   __ sub(SP, SP, Operand(512*kWordSize));
   __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset));
   __ add(SP, SP, Operand(512*kWordSize));
   __ fldrd(V0, Address(SP));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2220,7 +2238,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   __ movz(R2, Immediate(0xfff8), 0);
@@ -2231,7 +2249,7 @@
   __ sub(SP, SP, Operand(kWordSize));
   __ fldrd(V0, Address(SP));
   __ add(SP, SP, Operand(kWordSize));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2243,7 +2261,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   __ movz(R2, Immediate(10), 0);
@@ -2252,7 +2270,7 @@
   __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
   __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
   __ add(SP, SP, Operand(10*kWordSize));
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2707,7 +2725,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 21.0);
   __ vdupd(V1, V0, 0);
 
@@ -2719,7 +2737,7 @@
   __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex));
 
   __ faddd(V0, V2, V3);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2731,7 +2749,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vdups, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 21.0);
   __ fcvtsd(V0, V0);
   __ vdups(V1, V0, 0);
@@ -2753,7 +2771,7 @@
   __ faddd(V0, V1, V1);
   __ faddd(V0, V0, V2);
   __ faddd(V0, V0, V3);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2765,7 +2783,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V5, 42.0);
   __ vinsd(V1, 1, V5, 0);  // V1[1] <- V0[0].
 
@@ -2777,7 +2795,7 @@
   __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex));
 
   __ fmovdd(V0, V3);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -2789,7 +2807,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vinss, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ LoadDImmediate(V0, 21.0);
   __ fcvtsd(V0, V0);
   __ vinss(V1, 3, V0, 0);
@@ -2812,7 +2830,7 @@
   __ faddd(V0, V0, V1);
   __ faddd(V0, V0, V2);
   __ faddd(V0, V0, V3);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
@@ -3601,7 +3619,7 @@
 // R1: growable array.
 // R2: current thread.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   __ Push(CODE_REG);
   __ Push(THR);
   __ Push(LR);
@@ -3612,13 +3630,13 @@
   __ Pop(LR);
   __ Pop(THR);
   __ Pop(CODE_REG);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
 
 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) {
-  __ SetupDartSP(kTestStackSpace);
+  __ SetupDartSP();
   EnterTestFrame(assembler);
   Label miss, done;
   __ ComputeRange(R0, R2, R3, &miss);
@@ -3629,7 +3647,7 @@
 
   __ Bind(&done);
   LeaveTestFrame(assembler);
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc
index 11e579e..3d5b751 100644
--- a/runtime/vm/assembler_dbc_test.cc
+++ b/runtime/vm/assembler_dbc_test.cc
@@ -32,6 +32,81 @@
 #define __ assembler->
 
 
+static RawClass* CreateDummyClass(const String& class_name,
+                                  const Script& script) {
+  const Class& cls = Class::Handle(Class::New(
+      Library::Handle(), class_name, script, TokenPosition::kNoSource));
+  cls.set_is_synthesized_class();  // Dummy class for testing.
+  return cls.raw();
+}
+
+
+static RawLibrary* CreateDummyLibrary(const String& library_name) {
+  return Library::New(library_name);
+}
+
+
+static RawFunction* CreateFunction(const char* name) {
+  Thread* thread = Thread::Current();
+  const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
+  const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
+  const Script& script = Script::Handle();
+  const Class& owner_class =
+      Class::Handle(CreateDummyClass(class_name, script));
+  const Library& owner_library =
+      Library::Handle(CreateDummyLibrary(lib_name));
+  owner_class.set_library(owner_library);
+  const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
+  return Function::New(function_name, RawFunction::kRegularFunction,
+                       true, false, false, false, false, owner_class,
+                       TokenPosition::kMinSource);
+}
+
+
+static void GenerateDummyCode(Assembler* assembler, const Object& result) {
+  __ PushConstant(result);
+  __ ReturnTOS();
+}
+
+
+static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) {
+  // Make a dummy function.
+  Assembler _assembler_;
+  GenerateDummyCode(&_assembler_, result);
+  const char* dummy_function_name = "dummy_instance_function";
+  const Function& dummy_instance_function =
+      Function::Handle(CreateFunction(dummy_function_name));
+  Code& code =
+      Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_));
+  dummy_instance_function.AttachCode(code);
+
+  // Make a dummy ICData.
+  const Array& dummy_arguments_descriptor =
+      Array::Handle(ArgumentsDescriptor::New(2));
+  const ICData& ic_data = ICData::Handle(ICData::New(
+      dummy_instance_function,
+      String::Handle(dummy_instance_function.name()),
+      dummy_arguments_descriptor,
+      Thread::kNoDeoptId,
+      2));
+
+  // Wire up the Function in the ICData.
+  GrowableArray<intptr_t> cids(2);
+  cids.Add(kSmiCid);
+  cids.Add(kSmiCid);
+  ic_data.AddCheck(cids, dummy_instance_function);
+
+  // For the non-Smi tests.
+  cids[0] = kBigintCid;
+  ic_data.AddCheck(cids, dummy_instance_function);
+  ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original());
+
+  // Generate the instance call.
+  const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
+  __ InstanceCall2(2, call_ic_data_kidx);
+}
+
+
 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
@@ -66,7 +141,8 @@
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ PushConstant(Smi::Handle(Smi::New(84)));
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -80,7 +156,8 @@
   __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -96,7 +173,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -110,7 +188,8 @@
   __ PushConstant(Smi::Handle(Smi::New(30)));
   __ PushConstant(Smi::Handle(Smi::New(-12)));
   __ SubTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -124,7 +203,8 @@
   __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ SubTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -140,7 +220,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ SubTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -154,7 +235,8 @@
   __ PushConstant(Smi::Handle(Smi::New(-6)));
   __ PushConstant(Smi::Handle(Smi::New(-7)));
   __ MulTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -168,7 +250,8 @@
   __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
   __ PushConstant(Smi::Handle(Smi::New(-8)));
   __ MulTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -184,7 +267,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ MulTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -198,7 +282,8 @@
   __ PushConstant(Smi::Handle(Smi::New(0x22)));
   __ PushConstant(Smi::Handle(Smi::New(0x08)));
   __ BitOrTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -214,7 +299,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(0x08)));
   __ BitOrTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -228,7 +314,8 @@
   __ PushConstant(Smi::Handle(Smi::New(0x2a)));
   __ PushConstant(Smi::Handle(Smi::New(0xaa)));
   __ BitAndTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -244,7 +331,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(0x08)));
   __ BitAndTOS();
-  __ PushConstant(Smi::Handle(Smi::New(42)));  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
   __ ReturnTOS();
 }
 
@@ -258,7 +346,8 @@
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ EqualTOS();
-  __ PushConstant(Bool::False());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::False());
   __ ReturnTOS();
 }
 
@@ -272,7 +361,8 @@
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ EqualTOS();
-  __ PushConstant(Bool::True());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::True());
   __ ReturnTOS();
 }
 
@@ -288,7 +378,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ EqualTOS();
-  __ PushConstant(Bool::True());  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Bool::True());
   __ ReturnTOS();
 }
 
@@ -302,7 +393,8 @@
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ LessThanTOS();
-  __ PushConstant(Bool::False());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::False());
   __ ReturnTOS();
 }
 
@@ -316,7 +408,8 @@
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ LessThanTOS();
-  __ PushConstant(Bool::False());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::False());
   __ ReturnTOS();
 }
 
@@ -332,7 +425,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ LessThanTOS();
-  __ PushConstant(Bool::True());  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Bool::True());
   __ ReturnTOS();
 }
 
@@ -346,7 +440,8 @@
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ GreaterThanTOS();
-  __ PushConstant(Bool::False());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::False());
   __ ReturnTOS();
 }
 
@@ -360,7 +455,8 @@
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ PushConstant(Smi::Handle(Smi::New(42)));
   __ GreaterThanTOS();
-  __ PushConstant(Bool::False());  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Bool::False());
   __ ReturnTOS();
 }
 
@@ -376,7 +472,8 @@
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ GreaterThanTOS();
-  __ PushConstant(Bool::True());  // Shouldn't be skipped.
+  // Shouldn't be skipped.
+  MakeDummyInstanceCall(assembler, Bool::True());
   __ ReturnTOS();
 }
 
@@ -777,7 +874,7 @@
   __ PushConstant(Smi::Handle(Smi::New(41)));
   __ DropR(11);
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -840,11 +937,13 @@
 //    Push FP[rX] to the stack.
 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) {
   __ Frame(1);
+  __ PushConstant(Smi::Handle(Smi::New(37)));
   __ PushConstant(Smi::Handle(Smi::New(21)));
   __ StoreLocal(0);
   __ Push(0);
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -861,7 +960,8 @@
   __ Push(0);
   __ Push(0);
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -877,7 +977,8 @@
   __ Push(0);
   __ Push(0);
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -900,7 +1001,8 @@
   __ Push(0);
   __ Push(1);
   __ AddTOS();
-  __ PushConstant(Smi::Handle(Smi::New(0)));  // Should be skipped.
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
   __ ReturnTOS();
 }
 
@@ -951,14 +1053,16 @@
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ Push(1);
   __ AddTOS();
-  __ Jump(&error);
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1)));
   __ PopLocal(1);
 
   // Subtract 1 from FP[0].
   __ Push(0);
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ SubTOS();
-  __ Jump(&error);
+  // Should be skipped.
+  MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1)));
 
   // Jump to loop_entry if FP[0] != 0.
   __ StoreLocal(0);
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 790e94c..48b4a22 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -540,15 +540,16 @@
   ClosureNode(TokenPosition token_pos,
               const Function& function,
               AstNode* receiver,  // Non-null for implicit instance closures.
-              LocalScope* scope)  // Null for implicit closures.
+              LocalScope* scope)  // Null for implicit closures or functions
+                                  // that already have a ContextScope because
+                                  // they were compiled before.
       : AstNode(token_pos),
         function_(function),
         receiver_(receiver),
         scope_(scope),
         is_deferred_reference_(false) {
     ASSERT(function_.IsZoneHandle());
-    ASSERT((function_.IsNonImplicitClosureFunction() &&
-            (receiver_ == NULL) && (scope_ != NULL)) ||
+    ASSERT((function_.IsNonImplicitClosureFunction() && (receiver_ == NULL)) ||
            (function_.IsImplicitInstanceClosureFunction() &&
             (receiver_ != NULL) && (scope_ == NULL)) ||
            (function_.IsImplicitStaticClosureFunction() &&
diff --git a/runtime/vm/become.cc b/runtime/vm/become.cc
index 0f4586f..2a8e491 100644
--- a/runtime/vm/become.cc
+++ b/runtime/vm/become.cc
@@ -8,7 +8,6 @@
 #include "platform/utils.h"
 
 #include "vm/dart_api_state.h"
-#include "vm/freelist.h"
 #include "vm/isolate_reload.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
@@ -20,32 +19,55 @@
 
 DECLARE_FLAG(bool, trace_reload);
 
+
+ForwardingCorpse* ForwardingCorpse::AsForwarder(uword addr, intptr_t size) {
+  ASSERT(size >= kObjectAlignment);
+  ASSERT(Utils::IsAligned(size, kObjectAlignment));
+
+  ForwardingCorpse* result = reinterpret_cast<ForwardingCorpse*>(addr);
+
+  uword tags = 0;
+  tags = RawObject::SizeTag::update(size, tags);
+  tags = RawObject::ClassIdTag::update(kForwardingCorpse, tags);
+
+  result->tags_ = tags;
+  if (size > RawObject::SizeTag::kMaxSizeTag) {
+    *result->SizeAddress() = size;
+  }
+  result->set_target(Object::null());
+  return result;
+}
+
+
+void ForwardingCorpse::InitOnce() {
+  ASSERT(sizeof(ForwardingCorpse) == kObjectAlignment);
+  ASSERT(OFFSET_OF(ForwardingCorpse, tags_) == Object::tags_offset());
+}
+
+
 // Free list elements are used as a marker for forwarding objects. This is
 // safe because we cannot reach free list elements from live objects. Ideally
 // forwarding objects would have their own class id. See TODO below.
 static bool IsForwardingObject(RawObject* object) {
-  return object->IsHeapObject() && object->IsFreeListElement();
+  return object->IsHeapObject() && object->IsForwardingCorpse();
 }
 
 
 static RawObject* GetForwardedObject(RawObject* object) {
   ASSERT(IsForwardingObject(object));
   uword addr = reinterpret_cast<uword>(object) - kHeapObjectTag;
-  FreeListElement* forwarder = reinterpret_cast<FreeListElement*>(addr);
-  RawObject* new_target = reinterpret_cast<RawObject*>(forwarder->next());
-  return new_target;
+  ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
+  return forwarder->target();
 }
 
 
 static void ForwardObjectTo(RawObject* before_obj, RawObject* after_obj) {
   const intptr_t size_before = before_obj->Size();
 
-  // TODO(rmacnak): We should use different cids for forwarding corpses and
-  // free list elements.
   uword corpse_addr = reinterpret_cast<uword>(before_obj) - kHeapObjectTag;
-  FreeListElement* forwarder = FreeListElement::AsElement(corpse_addr,
-                                                          size_before);
-  forwarder->set_next(reinterpret_cast<FreeListElement*>(after_obj));
+  ForwardingCorpse* forwarder = ForwardingCorpse::AsForwarder(corpse_addr,
+                                                              size_before);
+  forwarder->set_target(after_obj);
   if (!IsForwardingObject(before_obj)) {
     FATAL("become: ForwardObjectTo failure.");
   }
@@ -130,22 +152,22 @@
 
 
 #if defined(DEBUG)
-class NoFreeListTargetsVisitor : public ObjectPointerVisitor {
+class NoForwardingCorpseTargetsVisitor : public ObjectPointerVisitor {
  public:
-  explicit NoFreeListTargetsVisitor(Isolate* isolate)
+  explicit NoForwardingCorpseTargetsVisitor(Isolate* isolate)
       : ObjectPointerVisitor(isolate) { }
 
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** p = first; p <= last; p++) {
       RawObject* target = *p;
       if (target->IsHeapObject()) {
-        ASSERT(!target->IsFreeListElement());
+        ASSERT(!target->IsForwardingCorpse());
       }
     }
   }
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(NoFreeListTargetsVisitor);
+  DISALLOW_COPY_AND_ASSIGN(NoForwardingCorpseTargetsVisitor);
 };
 #endif
 
@@ -166,7 +188,7 @@
 #if defined(DEBUG)
   {
     // There should be no pointers to free list elements / forwarding corpses.
-    NoFreeListTargetsVisitor visitor(isolate);
+    NoForwardingCorpseTargetsVisitor visitor(isolate);
     isolate->VisitObjectPointers(&visitor, true);
     heap->VisitObjectPointers(&visitor);
   }
@@ -190,7 +212,10 @@
     if (before_obj->IsVMHeapObject()) {
       FATAL("become: Cannot forward VM heap objects");
     }
-    if (after_obj->IsFreeListElement()) {
+    if (before_obj->IsForwardingCorpse()) {
+      FATAL("become: Cannot forward to multiple targets");
+    }
+    if (after_obj->IsForwardingCorpse()) {
       // The Smalltalk become does allow this, and for very special cases
       // it is important (shape changes to Class or Mixin), but as these
       // cases do not arise in Dart, better to prohibit it.
@@ -228,7 +253,7 @@
 
   {
     // There should be no pointers to forwarding corpses.
-    NoFreeListTargetsVisitor visitor(isolate);
+    NoForwardingCorpseTargetsVisitor visitor(isolate);
     isolate->VisitObjectPointers(&visitor, true);
     heap->VisitObjectPointers(&visitor);
   }
diff --git a/runtime/vm/become.h b/runtime/vm/become.h
index 9773553..b78524d 100644
--- a/runtime/vm/become.h
+++ b/runtime/vm/become.h
@@ -6,11 +6,71 @@
 #define VM_BECOME_H_
 
 #include "vm/allocation.h"
+#include "vm/raw_object.h"
 
 namespace dart {
 
 class Array;
 
+// Objects that are a source in a become are tranformed into forwarding
+// corpses pointing to the corresponding target. Forwarding corpses have the
+// same heap sizes as the source object to ensure the heap remains walkable.
+// If the heap sizes is small enough to be encoded in the size field of the
+// header, a forwarding corpse consists only of a header and the target pointer.
+// If the heap size is too big to be encoded in the header's size field, the
+// word after the target pointer contains the size.  This is the same
+// representation as a FreeListElement.
+class ForwardingCorpse {
+ public:
+  RawObject* target() const {
+    return target_;
+  }
+  void set_target(RawObject* target) {
+    target_ = target;
+  }
+
+  intptr_t Size() {
+    intptr_t size = RawObject::SizeTag::decode(tags_);
+    if (size != 0) return size;
+    return *SizeAddress();
+  }
+
+  static ForwardingCorpse* AsForwarder(uword addr, intptr_t size);
+
+  static void InitOnce();
+
+  // Used to allocate class for forwarding corpses in Object::InitOnce.
+  class FakeInstance {
+   public:
+    FakeInstance() { }
+    static cpp_vtable vtable() { return 0; }
+    static intptr_t InstanceSize() { return 0; }
+    static intptr_t NextFieldOffset() { return -kWordSize; }
+    static const ClassId kClassId = kForwardingCorpse;
+    static bool IsInstance() { return true; }
+
+   private:
+    DISALLOW_ALLOCATION();
+    DISALLOW_COPY_AND_ASSIGN(FakeInstance);
+  };
+
+ private:
+  // This layout mirrors the layout of RawObject.
+  uword tags_;
+  RawObject* target_;
+
+  // Returns the address of the embedded size.
+  intptr_t* SizeAddress() const {
+    uword addr = reinterpret_cast<uword>(&target_) + kWordSize;
+    return reinterpret_cast<intptr_t*>(addr);
+  }
+
+  // ForwardingCorpses cannot be allocated. Instead references to them are
+  // created using the AsForwarder factory method.
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(ForwardingCorpse);
+};
+
 // TODO(johnmccutchan): Refactor this class so that it is not all static and
 // provides utility methods for building the mapping of before and after.
 class Become : public AllStatic {
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 8cb9fa1..9432a1b 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -35,6 +35,7 @@
       table_[i] = vm_class_table->At(i);
     }
     table_[kFreeListElement] = vm_class_table->At(kFreeListElement);
+    table_[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
     table_[kDynamicCid] = vm_class_table->At(kDynamicCid);
     table_[kVoidCid] = vm_class_table->At(kVoidCid);
     class_heap_stats_table_ = reinterpret_cast<ClassHeapStats*>(
@@ -218,9 +219,6 @@
     if (!HasValidClassAt(i)) {
       continue;
     }
-    if (i == kFreeListElement) {
-      continue;
-    }
     cls = At(i);
     if (cls.raw() != reinterpret_cast<RawClass*>(0)) {
       name = cls.Name();
@@ -395,7 +393,10 @@
 
 
 ClassHeapStats* ClassTable::StatsWithUpdatedSize(intptr_t cid) {
-  if (!HasValidClassAt(cid) || (cid == kFreeListElement) || (cid == kSmiCid)) {
+  if (!HasValidClassAt(cid) ||
+      (cid == kFreeListElement) ||
+      (cid == kForwardingCorpse) ||
+      (cid == kSmiCid)) {
     return NULL;
   }
   Class& cls = Class::Handle(At(cid));
diff --git a/runtime/vm/compiler_stats.cc b/runtime/vm/compiler_stats.cc
index d15df53..e8d39b3 100644
--- a/runtime/vm/compiler_stats.cc
+++ b/runtime/vm/compiler_stats.cc
@@ -26,8 +26,8 @@
   }
 
   void VisitObject(RawObject* raw_obj) {
-    if (raw_obj->IsFreeListElement()) {
-      return;
+    if (raw_obj->IsPseudoObject()) {
+      return;  // Cannot be wrapped in handles.
     }
     obj_ = raw_obj;
     if (obj_.GetClassId() == TokenStream::kClassId) {
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 870bb34..e855b0f 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -996,7 +996,15 @@
         return R31IsSP;
       }
     }
-    // TODO(zra): Handle for logical immediate operations.
+    if (IsLogicalImmOp()) {
+      const int op = Bits(29, 2);
+      const bool set_flags = op == 3;
+      if (set_flags) {
+        return R31IsZR;
+      } else {
+        return R31IsSP;
+      }
+    }
     return R31IsZR;
   }
 
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index 657ffb0..4449cb1 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -404,7 +404,7 @@
   V(StoreLocal,                      X, xeg, ___, ___) \
   V(PopLocal,                        X, xeg, ___, ___) \
   V(StaticCall,                    A_D, num, num, ___) \
-  V(InstanceCall1,                  A_D, num, num, ___) \
+  V(InstanceCall1,                 A_D, num, num, ___) \
   V(InstanceCall2,                 A_D, num, num, ___) \
   V(InstanceCall1Opt,              A_D, num, num, ___) \
   V(InstanceCall2Opt,              A_D, num, num, ___) \
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index f4821e4..fe8154b 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -4,6 +4,7 @@
 
 #include "vm/dart.h"
 
+#include "vm/become.h"
 #include "vm/code_observers.h"
 #include "vm/cpu.h"
 #include "vm/dart_api_state.h"
@@ -146,6 +147,7 @@
   Isolate::InitOnce();
   PortMap::InitOnce();
   FreeListElement::InitOnce();
+  ForwardingCorpse::InitOnce();
   Api::InitOnce();
   NOT_IN_PRODUCT(CodeObservers::InitOnce());
   if (FLAG_profiler) {
@@ -653,7 +655,6 @@
   Isolate* isolate = Isolate::Current();
   void* callback_data = isolate->init_callback_data();
   Dart_IsolateShutdownCallback callback = Isolate::ShutdownCallback();
-  ServiceIsolate::SendIsolateShutdownMessage();
   if (callback != NULL) {
     (callback)(callback_data);
   }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 95ae648..254d829 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -42,6 +42,7 @@
 #include "vm/timeline.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
+#include "vm/uri.h"
 #include "vm/verifier.h"
 #include "vm/version.h"
 
@@ -480,6 +481,9 @@
   CHECK_API_SCOPE(T);
   HANDLESCOPE(T);
   CHECK_CALLBACK_STATE(T);
+  // Ensure we transition safepoint state to VM if we are not already in
+  // that state.
+  TransitionToVM transition(T);
 
   va_list args;
   va_start(args, format);
@@ -847,23 +851,20 @@
 
 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
   Thread* thread = Thread::Current();
-  {
-    const Object& obj = Object::Handle(thread->zone(),
-        Api::UnwrapHandle(handle));
-    if (!obj.IsError()) {
-      return Api::NewError(
-          "%s expects argument 'handle' to be an error handle.  "
-          "Did you forget to check Dart_IsError first?",
-          CURRENT_FUNC);
-    }
+  TransitionNativeToVM transition(thread);
+  const Object& obj = Object::Handle(thread->zone(),
+                                     Api::UnwrapHandle(handle));
+  if (!obj.IsError()) {
+    return Api::NewError(
+        "%s expects argument 'handle' to be an error handle.  "
+        "Did you forget to check Dart_IsError first?",
+        CURRENT_FUNC);
   }
   if (thread->top_exit_frame_info() == 0) {
     // There are no dart frames on the stack so it would be illegal to
     // propagate an error here.
     return Api::NewError("No Dart frames on stack, cannot propagate error.");
   }
-
-  TransitionNativeToVM transition(thread);
   // Unwind all the API scopes till the exit frame before propagating.
   const Error* error;
   {
@@ -975,6 +976,7 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
   PersistentHandle* ref = PersistentHandle::Cast(object);
@@ -987,6 +989,7 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
   FinalizablePersistentHandle* weak_ref =
@@ -1061,6 +1064,7 @@
 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
   PersistentHandle* ref = PersistentHandle::Cast(object);
@@ -1076,6 +1080,7 @@
     Dart_WeakPersistentHandle object) {
   Isolate* isolate = reinterpret_cast<Isolate*>(current_isolate);
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   ASSERT(isolate == Isolate::Current());
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
@@ -1091,8 +1096,10 @@
 DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
     Dart_GcPrologueCallback prologue_callback,
     Dart_GcEpilogueCallback epilogue_callback) {
-  Isolate* isolate = Isolate::Current();
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  DARTSCOPE(thread);
   if (prologue_callback != NULL) {
     if (isolate->gc_prologue_callback() != NULL) {
       return Api::NewError(
@@ -1290,13 +1297,14 @@
     StackZone zone(T);
     HandleScope handle_scope(T);
     Dart::RunShutdownCallback();
+    // The Thread structure is disassociated from the isolate, we do the
+    // safepoint transition explicity here instead of using the TransitionXXX
+    // scope objects as the original transition happened outside this scope in
+    // Dart_EnterIsolate/Dart_CreateIsolate.
+    T->ExitSafepoint();
+    T->set_execution_state(Thread::kThreadInVM);
+    ServiceIsolate::SendIsolateShutdownMessage();
   }
-  // The Thread structure is disassociated from the isolate, we do the
-  // safepoint transition explicity here instead of using the TransitionXXX
-  // scope objects as the original transition happened outside this scope in
-  // Dart_EnterIsolate/Dart_CreateIsolate.
-  T->ExitSafepoint();
-  T->set_execution_state(Thread::kThreadInVM);
   Dart::ShutdownIsolate();
 }
 
@@ -1309,6 +1317,7 @@
 DART_EXPORT void* Dart_CurrentIsolateData() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->init_callback_data();
 }
 
@@ -1318,6 +1327,7 @@
     FATAL1("%s expects argument 'isolate' to be non-null.",  CURRENT_FUNC);
   }
   // TODO(16615): Validate isolate parameter.
+  NoSafepointScope no_safepoint_scope;
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
   return iso->init_callback_data();
 }
@@ -1371,6 +1381,7 @@
 DART_EXPORT bool Dart_ShouldPauseOnStart() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->should_pause_on_start();
 }
 
@@ -1378,6 +1389,7 @@
 DART_EXPORT void Dart_SetShouldPauseOnStart(bool should_pause) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   if (isolate->is_runnable()) {
     FATAL1("%s expects the current isolate to not be runnable yet.",
            CURRENT_FUNC);
@@ -1389,6 +1401,7 @@
 DART_EXPORT bool Dart_IsPausedOnStart() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->is_paused_on_start();
 }
 
@@ -1396,6 +1409,7 @@
 DART_EXPORT void Dart_SetPausedOnStart(bool paused) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   if (isolate->message_handler()->is_paused_on_start() != paused) {
     isolate->message_handler()->PausedOnStart(paused);
   }
@@ -1405,6 +1419,7 @@
 DART_EXPORT bool Dart_ShouldPauseOnExit() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->should_pause_on_exit();
 }
 
@@ -1412,6 +1427,7 @@
 DART_EXPORT void Dart_SetShouldPauseOnExit(bool should_pause) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->set_should_pause_on_exit(should_pause);
 }
 
@@ -1419,6 +1435,7 @@
 DART_EXPORT bool Dart_IsPausedOnExit() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->is_paused_on_exit();
 }
 
@@ -1426,6 +1443,7 @@
 DART_EXPORT void Dart_SetPausedOnExit(bool paused) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   if (isolate->message_handler()->is_paused_on_exit() != paused) {
     isolate->message_handler()->PausedOnExit(paused);
   }
@@ -1557,6 +1575,7 @@
     FATAL1("%s expects argument 'isolate' to be non-null.",  CURRENT_FUNC);
   }
   // TODO(16615): Validate isolate parameter.
+  TransitionNativeToVM transition(Thread::Current());
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
   iso->SendInternalLibMessage(Isolate::kInterruptMsg, iso->pause_capability());
 }
@@ -1584,6 +1603,7 @@
     Dart_MessageNotifyCallback message_notify_callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   isolate->set_message_notify_callback(message_notify_callback);
 }
 
@@ -1591,6 +1611,7 @@
 DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback() {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_notify_callback();
 }
 
@@ -1700,6 +1721,7 @@
 DART_EXPORT bool Dart_HasServiceMessages() {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->HasOOBMessages();
 }
 
@@ -1707,6 +1729,7 @@
 DART_EXPORT bool Dart_HasLivePorts() {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate);
+  NoSafepointScope no_safepoint_scope;
   return isolate->message_handler()->HasLivePorts();
 }
 
@@ -1784,6 +1807,7 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
   ApiLocalScope* new_scope = thread->api_reusable_scope();
   if (new_scope == NULL) {
     new_scope = new ApiLocalScope(thread->api_top_scope(),
@@ -1802,6 +1826,7 @@
 DART_EXPORT void Dart_ExitScope() {
   Thread* T = Thread::Current();
   CHECK_API_SCOPE(T);
+  NoSafepointScope no_safepoint_scope;
   ApiLocalScope* scope = T->api_top_scope();
   ApiLocalScope* reusable_scope = T->api_reusable_scope();
   T->set_api_top_scope(scope->previous());  // Reset top scope to previous.
@@ -4577,20 +4602,16 @@
   if (Api::IsError(exception)) {
     ::Dart_PropagateError(exception);
   }
-
-  {
-    const Instance& excp = Api::UnwrapInstanceHandle(zone, exception);
-    if (excp.IsNull()) {
-      RETURN_TYPE_ERROR(zone, exception, Instance);
-    }
+  TransitionNativeToVM transition(thread);
+  const Instance& excp = Api::UnwrapInstanceHandle(zone, exception);
+  if (excp.IsNull()) {
+    RETURN_TYPE_ERROR(zone, exception, Instance);
   }
   if (thread->top_exit_frame_info() == 0) {
     // There are no dart frames on the stack so it would be illegal to
     // throw an exception here.
     return Api::NewError("No Dart frames on stack, cannot throw exception");
   }
-
-  TransitionNativeToVM transition(thread);
   // Unwind all the API scopes till the exit frame before throwing an
   // exception.
   const Instance* saved_exception;
@@ -4613,6 +4634,7 @@
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
   CHECK_CALLBACK_STATE(thread);
+  TransitionNativeToVM transition(thread);
   {
     const Instance& excp = Api::UnwrapInstanceHandle(zone, exception);
     if (excp.IsNull()) {
@@ -4628,8 +4650,6 @@
     // throw an exception here.
     return Api::NewError("No Dart frames on stack, cannot throw exception");
   }
-
-  TransitionNativeToVM transition(thread);
   // Unwind all the API scopes till the exit frame before throwing an
   // exception.
   const Instance* saved_exception;
@@ -5124,6 +5144,7 @@
   } else {
     // Slow path for Mints and Bigints.
     ASSERT_CALLBACK_STATE(arguments->thread());
+    TransitionNativeToVM transition(arguments->thread());
     Api::SetIntegerReturnValue(arguments, retval);
   }
 }
@@ -5133,6 +5154,7 @@
                                            double retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   ASSERT_CALLBACK_STATE(arguments->thread());
+  TransitionNativeToVM transition(arguments->thread());
   Api::SetDoubleReturnValue(arguments, retval);
 }
 
@@ -5148,6 +5170,31 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_DefaultCanonicalizeUrl(Dart_Handle library,
+                                                    Dart_Handle url) {
+  API_TIMELINE_DURATION;
+  DARTSCOPE(Thread::Current());
+  CHECK_CALLBACK_STATE(T);
+
+  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
+  if (lib.IsNull()) {
+    RETURN_TYPE_ERROR(Z, library, Library);
+  }
+  const String& uri = Api::UnwrapStringHandle(Z, url);
+  if (uri.IsNull()) {
+    RETURN_TYPE_ERROR(Z, url, String);
+  }
+
+  const String& lib_uri = String::Handle(Z, lib.url());
+  const char* resolved_uri;
+  if (!ResolveUri(uri.ToCString(), lib_uri.ToCString(), &resolved_uri)) {
+    return Api::NewError("%s: Unable to canonicalize uri '%s'.",
+                         CURRENT_FUNC, uri.ToCString());
+  }
+  return Api::NewHandle(T, String::New(resolved_uri));
+}
+
+
 // NOTE: Need to pass 'result' as a parameter here in order to avoid
 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
 // which shows up because of the use of setjmp.
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 7b5f135..5818624 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -37,7 +37,7 @@
 #define FLAG_LIST(P, R, D, C)                                                  \
 P(always_megamorphic_calls, bool, false,                                       \
   "Instance call always as megamorphic.")                                      \
-P(background_compilation, bool, false,                                         \
+P(background_compilation, bool, USING_MULTICORE,                               \
   "Run optimizing compilation in background")                                  \
 R(background_compilation_stop_alot, false, bool, false,                        \
   "Stress test system: stop background compiler often.")                       \
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index d4fd498..4778d7a 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -156,8 +156,9 @@
       // TODO(vegorov) remove this once we have ported all necessary
       // instructions to DBC.
       if (!current->HasLocs()) {
-        graph_entry_->parsed_function().Bailout("SSALivenessAnalysis",
-                                                current->ToCString());
+        const char* msg = "SSALivenessAnalysis::ComputeInitialSets";
+        NOT_IN_PRODUCT(msg = current->ToCString());
+        graph_entry_->parsed_function().Bailout("SSALivenessAnalysis", msg);
       }
 #endif
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index bd07667..d1e0b85 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2411,6 +2411,7 @@
   // compiler.  If it was not, set it here.
   if (function.context_scope() == ContextScope::null()) {
     ASSERT(!is_implicit);
+    ASSERT(node->scope() != NULL);
     const ContextScope& context_scope = ContextScope::ZoneHandle(
         Z, node->scope()->PreserveOuterScope(owner()->context_level()));
     ASSERT(!function.HasCode());
@@ -2611,40 +2612,27 @@
 }
 
 
-static intptr_t GetResultCidOfNativeFactory(const Function& function) {
+static bool IsNativeListFactory(const Function& function) {
   switch (function.recognized_kind()) {
     case MethodRecognizer::kTypedData_Int8Array_factory:
-      return kTypedDataInt8ArrayCid;
     case MethodRecognizer::kTypedData_Uint8Array_factory:
-      return kTypedDataUint8ArrayCid;
     case MethodRecognizer::kTypedData_Uint8ClampedArray_factory:
-      return kTypedDataUint8ClampedArrayCid;
     case MethodRecognizer::kTypedData_Int16Array_factory:
-      return kTypedDataInt16ArrayCid;
     case MethodRecognizer::kTypedData_Uint16Array_factory:
-      return kTypedDataUint16ArrayCid;
     case MethodRecognizer::kTypedData_Int32Array_factory:
-      return kTypedDataInt32ArrayCid;
     case MethodRecognizer::kTypedData_Uint32Array_factory:
-      return kTypedDataUint32ArrayCid;
     case MethodRecognizer::kTypedData_Int64Array_factory:
-      return kTypedDataInt64ArrayCid;
     case MethodRecognizer::kTypedData_Uint64Array_factory:
-      return kTypedDataUint64ArrayCid;
     case MethodRecognizer::kTypedData_Float32Array_factory:
-      return kTypedDataFloat32ArrayCid;
     case MethodRecognizer::kTypedData_Float64Array_factory:
-      return kTypedDataFloat64ArrayCid;
     case MethodRecognizer::kTypedData_Float32x4Array_factory:
-      return kTypedDataFloat32x4ArrayCid;
     case MethodRecognizer::kTypedData_Int32x4Array_factory:
-      return kTypedDataInt32x4ArrayCid;
     case MethodRecognizer::kTypedData_Float64x2Array_factory:
-      return kTypedDataFloat64x2ArrayCid;
+      return true;
     default:
       break;
   }
-  return kDynamicCid;
+  return false;
 }
 
 
@@ -2660,12 +2648,11 @@
                              node->arguments()->names(),
                              arguments,
                              owner()->ic_data_array());
-  if (node->function().is_native()) {
-    const intptr_t result_cid = GetResultCidOfNativeFactory(node->function());
-    if (result_cid != kDynamicCid) {
-      call->set_result_cid(result_cid);
-      call->set_is_native_list_factory(true);
-    }
+  if (node->function().is_native() && IsNativeListFactory(node->function())) {
+    call->set_is_native_list_factory(true);
+  }
+  if (node->function().recognized_kind() != MethodRecognizer::kUnknown) {
+    call->set_result_cid(MethodRecognizer::ResultCid(node->function()));
   }
   ReturnDefinition(call);
 }
@@ -2819,6 +2806,9 @@
       // (0) type-arguments, (1) length.
       ASSERT(!LoadFieldInstr::IsFixedLengthArrayCid(result_cid) ||
              arguments->length() == 2);
+    } else if (node->constructor().recognized_kind() !=
+               MethodRecognizer::kUnknown) {
+      call->set_result_cid(MethodRecognizer::ResultCid(node->constructor()));
     }
     ReturnDefinition(call);
     return;
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index d0ffe77..2ee8ed1 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -888,6 +888,15 @@
 }
 
 
+CompileType PolymorphicInstanceCallInstr::ComputeType() const {
+  if (!HasSingleRecognizedTarget()) return CompileType::Dynamic();
+  const Function& target = Function::Handle(ic_data().GetTargetAt(0));
+  return (target.recognized_kind() != MethodRecognizer::kUnknown)
+      ? CompileType::FromCid(MethodRecognizer::ResultCid(target))
+      : CompileType::Dynamic();
+}
+
+
 CompileType StaticCallInstr::ComputeType() const {
   if (result_cid_ != kDynamicCid) {
     return CompileType::FromCid(result_cid_);
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 4704219..1763877 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -3038,6 +3038,34 @@
     default:          return NULL;
   }
 }
+#else
+static void TryFastPathSmiOp(
+    FlowGraphCompiler* compiler, ICData* call_ic_data, const String& name) {
+  if (!FLAG_two_args_smi_icd) {
+    return;
+  }
+  if (name.raw() == Symbols::Plus().raw()) {
+    __ AddTOS();
+  } else if (name.raw() == Symbols::Minus().raw()) {
+    __ SubTOS();
+  } else if (name.raw() == Symbols::EqualOperator().raw()) {
+    __ EqualTOS();
+  } else if (name.raw() == Symbols::LAngleBracket().raw()) {
+    __ LessThanTOS();
+  } else if (name.raw() == Symbols::RAngleBracket().raw()) {
+    __ GreaterThanTOS();
+  } else if (name.raw() == Symbols::BitAnd().raw()) {
+    __ BitAndTOS();
+  } else if (name.raw() == Symbols::BitOr().raw()) {
+    __ BitOrTOS();
+  } else if (name.raw() == Symbols::Star().raw()) {
+    __ MulTOS();
+  } else {
+    return;
+  }
+  bool is_smi_two_args_op = call_ic_data->AddSmiSmiCheckForFastSmiStubs();
+  ASSERT(is_smi_two_args_op);
+}
 #endif
 
 
@@ -3110,28 +3138,14 @@
     }
   }
 #else
-  call_ic_data = &ICData::ZoneHandle(call_ic_data->Original());
+  ICData* ic_data = &ICData::ZoneHandle(call_ic_data->Original());
 
   // Emit smi fast path instruction. If fast-path succeeds it skips the next
   // instruction otherwise it falls through.
-  if (function_name().raw() == Symbols::Plus().raw()) {
-    __ AddTOS();
-  } else if (function_name().raw() == Symbols::EqualOperator().raw()) {
-    __ EqualTOS();
-  } else if (function_name().raw() == Symbols::LAngleBracket().raw()) {
-    __ LessThanTOS();
-  } else if (function_name().raw() == Symbols::RAngleBracket().raw()) {
-    __ GreaterThanTOS();
-  } else if (function_name().raw() == Symbols::BitAnd().raw()) {
-    __ BitAndTOS();
-  } else if (function_name().raw() == Symbols::BitOr().raw()) {
-    __ BitOrTOS();
-  } else if (function_name().raw() == Symbols::Star().raw()) {
-    __ MulTOS();
-  }
+  TryFastPathSmiOp(compiler, ic_data, function_name());
 
   const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
-  switch (call_ic_data->NumArgsTested()) {
+  switch (ic_data->NumArgsTested()) {
     case 1:
       if (compiler->is_optimizing()) {
         __ InstanceCall1Opt(ArgumentCount(), call_ic_data_kidx);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index be04e5e..27fe9a1 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -2912,6 +2912,8 @@
     return instance_call_->token_pos();
   }
 
+  virtual CompileType ComputeType() const;
+
   virtual intptr_t ArgumentCount() const {
     return instance_call()->ArgumentCount();
   }
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 9d167dc..a2fa2cb 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2649,7 +2649,9 @@
   compiler->AddSlowPathCode(slow_path);
 
   __ ldr(TMP, Address(THR, Thread::stack_limit_offset()));
-  __ CompareRegisters(SP, TMP);
+  // Compare to CSP not SP because CSP is closer to the stack limit. See
+  // Assembler::EnterFrame.
+  __ CompareRegisters(CSP, TMP);
   __ b(slow_path->entry_label(), LS);
   if (compiler->CanOSRFunction() && in_loop()) {
     const Register temp = locs()->temp(0).reg();
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc
index 16a2baf..4af998e 100644
--- a/runtime/vm/intermediate_language_dbc.cc
+++ b/runtime/vm/intermediate_language_dbc.cc
@@ -212,7 +212,11 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#if defined(PRODUCT)
+  compiler->Bailout("PolymorphicInstanceCallInstr::EmitNativeCode");
+#else  // defined(PRODUCT)
   compiler->Bailout(ToCString());
+#endif  // defined(PRODUCT)
 }
 
 
@@ -505,7 +509,11 @@
 EMIT_NATIVE_CODE(StoreIndexed, 3) {
   if (compiler->is_optimizing()) {
     if (class_id() != kArrayCid) {
+#if defined(PRODUCT)
+      compiler->Bailout("StoreIndexed");
+#else  // defined(PRODUCT)
       compiler->Bailout(ToCString());
+#endif  // defined(PRODUCT)
     }
 
     __ StoreIndexed(locs()->in(kArrayPos).reg(),
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index bdd7c5c..03ffd48 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -68,7 +68,7 @@
   String& str = String::Handle(zone);
   Error& error = Error::Handle(zone);
 
-#define SETUP_FUNCTION(class_name, function_name, destination, fp)             \
+#define SETUP_FUNCTION(class_name, function_name, destination, type, fp)       \
   if (strcmp(#class_name, "::") == 0) {                                        \
     str = String::New(#function_name);                                         \
     func = lib.LookupFunctionAllowPrivate(str);                                \
@@ -179,7 +179,7 @@
   FlowGraph* graph = new FlowGraph(parsed_function, graph_entry, block_id);
   const Function& function = parsed_function.function();
   switch (function.recognized_kind()) {
-#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
+#define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
     case MethodRecognizer::k##enum_name:                                       \
       if (!Build_##enum_name(graph)) return false;                             \
       break;
@@ -227,7 +227,7 @@
     return;
   }
 
-#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
+#define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
     case MethodRecognizer::k##enum_name:                                       \
       compiler->assembler()->Comment("Intrinsic");                             \
       enum_name(compiler->assembler());                                        \
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 54eec6e..100dee4 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -38,7 +38,7 @@
  private:
   static bool CanIntrinsify(const Function& function);
 
-#define DECLARE_FUNCTION(test_class_name, test_function_name, enum_name, fp)   \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp) \
   static void enum_name(Assembler* assembler);
 
   ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
@@ -50,7 +50,7 @@
 #undef DECLARE_FUNCTION
 
 #if !defined(TARGET_ARCH_DBC)
-#define DECLARE_FUNCTION(test_class_name, test_function_name, enum_name, fp)   \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp) \
   static bool Build_##enum_name(FlowGraph* flow_graph);
 
   GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
diff --git a/runtime/vm/intrinsifier_dbc.cc b/runtime/vm/intrinsifier_dbc.cc
index 21a3ae0..3d0b5d1 100644
--- a/runtime/vm/intrinsifier_dbc.cc
+++ b/runtime/vm/intrinsifier_dbc.cc
@@ -23,7 +23,7 @@
 
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
-#define DEFINE_FUNCTION(test_class_name, test_function_name, enum_name, fp)    \
+#define DEFINE_FUNCTION(class_name, test_function_name, enum_name, type, fp)   \
   void Intrinsifier::enum_name(Assembler* assembler) {                         \
     if (Simulator::IsSupportedIntrinsic(Simulator::k##enum_name##Intrinsic)) { \
       assembler->Intrinsic(Simulator::k##enum_name##Intrinsic);                \
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 0291517..5913789 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -408,7 +408,7 @@
         class_table->HasValidClassAt(i)) {
       // Copy the class into the saved class table and add it to the set.
       local_saved_class_table[i] = class_table->At(i);
-      if (i != kFreeListElement) {
+      if (i != kFreeListElement && i != kForwardingCorpse) {
         cls = class_table->At(i);
         bool already_present = old_classes_set.Insert(cls);
         ASSERT(!already_present);
@@ -971,8 +971,8 @@
   }
 
   virtual void VisitObject(RawObject* obj) {
-    // Free-list elements cannot even be wrapped in handles.
-    if (obj->IsFreeListElement()) {
+    if (obj->IsPseudoObject()) {
+      // Cannot even be wrapped in handles.
       return;
     }
     handle_ = obj;
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index b6d1382..9b45046 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -648,7 +648,7 @@
 
 TEST_CASE(IsolateReload_LiveStack) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "helper() => 7;\n"
       "alpha() { var x = helper(); reloadTest(); return x + helper(); }\n"
       "foo() => alpha();\n"
@@ -661,7 +661,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "helper() => 100;\n"
       "alpha() => 5 + helper();\n"
       "foo() => alpha();\n"
@@ -694,41 +694,41 @@
 
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
 
-  // Fail to find 'importable_test_lib' in the isolate.
-  result = Dart_LookupLibrary(NewString("importable_test_lib"));
+  // Fail to find 'test:importable_lib' in the isolate.
+  result = Dart_LookupLibrary(NewString("test:importable_lib"));
   EXPECT(Dart_IsError(result));
 
   const char* kReloadScript =
-      "import 'importable_test_lib';\n"
+      "import 'test:importable_lib';\n"
       "main() {\n"
       "  return importedFunc();\n"
       "}\n";
 
-  // Reload and add 'importable_test_lib' to isolate.
+  // Reload and add 'test:importable_lib' to isolate.
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
 
   EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
 
-  // Find 'importable_test_lib' in the isolate.
-  result = Dart_LookupLibrary(NewString("importable_test_lib"));
+  // Find 'test:importable_lib' in the isolate.
+  result = Dart_LookupLibrary(NewString("test:importable_lib"));
   EXPECT(Dart_IsLibrary(result));
 
   // Reload and remove 'dart:math' from isolate.
   lib = TestCase::ReloadTestScript(kScript);
   EXPECT_VALID(lib);
 
-  // Fail to find 'importable_test_lib' in the isolate.
-  result = Dart_LookupLibrary(NewString("importable_test_lib"));
+  // Fail to find 'test:importable_lib' in the isolate.
+  result = Dart_LookupLibrary(NewString("test:importable_lib"));
   EXPECT(Dart_IsError(result));
 }
 
 
 TEST_CASE(IsolateReload_LibraryHide) {
-  // Import 'importable_test_lib' with importedFunc hidden. Will result in an
+  // Import 'test:importable_lib' with importedFunc hidden. Will result in an
   // error.
   const char* kScript =
-      "import 'importable_test_lib' hide importedFunc;\n"
+      "import 'test:importable_lib' hide importedFunc;\n"
       "main() {\n"
       "  return importedFunc();\n"
       "}\n";
@@ -740,9 +740,9 @@
 
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
 
-  // Import 'importable_test_lib'.
+  // Import 'test:importable_lib'.
   const char* kReloadScript =
-      "import 'importable_test_lib';\n"
+      "import 'test:importable_lib';\n"
       "main() {\n"
       "  return importedFunc();\n"
       "}\n";
@@ -755,10 +755,10 @@
 
 
 TEST_CASE(IsolateReload_LibraryShow) {
-  // Import 'importable_test_lib' with importedIntFunc visible. Will result in
+  // Import 'test:importable_lib' with importedIntFunc visible. Will result in
   // an error when 'main' is invoked.
   const char* kScript =
-      "import 'importable_test_lib' show importedIntFunc;\n"
+      "import 'test:importable_lib' show importedIntFunc;\n"
       "main() {\n"
       "  return importedFunc();\n"
       "}\n"
@@ -775,10 +775,10 @@
   // Results in an error.
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
 
-  // Import 'importable_test_lib' with importedFunc visible. Will result in
+  // Import 'test:importable_lib' with importedFunc visible. Will result in
   // an error when 'mainInt' is invoked.
   const char* kReloadScript =
-      "import 'importable_test_lib' show importedFunc;\n"
+      "import 'test:importable_lib' show importedFunc;\n"
       "main() {\n"
       "  return importedFunc();\n"
       "}\n"
@@ -800,8 +800,8 @@
 // that is compatible with the fast path smi stubs.
 TEST_CASE(IsolateReload_SmiFastPathStubs) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
-      "import 'importable_test_lib' show importedIntFunc;\n"
+      "import 'test:isolate_reload_helper';\n"
+      "import 'test:importable_lib' show importedIntFunc;\n"
       "main() {\n"
       "  var x = importedIntFunc();\n"
       "  var y = importedIntFunc();\n"
@@ -824,7 +824,7 @@
 // mixins when we reload.
 TEST_CASE(IsolateReload_ImportedMixinFunction) {
   const char* kScript =
-      "import 'importable_test_lib' show ImportedMixin;\n"
+      "import 'test:importable_lib' show ImportedMixin;\n"
       "class A extends Object with ImportedMixin {\n"
       "}"
       "var func = new A().mixinFunc;\n"
@@ -838,7 +838,7 @@
   EXPECT_STREQ("mixin", SimpleInvokeStr(lib, "main"));
 
   const char* kReloadScript =
-      "import 'importable_test_lib' show ImportedMixin;\n"
+      "import 'test:importable_lib' show ImportedMixin;\n"
       "class A extends Object with ImportedMixin {\n"
       "}"
       "var func;\n"
@@ -877,7 +877,7 @@
 
 TEST_CASE(IsolateReload_PendingUnqualifiedCall_StaticToInstance) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  static foo() => 'static';\n"
       "  test() {\n"
@@ -893,7 +893,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  foo() => 'instance';\n"
       "  test() {\n"
@@ -918,7 +918,7 @@
 
 TEST_CASE(IsolateReload_PendingUnqualifiedCall_InstanceToStatic) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  foo() => 'instance';\n"
       "  test() {\n"
@@ -934,7 +934,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  static foo() => 'static';\n"
       "  test() {\n"
@@ -959,7 +959,7 @@
 
 TEST_CASE(IsolateReload_PendingConstructorCall_AbstractToConcrete) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "abstract class Foo {}\n"
       "class C {\n"
       "  test() {\n"
@@ -980,7 +980,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class Foo {}\n"
       "class C {\n"
       "  test() {\n"
@@ -1010,7 +1010,7 @@
 
 TEST_CASE(IsolateReload_PendingConstructorCall_ConcreteToAbstract) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class Foo {}\n"
       "class C {\n"
       "  test() {\n"
@@ -1031,7 +1031,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "abstract class Foo {}\n"
       "class C {\n"
       "  test() {\n"
@@ -1061,7 +1061,7 @@
 
 TEST_CASE(IsolateReload_PendingStaticCall_DefinedToNSM) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  static foo() => 'static'\n"
       "  test() {\n"
@@ -1081,7 +1081,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  test() {\n"
       "    reloadTest();\n"
@@ -1109,7 +1109,7 @@
 
 TEST_CASE(IsolateReload_PendingStaticCall_NSMToDefined) {
   const char* kScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  test() {\n"
       "    reloadTest();\n"
@@ -1128,7 +1128,7 @@
   EXPECT_VALID(lib);
 
   const char* kReloadScript =
-      "import 'isolate_reload_test_helper';\n"
+      "import 'test:isolate_reload_helper';\n"
       "class C {\n"
       "  static foo() => 'static'\n"
       "  test() {\n"
diff --git a/runtime/vm/lockers.cc b/runtime/vm/lockers.cc
index 2efe245..b8ac4b6 100644
--- a/runtime/vm/lockers.cc
+++ b/runtime/vm/lockers.cc
@@ -12,11 +12,11 @@
 static void updateThreadState(Thread* thread) {
   // First try a fast update of the thread state to indicate it is not at a
   // safepoint anymore.
-  uword old_state = Thread::SetAtSafepoint(true, 0);
+  uint32_t old_state = Thread::SetAtSafepoint(true, 0);
   uword addr =
       reinterpret_cast<uword>(thread) + Thread::safepoint_state_offset();
-  if (AtomicOperations::CompareAndSwapWord(
-          reinterpret_cast<uword*>(addr), old_state, 0) != old_state) {
+  if (AtomicOperations::CompareAndSwapUint32(
+          reinterpret_cast<uint32_t*>(addr), old_state, 0) != old_state) {
     // Fast update failed which means we could potentially be in the middle
     // of a safepoint operation and need to block for it.
     SafepointHandler* handler = thread->isolate()->safepoint_handler();
@@ -34,11 +34,11 @@
   Monitor::WaitResult result = monitor_->Wait(millis);
   // First try a fast update of the thread state to indicate it is not at a
   // safepoint anymore.
-  uword old_state = Thread::SetAtSafepoint(true, 0);
+  uint32_t old_state = Thread::SetAtSafepoint(true, 0);
   uword addr =
       reinterpret_cast<uword>(thread) + Thread::safepoint_state_offset();
-  if (AtomicOperations::CompareAndSwapWord(
-          reinterpret_cast<uword*>(addr), old_state, 0) != old_state) {
+  if (AtomicOperations::CompareAndSwapUint32(
+          reinterpret_cast<uint32_t*>(addr), old_state, 0) != old_state) {
     // Fast update failed which means we could potentially be in the middle
     // of a safepoint operation and need to block for it.
     monitor_->Exit();
@@ -98,11 +98,11 @@
     Monitor::WaitResult result = monitor_->Wait(millis);
     // First try a fast update of the thread state to indicate it is not at a
     // safepoint anymore.
-    uword old_state = Thread::SetAtSafepoint(true, 0);
+    uint32_t old_state = Thread::SetAtSafepoint(true, 0);
     uword addr =
         reinterpret_cast<uword>(thread) + Thread::safepoint_state_offset();
-    if (AtomicOperations::CompareAndSwapWord(
-            reinterpret_cast<uword*>(addr), old_state, 0) != old_state) {
+    if (AtomicOperations::CompareAndSwapUint32(
+            reinterpret_cast<uint32_t*>(addr), old_state, 0) != old_state) {
       // Fast update failed which means we could potentially be in the middle
       // of a safepoint operation and need to block for it.
       monitor_->Exit();
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 8784651..5e5f685 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -457,6 +457,11 @@
 }
 
 
+void MessageHandler::DebugDump() {
+  PortMap::DebugDumpForMessageHandler(this);
+}
+
+
 void MessageHandler::PausedOnStartLocked(MonitorLocker* ml, bool paused) {
   if (paused) {
     ASSERT(!is_paused_on_start_);
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 1d039c5..c52431d 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -81,6 +81,8 @@
     return live_ports_;
   }
 
+  void DebugDump();
+
   bool paused() const { return paused_ > 0; }
 
   void increment_paused() { paused_++; }
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
index 45a6f59..03014ac 100644
--- a/runtime/vm/method_recognizer.cc
+++ b/runtime/vm/method_recognizer.cc
@@ -25,7 +25,19 @@
 }
 
 
-#define KIND_TO_STRING(class_name, function_name, enum_name, fp)               \
+intptr_t MethodRecognizer::ResultCid(const Function& function) {
+  switch (function.recognized_kind()) {
+#define DEFINE_CASE(cname, fname, ename, result_type, fingerprint) \
+    case k##ename: return k##result_type##Cid;
+    RECOGNIZED_LIST(DEFINE_CASE)
+#undef DEFINE_CASE
+    default:
+      return kDynamicCid;
+  }
+}
+
+
+#define KIND_TO_STRING(class_name, function_name, enum_name, type, fp) \
   #enum_name,
 static const char* recognized_list_method_name[] = {
   "Unknown",
@@ -51,7 +63,7 @@
   libs.Add(&Library::ZoneHandle(Library::DeveloperLibrary()));
   Function& func = Function::Handle();
 
-#define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, fp)          \
+#define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, type, fp)    \
   func = Library::GetFunction(libs, #class_name, #function_name);              \
   if (func.IsNull()) {                                                         \
     OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
@@ -74,7 +86,7 @@
 #define SET_IS_ALWAYS_INLINE(class_name, function_name, dest, fp)              \
   SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_always_inline, true)
 
-#define SET_IS_NEVER_INLINE(class_name, function_name, dest, fp)              \
+#define SET_IS_NEVER_INLINE(class_name, function_name, dest, fp)               \
   SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_is_inlinable, false)
 
 #define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp)         \
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 6d7e1e8..33b7f42 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -9,293 +9,319 @@
 
 namespace dart {
 
-// (class-name, function-name, recognized enum, fingerprint).
+// (class-name, function-name, recognized enum, result type, fingerprint).
 // When adding a new function add a 0 as fingerprint, build and run to get the
 // correct fingerprint from the mismatch error.
 #define OTHER_RECOGNIZED_LIST(V)                                               \
-  V(::, identical, ObjectIdentical, 317103244)                                 \
-  V(ClassID, getID, ClassIDgetID, 1385157717)                                  \
-  V(Object, Object., ObjectConstructor, 1746278398)                            \
-  V(_List, ., ObjectArrayAllocate, 1661438741)                                 \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1508321565)                    \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 953411007)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 433971756)                   \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1329446488)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 137212209)                   \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 499907480)                 \
-  V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 1639388276)                  \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 1672834581)              \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 966634744)               \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1197581758)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 810805548)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1317196265)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 1328908284)                  \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1827614958)                  \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1694054572)                \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 915652649)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1958474336)                \
-  V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 1970687707)                  \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1853026980)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1197862362)              \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 2093630771)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1982971324)              \
-  V(_StringBase, _interpolate, StringBaseInterpolate, 1872292681)              \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 792762465)              \
-  V(_Double, _add, DoubleAdd, 2213216)                                         \
-  V(_Double, _sub, DoubleSub, 1100692582)                                      \
-  V(_Double, _mul, DoubleMul, 436784097)                                       \
-  V(_Double, _div, DoubleDiv, 953317135)                                       \
-  V(::, min, MathMin, 1115051548)                                              \
-  V(::, max, MathMax, 1410473322)                                              \
-  V(::, _doublePow, MathDoublePow, 1770960781)                                 \
-  V(Float32x4, Float32x4., Float32x4Constructor, 93751705)                     \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, 1193954374)                      \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, 12296613)                      \
-  V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits, 1188039061)\
-  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1750763218)    \
-  V(Float32x4, shuffle, Float32x4Shuffle, 2015957023)                          \
-  V(Float32x4, shuffleMix, Float32x4ShuffleMix, 1099087979)                    \
-  V(Float32x4, get:signMask, Float32x4GetSignMask, 487049875)                  \
-  V(Float32x4, _cmpequal, Float32x4Equal, 127403211)                           \
-  V(Float32x4, _cmpgt, Float32x4GreaterThan, 2118391173)                       \
-  V(Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 557807661)                \
-  V(Float32x4, _cmplt, Float32x4LessThan, 1061691185)                          \
-  V(Float32x4, _cmplte, Float32x4LessThanOrEqual, 102608993)                   \
-  V(Float32x4, _cmpnequal, Float32x4NotEqual, 1873649982)                      \
-  V(Float32x4, _min, Float32x4Min, 1158016632)                                 \
-  V(Float32x4, _max, Float32x4Max, 118915526)                                  \
-  V(Float32x4, _scale, Float32x4Scale, 415757469)                              \
-  V(Float32x4, _sqrt, Float32x4Sqrt, 1934518992)                               \
-  V(Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 1586141174)           \
-  V(Float32x4, _reciprocal, Float32x4Reciprocal, 1651466502)                   \
-  V(Float32x4, _negate, Float32x4Negate, 2142478676)                           \
-  V(Float32x4, _abs, Float32x4Absolute, 337704007)                             \
-  V(Float32x4, _clamp, Float32x4Clamp, 1107305005)                             \
-  V(Float32x4, withX, Float32x4WithX, 1311992575)                              \
-  V(Float32x4, withY, Float32x4WithY, 175290640)                               \
-  V(Float32x4, withZ, Float32x4WithZ, 837367384)                               \
-  V(Float32x4, withW, Float32x4WithW, 1625145605)                              \
-  V(Float64x2, Float64x2., Float64x2Constructor, 423355933)                    \
-  V(Float64x2, Float64x2.zero, Float64x2Zero, 2066666975)                      \
-  V(Float64x2, Float64x2.splat, Float64x2Splat, 716962994)                     \
-  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 792974246)     \
-  V(Float64x2, get:x, Float64x2GetX, 1488958362)                               \
-  V(Float64x2, get:y, Float64x2GetY, 1022688506)                               \
-  V(Float64x2, _negate, Float64x2Negate, 1693416311)                           \
-  V(Float64x2, abs, Float64x2Abs, 52403783)                                    \
-  V(Float64x2, sqrt, Float64x2Sqrt, 2012680669)                                \
-  V(Float64x2, get:signMask, Float64x2GetSignMask, 668856717)                  \
-  V(Float64x2, scale, Float64x2Scale, 646122081)                               \
-  V(Float64x2, withX, Float64x2WithX, 489409269)                               \
-  V(Float64x2, withY, Float64x2WithY, 943642284)                               \
-  V(Float64x2, min, Float64x2Min, 685235702)                                   \
-  V(Float64x2, max, Float64x2Max, 198659675)                                   \
-  V(Int32x4, Int32x4., Int32x4Constructor, 649173415)                          \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 458597857)                  \
-  V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits, 2122470988)  \
-  V(Int32x4, get:flagX, Int32x4GetFlagX, 1446544324)                           \
-  V(Int32x4, get:flagY, Int32x4GetFlagY, 1148149370)                           \
-  V(Int32x4, get:flagZ, Int32x4GetFlagZ, 550901369)                            \
-  V(Int32x4, get:flagW, Int32x4GetFlagW, 1346664620)                           \
-  V(Int32x4, get:signMask, Int32x4GetSignMask, 740215269)                      \
-  V(Int32x4, shuffle, Int32x4Shuffle, 549194518)                               \
-  V(Int32x4, shuffleMix, Int32x4ShuffleMix, 1550866145)                        \
-  V(Int32x4, select, Int32x4Select, 1368318775)                                \
-  V(Int32x4, withFlagX, Int32x4WithFlagX, 250974159)                           \
-  V(Int32x4, withFlagY, Int32x4WithFlagY, 1686481348)                          \
-  V(Int32x4, withFlagZ, Int32x4WithFlagZ, 645582330)                           \
-  V(Int32x4, withFlagW, Int32x4WithFlagW, 878364277)                           \
-  V(Float32List, [], Float32ArrayGetIndexed, 1451643535)                       \
-  V(Float32List, []=, Float32ArraySetIndexed, 453873887)                       \
-  V(Int8List, [], Int8ArrayGetIndexed, 110819507)                              \
-  V(Int8List, []=, Int8ArraySetIndexed, 865684695)                             \
-  V(Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 41288685)               \
-  V(Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 687206488)             \
+  V(::, identical, ObjectIdentical, Bool, 0x12e69c8c)                          \
+  V(ClassID, getID, ClassIDgetID, Smi, 0x528fd455)                             \
+  V(Object, Object., ObjectConstructor, Dynamic, 0x681617fe)                   \
+  V(_List, ., ObjectArrayAllocate, Array, 0x63078b15)                          \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, Smi, 0x59e7291d)               \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, Smi, 0x38d3e5bf)             \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, Smi, 0x19dde22c)             \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, Smi, 0x4f3dbe58)           \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, Dynamic, 0x082db131)         \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, Dynamic, 0x1dcbfb98)       \
+  V(_TypedList, _getInt64, ByteArrayBaseGetInt64, Dynamic, 0x61b71474)         \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, Double, 0x63b56e15)      \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, Double, 0x399dacf8)      \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, Float32x4,           \
+    0x4761a5be)                                                                \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, Int32x4, 0x3053e92c)     \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, Dynamic, 0x4e82d1e9)           \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, Dynamic, 0x4f3587fc)         \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, Dynamic, 0x6cef30ee)         \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, Dynamic, 0x64f938ac)       \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, Dynamic, 0x3693c029)         \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, Dynamic, 0x74bbf260)       \
+  V(_TypedList, _setInt64, ByteArrayBaseSetInt64, Dynamic, 0x75764edb)         \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, Dynamic, 0x6e72f2a4)     \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, Dynamic, 0x4765edda)     \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, Dynamic, 0x7cca4533) \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, Dynamic, 0x7631bdbc)     \
+  V(_StringBase, _interpolate, StringBaseInterpolate, Dynamic, 0x6f98eb49)     \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, Double, 0x2f409861)     \
+  V(_Double, _add, DoubleAdd, Double, 0x0021c560)                              \
+  V(_Double, _sub, DoubleSub, Double, 0x419b3c66)                              \
+  V(_Double, _mul, DoubleMul, Double, 0x1a08cbe1)                              \
+  V(_Double, _div, DoubleDiv, Double, 0x38d2770f)                              \
+  V(::, min, MathMin, Dynamic, 0x4276561c)                                     \
+  V(::, max, MathMax, Dynamic, 0x54121d6a)                                     \
+  V(::, _doublePow, MathDoublePow, Double, 0x698eb78d)                         \
+  V(Float32x4, Float32x4., Float32x4Constructor, Float32x4, 0x05968999)        \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, Float32x4, 0x472a4c46)           \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, Float32x4, 0x00bba1a5)         \
+  V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits, Float32x4, \
+    0x46d00995)                                                                \
+  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, Float32x4,     \
+    0x685a86d2)                                                                \
+  V(Float32x4, shuffle, Float32x4Shuffle, Float32x4, 0x7829101f)               \
+  V(Float32x4, shuffleMix, Float32x4ShuffleMix, Float32x4, 0x4182c06b)         \
+  V(Float32x4, get:signMask, Float32x4GetSignMask, Dynamic, 0x1d07ca93)        \
+  V(Float32x4, _cmpequal, Float32x4Equal, Int32x4, 0x079804cb)                 \
+  V(Float32x4, _cmpgt, Float32x4GreaterThan, Int32x4, 0x7e441585)              \
+  V(Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, Int32x4, 0x213f782d)      \
+  V(Float32x4, _cmplt, Float32x4LessThan, Int32x4, 0x3f481f31)                 \
+  V(Float32x4, _cmplte, Float32x4LessThanOrEqual, Int32x4, 0x061db061)         \
+  V(Float32x4, _cmpnequal, Float32x4NotEqual, Int32x4, 0x6fada13e)             \
+  V(Float32x4, _min, Float32x4Min, Float32x4, 0x4505ee78)                      \
+  V(Float32x4, _max, Float32x4Max, Float32x4, 0x071681c6)                      \
+  V(Float32x4, _scale, Float32x4Scale, Float32x4, 0x18c7f49d)                  \
+  V(Float32x4, _sqrt, Float32x4Sqrt, Float32x4, 0x734e6ad0)                    \
+  V(Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, Float32x4,            \
+    0x5e8a97f6)                                                                \
+  V(Float32x4, _reciprocal, Float32x4Reciprocal, Float32x4, 0x626f6106)        \
+  V(Float32x4, _negate, Float32x4Negate, Float32x4, 0x7fb3a154)                \
+  V(Float32x4, _abs, Float32x4Absolute, Float32x4, 0x1420f447)                 \
+  V(Float32x4, _clamp, Float32x4Clamp, Float32x4, 0x4200222d)                  \
+  V(Float32x4, withX, Float32x4WithX, Float32x4, 0x4e336aff)                   \
+  V(Float32x4, withY, Float32x4WithY, Float32x4, 0x0a72b910)                   \
+  V(Float32x4, withZ, Float32x4WithZ, Float32x4, 0x31e93658)                   \
+  V(Float32x4, withW, Float32x4WithW, Float32x4, 0x60ddc105)                   \
+  V(Float64x2, Float64x2., Float64x2Constructor, Float64x2, 0x193be61d)        \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, Float64x2, 0x7b2ed5df)           \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, Float64x2, 0x2abbfcb2)         \
+  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, Float64x2,     \
+    0x2f43d3a6)                                                                \
+  V(Float64x2, get:x, Float64x2GetX, Double, 0x58bfb39a)                       \
+  V(Float64x2, get:y, Float64x2GetY, Double, 0x3cf4fcfa)                       \
+  V(Float64x2, _negate, Float64x2Negate, Float64x2, 0x64ef7b77)                \
+  V(Float64x2, abs, Float64x2Abs, Float64x2, 0x031f9e47)                       \
+  V(Float64x2, sqrt, Float64x2Sqrt, Float64x2, 0x77f711dd)                     \
+  V(Float64x2, get:signMask, Float64x2GetSignMask, Dynamic, 0x27ddf18d)        \
+  V(Float64x2, scale, Float64x2Scale, Float64x2, 0x26830a61)                   \
+  V(Float64x2, withX, Float64x2WithX, Float64x2, 0x1d2bcaf5)                   \
+  V(Float64x2, withY, Float64x2WithY, Float64x2, 0x383ed6ac)                   \
+  V(Float64x2, min, Float64x2Min, Float64x2, 0x28d7ddf6)                       \
+  V(Float64x2, max, Float64x2Max, Float64x2, 0x0bd74e5b)                       \
+  V(Int32x4, Int32x4., Int32x4Constructor, Int32x4, 0x26b199a7)                \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, Int32x4, 0x1b55a5e1)        \
+  V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits, Int32x4,     \
+    0x7e82564c)                                                                \
+  V(Int32x4, get:flagX, Int32x4GetFlagX, Bool, 0x563883c4)                     \
+  V(Int32x4, get:flagY, Int32x4GetFlagY, Bool, 0x446f5e7a)                     \
+  V(Int32x4, get:flagZ, Int32x4GetFlagZ, Bool, 0x20d61679)                     \
+  V(Int32x4, get:flagW, Int32x4GetFlagW, Bool, 0x504478ac)                     \
+  V(Int32x4, get:signMask, Int32x4GetSignMask, Dynamic, 0x2c1ec9e5)            \
+  V(Int32x4, shuffle, Int32x4Shuffle, Int32x4, 0x20bc0b16)                     \
+  V(Int32x4, shuffleMix, Int32x4ShuffleMix, Int32x4, 0x5c7056e1)               \
+  V(Int32x4, select, Int32x4Select, Float32x4, 0x518ee337)                     \
+  V(Int32x4, withFlagX, Int32x4WithFlagX, Int32x4, 0x0ef58fcf)                 \
+  V(Int32x4, withFlagY, Int32x4WithFlagY, Int32x4, 0x6485a9c4)                 \
+  V(Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                 \
+  V(Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                 \
+  V(Float32List, [], Float32ArrayGetIndexed, Double, 0x5686528f)               \
+  V(Float32List, []=, Float32ArraySetIndexed, Dynamic, 0x1b0d90df)             \
+  V(Int8List, [], Int8ArrayGetIndexed, Smi, 0x069af8b3)                        \
+  V(Int8List, []=, Int8ArraySetIndexed, Dynamic, 0x33994cd7)                   \
+  V(Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, Smi, 0x027603ed)        \
+  V(Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, Dynamic, 0x28f5f058)   \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    41288685)                                                                  \
+    Smi, 0x027603ed)                                                           \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    687206488)                                                                 \
-  V(Int16List, [], Int16ArrayGetIndexed, 389863073)                            \
-  V(Int16List, []=, Int16ArraySetIndexed, 855133756)                           \
-  V(Uint16List, [], Uint16ArrayGetIndexed, 1053739567)                         \
-  V(Uint16List, []=, Uint16ArraySetIndexed, 1547307961)                        \
-  V(Int32List, [], Int32ArrayGetIndexed, 640610057)                            \
-  V(Int32List, []=, Int32ArraySetIndexed, 453358705)                           \
-  V(Int64List, [], Int64ArrayGetIndexed, 202150810)                            \
-  V(Int64List, []=, Int64ArraySetIndexed, 924110852)                           \
-  V(Float32x4List, [], Float32x4ArrayGetIndexed, 29819259)                     \
-  V(Float32x4List, []=, Float32x4ArraySetIndexed, 1458062250)                  \
-  V(Int32x4List, [], Int32x4ArrayGetIndexed, 137707405)                        \
-  V(Int32x4List, []=, Int32x4ArraySetIndexed, 496650149)                       \
-  V(Float64x2List, [], Float64x2ArrayGetIndexed, 1721439384)                   \
-  V(Float64x2List, []=, Float64x2ArraySetIndexed, 1994027006)                  \
-  V(_Bigint, get:_neg, Bigint_getNeg, 2079423063)                              \
-  V(_Bigint, get:_used, Bigint_getUsed, 1426329619)                            \
-  V(_Bigint, get:_digits, Bigint_getDigits, 1185333683)                        \
-  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 2104211307)               \
-  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 1273697266)               \
-  V(_HashVMBase, get:_data, LinkedHashMap_getData, 1274399923)                 \
-  V(_HashVMBase, set:_data, LinkedHashMap_setData, 1611093357)                 \
-  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 367462469)          \
-  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 1049390812)         \
-  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 902147072)          \
-  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 1236137630)         \
-  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 812542585)    \
-  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 1072259010)   \
+    Dynamic, 0x28f5f058)                                                       \
+  V(Int16List, [], Int16ArrayGetIndexed, Smi, 0x173cd6a1)                      \
+  V(Int16List, []=, Int16ArraySetIndexed, Dynamic, 0x32f84e3c)                 \
+  V(Uint16List, [], Uint16ArrayGetIndexed, Smi, 0x3ececa2f)                    \
+  V(Uint16List, []=, Uint16ArraySetIndexed, Dynamic, 0x5c3a0bb9)               \
+  V(Int32List, [], Int32ArrayGetIndexed, Dynamic, 0x262eef09)                  \
+  V(Int32List, []=, Int32ArraySetIndexed, Dynamic, 0x1b05b471)                 \
+  V(Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x0c0c939a)                  \
+  V(Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x3714d004)                 \
+  V(Float32x4List, [], Float32x4ArrayGetIndexed, Float32x4, 0x01c7017b)        \
+  V(Float32x4List, []=, Float32x4ArraySetIndexed, Dynamic, 0x56e843aa)         \
+  V(Int32x4List, [], Int32x4ArrayGetIndexed, Int32x4, 0x08353f8d)              \
+  V(Int32x4List, []=, Int32x4ArraySetIndexed, Dynamic, 0x1d9a47a5)             \
+  V(Float64x2List, [], Float64x2ArrayGetIndexed, Float64x2, 0x669b1498)        \
+  V(Float64x2List, []=, Float64x2ArraySetIndexed, Dynamic, 0x76da6ffe)         \
+  V(_Bigint, get:_neg, Bigint_getNeg, Bool, 0x7bf17a57)                        \
+  V(_Bigint, get:_used, Bigint_getUsed, Smi, 0x55041013)                       \
+  V(_Bigint, get:_digits, Bigint_getDigits, TypedDataUint32Array, 0x46a6c1b3)  \
+  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, Dynamic, 0x7d6bb76b)      \
+  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, Dynamic, 0x4beb13f2)      \
+  V(_HashVMBase, get:_data, LinkedHashMap_getData, Array, 0x4bf5ccb3)          \
+  V(_HashVMBase, set:_data, LinkedHashMap_setData, Dynamic, 0x6007556d)        \
+  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, Smi, 0x15e70845)    \
+  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, Dynamic, 0x3e8c6edc)\
+  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, Smi, 0x35c5ac00)    \
+  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, Dynamic, 0x49adf69e)\
+  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, Smi,          \
+    0x306e6a79)                                                                \
+  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, Dynamic,      \
+    0x3fe95fc2)                                                                \
 
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, 1673522705)                                        \
-  V(_Smi, get:bitLength, Smi_bitLength, 632480332)                             \
-  V(_Bigint, _lsh, Bigint_lsh, 1557746963)                                     \
-  V(_Bigint, _rsh, Bigint_rsh, 761843937)                                      \
-  V(_Bigint, _absAdd, Bigint_absAdd, 1227835493)                               \
-  V(_Bigint, _absSub, Bigint_absSub, 390740532)                                \
-  V(_Bigint, _mulAdd, Bigint_mulAdd, 617534446)                                \
-  V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1623635507)                               \
-  V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 797340802)            \
-  V(_Montgomery, _mulMod, Montgomery_mulMod, 1947987219)                       \
-  V(_Double, >, Double_greaterThan, 1453001345)                                \
-  V(_Double, >=, Double_greaterEqualThan, 1815180096)                          \
-  V(_Double, <, Double_lessThan, 652059836)                                    \
-  V(_Double, <=, Double_lessEqualThan, 512138528)                              \
-  V(_Double, ==, Double_equal, 1468668497)                                     \
-  V(_Double, +, Double_add, 1269587413)                                        \
-  V(_Double, -, Double_sub, 1644506555)                                        \
-  V(_Double, *, Double_mul, 600860888)                                         \
-  V(_Double, /, Double_div, 1220198876)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 184085483)                            \
-  V(_Double, get:isNegative, Double_getIsNegative, 978911030)                  \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 856594998)                \
-  V(_Double, .fromInteger, DoubleFromInteger, 2129942595)                      \
-  V(_List, []=, ObjectArraySetIndexed, 886228780)                              \
-  V(_GrowableList, .withData, GrowableArray_Allocate, 631736030)               \
-  V(_GrowableList, add, GrowableArray_add, 219371757)                          \
-  V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, 1614206970)                   \
-  V(Object, ==, ObjectEquals, 291909336)                                       \
-  V(Object, get:runtimeType, ObjectRuntimeType, 15188587)                      \
-  V(_StringBase, get:hashCode, String_getHashCode, 2026040200)                 \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 1958879178)                   \
-  V(_StringBase, _substringMatches, StringBaseSubstringMatches, 797253099)     \
-  V(_StringBase, [], StringBaseCharAt, 754527301)                              \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 2026040200)       \
+  V(_Smi, ~, Smi_bitNegate, Smi, 0x63bfee11)                                   \
+  V(_Smi, get:bitLength, Smi_bitLength, Smi, 0x25b2e24c)                       \
+  V(_Bigint, _lsh, Bigint_lsh, Dynamic, 0x5cd95513)                            \
+  V(_Bigint, _rsh, Bigint_rsh, Dynamic, 0x2d68d0e1)                            \
+  V(_Bigint, _absAdd, Bigint_absAdd, Dynamic, 0x492f4865)                      \
+  V(_Bigint, _absSub, Bigint_absSub, Dynamic, 0x174a3a34)                      \
+  V(_Bigint, _mulAdd, Bigint_mulAdd, Dynamic, 0x24ced3ee)                      \
+  V(_Bigint, _sqrAdd, Bigint_sqrAdd, Dynamic, 0x60c6b633)                      \
+  V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, Dynamic, 0x2f867482)  \
+  V(_Montgomery, _mulMod, Montgomery_mulMod, Dynamic, 0x741bed13)              \
+  V(_Double, >, Double_greaterThan, Bool, 0x569b0a81)                          \
+  V(_Double, >=, Double_greaterEqualThan, Bool, 0x6c317340)                    \
+  V(_Double, <, Double_lessThan, Bool, 0x26dda4bc)                             \
+  V(_Double, <=, Double_lessEqualThan, Bool, 0x1e869d20)                       \
+  V(_Double, ==, Double_equal, Bool, 0x578a1a51)                               \
+  V(_Double, +, Double_add, Double, 0x4bac5dd5)                                \
+  V(_Double, -, Double_sub, Double, 0x62052dbb)                                \
+  V(_Double, *, Double_mul, Double, 0x23d068d8)                                \
+  V(_Double, /, Double_div, Double, 0x48bac1dc)                                \
+  V(_Double, get:isNaN, Double_getIsNaN, Bool, 0x0af8ebeb)                     \
+  V(_Double, get:isNegative, Double_getIsNegative, Bool, 0x3a58ff36)           \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, Double, 0x330e9a36)       \
+  V(_Double, .fromInteger, DoubleFromInteger, Double, 0x7ef45843)              \
+  V(_List, []=, ObjectArraySetIndexed, Dynamic, 0x34d2c72c)                    \
+  V(_GrowableList, .withData, GrowableArray_Allocate, GrowableObjectArray,     \
+    0x25a786de)                                                                \
+  V(_GrowableList, add, GrowableArray_add, Dynamic, 0x0d1358ed)                \
+  V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, Dynamic, 0x6036d7fa)          \
+  V(Object, ==, ObjectEquals, Bool, 0x11662ed8)                                \
+  V(Object, get:runtimeType, ObjectRuntimeType, Type, 0x00e7c26b)              \
+  V(_StringBase, get:hashCode, String_getHashCode, Smi, 0x78c2eb88)            \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, Bool, 0x74c21fca)             \
+  V(_StringBase, _substringMatches, StringBaseSubstringMatches, Bool,          \
+    0x2f851deb)                                                                \
+  V(_StringBase, [], StringBaseCharAt, Dynamic, 0x2cf92c45)                    \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, Smi, 0x78c2eb88)  \
   V(_OneByteString, _substringUncheckedNative,                                 \
-    OneByteString_substringUnchecked, 1670133538)                              \
-  V(_OneByteString, _setAt, OneByteStringSetAt, 1160066031)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 1028631946)             \
-  V(_OneByteString, ==, OneByteString_equality, 1062844160)                    \
-  V(_TwoByteString, ==, TwoByteString_equality, 1062844160)                    \
+    OneByteString_substringUnchecked, OneByteString, 0x638c3722)               \
+  V(_OneByteString, _setAt, OneByteStringSetAt, Dynamic, 0x452533ef)           \
+  V(_OneByteString, _allocate, OneByteString_allocate, OneByteString,          \
+    0x3d4fad8a)                                                                \
+  V(_OneByteString, ==, OneByteString_equality, Bool, 0x3f59b700)              \
+  V(_TwoByteString, ==, TwoByteString_equality, Bool, 0x3f59b700)              \
 
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
-    2042488139)                                                                \
-  V(_IntegerImplementation, +, Integer_add, 239272130)                         \
-  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, 957923759)\
-  V(_IntegerImplementation, -, Integer_sub, 216175811)                         \
+    Dynamic, 0x79bde54b)                                                       \
+  V(_IntegerImplementation, +, Integer_add, Dynamic, 0x0e4300c2)               \
+  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, Dynamic,  \
+    0x3918c1af)                                                                \
+  V(_IntegerImplementation, -, Integer_sub, Dynamic, 0x0ce294c3)               \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
-    2032062140)                                                                \
-  V(_IntegerImplementation, *, Integer_mul, 1301152164)                        \
+    Dynamic, 0x791ecebc)                                                       \
+  V(_IntegerImplementation, *, Integer_mul, Dynamic, 0x4d8e01a4)               \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
-    779285842)                                                                 \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 1018128256)               \
-  V(_IntegerImplementation, unary-, Integer_negate, 1507648892)                \
+    Dynamic, 0x2e72f552)                                                       \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, Dynamic, 0x3caf6780)      \
+  V(_IntegerImplementation, unary-, Integer_negate, Dynamic, 0x59dce57c)       \
   V(_IntegerImplementation, _bitAndFromInteger, Integer_bitAndFromInteger,     \
-    503046514)                                                                 \
-  V(_IntegerImplementation, &, Integer_bitAnd, 1500136766)                     \
+    Dynamic, 0x1dfbe172)                                                       \
+  V(_IntegerImplementation, &, Integer_bitAnd, Dynamic, 0x596a453e)            \
   V(_IntegerImplementation, _bitOrFromInteger, Integer_bitOrFromInteger,       \
-    1031383580)                                                                \
-  V(_IntegerImplementation, |, Integer_bitOr, 119412028)                       \
+    Dynamic, 0x3d79aa1c)                                                       \
+  V(_IntegerImplementation, |, Integer_bitOr, Dynamic, 0x071e153c)             \
   V(_IntegerImplementation, _bitXorFromInteger, Integer_bitXorFromInteger,     \
-    1339506501)                                                                \
-  V(_IntegerImplementation, ^, Integer_bitXor, 210430781)                      \
+    Dynamic, 0x4fd73f45)                                                       \
+  V(_IntegerImplementation, ^, Integer_bitXor, Dynamic, 0x0c8aeb3d)            \
   V(_IntegerImplementation, _greaterThanFromInteger,                           \
-    Integer_greaterThanFromInt, 780147656)                                     \
-  V(_IntegerImplementation, >, Integer_greaterThan, 673741711)                 \
-  V(_IntegerImplementation, ==, Integer_equal, 272474439)                      \
-  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
-    2004079901)                                                                \
-  V(_IntegerImplementation, <, Integer_lessThan, 652059836)                    \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 512138528)              \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1815180096)          \
-  V(_IntegerImplementation, <<, Integer_shl, 1127538624)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 1243972513)                       \
-  V(_Double, toInt, DoubleToInteger, 653210699)
+    Integer_greaterThanFromInt, Bool, 0x2e801bc8)                              \
+  V(_IntegerImplementation, >, Integer_greaterThan, Bool, 0x28287b8f)          \
+  V(_IntegerImplementation, ==, Integer_equal, Bool, 0x103da147)               \
+  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, Bool,     \
+    0x7773d51d)                                                                \
+  V(_IntegerImplementation, <, Integer_lessThan, Bool, 0x26dda4bc)             \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, Bool, 0x1e869d20)       \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, Bool, 0x6c317340)    \
+  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x4334dfc0)              \
+  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x4a2583a1)              \
+  V(_Double, toInt, DoubleToInteger, Dynamic, 0x26ef344b)
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, MathSqrt, 417912310)                                             \
-  V(_Random, _nextState, Random_nextState, 508231939)                          \
+  V(::, sqrt, MathSqrt, Double, 0x18e8d5f6)                                    \
+  V(_Random, _nextState, Random_nextState, Dynamic, 0x1e4b0103)                \
 
 #define GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                       \
-  V(::, sin, MathSin, 65032)                                                   \
-  V(::, cos, MathCos, 2006233918)                                              \
-  V(::, tan, MathTan, 1276867325)                                              \
-  V(::, asin, MathAsin, 1678592173)                                            \
-  V(::, acos, MathAcos, 1121218433)                                            \
-  V(::, atan, MathAtan, 1109653625)                                            \
-  V(::, atan2, MathAtan2, 894696289)                                           \
+  V(::, sin, MathSin, Double, 0x0000fe08)                                      \
+  V(::, cos, MathCos, Double, 0x7794b33e)                                      \
+  V(::, tan, MathTan, Double, 0x4c1b72fd)                                      \
+  V(::, asin, MathAsin, Double, 0x640d48ad)                                    \
+  V(::, acos, MathAcos, Double, 0x42d46f81)                                    \
+  V(::, atan, MathAtan, Double, 0x4223f879)                                    \
+  V(::, atan2, MathAtan2, Double, 0x3553fb61)                                  \
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(Int8List, ., TypedData_Int8Array_factory, 779569635)                       \
-  V(Uint8List, ., TypedData_Uint8Array_factory, 1790399545)                    \
-  V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory, 405875159)       \
-  V(Int16List, ., TypedData_Int16Array_factory, 347431914)                     \
-  V(Uint16List, ., TypedData_Uint16Array_factory, 121990116)                   \
-  V(Int32List, ., TypedData_Int32Array_factory, 1540657744)                    \
-  V(Uint32List, ., TypedData_Uint32Array_factory, 1012511652)                  \
-  V(Int64List, ., TypedData_Int64Array_factory, 1473796807)                    \
-  V(Uint64List, ., TypedData_Uint64Array_factory, 738799620)                   \
-  V(Float32List, ., TypedData_Float32Array_factory, 1938690635)                \
-  V(Float64List, ., TypedData_Float64Array_factory, 1344005361)                \
-  V(Float32x4List, ., TypedData_Float32x4Array_factory, 2055067416)            \
-  V(Int32x4List, ., TypedData_Int32x4Array_factory, 504220232)                 \
-  V(Float64x2List, ., TypedData_Float64x2Array_factory, 416019673)             \
+  V(Int8List, ., TypedData_Int8Array_factory, TypedDataInt8Array, 0x2e7749e3)  \
+  V(Uint8List, ., TypedData_Uint8Array_factory, TypedDataUint8Array,           \
+    0x6ab75439)                                                                \
+  V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory,                  \
+    TypedDataUint8ClampedArray, 0x183129d7)                                    \
+  V(Int16List, ., TypedData_Int16Array_factory, TypedDataInt16Array,           \
+    0x14b563ea)                                                                \
+  V(Uint16List, ., TypedData_Uint16Array_factory, TypedDataUint16Array,        \
+    0x07456be4)                                                                \
+  V(Int32List, ., TypedData_Int32Array_factory, TypedDataInt32Array,           \
+    0x5bd49250)                                                                \
+  V(Uint32List, ., TypedData_Uint32Array_factory,                              \
+    TypedDataUint32Array, 0x3c59b3a4)                                          \
+  V(Int64List, ., TypedData_Int64Array_factory,                                \
+    TypedDataInt64Array, 0x57d85ac7)                                           \
+  V(Uint64List, ., TypedData_Uint64Array_factory,                              \
+    TypedDataUint64Array, 0x2c093004)                                          \
+  V(Float32List, ., TypedData_Float32Array_factory,                            \
+    TypedDataFloat32Array, 0x738e124b)                                         \
+  V(Float64List, ., TypedData_Float64Array_factory,                            \
+    TypedDataFloat64Array, 0x501be4f1)                                         \
+  V(Float32x4List, ., TypedData_Float32x4Array_factory,                        \
+    TypedDataFloat32x4Array, 0x7a7dd718)                                       \
+  V(Int32x4List, ., TypedData_Int32x4Array_factory,                            \
+    TypedDataInt32x4Array, 0x1e0dca48)                                         \
+  V(Float64x2List, ., TypedData_Float64x2Array_factory,                        \
+    TypedDataFloat64x2Array, 0x18cbf4d9)                                       \
 
 #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                    \
-  V(Uint8List, [], Uint8ArrayGetIndexed, 41288685)                             \
-  V(Uint8List, []=, Uint8ArraySetIndexed, 101536342)                           \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 41288685)           \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 101536342)         \
-  V(Uint32List, [], Uint32ArrayGetIndexed, 1614870523)                         \
-  V(Uint32List, []=, Uint32ArraySetIndexed, 978194713)                         \
-  V(Float64List, []=, Float64ArraySetIndexed, 328934501)                       \
-  V(Float64List, [], Float64ArrayGetIndexed, 2049378701)                       \
-  V(_TypedList, get:length, TypedDataLength, 546364442)                        \
-  V(Float32x4, get:x, Float32x4ShuffleX, 1674625343)                           \
-  V(Float32x4, get:y, Float32x4ShuffleY, 540293915)                            \
-  V(Float32x4, get:z, Float32x4ShuffleZ, 320347578)                            \
-  V(Float32x4, get:w, Float32x4ShuffleW, 1770606624)                           \
-  V(Float32x4, _mul, Float32x4Mul, 42807622)                                   \
-  V(Float32x4, _sub, Float32x4Sub, 103774455)                                  \
-  V(Float32x4, _add, Float32x4Add, 1352634374)                                 \
+  V(Uint8List, [], Uint8ArrayGetIndexed, Smi, 0x027603ed)                      \
+  V(Uint8List, []=, Uint8ArraySetIndexed, Dynamic, 0x060d5256)                 \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, Smi, 0x027603ed)    \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, Dynamic,           \
+    0x060d5256)                                                                \
+  V(Uint32List, [], Uint32ArrayGetIndexed, Dynamic, 0x6040f7fb)                \
+  V(Uint32List, []=, Uint32ArraySetIndexed, Dynamic, 0x3a4e1119)               \
+  V(Float64List, [], Float64ArrayGetIndexed, Double, 0x7a27098d)               \
+  V(Float64List, []=, Float64ArraySetIndexed, Dynamic, 0x139b2465)             \
+  V(_TypedList, get:length, TypedDataLength, Smi, 0x2090dc1a)                  \
+  V(Float32x4, get:x, Float32x4ShuffleX, Double, 0x63d0c13f)                   \
+  V(Float32x4, get:y, Float32x4ShuffleY, Double, 0x20343b1b)                   \
+  V(Float32x4, get:z, Float32x4ShuffleZ, Double, 0x13181dba)                   \
+  V(Float32x4, get:w, Float32x4ShuffleW, Double, 0x69895020)                   \
+  V(Float32x4, _mul, Float32x4Mul, Float32x4, 0x028d3146)                      \
+  V(Float32x4, _sub, Float32x4Sub, Float32x4, 0x062f78f7)                      \
+  V(Float32x4, _add, Float32x4Add, Float32x4, 0x509f9006)                      \
 
 #define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
-  V(_List, get:length, ObjectArrayLength, 630471378)                           \
-  V(_List, [], ObjectArrayGetIndexed, 360400496)                               \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 630471378)               \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 360400496)                   \
-  V(_GrowableList, get:length, GrowableArrayLength, 417111542)                 \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 41110914)             \
-  V(_GrowableList, _setData, GrowableArraySetData, 210059283)                  \
-  V(_GrowableList, _setLength, GrowableArraySetLength, 335652822)              \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1957529650)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 225246870)                    \
-  V(_StringBase, get:length, StringBaseLength, 707533587)                      \
-  V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, 1436590579)           \
-  V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, 1436590579)           \
+  V(_List, get:length, ObjectArrayLength, Smi, 0x25943ad2)                     \
+  V(_List, [], ObjectArrayGetIndexed, Dynamic, 0x157b4670)                     \
+  V(_ImmutableList, get:length, ImmutableArrayLength, Smi, 0x25943ad2)         \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, Dynamic, 0x157b4670)         \
+  V(_GrowableList, get:length, GrowableArrayLength, Smi, 0x18dc9df6)           \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, Smi, 0x02734d82)      \
+  V(_GrowableList, _setData, GrowableArraySetData, Dynamic, 0x0c854013)        \
+  V(_GrowableList, _setLength, GrowableArraySetLength, Dynamic, 0x1401a7d6)    \
+  V(_GrowableList, [], GrowableArrayGetIndexed, Dynamic, 0x74ad8832)           \
+  V(_GrowableList, []=, GrowableArraySetIndexed, Dynamic, 0x0d6cfe96)          \
+  V(_StringBase, get:length, StringBaseLength, Smi, 0x2a2c1b13)                \
+  V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, Smi, 0x55a0a1f3)      \
+  V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, Smi, 0x55a0a1f3)      \
   V(_ExternalOneByteString, codeUnitAt, ExternalOneByteStringCodeUnitAt,       \
-    1436590579)                                                                \
+    Smi, 0x55a0a1f3)                                                           \
   V(_ExternalTwoByteString, codeUnitAt, ExternalTwoByteStringCodeUnitAt,       \
-    1436590579)                                                                \
-  V(_Double, unary-, DoubleFlipSignBit, 1783281169)                            \
-  V(_Double, truncateToDouble, DoubleTruncate, 791143891)                      \
-  V(_Double, roundToDouble, DoubleRound, 797558034)                            \
-  V(_Double, floorToDouble, DoubleFloor, 1789426271)                           \
-  V(_Double, ceilToDouble, DoubleCeil, 453271198)                              \
-  V(_Double, _modulo, DoubleMod, 776062204)
+    Smi, 0x55a0a1f3)                                                           \
+  V(_Double, unary-, DoubleFlipSignBit, Double, 0x6a4ab611)                    \
+  V(_Double, truncateToDouble, DoubleTruncate, Double, 0x2f27e5d3)             \
+  V(_Double, roundToDouble, DoubleRound, Double, 0x2f89c512)                   \
+  V(_Double, floorToDouble, DoubleFloor, Double, 0x6aa87a5f)                   \
+  V(_Double, ceilToDouble, DoubleCeil, Double, 0x1b045e9e)                     \
+  V(_Double, _modulo, DoubleMod, Double, 0x2e41c4fc)
 
 
 #define GRAPH_INTRINSICS_LIST(V)                                               \
@@ -304,10 +330,11 @@
   GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                             \
 
 #define DEVELOPER_LIB_INTRINSIC_LIST(V)                                        \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, 187721469)                     \
-  V(::, _getDefaultTag, UserTag_defaultTag, 350077879)                         \
-  V(::, _getCurrentTag, Profiler_getCurrentTag, 1215225901)                    \
-  V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, 1072246292)        \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, Dynamic, 0x0b3066fd)           \
+  V(::, _getDefaultTag, UserTag_defaultTag, Dynamic, 0x14ddc3b7)               \
+  V(::, _getCurrentTag, Profiler_getCurrentTag, Dynamic, 0x486ee02d)           \
+  V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, Dynamic,           \
+    0x3fe92e14)                                                                \
 
 #define ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V)                                  \
   CORE_LIB_INTRINSIC_LIST(V)                                                   \
@@ -326,158 +353,158 @@
 
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
-  V(Object, ==, ObjectEquals, 291909336)                                       \
-  V(_List, get:length, ObjectArrayLength, 630471378)                           \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 630471378)               \
-  V(_TypedList, get:length, TypedDataLength, 546364442)                        \
-  V(_GrowableList, get:length, GrowableArrayLength, 417111542)                 \
-  V(_GrowableList, add, GrowableListAdd, 219371757)                            \
-  V(_GrowableList, removeLast, GrowableListRemoveLast, 324891524)              \
-  V(_StringBase, get:length, StringBaseLength, 707533587)                      \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 1065954929)                  \
-  V(_FixedSizeArrayIterator, moveNext, FixedListIteratorMoveNext, 1451346178)  \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 1840323187)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 620771070)                   \
-  V(_List, ., ObjectArrayAllocate, 1661438741)                                 \
-  V(_List, [], ObjectArrayGetIndexed, 360400496)                               \
-  V(_List, []=, ObjectArraySetIndexed, 886228780)                              \
-  V(ListMixin, get:isEmpty, ListMixinIsEmpty, 2021497798)                      \
-  V(_List, get:iterator, ObjectArrayIterator, 295498778)                       \
-  V(_List, forEach, ObjectArrayForEach, 180150673)                             \
-  V(_List, _slice, ObjectArraySlice, 840558357)                                \
-  V(_ImmutableList, get:iterator, ImmutableArrayIterator, 295498778)           \
-  V(_ImmutableList, forEach, ImmutableArrayForEach, 180150673)                 \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 360400496)                   \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1957529650)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 225246870)                    \
-  V(Float32List, [], Float32ArrayGetIndexed, 1451643535)                       \
-  V(Float32List, []=, Float32ArraySetIndexed, 453873887)                       \
-  V(Float64List, [], Float64ArrayGetIndexed, 2049378701)                       \
-  V(Float64List, []=, Float64ArraySetIndexed, 328934501)                       \
-  V(Int8List, [], Int8ArrayGetIndexed, 110819507)                              \
-  V(Int8List, []=, Int8ArraySetIndexed, 865684695)                             \
-  V(Uint8List, [], Uint8ArrayGetIndexed, 41288685)                             \
-  V(Uint8List, []=, Uint8ArraySetIndexed, 101536342)                           \
-  V(Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 41288685)               \
-  V(Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 687206488)             \
-  V(Uint16List, [], Uint16ArrayGetIndexed, 1053739567)                         \
-  V(Uint16List, []=, Uint16ArraySetIndexed, 1547307961)                        \
-  V(Int16List, [], Int16ArrayGetIndexed, 389863073)                            \
-  V(Int16List, []=, Int16ArraySetIndexed, 855133756)                           \
-  V(Int32List, [], Int32ArrayGetIndexed, 640610057)                            \
-  V(Int32List, []=, Int32ArraySetIndexed, 453358705)                           \
-  V(Int64List, [], Int64ArrayGetIndexed, 202150810)                            \
-  V(Int64List, []=, Int64ArraySetIndexed, 924110852)                           \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1338422227)                 \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 540212720)                 \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 302213458)                    \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 1837635160)                  \
-  V(_ByteDataView, setInt8, ByteDataViewSetInt8, 660389322)                    \
-  V(_ByteDataView, setUint8, ByteDataViewSetUint8, 1651986039)                 \
-  V(_ByteDataView, setInt16, ByteDataViewSetInt16, 2051262146)                 \
-  V(_ByteDataView, setUint16, ByteDataViewSetUint16, 1692244111)               \
-  V(_ByteDataView, setInt32, ByteDataViewSetInt32, 862135882)                  \
-  V(_ByteDataView, setUint32, ByteDataViewSetUint32, 361732249)                \
-  V(_ByteDataView, setInt64, ByteDataViewSetInt64, 1208972197)                 \
-  V(_ByteDataView, setUint64, ByteDataViewSetUint64, 1545853836)               \
-  V(_ByteDataView, setFloat32, ByteDataViewSetFloat32, 1333183642)             \
-  V(_ByteDataView, setFloat64, ByteDataViewSetFloat64, 1579015503)             \
-  V(_ByteDataView, getInt8, ByteDataViewGetInt8, 29018237)                     \
-  V(_ByteDataView, getUint8, ByteDataViewGetUint8, 312322868)                  \
-  V(_ByteDataView, getInt16, ByteDataViewGetInt16, 1613243255)                 \
-  V(_ByteDataView, getUint16, ByteDataViewGetUint16, 284020105)                \
-  V(_ByteDataView, getInt32, ByteDataViewGetInt32, 2036535169)                 \
-  V(_ByteDataView, getUint32, ByteDataViewGetUint32, 571293096)                \
-  V(_ByteDataView, getInt64, ByteDataViewGetInt64, 1971181000)                 \
-  V(_ByteDataView, getUint64, ByteDataViewGetUint64, 799775022)                \
-  V(_ByteDataView, getFloat32, ByteDataViewGetFloat32, 947822534)              \
-  V(_ByteDataView, getFloat64, ByteDataViewGetFloat64, 1402356525)             \
-  V(::, asin, MathASin, 1678592173)                                            \
-  V(::, acos, MathACos, 1121218433)                                            \
-  V(::, atan, MathATan, 1109653625)                                            \
-  V(::, atan2, MathATan2, 894696289)                                           \
-  V(::, cos, MathCos, 2006233918)                                              \
-  V(::, exp, MathExp, 1500946333)                                              \
-  V(::, log, MathLog, 739403086)                                               \
-  V(::, max, MathMax, 1410473322)                                              \
-  V(::, min, MathMin, 1115051548)                                              \
-  V(::, pow, MathPow, 2058759335)                                              \
-  V(::, sin, MathSin, 65032)                                                   \
-  V(::, sqrt, MathSqrt, 417912310)                                             \
-  V(::, tan, MathTan, 1276867325)                                              \
-  V(Lists, copy, ListsCopy, 564237562)                                         \
-  V(_Bigint, get:_neg, Bigint_getNeg, 2079423063)                              \
-  V(_Bigint, get:_used, Bigint_getUsed, 1426329619)                            \
-  V(_Bigint, get:_digits, Bigint_getDigits, 1185333683)                        \
-  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 2104211307)               \
-  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 1273697266)               \
-  V(_HashVMBase, get:_data, LinkedHashMap_getData, 1274399923)                 \
-  V(_HashVMBase, set:_data, LinkedHashMap_setData, 1611093357)                 \
-  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 367462469)          \
-  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 1049390812)         \
-  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 902147072)          \
-  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 1236137630)         \
-  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 812542585)    \
-  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 1072259010)   \
+  V(Object, ==, ObjectEquals, 0x11662ed8)                                      \
+  V(_List, get:length, ObjectArrayLength, 0x25943ad2)                          \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 0x25943ad2)              \
+  V(_TypedList, get:length, TypedDataLength, 0x2090dc1a)                       \
+  V(_GrowableList, get:length, GrowableArrayLength, 0x18dc9df6)                \
+  V(_GrowableList, add, GrowableListAdd, 0x0d1358ed)                           \
+  V(_GrowableList, removeLast, GrowableListRemoveLast, 0x135d7384)             \
+  V(_StringBase, get:length, StringBaseLength, 0x2a2c1b13)                     \
+  V(ListIterator, moveNext, ListIteratorMoveNext, 0x3f892e71)                  \
+  V(_FixedSizeArrayIterator, moveNext, FixedListIteratorMoveNext, 0x5681c902)  \
+  V(_GrowableList, get:iterator, GrowableArrayIterator, 0x6db11a73)            \
+  V(_GrowableList, forEach, GrowableArrayForEach, 0x250036fe)                  \
+  V(_List, ., ObjectArrayAllocate, 0x63078b15)                                 \
+  V(_List, [], ObjectArrayGetIndexed, 0x157b4670)                              \
+  V(_List, []=, ObjectArraySetIndexed, 0x34d2c72c)                             \
+  V(ListMixin, get:isEmpty, ListMixinIsEmpty, 0x787d9bc6)                      \
+  V(_List, get:iterator, ObjectArrayIterator, 0x119cf41a)                      \
+  V(_List, forEach, ObjectArrayForEach, 0x0abce191)                            \
+  V(_List, _slice, ObjectArraySlice, 0x3219e715)                               \
+  V(_ImmutableList, get:iterator, ImmutableArrayIterator, 0x119cf41a)          \
+  V(_ImmutableList, forEach, ImmutableArrayForEach, 0x0abce191)                \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 0x157b4670)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 0x74ad8832)                    \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 0x0d6cfe96)                   \
+  V(Float32List, [], Float32ArrayGetIndexed, 0x5686528f)                       \
+  V(Float32List, []=, Float32ArraySetIndexed, 0x1b0d90df)                      \
+  V(Float64List, [], Float64ArrayGetIndexed, 0x7a27098d)                       \
+  V(Float64List, []=, Float64ArraySetIndexed, 0x139b2465)                      \
+  V(Int8List, [], Int8ArrayGetIndexed, 0x069af8b3)                             \
+  V(Int8List, []=, Int8ArraySetIndexed, 0x33994cd7)                            \
+  V(Uint8List, [], Uint8ArrayGetIndexed, 0x027603ed)                           \
+  V(Uint8List, []=, Uint8ArraySetIndexed, 0x060d5256)                          \
+  V(Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 0x027603ed)             \
+  V(Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 0x28f5f058)            \
+  V(Uint16List, [], Uint16ArrayGetIndexed, 0x3ececa2f)                         \
+  V(Uint16List, []=, Uint16ArraySetIndexed, 0x5c3a0bb9)                        \
+  V(Int16List, [], Int16ArrayGetIndexed, 0x173cd6a1)                           \
+  V(Int16List, []=, Int16ArraySetIndexed, 0x32f84e3c)                          \
+  V(Int32List, [], Int32ArrayGetIndexed, 0x262eef09)                           \
+  V(Int32List, []=, Int32ArraySetIndexed, 0x1b05b471)                          \
+  V(Int64List, [], Int64ArrayGetIndexed, 0x0c0c939a)                           \
+  V(Int64List, []=, Int64ArraySetIndexed, 0x3714d004)                          \
+  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 0x4fc6b3d3)                 \
+  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 0x2032fdf0)                \
+  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 0x12036952)                   \
+  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 0x6d881658)                  \
+  V(_ByteDataView, setInt8, ByteDataViewSetInt8, 0x275cbdca)                   \
+  V(_ByteDataView, setUint8, ByteDataViewSetUint8, 0x62774e77)                 \
+  V(_ByteDataView, setInt16, ByteDataViewSetInt16, 0x7a43c6c2)                 \
+  V(_ByteDataView, setUint16, ByteDataViewSetUint16, 0x64dd988f)               \
+  V(_ByteDataView, setInt32, ByteDataViewSetInt32, 0x3363264a)                 \
+  V(_ByteDataView, setUint32, ByteDataViewSetUint32, 0x158f9899)               \
+  V(_ByteDataView, setInt64, ByteDataViewSetInt64, 0x480f73a5)                 \
+  V(_ByteDataView, setUint64, ByteDataViewSetUint64, 0x5c23db8c)               \
+  V(_ByteDataView, setFloat32, ByteDataViewSetFloat32, 0x4f76c49a)             \
+  V(_ByteDataView, setFloat64, ByteDataViewSetFloat64, 0x5e1ddd4f)             \
+  V(_ByteDataView, getInt8, ByteDataViewGetInt8, 0x01bac87d)                   \
+  V(_ByteDataView, getUint8, ByteDataViewGetUint8, 0x129dab34)                 \
+  V(_ByteDataView, getInt16, ByteDataViewGetInt16, 0x60282377)                 \
+  V(_ByteDataView, getUint16, ByteDataViewGetUint16, 0x10edcd89)               \
+  V(_ByteDataView, getInt32, ByteDataViewGetInt32, 0x79630f81)                 \
+  V(_ByteDataView, getUint32, ByteDataViewGetUint32, 0x220d3da8)               \
+  V(_ByteDataView, getInt64, ByteDataViewGetInt64, 0x757dd5c8)                 \
+  V(_ByteDataView, getUint64, ByteDataViewGetUint64, 0x2fab992e)               \
+  V(_ByteDataView, getFloat32, ByteDataViewGetFloat32, 0x387e9fc6)             \
+  V(_ByteDataView, getFloat64, ByteDataViewGetFloat64, 0x5396432d)             \
+  V(::, asin, MathAsin, 0x640d48ad)                                            \
+  V(::, acos, MathAcos, 0x42d46f81)                                            \
+  V(::, atan, MathAtan, 0x4223f879)                                            \
+  V(::, atan2, MathAtan2, 0x3553fb61)                                          \
+  V(::, cos, MathCos, 0x7794b33e)                                              \
+  V(::, exp, MathExp, 0x59769f9d)                                              \
+  V(::, log, MathLog, 0x2c12654e)                                              \
+  V(::, max, MathMax, 0x54121d6a)                                              \
+  V(::, min, MathMin, 0x4276561c)                                              \
+  V(::, pow, MathPow, 0x7ab62ca7)                                              \
+  V(::, sin, MathSin, 0x0000fe08)                                              \
+  V(::, sqrt, MathSqrt, 0x18e8d5f6)                                            \
+  V(::, tan, MathTan, 0x4c1b72fd)                                              \
+  V(Lists, copy, ListsCopy, 0x21a194fa)                                        \
+  V(_Bigint, get:_neg, Bigint_getNeg, 0x7bf17a57)                              \
+  V(_Bigint, get:_used, Bigint_getUsed, 0x55041013)                            \
+  V(_Bigint, get:_digits, Bigint_getDigits, 0x46a6c1b3)                        \
+  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0x7d6bb76b)               \
+  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x4beb13f2)               \
+  V(_HashVMBase, get:_data, LinkedHashMap_getData, 0x4bf5ccb3)                 \
+  V(_HashVMBase, set:_data, LinkedHashMap_setData, 0x6007556d)                 \
+  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 0x15e70845)         \
+  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 0x3e8c6edc)         \
+  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 0x35c5ac00)         \
+  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 0x49adf69e)         \
+  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0x306e6a79)   \
+  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x3fe95fc2)   \
 
 // A list of core function that should never be inlined.
 #define INLINE_BLACK_LIST(V)                                                   \
-  V(_Bigint, _lsh, Bigint_lsh, 1557746963)                                     \
-  V(_Bigint, _rsh, Bigint_rsh, 761843937)                                      \
-  V(_Bigint, _absAdd, Bigint_absAdd, 1227835493)                               \
-  V(_Bigint, _absSub, Bigint_absSub, 390740532)                                \
-  V(_Bigint, _mulAdd, Bigint_mulAdd, 617534446)                                \
-  V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1623635507)                               \
-  V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 797340802)            \
-  V(_Montgomery, _mulMod, Montgomery_mulMod, 1947987219)                       \
-  V(_Double, >, Double_greaterThan, 1453001345)                                \
-  V(_Double, >=, Double_greaterEqualThan, 1815180096)                          \
-  V(_Double, <, Double_lessThan, 652059836)                                    \
-  V(_Double, <=, Double_lessEqualThan, 512138528)                              \
-  V(_Double, ==, Double_equal, 1468668497)                                     \
-  V(_Double, +, Double_add, 1269587413)                                        \
-  V(_Double, -, Double_sub, 1644506555)                                        \
-  V(_Double, *, Double_mul, 600860888)                                         \
-  V(_Double, /, Double_div, 1220198876)                                        \
-  V(_IntegerImplementation, +, Integer_add, 239272130)                         \
-  V(_IntegerImplementation, -, Integer_sub, 216175811)                         \
-  V(_IntegerImplementation, *, Integer_mul, 1301152164)                        \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 1018128256)               \
-  V(_IntegerImplementation, unary-, Integer_negate, 1507648892)                \
-  V(_IntegerImplementation, &, Integer_bitAnd, 1500136766)                     \
-  V(_IntegerImplementation, |, Integer_bitOr, 119412028)                       \
-  V(_IntegerImplementation, ^, Integer_bitXor, 210430781)                      \
-  V(_IntegerImplementation, >, Integer_greaterThan, 673741711)                 \
-  V(_IntegerImplementation, ==, Integer_equal, 272474439)                      \
-  V(_IntegerImplementation, <, Integer_lessThan, 652059836)                    \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 512138528)              \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1815180096)          \
-  V(_IntegerImplementation, <<, Integer_shl, 1127538624)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 1243972513)                       \
+  V(_Bigint, _lsh, Bigint_lsh, 0x5cd95513)                                     \
+  V(_Bigint, _rsh, Bigint_rsh, 0x2d68d0e1)                                     \
+  V(_Bigint, _absAdd, Bigint_absAdd, 0x492f4865)                               \
+  V(_Bigint, _absSub, Bigint_absSub, 0x174a3a34)                               \
+  V(_Bigint, _mulAdd, Bigint_mulAdd, 0x24ced3ee)                               \
+  V(_Bigint, _sqrAdd, Bigint_sqrAdd, 0x60c6b633)                               \
+  V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 0x2f867482)           \
+  V(_Montgomery, _mulMod, Montgomery_mulMod, 0x741bed13)                       \
+  V(_Double, >, Double_greaterThan, 0x569b0a81)                                \
+  V(_Double, >=, Double_greaterEqualThan, 0x6c317340)                          \
+  V(_Double, <, Double_lessThan, 0x26dda4bc)                                   \
+  V(_Double, <=, Double_lessEqualThan, 0x1e869d20)                             \
+  V(_Double, ==, Double_equal, 0x578a1a51)                                     \
+  V(_Double, +, Double_add, 0x4bac5dd5)                                        \
+  V(_Double, -, Double_sub, 0x62052dbb)                                        \
+  V(_Double, *, Double_mul, 0x23d068d8)                                        \
+  V(_Double, /, Double_div, 0x48bac1dc)                                        \
+  V(_IntegerImplementation, +, Integer_add, 0x0e4300c2)                        \
+  V(_IntegerImplementation, -, Integer_sub, 0x0ce294c3)                        \
+  V(_IntegerImplementation, *, Integer_mul, 0x4d8e01a4)                        \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 0x3caf6780)               \
+  V(_IntegerImplementation, unary-, Integer_negate, 0x59dce57c)                \
+  V(_IntegerImplementation, &, Integer_bitAnd, 0x596a453e)                     \
+  V(_IntegerImplementation, |, Integer_bitOr, 0x071e153c)                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 0x0c8aeb3d)                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 0x28287b8f)                \
+  V(_IntegerImplementation, ==, Integer_equal, 0x103da147)                     \
+  V(_IntegerImplementation, <, Integer_lessThan, 0x26dda4bc)                   \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 0x1e869d20)             \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x6c317340)          \
+  V(_IntegerImplementation, <<, Integer_shl, 0x4334dfc0)                       \
+  V(_IntegerImplementation, >>, Integer_sar, 0x4a2583a1)                       \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
-  V(_StringBase, [], StringBaseCharAt, 754527301)                              \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1508321565)                    \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 953411007)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 433971756)                   \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1329446488)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 137212209)                   \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 499907480)                 \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 1672834581)              \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 966634744)               \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1197581758)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 810805548)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1317196265)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 1328908284)                   \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1827614958)                  \
-  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 1694054572)                 \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 915652649)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1958474336)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1853026980)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1197862362)              \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 2093630771)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1982971324)              \
+  V(_StringBase, [], StringBaseCharAt, 0x2cf92c45)                             \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0x59e7291d)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0x38d3e5bf)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0x19dde22c)                  \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0x4f3dbe58)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0x082db131)                  \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0x1dcbfb98)                \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0x63b56e15)              \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0x399dacf8)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x4761a5be)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x3053e92c)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0x4e82d1e9)                    \
+  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 0x4f3587fc)                   \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0x6cef30ee)                  \
+  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 0x64f938ac)                 \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0x3693c029)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0x74bbf260)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0x6e72f2a4)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0x4765edda)              \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x7cca4533)          \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0x7631bdbc)              \
 
 // Forward declarations.
 class Function;
@@ -489,7 +516,8 @@
  public:
   enum Kind {
     kUnknown,
-#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, fp) k##enum_name,
+#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp) \
+    k##enum_name,
     RECOGNIZED_LIST(DEFINE_ENUM_LIST)
 #undef DEFINE_ENUM_LIST
     kNumRecognizedMethods
@@ -498,6 +526,7 @@
   static Kind RecognizeKind(const Function& function);
   static bool AlwaysInline(const Function& function);
   static bool PolymorphicTarget(const Function& function);
+  static intptr_t ResultCid(const Function& function);
   static const char* KindToCString(Kind kind);
 #if defined(DART_NO_SNAPSHOT)
   static void InitializeState();
@@ -517,21 +546,21 @@
 // List of recognized list factories:
 // (factory-name-symbol, result-cid, fingerprint).
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
-  V(_ListFactory, kArrayCid, 1661438741)                                       \
-  V(_GrowableListWithData, kGrowableObjectArrayCid, 631736030)                 \
-  V(_GrowableListFactory, kGrowableObjectArrayCid, 1330464656)                 \
-  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 779569635)                      \
-  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 1790399545)                   \
-  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 405875159)      \
-  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 347431914)                    \
-  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 121990116)                  \
-  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 1540657744)                   \
-  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 1012511652)                 \
-  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 1473796807)                   \
-  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 738799620)                  \
-  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 1344005361)               \
-  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1938690635)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 2055067416)           \
+  V(_ListFactory, kArrayCid, 0x63078b15)                                       \
+  V(_GrowableListWithData, kGrowableObjectArrayCid, 0x25a786de)                \
+  V(_GrowableListFactory, kGrowableObjectArrayCid, 0x4f4d4790)                 \
+  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 0x2e7749e3)                     \
+  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 0x6ab75439)                   \
+  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 0x183129d7)     \
+  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 0x14b563ea)                   \
+  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 0x07456be4)                 \
+  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 0x5bd49250)                   \
+  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 0x3c59b3a4)                 \
+  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 0x57d85ac7)                   \
+  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 0x2c093004)                 \
+  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 0x501be4f1)               \
+  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 0x738e124b)               \
+  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718)           \
 
 
 // Class that recognizes factories and returns corresponding result cid.
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0d5ca5f..13b84c6 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7,6 +7,7 @@
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/assembler.h"
+#include "vm/become.h"
 #include "vm/cpu.h"
 #include "vm/bit_vector.h"
 #include "vm/bootstrap.h"
@@ -562,6 +563,13 @@
   cls.set_is_finalized();
   cls.set_is_type_finalized();
 
+  // Allocate and initialize the forwarding corpse class.
+  cls = Class::New<ForwardingCorpse::FakeInstance>(kForwardingCorpse);
+  cls.set_num_type_arguments(0);
+  cls.set_num_own_type_arguments(0);
+  cls.set_is_finalized();
+  cls.set_is_type_finalized();
+
   // Allocate and initialize the sentinel values of Null class.
   {
     *sentinel_ ^=
@@ -929,6 +937,8 @@
   void VisitObject(RawObject* obj) {
     // Free list elements should never be marked.
     ASSERT(!obj->IsMarked());
+    // No forwarding corpses in the VM isolate.
+    ASSERT(!obj->IsForwardingCorpse());
     if (!obj->IsFreeListElement()) {
       ASSERT(obj->IsVMHeapObject());
       obj->SetMarkBitUnsynchronized();
@@ -1000,6 +1010,13 @@
   cls = isolate->object_store()->one_byte_string_class();
   cls.set_name(Symbols::OneByteString());
 
+  // Set up names for the pseudo-classes for free list elements and forwarding
+  // corpses. Mainly this makes VM debugging easier.
+  cls = isolate->class_table()->At(kFreeListElement);
+  cls.set_name(Symbols::FreeListElement());
+  cls = isolate->class_table()->At(kForwardingCorpse);
+  cls.set_name(Symbols::ForwardingCorpse());
+
   {
     ASSERT(isolate == Dart::vm_isolate());
     WritableVMIsolateScope scope(Thread::Current());
@@ -1080,6 +1097,7 @@
     }
   }
   ASSERT(builtin_vtables_[kFreeListElement] == 0);
+  ASSERT(builtin_vtables_[kForwardingCorpse] == 0);
 #endif
 }
 
@@ -1916,8 +1934,6 @@
 
 
 RawString* Class::Name() const {
-  // TODO(turnidge): This assert fails for the fake kFreeListElement class.
-  // Fix this.
   ASSERT(raw_ptr()->name_ != String::null());
   return raw_ptr()->name_;
 }
@@ -7123,11 +7139,10 @@
       // This output can be copied into a file, then used with sed
       // to replace the old values.
       // sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h
-      THR_Print("s/V(%s, %d)/V(%s, %d)/\n",
-                prefix, fp, prefix, SourceFingerprint());
+      THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint());
     } else {
       THR_Print("FP mismatch while recognizing method %s:"
-                " expecting %d found %d\n",
+                " expecting 0x%08x found 0x%08x\n",
                 ToFullyQualifiedCString(),
                 fp,
                 SourceFingerprint());
@@ -11315,33 +11330,39 @@
     OS::Print("Function not found %s.%s\n", #class_name, #function_name);      \
   } else {                                                                     \
     CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp);             \
-  }                                                                            \
+  }
+
+#define CHECK_FINGERPRINTS2(class_name, function_name, dest, type, fp) \
+  CHECK_FINGERPRINTS(class_name, function_name, dest, fp)
 
   all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
-  CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
-  CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+  CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
+  CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
 
   all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::CollectionLibrary()));
-  OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS);
+  OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS2);
   INLINE_WHITE_LIST(CHECK_FINGERPRINTS);
   INLINE_BLACK_LIST(CHECK_FINGERPRINTS);
   POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS);
 
   all_libs.Clear();
   all_libs.Add(&Library::ZoneHandle(Library::DeveloperLibrary()));
-  DEVELOPER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+  DEVELOPER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
 
   all_libs.Clear();
   all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
-  MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+  MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
 
   all_libs.Clear();
   all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
-  TYPED_DATA_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+  TYPED_DATA_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
 
 #undef CHECK_FINGERPRINTS
+#undef CHECK_FINGERPRINTS2
+
+
 
 Class& cls = Class::Handle();
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 30cc72d..984a718 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -8521,6 +8521,7 @@
   intptr_t cid = value->GetClassId();
   // Free-list elements cannot be wrapped in a handle.
   ASSERT(cid != kFreeListElement);
+  ASSERT(cid != kForwardingCorpse);
   if (cid >= kNumPredefinedCids) {
     cid = kInstanceCid;
   }
diff --git a/runtime/vm/object_arm64_test.cc b/runtime/vm/object_arm64_test.cc
index 4349bb9..a883609 100644
--- a/runtime/vm/object_arm64_test.cc
+++ b/runtime/vm/object_arm64_test.cc
@@ -17,7 +17,7 @@
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
 void GenerateIncrement(Assembler* assembler) {
-  __ mov(SP, CSP);
+  __ EnterFrame(1 * kWordSize);
   __ movz(R0, Immediate(0), 0);
   __ Push(R0);
   __ add(R0, R0, Operand(1));
@@ -26,6 +26,7 @@
   __ add(R1, R1, Operand(1));
   __ Pop(R0);
   __ mov(R0, R1);
+  __ LeaveFrame();
   __ ret();
 }
 
diff --git a/runtime/vm/object_dbc_test.cc b/runtime/vm/object_dbc_test.cc
index 464350d..ecb1fa0 100644
--- a/runtime/vm/object_dbc_test.cc
+++ b/runtime/vm/object_dbc_test.cc
@@ -16,14 +16,12 @@
 
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
+// For other architectures, this sequence does do an increment, hence the name.
+// On DBC, we don't do an increment because generating an instance call here
+// would be too complex.
 void GenerateIncrement(Assembler* assembler) {
   __ Frame(1);
-  __ LoadConstant(0, Smi::Handle(Smi::New(0)));
-  __ PushConstant(Smi::Handle(Smi::New(1)));
-  __ Push(0);
-  __ AddTOS();
-  __ Trap();
-  __ PopLocal(0);
+  __ LoadConstant(0, Smi::Handle(Smi::New(1)));
   __ Return(0);
 }
 
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 9affdcb..e1ca9dd 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -120,6 +120,24 @@
 }
 
 
+void ObjectStore::PrintToJSONObject(JSONObject* jsobj) {
+  if (!FLAG_support_service) {
+    return;
+  }
+  jsobj->AddProperty("type", "_ObjectStore");
+
+  {
+    JSONObject fields(jsobj, "fields");
+    Object& value = Object::Handle();
+#define PRINT_OBJECT_STORE_FIELD(type, name)                                   \
+    value = name;                                                              \
+    fields.AddProperty(#name, value);
+OBJECT_STORE_FIELD_LIST(PRINT_OBJECT_STORE_FIELD);
+#undef PRINT_OBJECT_STORE_FIELD
+  }
+}
+
+
 RawError* ObjectStore::PreallocateObjects() {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 56ee2b0..a58bc6c 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -498,92 +498,100 @@
 
   static void Init(Isolate* isolate);
 
+  void PrintToJSONObject(JSONObject* jsobj);
+
  private:
   ObjectStore();
 
+#define OBJECT_STORE_FIELD_LIST(V)                                             \
+  V(RawClass*, object_class_)                                                  \
+  V(RawType*, object_type_)                                                    \
+  V(RawClass*, null_class_)                                                    \
+  V(RawType*, null_type_)                                                      \
+  V(RawType*, function_type_)                                                  \
+  V(RawClass*, closure_class_)                                                 \
+  V(RawType*, number_type_)                                                    \
+  V(RawType*, int_type_)                                                       \
+  V(RawClass*, integer_implementation_class_)                                  \
+  V(RawClass*, smi_class_)                                                     \
+  V(RawType*, smi_type_)                                                       \
+  V(RawClass*, mint_class_)                                                    \
+  V(RawType*, mint_type_)                                                      \
+  V(RawClass*, bigint_class_)                                                  \
+  V(RawClass*, double_class_)                                                  \
+  V(RawType*, double_type_)                                                    \
+  V(RawType*, float32x4_type_)                                                 \
+  V(RawType*, int32x4_type_)                                                   \
+  V(RawType*, float64x2_type_)                                                 \
+  V(RawType*, string_type_)                                                    \
+  V(RawClass*, future_class_)                                                  \
+  V(RawClass*, completer_class_)                                               \
+  V(RawClass*, stream_iterator_class_)                                         \
+  V(RawClass*, symbol_class_)                                                  \
+  V(RawClass*, one_byte_string_class_)                                         \
+  V(RawClass*, two_byte_string_class_)                                         \
+  V(RawClass*, external_one_byte_string_class_)                                \
+  V(RawClass*, external_two_byte_string_class_)                                \
+  V(RawType*, bool_type_)                                                      \
+  V(RawClass*, bool_class_)                                                    \
+  V(RawClass*, array_class_)                                                   \
+  V(RawType*, array_type_)                                                     \
+  V(RawClass*, immutable_array_class_)                                         \
+  V(RawClass*, growable_object_array_class_)                                   \
+  V(RawClass*, linked_hash_map_class_)                                         \
+  V(RawClass*, float32x4_class_)                                               \
+  V(RawClass*, int32x4_class_)                                                 \
+  V(RawClass*, float64x2_class_)                                               \
+  V(RawClass*, error_class_)                                                   \
+  V(RawClass*, weak_property_class_)                                           \
+  V(RawArray*, symbol_table_)                                                  \
+  V(RawArray*, canonical_types_)                                               \
+  V(RawArray*, canonical_type_arguments_)                                      \
+  V(RawLibrary*, async_library_)                                               \
+  V(RawLibrary*, builtin_library_)                                             \
+  V(RawLibrary*, core_library_)                                                \
+  V(RawLibrary*, collection_library_)                                          \
+  V(RawLibrary*, convert_library_)                                             \
+  V(RawLibrary*, developer_library_)                                           \
+  V(RawLibrary*, internal_library_)                                            \
+  V(RawLibrary*, isolate_library_)                                             \
+  V(RawLibrary*, math_library_)                                                \
+  V(RawLibrary*, mirrors_library_)                                             \
+  V(RawLibrary*, native_wrappers_library_)                                     \
+  V(RawLibrary*, profiler_library_)                                            \
+  V(RawLibrary*, root_library_)                                                \
+  V(RawLibrary*, typed_data_library_)                                          \
+  V(RawLibrary*, vmservice_library_)                                           \
+  V(RawGrowableObjectArray*, libraries_)                                       \
+  V(RawArray*, libraries_map_)                                                 \
+  V(RawGrowableObjectArray*, closure_functions_)                               \
+  V(RawGrowableObjectArray*, pending_classes_)                                 \
+  V(RawGrowableObjectArray*, pending_deferred_loads_)                          \
+  V(RawGrowableObjectArray*, resume_capabilities_)                             \
+  V(RawGrowableObjectArray*, exit_listeners_)                                  \
+  V(RawGrowableObjectArray*, error_listeners_)                                 \
+  V(RawContext*, empty_context_)                                               \
+  V(RawInstance*, stack_overflow_)                                             \
+  V(RawInstance*, out_of_memory_)                                              \
+  V(RawUnhandledException*, preallocated_unhandled_exception_)                 \
+  V(RawStacktrace*, preallocated_stack_trace_)                                 \
+  V(RawFunction*, lookup_port_handler_)                                        \
+  V(RawTypedData*, empty_uint32_array_)                                        \
+  V(RawFunction*, handle_message_function_)                                    \
+  V(RawArray*, library_load_error_table_)                                      \
+  V(RawArray*, compile_time_constants_)                                        \
+  V(RawArray*, unique_dynamic_targets_)                                        \
+  V(RawGrowableObjectArray*, token_objects_)                                   \
+  V(RawArray*, token_objects_map_)                                             \
+  V(RawGrowableObjectArray*, megamorphic_cache_table_)                         \
+  V(RawCode*, megamorphic_miss_code_)                                          \
+  V(RawFunction*, megamorphic_miss_function_)                                  \
+
   RawObject** from() { return reinterpret_cast<RawObject**>(&object_class_); }
-  RawClass* object_class_;
-  RawType* object_type_;
-  RawClass* null_class_;
-  RawType* null_type_;
-  RawType* function_type_;
-  RawClass* closure_class_;
-  RawType* number_type_;
-  RawType* int_type_;
-  RawClass* integer_implementation_class_;
-  RawClass* smi_class_;
-  RawType* smi_type_;
-  RawClass* mint_class_;
-  RawType* mint_type_;
-  RawClass* bigint_class_;
-  RawClass* double_class_;
-  RawType* double_type_;
-  RawType* float32x4_type_;
-  RawType* int32x4_type_;
-  RawType* float64x2_type_;
-  RawType* string_type_;
-  RawClass* future_class_;
-  RawClass* completer_class_;
-  RawClass* stream_iterator_class_;
-  RawClass* symbol_class_;
-  RawClass* one_byte_string_class_;
-  RawClass* two_byte_string_class_;
-  RawClass* external_one_byte_string_class_;
-  RawClass* external_two_byte_string_class_;
-  RawType* bool_type_;
-  RawClass* bool_class_;
-  RawClass* array_class_;
-  RawType* array_type_;
-  RawClass* immutable_array_class_;
-  RawClass* growable_object_array_class_;
-  RawClass* linked_hash_map_class_;
-  RawClass* float32x4_class_;
-  RawClass* int32x4_class_;
-  RawClass* float64x2_class_;
-  RawClass* error_class_;
-  RawClass* weak_property_class_;
-  RawArray* symbol_table_;
-  RawArray* canonical_types_;
-  RawArray* canonical_type_arguments_;
-  RawLibrary* async_library_;
-  RawLibrary* builtin_library_;
-  RawLibrary* core_library_;
-  RawLibrary* collection_library_;
-  RawLibrary* convert_library_;
-  RawLibrary* developer_library_;
-  RawLibrary* internal_library_;
-  RawLibrary* isolate_library_;
-  RawLibrary* math_library_;
-  RawLibrary* mirrors_library_;
-  RawLibrary* native_wrappers_library_;
-  RawLibrary* profiler_library_;
-  RawLibrary* root_library_;
-  RawLibrary* typed_data_library_;
-  RawLibrary* vmservice_library_;
-  RawGrowableObjectArray* libraries_;
-  RawArray* libraries_map_;
-  RawGrowableObjectArray* closure_functions_;
-  RawGrowableObjectArray* pending_classes_;
-  RawGrowableObjectArray* pending_deferred_loads_;
-  RawGrowableObjectArray* resume_capabilities_;
-  RawGrowableObjectArray* exit_listeners_;
-  RawGrowableObjectArray* error_listeners_;
-  RawContext* empty_context_;
-  RawInstance* stack_overflow_;
-  RawInstance* out_of_memory_;
-  RawUnhandledException* preallocated_unhandled_exception_;
-  RawStacktrace* preallocated_stack_trace_;
-  RawFunction* lookup_port_handler_;
-  RawTypedData* empty_uint32_array_;
-  RawFunction* handle_message_function_;
-  RawArray* library_load_error_table_;
-  RawArray* compile_time_constants_;
-  RawArray* unique_dynamic_targets_;
-  RawGrowableObjectArray* token_objects_;
-  RawArray* token_objects_map_;
-  RawGrowableObjectArray* megamorphic_cache_table_;
-  RawCode* megamorphic_miss_code_;
-  RawFunction* megamorphic_miss_function_;
+#define DECLARE_OBJECT_STORE_FIELD(type, name)                                 \
+  type name;
+OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD)
+#undef DECLARE_OBJECT_STORE_FIELD
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&megamorphic_miss_function_);
   }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 9ad5f70..7d70f20 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4125,9 +4125,8 @@
       : objects_(objects) { }
   virtual ~ObjectAccumulator() { }
   virtual void VisitObject(RawObject* obj) {
-    // Free-list elements cannot even be wrapped in handles.
-    if (obj->IsFreeListElement()) {
-      return;
+    if (obj->IsPseudoObject()) {
+      return;  // Cannot be wrapped in handles.
     }
     Object& handle = Object::Handle(obj);
     // Skip some common simple objects to run in reasonable time.
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a07921f..f2a6422 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -365,6 +365,7 @@
   void exit_finally() { inside_finally_ = false; }
 
   void AddNodeForFinallyInlining(AstNode* node);
+  void RemoveJumpToLabel(SourceLabel *label);
   AstNode* GetNodeToInlineFinally(int index) {
     if (0 <= index && index < inlined_finally_nodes_.length()) {
       return inlined_finally_nodes_[index];
@@ -390,6 +391,25 @@
 }
 
 
+void Parser::TryStack::RemoveJumpToLabel(SourceLabel *label) {
+  int i = 0;
+  while (i < inlined_finally_nodes_.length()) {
+    if (inlined_finally_nodes_[i]->IsJumpNode()) {
+      JumpNode* jump = inlined_finally_nodes_[i]->AsJumpNode();
+      if (jump->label() == label) {
+        // Shift remaining entries left and delete last entry.
+        for (int j = i + 1; j < inlined_finally_nodes_.length(); j++) {
+          inlined_finally_nodes_[j - 1] = inlined_finally_nodes_[j];
+        }
+        inlined_finally_nodes_.RemoveLast();
+        continue;
+      }
+    }
+    i++;
+  }
+}
+
+
 // For parsing a compilation unit.
 Parser::Parser(const Script& script,
                const Library& library,
@@ -508,6 +528,14 @@
 }
 
 
+int Parser::FunctionLevel() const {
+  if (current_block_ != NULL) {
+    return current_block_->scope->function_level();
+  }
+  return 0;
+}
+
+
 const Class& Parser::current_class() const {
   return current_class_;
 }
@@ -2369,7 +2397,7 @@
     // If we create an implicit instance closure from inside a closure of a
     // parameterized class, make sure that the receiver is captured as
     // instantiator.
-    if (current_block_->scope->function_level() > 0) {
+    if (FunctionLevel() > 0) {
       const Type& signature_type = Type::Handle(Z,
           implicit_closure_function.SignatureType());
       const Class& scope_class = Class::Handle(Z, signature_type.type_class());
@@ -3358,7 +3386,7 @@
     AddFormalParamsToScope(&params, current_block_->scope);
 
     if (I->type_checks() &&
-        (current_block_->scope->function_level() > 0)) {
+        (FunctionLevel() > 0)) {
       // We are parsing, but not compiling, a local function.
       // The instantiator may be required at run time for generic type checks.
       if (IsInstantiatorRequired()) {
@@ -7406,7 +7434,7 @@
 
 
 void Parser::CaptureInstantiator() {
-  ASSERT(current_block_->scope->function_level() > 0);
+  ASSERT(FunctionLevel() > 0);
   const String* variable_name = current_function().IsInFactoryScope() ?
       &Symbols::TypeArgumentsParameter() : &Symbols::This();
   current_block_->scope->CaptureVariable(
@@ -7643,6 +7671,7 @@
   // Note that we cannot share the same closure function between the closurized
   // and non-closurized versions of the same parent function.
   Function& function = Function::ZoneHandle(Z);
+  bool found_func = true;
   // TODO(hausner): There could be two different closures at the given
   // function_pos, one enclosed in a closurized function and one enclosed in the
   // non-closurized version of this same function.
@@ -7651,6 +7680,7 @@
     // The function will be registered in the lookup table by the
     // EffectGraphVisitor::VisitClosureNode when the newly allocated closure
     // function has been properly setup.
+    found_func = false;
     function = Function::NewClosureFunction(*function_name,
                                             innermost_function(),
                                             function_pos);
@@ -7700,15 +7730,40 @@
     }
   }
 
-  // Parse the local function.
-  SequenceNode* statements = Parser::ParseFunc(function, !is_literal);
-  INC_STAT(thread(), num_functions_parsed, 1);
+  Type& signature_type = Type::ZoneHandle(Z);
+  SequenceNode* statements = NULL;
+  if (!found_func) {
+    // Parse the local function. As a side effect of the parsing, the
+    // variables of this function's scope that are referenced by the local
+    // function (and its inner nested functions) will be marked as captured.
 
-  // Now that the local function has formal parameters, lookup the signature
-  Type& signature_type = Type::ZoneHandle(Z, function.SignatureType());
-  signature_type ^= ClassFinalizer::FinalizeType(
-      current_class(), signature_type, ClassFinalizer::kCanonicalize);
-  function.SetSignatureType(signature_type);
+    statements = Parser::ParseFunc(function, !is_literal);
+    INC_STAT(thread(), num_functions_parsed, 1);
+
+    // Now that the local function has formal parameters, lookup the signature
+    signature_type = function.SignatureType();
+    signature_type ^= ClassFinalizer::FinalizeType(
+        current_class(), signature_type, ClassFinalizer::kCanonicalize);
+    function.SetSignatureType(signature_type);
+  } else {
+    // The local function was parsed before. The captured variables are
+    // saved in the function's context scope. Iterate over the context scope
+    // and mark its variables as captured.
+    const ContextScope& context_scope =
+        ContextScope::Handle(Z, function.context_scope());
+    ASSERT(!context_scope.IsNull());
+    String& var_name = String::Handle(Z);
+    for (int i = 0; i < context_scope.num_variables(); i++) {
+      var_name = context_scope.NameAt(i);
+      // We need to look up the name in a way that returns even hidden
+      // variables, e.g. 'this' in an initializer list.
+      LocalVariable* v = current_block_->scope->LookupVariable(var_name, true);
+      ASSERT(v != NULL);
+      current_block_->scope->CaptureVariable(v);
+    }
+    SkipFunctionLiteral();
+    signature_type = function.SignatureType();
+  }
 
   // Local functions are registered in the enclosing class, but
   // ignored during class finalization. The enclosing class has
@@ -7717,7 +7772,7 @@
   ASSERT(signature_type.IsFinalized());
 
   // Make sure that the instantiator is captured.
-  if ((current_block_->scope->function_level() > 0) &&
+  if ((FunctionLevel() > 0) &&
       Class::Handle(signature_type.type_class()).IsGeneric()) {
     CaptureInstantiator();
   }
@@ -7763,8 +7818,9 @@
   // variables are not relevant for the compilation of the enclosing function.
   // This pruning is done by omitting to hook the local scope in its parent
   // scope in the constructor of LocalScope.
-  AstNode* closure = new(Z) ClosureNode(
-      function_pos, function, NULL, statements->scope());
+  AstNode* closure =
+      new(Z) ClosureNode(function_pos, function, NULL,
+                         statements != NULL ? statements->scope() : NULL);
 
   if (function_variable == NULL) {
     ASSERT(is_literal);
@@ -8405,6 +8461,7 @@
         // We have seen a 'continue' with this label name. Resolve
         // the forward reference.
         case_label->ResolveForwardReference();
+        RemoveNodesForFinallyInlining(case_label);
       } else {
         ReportError(label_pos, "label '%s' already exists in scope",
                     label_name->ToCString());
@@ -8548,7 +8605,7 @@
   if (try_stack_ != NULL) {
     LocalScope* scope = try_stack_->try_block()->scope;
     uint16_t try_index = try_stack_->try_index();
-    const int current_function_level = current_block_->scope->function_level();
+    const int current_function_level = FunctionLevel();
     if (scope->function_level() == current_function_level) {
       // The block declaring :saved_try_ctx_var variable is the parent of the
       // pushed try block.
@@ -9299,7 +9356,7 @@
     return;
   }
   ASSERT(node->IsReturnNode() || node->IsJumpNode());
-  const intptr_t func_level = current_block_->scope->function_level();
+  const intptr_t func_level = FunctionLevel();
   TryStack* iterator = try_stack_;
   while ((iterator != NULL) &&
       (iterator->try_block()->scope->function_level() == func_level)) {
@@ -9313,7 +9370,12 @@
       // so we do not need to inline the finally code. Otherwise we need
       // to inline the finally code of this try block and then move on to the
       // next outer try block.
-      if (label->owner()->IsNestedWithin(try_scope)) {
+      // For unresolved forward jumps to switch cases, we don't yet know
+      // to which scope the label will be resolved. Tentatively add the
+      // jump to all nested try statements and remove the outermost ones
+      // when we know the exact jump target. (See
+      // RemoveNodesForFinallyInlining below.)
+      if (!label->IsUnresolved() && label->owner()->IsNestedWithin(try_scope)) {
         break;
       }
     }
@@ -9323,13 +9385,26 @@
 }
 
 
+void Parser::RemoveNodesForFinallyInlining(SourceLabel* label) {
+  TryStack* iterator = try_stack_;
+  const intptr_t func_level = FunctionLevel();
+  while ((iterator != NULL) &&
+         (iterator->try_block()->scope->function_level() == func_level)) {
+    iterator->RemoveJumpToLabel(label);
+    iterator = iterator->outer_try();
+  }
+}
+
+
 // Add the inlined finally clause to the specified node.
 void Parser::AddFinallyClauseToNode(bool is_async,
                                     AstNode* node,
                                     InlinedFinallyNode* finally_clause) {
   ReturnNode* return_node = node->AsReturnNode();
   if (return_node != NULL) {
-    parsed_function()->EnsureFinallyReturnTemp(is_async);
+    if (FunctionLevel() == 0) {
+      parsed_function()->EnsureFinallyReturnTemp(is_async);
+    }
     return_node->AddInlinedFinallyNode(finally_clause);
     return;
   }
@@ -9444,7 +9519,7 @@
       // Has a type specification that is not malformed or malbounded.  Now
       // form an 'if type check' to guard the catch handler code.
       if (!exception_param.type->IsInstantiated() &&
-          (current_block_->scope->function_level() > 0)) {
+          (FunctionLevel() > 0)) {
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
@@ -9859,7 +9934,7 @@
   if (jump_kind == Token::kBREAK && target->kind() == SourceLabel::kCase) {
     ReportError(jump_pos, "'break' to case clause label is illegal");
   }
-  if (target->FunctionLevel() != current_block_->scope->function_level()) {
+  if (target->FunctionLevel() != FunctionLevel()) {
     ReportError(jump_pos, "'%s' target must be in same function context",
                 Token::Str(jump_kind));
   }
@@ -10058,17 +10133,16 @@
     if (CurrentToken() != Token::kSEMICOLON) {
       const TokenPosition expr_pos = TokenPos();
       if (current_function().IsGenerativeConstructor() &&
-          (current_block_->scope->function_level() == 0)) {
+          (FunctionLevel() == 0)) {
         ReportError(expr_pos,
                     "return of a value is not allowed in constructors");
       } else if (current_function().IsGeneratorClosure() &&
-          (current_block_->scope->function_level() == 0)) {
+          (FunctionLevel() == 0)) {
         ReportError(expr_pos, "generator functions may not return a value");
       }
       AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
       if (I->type_checks() &&
-          current_function().IsAsyncClosure() &&
-          (current_block_->scope->function_level() == 0)) {
+          current_function().IsAsyncClosure() && (FunctionLevel() == 0)) {
         // In checked mode, when the declared result type is Future<T>, verify
         // that the returned expression is of type T or Future<T> as follows:
         // return temp = expr, temp is Future ? temp as Future<T> : temp as T;
@@ -10119,7 +10193,7 @@
       statement = new(Z) ReturnNode(statement_pos, expr);
     } else {
       if (current_function().IsSyncGenClosure() &&
-          (current_block_->scope->function_level() == 0)) {
+          (FunctionLevel() == 0)) {
         // In a synchronous generator, return without an expression
         // returns false, signaling that the iterator terminates and
         // did not yield a value.
@@ -10529,8 +10603,7 @@
         const TokenPosition type_pos = TokenPos();
         const AbstractType& type = AbstractType::ZoneHandle(Z,
             ParseType(ClassFinalizer::kCanonicalize));
-        if (!type.IsInstantiated() &&
-            (current_block_->scope->function_level() > 0)) {
+        if (!type.IsInstantiated() && (FunctionLevel() > 0)) {
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
@@ -11451,7 +11524,7 @@
                         "from static function",
                         name.ToCString());
           }
-          if (current_block_->scope->function_level() > 0) {
+          if (FunctionLevel() > 0) {
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
@@ -11547,7 +11620,7 @@
                         "from static function",
                         name.ToCString());
           }
-          if (current_block_->scope->function_level() > 0) {
+          if (FunctionLevel() > 0) {
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
@@ -11665,7 +11738,7 @@
                         "from static function",
                         name.ToCString());
           }
-          if (current_block_->scope->function_level() > 0) {
+          if (FunctionLevel() > 0) {
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
@@ -12498,7 +12571,7 @@
       TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z,
           current_class().LookupTypeParameter(ident));
       if (!type_parameter.IsNull()) {
-        if (current_block_->scope->function_level() > 0) {
+        if (FunctionLevel() > 0) {
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
@@ -12839,7 +12912,7 @@
     ASSERT(!factory_method.IsNull());
     if (!list_type_arguments.IsNull() &&
         !list_type_arguments.IsInstantiated() &&
-        (current_block_->scope->function_level() > 0)) {
+        (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
     }
@@ -13101,7 +13174,7 @@
     ASSERT(!factory_method.IsNull());
     if (!map_type_arguments.IsNull() &&
         !map_type_arguments.IsInstantiated() &&
-        (current_block_->scope->function_level() > 0)) {
+        (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
     }
@@ -13685,7 +13758,7 @@
     CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments);
     if (!type_arguments.IsNull() &&
         !type_arguments.IsInstantiated() &&
-        (current_block_->scope->function_level() > 0)) {
+        (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
     }
@@ -14352,6 +14425,7 @@
 void Parser::SkipPostfixExpr() {
   SkipPrimary();
   if (CurrentToken() == Token::kHASH) {
+    ConsumeToken();
     if (IsIdentifier()) {
       ConsumeToken();
       SkipIf(Token::kASSIGN);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 84301f2..3bcb688 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -338,6 +338,10 @@
   // current_function(), but is greater than zero while parsing the body of
   // local functions nested in current_function().
 
+  // FunctionLevel is 0 when parsing code of current_function(), and denotes
+  // the relative nesting level when parsing a nested function.
+  int FunctionLevel() const;
+
   // The class being parsed.
   const Class& current_class() const;
   void set_current_class(const Class& value);
@@ -739,6 +743,7 @@
   // Add specified node to try block list so that it can be patched with
   // inlined finally code if needed.
   void AddNodeForFinallyInlining(AstNode* node);
+  void RemoveNodesForFinallyInlining(SourceLabel* label);
   // Add the inlined finally clause to the specified node.
   void AddFinallyClauseToNode(bool is_async,
                               AstNode* node,
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index 3df0a63..8ef15c5 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -326,4 +326,20 @@
   }
 }
 
+
+void PortMap::DebugDumpForMessageHandler(MessageHandler* handler) {
+  SafepointMutexLocker ml(mutex_);
+  Object& msg_handler = Object::Handle();
+  for (intptr_t i = 0; i < capacity_; i++) {
+    if (map_[i].handler == handler) {
+      if (map_[i].state == kLivePort) {
+        OS::Print("Live Port = %" Pd64 "\n", map_[i].port);
+        msg_handler = DartLibraryCalls::LookupHandler(map_[i].port);
+        OS::Print("Handler = %s\n", msg_handler.ToCString());
+      }
+    }
+  }
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/port.h b/runtime/vm/port.h
index 9ec7e7b..6e41e3a 100644
--- a/runtime/vm/port.h
+++ b/runtime/vm/port.h
@@ -59,6 +59,8 @@
   static void PrintPortsForMessageHandler(MessageHandler* handler,
                                           JSONStream* stream);
 
+  static void DebugDumpForMessageHandler(MessageHandler* handler);
+
  private:
   friend class dart::PortMapTestPeer;
 
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index 52c6e88..fd26900 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -366,7 +366,8 @@
     }
     if ((cid == kDynamicCid) ||
         (cid == kVoidCid) ||
-        (cid == kFreeListElement)) {
+        (cid == kFreeListElement) ||
+        (cid == kForwardingCorpse)) {
       continue;
     }
     cls = isolate()->class_table()->At(cid);
@@ -407,11 +408,12 @@
     { "dart:typed_data", "ByteData", "ByteData." },
     { "dart:typed_data", "ByteData", "ByteData._view" },
     { "dart:typed_data", "ByteBuffer", "ByteBuffer._New" },
-#if !defined(PRODUCT)
     { "dart:_vmservice", "::", "_registerIsolate" },
     { "dart:_vmservice", "::", "boot" },
+#if !defined(PRODUCT)
     { "dart:developer", "Metrics", "_printMetrics" },
     { "dart:developer", "::", "_runExtension" },
+    { "dart:isolate", "::", "_runPendingImmediateCallback" },
 #endif  // !PRODUCT
     // Fields
     { "dart:core", "Error", "_stackTrace" },
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 195149f..cc0f89d 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -1255,7 +1255,9 @@
 
   void Build() {
     ScopeTimer sw("ProfileBuilder::Build", FLAG_trace_profiler);
-    FilterSamples();
+    if (!FilterSamples()) {
+      return;
+    }
 
     Setup();
     BuildCodeTable();
@@ -1297,15 +1299,16 @@
     RegisterProfileCodeTag(VMTag::kInlineEndCodeTagId);
   }
 
-  void FilterSamples() {
+  bool FilterSamples() {
     ScopeTimer sw("ProfileBuilder::FilterSamples", FLAG_trace_profiler);
     SampleBuffer* sample_buffer = Profiler::sample_buffer();
     if (sample_buffer == NULL) {
-      return;
+      return false;
     }
     samples_ = sample_buffer->BuildProcessedSampleBuffer(filter_);
     profile_->samples_ = samples_;
     profile_->sample_count_ = samples_->length();
+    return true;
   }
 
   void UpdateMinMaxTimes(int64_t timestamp) {
@@ -2518,7 +2521,7 @@
 
 
 ProfileFunction* Profile::FindFunction(const Function& function) {
-  return functions_->Lookup(function);
+  return (functions_ != NULL) ? functions_->Lookup(function) : NULL;
 }
 
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index cc880e9..8f92e9d 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -4,6 +4,7 @@
 
 #include "vm/raw_object.h"
 
+#include "vm/become.h"
 #include "vm/class_table.h"
 #include "vm/dart.h"
 #include "vm/freelist.h"
@@ -177,6 +178,12 @@
       instance_size = element->Size();
       break;
     }
+    case kForwardingCorpse: {
+      uword addr = RawObject::ToAddr(this);
+      ForwardingCorpse* element = reinterpret_cast<ForwardingCorpse*>(addr);
+      instance_size = element->Size();
+      break;
+    }
     default: {
       // Get the (constant) instance size out of the class object.
       // TODO(koda): Add Size(ClassTable*) interface to allow caching in loops.
@@ -288,6 +295,12 @@
         size = element->Size();
         break;
       }
+      case kForwardingCorpse: {
+        uword addr = RawObject::ToAddr(this);
+        ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
+        size = forwarder->Size();
+        break;
+      }
       case kNullCid:
         size = Size();
         break;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 74cf176..518b027 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -181,9 +181,12 @@
   kDynamicCid,
   kVoidCid,
 
-  // The following entry does not describe a real class, but instead it is an
-  // id which is used to identify free list elements in the heap.
+  // The following entries describes classes for pseudo-objects in the heap
+  // that should never be reachable from live objects. Free list elements
+  // maintain the free list for old space, and forwarding corpses are used to
+  // implement one-way become.
   kFreeListElement,
+  kForwardingCorpse,
 
   kNumPredefinedCids,
 };
@@ -442,6 +445,12 @@
   bool IsFreeListElement() const {
     return ((GetClassId() == kFreeListElement));
   }
+  bool IsForwardingCorpse() const {
+    return ((GetClassId() == kForwardingCorpse));
+  }
+  bool IsPseudoObject() const {
+    return IsFreeListElement() || IsForwardingCorpse();
+  }
 
   intptr_t Size() const {
     uword tags = ptr()->tags_;
diff --git a/runtime/vm/safepoint.h b/runtime/vm/safepoint.h
index 9477425..58afb49 100644
--- a/runtime/vm/safepoint.h
+++ b/runtime/vm/safepoint.h
@@ -313,10 +313,45 @@
   }
 
  private:
-  int16_t execution_state_;
+  uint32_t execution_state_;
   DISALLOW_COPY_AND_ASSIGN(TransitionToGenerated);
 };
 
+
+// TransitionToVM is used to transition the safepoint state of a
+// thread from "running native code" to "running vm code"
+// and ensures that the state is reverted back to "running native code"
+// when exiting the scope/frame.
+// This transition helper is mainly used in the error path of the
+// Dart API implementations where we sometimes do not have an explicit
+// transition set up.
+class TransitionToVM : public TransitionSafepointState {
+ public:
+  explicit TransitionToVM(Thread* T) : TransitionSafepointState(T),
+                                       execution_state_(T->execution_state()) {
+    ASSERT(T == Thread::Current());
+    ASSERT((execution_state_ == Thread::kThreadInVM) ||
+           (execution_state_ == Thread::kThreadInNative));
+    if (execution_state_ == Thread::kThreadInNative) {
+      T->ExitSafepoint();
+      T->set_execution_state(Thread::kThreadInVM);
+    }
+    ASSERT(T->execution_state() == Thread::kThreadInVM);
+  }
+
+  ~TransitionToVM() {
+    ASSERT(thread()->execution_state() == Thread::kThreadInVM);
+    if (execution_state_ == Thread::kThreadInNative) {
+      thread()->set_execution_state(Thread::kThreadInNative);
+      thread()->EnterSafepoint();
+    }
+  }
+
+ private:
+  uint32_t execution_state_;
+  DISALLOW_COPY_AND_ASSIGN(TransitionToVM);
+};
+
 }  // namespace dart
 
 #endif  // VM_SAFEPOINT_H_
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 03f0912..306a78a 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -464,11 +464,9 @@
     total_count += count;
     while (!pending->IsEmpty()) {
       RawObject* raw_object = pending->Pop();
-      if (raw_object->IsFreeListElement()) {
-        // TODO(rmacnak): Forwarding corpse from become. Probably we should also
-        // visit the store buffer blocks during become, and mark any forwardees
-        // as remembered if their forwarders are remembered to satisfy the
-        // following assert.
+      if (raw_object->IsForwardingCorpse()) {
+        // A source object in a become was a remembered object, but we do
+        // not visit the store buffer during become to remove it.
         continue;
       }
       ASSERT(raw_object->IsRemembered());
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 6060e7a..be2cdda 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -98,6 +98,14 @@
 }
 
 
+void LocalScope::MoveLabel(SourceLabel* label) {
+  ASSERT(LocalLookupLabel(label->name()) == NULL);
+  ASSERT(label->kind() == SourceLabel::kForward);
+  labels_.Add(label);
+  label->set_owner(this);
+}
+
+
 NameReference* LocalScope::FindReference(const String& name) const {
   ASSERT(name.IsSymbol());
   intptr_t num_references = referenced_.length();
@@ -489,7 +497,7 @@
       if (outer_switch == NULL) {
         return label;
       } else {
-        outer_switch->AddLabel(label);
+        outer_switch->MoveLabel(label);
       }
     }
   }
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index aaf120d..c2fbfe0 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -182,7 +182,6 @@
   const String& name() const { return name_; }
   LocalScope* owner() const { return owner_; }
   void set_owner(LocalScope* owner) {
-    ASSERT(owner_ == NULL);
     owner_ = owner;
   }
 
@@ -191,6 +190,7 @@
   // Returns the function level of the scope in which the label is defined.
   int FunctionLevel() const;
 
+  bool IsUnresolved() { return kind_ == kForward; }
   void ResolveForwardReference() { kind_ = kCase; }
 
  private:
@@ -255,6 +255,9 @@
   // is already present.
   bool AddLabel(SourceLabel* label);
 
+  // Move an unresolved label of a switch case label to an outer switch.
+  void MoveLabel(SourceLabel* label);
+
   // Lookup a variable in this scope only.
   LocalVariable* LocalLookupVariable(const String& name) const;
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index fc78a48..80607bb 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -859,7 +859,6 @@
 
     if (handler != NULL) {
       EmbedderHandleMessage(handler, &js);
-      js.PostReply();
       return;
     }
 
@@ -1126,16 +1125,16 @@
   ASSERT(handler != NULL);
   Dart_ServiceRequestCallback callback = handler->callback();
   ASSERT(callback != NULL);
-  const char* r = NULL;
-  const char* method = js->method();
-  const char** keys = js->param_keys();
-  const char** values = js->param_values();
-  r = callback(method, keys, values, js->num_params(), handler->user_data());
-  ASSERT(r != NULL);
-  // TODO(johnmccutchan): Allow for NULL returns?
-  TextBuffer* buffer = js->buffer();
-  buffer->AddString(r);
-  free(const_cast<char*>(r));
+  const char* response = NULL;
+  bool success = callback(js->method(), js->param_keys(), js->param_values(),
+                          js->num_params(), handler->user_data(), &response);
+  ASSERT(response != NULL);
+  if (!success) {
+    js->SetupError();
+  }
+  js->buffer()->AddString(response);
+  js->PostReply();
+  free(const_cast<char*>(response));
 }
 
 
@@ -2217,7 +2216,7 @@
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
     RawObject* raw_obj = it->Get();
-    if (raw_obj->IsFreeListElement()) {
+    if (raw_obj->IsPseudoObject()) {
       return kProceed;
     }
     Thread* thread = Thread::Current();
@@ -3341,8 +3340,7 @@
   virtual uword filter_addr() const { return addr_; }
 
   virtual bool FindObject(RawObject* obj) const {
-    // Free list elements are not real objects, so skip them.
-    if (obj->IsFreeListElement()) {
+    if (obj->IsPseudoObject()) {
       return false;
     }
     uword obj_begin = RawObject::ToAddr(obj);
@@ -3597,6 +3595,19 @@
 }
 
 
+static const MethodParameter* get_object_store_params[] = {
+  RUNNABLE_ISOLATE_PARAMETER,
+  NULL,
+};
+
+
+static bool GetObjectStore(Thread* thread, JSONStream* js) {
+  JSONObject jsobj(js);
+  thread->isolate()->object_store()->PrintToJSONObject(&jsobj);
+  return true;
+}
+
+
 static const MethodParameter* get_class_list_params[] = {
   RUNNABLE_ISOLATE_PARAMETER,
   NULL,
@@ -3973,6 +3984,8 @@
     get_isolate_metric_list_params },
   { "getObject", GetObject,
     get_object_params },
+  { "_getObjectStore", GetObjectStore,
+    get_object_store_params },
   { "_getObjectByAddress", GetObjectByAddress,
     get_object_by_address_params },
   { "_getPersistentHandles", GetPersistentHandles,
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index e65c539..d4d02d7 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -363,6 +363,9 @@
 
  protected:
   static void ShutdownIsolate(uword parameter) {
+    if (FLAG_trace_service) {
+      OS::Print("vm-service: ShutdownIsolate\n");
+    }
     Isolate* I = reinterpret_cast<Isolate*>(parameter);
     ASSERT(ServiceIsolate::IsServiceIsolate(I));
     ServiceIsolate::SetServiceIsolate(NULL);
@@ -382,6 +385,10 @@
       if (!error.IsNull() && !error.IsUnwindError()) {
         OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString());
       }
+      error = I->sticky_error();
+      if (!error.IsNull() && !error.IsUnwindError()) {
+        OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString());
+      }
       Dart::RunShutdownCallback();
     }
     // Shut the isolate down.
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 5071bce..c272b4c 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -571,23 +571,27 @@
 }
 
 
-static const char* alpha_callback(
+static bool alpha_callback(
     const char* name,
     const char** option_keys,
     const char** option_values,
     intptr_t num_options,
-    void* user_data) {
-  return strdup("alpha");
+    void* user_data,
+    const char** result) {
+  *result = strdup("alpha");
+  return true;
 }
 
 
-static const char* beta_callback(
+static bool beta_callback(
     const char* name,
     const char** option_keys,
     const char** option_values,
     intptr_t num_options,
-    void* user_data) {
-  return strdup("beta");
+    void* user_data,
+    const char** result) {
+  *result = strdup("beta");
+  return false;
 }
 
 
@@ -626,7 +630,7 @@
   service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]");
   Service::HandleRootMessage(service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
-  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":1}",
+  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":1}",
                handler.msg());
 }
 
@@ -666,7 +670,7 @@
   service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
-  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":\"0\"}",
+  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":\"0\"}",
                handler.msg());
 }
 
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 36f5f9c..b3cac8b 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -1218,7 +1218,7 @@
 void Simulator::ClearExclusive() {
   MutexLocker ml(exclusive_access_lock_);
   // Remove the reservation for this thread.
-  SetExclusiveAccess(NULL);
+  SetExclusiveAccess(0);
 }
 
 
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index ffe4e92..baafca84 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -754,6 +754,20 @@
 #define DECLARE_A_X int32_t rD; USE(rD)
 #define DECODE_A_X rD = (static_cast<int32_t>(op) >> Bytecode::kDShift);
 
+
+#define SMI_FASTPATH_ICDATA_INC                                                \
+  do {                                                                         \
+    ASSERT(Bytecode::IsCallOpcode(*pc));                                       \
+    const uint16_t kidx = Bytecode::DecodeD(*pc);                              \
+    const RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));           \
+    RawObject** data = icdata->ptr()->ic_data_->ptr()->data();                 \
+    const intptr_t count_offset = ICData::CountIndexFor(2);                    \
+    const intptr_t raw_smi_old =                                               \
+        reinterpret_cast<intptr_t>(data[count_offset]);                        \
+    const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);               \
+    *reinterpret_cast<intptr_t*>(&data[count_offset]) = raw_smi_new;           \
+  } while (0);                                                                 \
+
 // Declare bytecode handler for a smi operation (e.g. AddTOS) with the
 // given result type and the given behavior specified as a function
 // that takes left and right operands and result slot and returns
@@ -764,6 +778,7 @@
     const intptr_t rhs = reinterpret_cast<intptr_t>(SP[-0]);                   \
     ResultT* slot = reinterpret_cast<ResultT*>(SP - 1);                        \
     if (LIKELY(AreBothSmis(lhs, rhs) && !Func(lhs, rhs, slot))) {              \
+      SMI_FASTPATH_ICDATA_INC;                                                 \
       /* Fast path succeeded. Skip the generic call that follows. */           \
       pc++;                                                                    \
       /* We dropped 2 arguments and push result                   */           \
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index 9865ca9..7172bbe 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -76,7 +76,7 @@
   }
 
   enum IntrinsicId {
-#define V(test_class_name, test_function_name, enum_name, fp) \
+#define V(test_class_name, test_function_name, enum_name, type, fp) \
     k##enum_name##Intrinsic,
   ALL_INTRINSICS_LIST(V)
   GRAPH_INTRINSICS_LIST(V)
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index d23c755..d980ca1 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -1156,7 +1156,7 @@
 void Simulator::ClearExclusive() {
   MutexLocker ml(exclusive_access_lock_);
   // Remove the reservation for this thread.
-  SetExclusiveAccess(NULL);
+  SetExclusiveAccess(0);
 }
 
 
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index ee8858d6..7fa1573 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -30,6 +30,22 @@
 }
 
 
+SourceReport::~SourceReport() {
+  ClearScriptTable();
+}
+
+
+void SourceReport::ClearScriptTable() {
+  for (intptr_t i = 0; i < script_table_entries_.length(); i++) {
+    delete script_table_entries_[i];
+    script_table_entries_[i] = NULL;
+  }
+  script_table_entries_.Clear();
+  script_table_.Clear();
+  next_script_index_ = 0;
+}
+
+
 void SourceReport::Init(Thread* thread,
                         const Script* script,
                         TokenPosition start_pos,
@@ -38,9 +54,7 @@
   script_ = script;
   start_pos_ = start_pos;
   end_pos_ = end_pos;
-  script_table_entries_.Clear();
-  script_table_.Clear();
-  next_script_index_ = 0;
+  ClearScriptTable();
   if (IsReportRequested(kProfile)) {
     // Build the profile.
     SampleFilter samplesForIsolate(thread_->isolate(),
@@ -103,17 +117,36 @@
   if (pair != NULL) {
     return pair->index;
   }
-
-  ScriptTableEntry tmp;
-  tmp.key = &url;
-  tmp.index = next_script_index_++;
-  tmp.script = &script;
+  ScriptTableEntry* tmp = new ScriptTableEntry();
+  tmp->key = &url;
+  tmp->index = next_script_index_++;
+  tmp->script = &Script::Handle(zone(), script.raw());
   script_table_entries_.Add(tmp);
-  script_table_.Insert(&(script_table_entries_.Last()));
-  return tmp.index;
+  script_table_.Insert(tmp);
+  ASSERT(script_table_entries_.length() == next_script_index_);
+#if defined(DEBUG)
+  VerifyScriptTable();
+#endif
+  return tmp->index;
 }
 
 
+#if defined(DEBUG)
+void SourceReport::VerifyScriptTable() {
+  for (intptr_t i = 0; i < script_table_entries_.length(); i++) {
+    const String* url = script_table_entries_[i]->key;
+    const Script* script = script_table_entries_[i]->script;
+    intptr_t index = script_table_entries_[i]->index;
+    ASSERT(i == index);
+    const String& url2 = String::Handle(zone(), script->url());
+    ASSERT(url2.Equals(*url));
+    ScriptTableEntry* pair = script_table_.Lookup(&url2);
+    ASSERT(i == pair->index);
+  }
+}
+#endif
+
+
 bool SourceReport::ScriptIsLoadedByLibrary(const Script& script,
                                            const Library& lib) {
   const Array& scripts = Array::Handle(zone(), lib.LoadedScripts());
@@ -337,8 +370,8 @@
 
 
 void SourceReport::PrintScriptTable(JSONArray* scripts) {
-  for (int i = 0; i < script_table_entries_.length(); i++) {
-    const Script* script = script_table_entries_[i].script;
+  for (intptr_t i = 0; i < script_table_entries_.length(); i++) {
+    const Script* script = script_table_entries_[i]->script;
     scripts->AddValue(*script);
   }
 }
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index cd2ad3a..dec18cfa 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -40,6 +40,7 @@
   // (e.g. kCallSites | kCoverage).
   explicit SourceReport(intptr_t report_set,
                         CompileMode compile = kNoCompile);
+  ~SourceReport();
 
   // Generate a source report for (some subrange of) a script.
   //
@@ -50,6 +51,7 @@
                  TokenPosition end_pos = TokenPosition::kNoSource);
 
  private:
+  void ClearScriptTable();
   void Init(Thread* thread, const Script* script,
             TokenPosition start_pos, TokenPosition end_pos);
 
@@ -69,6 +71,9 @@
   void PrintPossibleBreakpointsData(JSONObject* jsobj,
                                     const Function& func, const Code& code);
   void PrintProfileData(JSONObject* jsobj, ProfileFunction* profile_function);
+#if defined(DEBUG)
+  void VerifyScriptTable();
+#endif
   void PrintScriptTable(JSONArray* jsarr);
 
   void VisitFunction(JSONArray* jsarr, const Function& func);
@@ -114,7 +119,7 @@
   TokenPosition start_pos_;
   TokenPosition end_pos_;
   Profile profile_;
-  GrowableArray<ScriptTableEntry> script_table_entries_;
+  GrowableArray<ScriptTableEntry*> script_table_entries_;
   DirectChainedHashMap<ScriptTableTrait> script_table_;
   intptr_t next_script_index_;
 };
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index ad00dec..2d3f5bc 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -425,6 +425,49 @@
 }
 
 
+TEST_CASE(SourceReport_Coverage_AllFunctions_ForceCompile) {
+  const char* kScript =
+      "helper0() {}\n"
+      "helper1() {}\n"
+      "main() {\n"
+      "  if (true) {\n"
+      "    helper0();\n"
+      "  } else {\n"
+      "    helper1();\n"
+      "  }\n"
+      "}";
+
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+
+  SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
+  JSONStream js;
+
+  // We generate a report with all functions in the VM.
+  Script& null_script = Script::Handle();
+  {
+    TransitionNativeToVM transition(Thread::Current());
+    report.PrintJSON(&js, null_script);
+  }
+  const char* result = js.ToCString();
+
+  // Sanity check the header.
+  EXPECT_SUBSTRING("{\"type\":\"SourceReport\",\"ranges\":[", result);
+
+  // Make sure that the main function was found.
+  EXPECT_SUBSTRING(
+      "\"startPos\":12,\"endPos\":39,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[23],\"misses\":[32]}",
+      result);
+
+  // More than one script is referenced in the report.
+  EXPECT_SUBSTRING("\"scriptIndex\":0", result);
+  EXPECT_SUBSTRING("\"scriptIndex\":1", result);
+  EXPECT_SUBSTRING("\"scriptIndex\":2", result);
+}
+
+
 TEST_CASE(SourceReport_CallSites_SimpleCall) {
   char buffer[1024];
   const char* kScript =
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 15b7e0f..97a20c8 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -780,8 +780,8 @@
   __ Comment("InvokeDartCodeStub");
 
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
-  // to access the stack, and put the C stack pointer at the stack limit.
-  __ SetupDartSP(OSThread::GetSpecifiedStackSize());
+  // to access the stack.
+  __ SetupDartSP();
   __ EnterFrame(0);
 
   // Push code object to PC marker slot.
@@ -896,7 +896,7 @@
 
   // Restore the frame pointer and C stack pointer and return.
   __ LeaveFrame();
-  __ mov(CSP, SP);
+  __ RestoreCSP();
   __ ret();
 }
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 7057da2..8b85956 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -274,6 +274,8 @@
   V(ByteBufferDot_New, "ByteBuffer._New")                                      \
   V(_WeakProperty, "_WeakProperty")                                            \
   V(_MirrorReference, "_MirrorReference")                                      \
+  V(FreeListElement, "FreeListElement")                                        \
+  V(ForwardingCorpse, "ForwardingCorpse")                                      \
   V(InvocationMirror, "_InvocationMirror")                                     \
   V(AllocateInvocationMirror, "_allocateInvocationMirror")                     \
   V(toString, "toString")                                                      \
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index c6b6bdb..2059b7107 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -75,7 +75,7 @@
 
 
 static bool IsImportableTestLib(const char* url_name) {
-  const char* kImportTestLibUri = "importable_test_lib";
+  const char* kImportTestLibUri = "test:importable_lib";
   static const intptr_t kImportTestLibUriLen = strlen(kImportTestLibUri);
   return (strncmp(url_name, kImportTestLibUri, kImportTestLibUriLen) == 0);
 }
@@ -92,8 +92,9 @@
 }
 
 
+#ifndef PRODUCT
 static bool IsIsolateReloadTestLib(const char* url_name) {
-  const char* kIsolateReloadTestLibUri = "isolate_reload_test_helper";
+  const char* kIsolateReloadTestLibUri = "test:isolate_reload_helper";
   static const intptr_t kIsolateReloadTestLibUriLen =
       strlen(kIsolateReloadTestLibUri);
   return (strncmp(url_name,
@@ -102,7 +103,6 @@
 }
 
 
-#ifndef PRODUCT
 static Dart_Handle IsolateReloadTestLibSource() {
   // Special library with one function.
   return DartUtils::NewString("void reloadTest() native 'Reload_Test';\n");
@@ -139,6 +139,9 @@
 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
                                      Dart_Handle library,
                                      Dart_Handle url) {
+  if (tag == Dart_kCanonicalizeUrl) {
+    return Dart_DefaultCanonicalizeUrl(library, url);
+  }
   if (tag == Dart_kScriptTag) {
     // Reload request.
     ASSERT(script_reload_key != kUnsetThreadLocalKey);
@@ -146,7 +149,7 @@
        reinterpret_cast<const char*>(
            OSThread::GetThreadLocal(script_reload_key));
     ASSERT(script_source != NULL);
-    OSThread::SetThreadLocal(script_reload_key, NULL);
+    OSThread::SetThreadLocal(script_reload_key, 0);
     return Dart_LoadScript(url,
                            NewString(script_source),
                            0,
@@ -172,23 +175,6 @@
 
   bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_chars);
   bool is_io_library = DartUtils::IsDartIOLibURL(library_url_string);
-  if (tag == Dart_kCanonicalizeUrl) {
-    // Already canonicalized.
-    if (IsImportableTestLib(url_chars) || IsIsolateReloadTestLib(url_chars)) {
-      return url;
-    }
-    // If this is a Dart Scheme URL then it is not modified as it will be
-    // handled by the VM internally.
-    if (is_dart_scheme_url || is_io_library) {
-      return url;
-    }
-
-    Dart_Handle library_url = Dart_LibraryUrl(library);
-    if (Dart_IsError(library_url)) {
-      return library_url;
-    }
-    return DartUtils::ResolveUri(library_url, url);
-  }
   if (is_dart_scheme_url) {
     ASSERT(tag == Dart_kImportTag);
     // Handle imports of other built-in libraries present in the SDK.
diff --git a/runtime/vm/uri.cc b/runtime/vm/uri.cc
new file mode 100644
index 0000000..7d9ef76
--- /dev/null
+++ b/runtime/vm/uri.cc
@@ -0,0 +1,541 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/uri.h"
+
+#include "vm/zone.h"
+
+namespace dart {
+
+static bool IsUnreservedChar(intptr_t value) {
+  return ((value >= 'a' && value <= 'z') ||
+          (value >= 'A' && value <= 'Z') ||
+          (value >= '0' && value <= '9') ||
+          value == '-' ||
+          value == '.' ||
+          value == '_' ||
+          value == '~');
+}
+
+
+static bool IsDelimiter(intptr_t value) {
+  switch (value) {
+    case ':': case '/': case '?': case '#':
+    case '[': case ']': case '@': case '!':
+    case '$': case '&': case '\'': case '(':
+    case ')': case '*': case '+': case ',':
+    case ';': case '=':
+      return true;
+    default:
+      return false;
+  }
+}
+
+
+static bool IsHexDigit(char value) {
+  return ((value >= '0' && value <= '9') ||
+          (value >= 'A' && value <= 'F') ||
+          (value >= 'a' && value <= 'f'));
+}
+
+
+static int HexValue(char digit) {
+  if ((digit >= '0' && digit <= '9')) {
+    return digit - '0';
+  }
+  if ((digit >= 'A' && digit <= 'F')) {
+    return digit - 'A' + 10;
+  }
+  if ((digit >= 'a' && digit <= 'f')) {
+    return digit - 'a' + 10;
+  }
+  UNREACHABLE();
+  return 0;
+}
+
+
+static int GetEscapedValue(const char* str, intptr_t pos, intptr_t len) {
+  if (pos + 2 >= len) {
+    // Not enough room for a valid escape sequence.
+    return -1;
+  }
+  if (str[pos] != '%') {
+    // Escape sequences start with '%'.
+    return -1;
+  }
+
+  char digit1 = str[pos + 1];
+  char digit2 = str[pos + 2];
+  if (!IsHexDigit(digit1) || !IsHexDigit(digit2)) {
+    // Invalid escape sequence.  Ignore it.
+    return -1;
+  }
+  return HexValue(digit1) * 16 + HexValue(digit2);
+}
+
+
+static char* NormalizeEscapes(const char* str, intptr_t len) {
+  // Allocate the buffer.
+  Zone* zone = Thread::Current()->zone();
+  // We multiply len by three because a percent-escape sequence is
+  // three characters long (e.g. ' ' -> '%20).  +1 for '\0'.  We could
+  // take two passes through the string and avoid the excess
+  // allocation, but it's zone-memory so it doesn't seem necessary.
+  char* buffer = zone->Alloc<char>(len * 3 + 1);
+
+  // Copy the string, normalizing as we go.
+  intptr_t buffer_pos = 0;
+  intptr_t pos = 0;
+  while (pos < len) {
+    int escaped_value = GetEscapedValue(str, pos, len);
+    if (escaped_value >= 0) {
+      // If one of the special "unreserved" characters has been
+      // escaped, revert the escaping.  Otherwise preserve the
+      // escaping.
+      if (IsUnreservedChar(escaped_value)) {
+        buffer[buffer_pos] = escaped_value;
+        buffer_pos++;
+      } else {
+        OS::SNPrint(buffer + buffer_pos, 4, "%%%02X", escaped_value);
+        buffer_pos += 3;
+      }
+      pos += 3;
+    } else {
+      char c = str[pos];
+      // If a delimiter or unreserved character is currently not
+      // escaped, preserve that.  If there is a busted %-sequence in
+      // the input, preserve that too.
+      if (c == '%' || IsDelimiter(c) || IsUnreservedChar(c)) {
+        buffer[buffer_pos] = c;
+        buffer_pos++;
+      } else {
+        // Escape funky characters.
+        OS::SNPrint(buffer + buffer_pos, 4, "%%%02X", c);
+        buffer_pos += 3;
+      }
+      pos++;
+    }
+  }
+  buffer[buffer_pos] = '\0';
+  return buffer;
+}
+
+
+// Lower-case a string in place.
+static void StringLower(char* str) {
+  const intptr_t len = strlen(str);
+  intptr_t i = 0;
+  while (i < len) {
+    int escaped_value = GetEscapedValue(str, i, len);
+    if (escaped_value >= 0) {
+      // Don't lowercase escape sequences.
+      i += 3;
+    } else {
+      // I don't use tolower() because I don't want the locale
+      // transforming any non-acii characters.
+      char c = str[i];
+      if (c >= 'A' && c <= 'Z') {
+        str[i] = c + ('a' - 'A');
+      }
+      i++;
+    }
+  }
+}
+
+
+static void ClearParsedUri(ParsedUri* parsed_uri) {
+  parsed_uri->scheme = NULL;
+  parsed_uri->userinfo = NULL;
+  parsed_uri->host = NULL;
+  parsed_uri->port = NULL;
+  parsed_uri->path = NULL;
+  parsed_uri->query = NULL;
+  parsed_uri->fragment = NULL;
+}
+
+
+static intptr_t ParseAuthority(const char* authority, ParsedUri* parsed_uri) {
+  Zone* zone = Thread::Current()->zone();
+  const char* current = authority;
+  intptr_t len = 0;
+
+  size_t userinfo_len = strcspn(current, "@/");
+  if (current[userinfo_len] == '@') {
+    // The '@' character follows the optional userinfo string.
+    parsed_uri->userinfo = NormalizeEscapes(current, userinfo_len);
+    current += userinfo_len + 1;
+    len += userinfo_len + 1;
+  } else {
+    parsed_uri->userinfo = NULL;
+  }
+
+  size_t host_len = strcspn(current, ":/");
+  char* host = NormalizeEscapes(current, host_len);
+  StringLower(host);
+  parsed_uri->host = host;
+  len += host_len;
+
+  if (current[host_len] == ':') {
+    // The ':' character precedes the optional port string.
+    const char* port_start = current + host_len + 1;  // +1 for ':'
+    size_t port_len = strcspn(port_start, "/");
+    parsed_uri->port = zone->MakeCopyOfStringN(port_start, port_len);
+    len += 1 + port_len;  // +1 for ':'
+  } else {
+    parsed_uri->port = NULL;
+  }
+  return len;
+}
+
+
+// Performs a simple parse of a uri into its components.
+// See RFC 3986 Section 3: Syntax.
+bool ParseUri(const char* uri, ParsedUri* parsed_uri) {
+  Zone* zone = Thread::Current()->zone();
+
+  // The first ':' separates the scheme from the rest of the uri.  If
+  // a ':' occurs after the first '/' it doesn't count.
+  size_t scheme_len = strcspn(uri, ":/");
+  const char* rest = uri;
+  if (uri[scheme_len] == ':') {
+    char* scheme = zone->MakeCopyOfStringN(uri, scheme_len);
+    StringLower(scheme);
+    parsed_uri->scheme = scheme;
+    rest = uri + scheme_len + 1;
+  } else {
+    parsed_uri->scheme = NULL;
+  }
+
+  // The first '#' separates the optional fragment
+  const char* hash_pos = rest + strcspn(rest, "#");
+  if (*hash_pos == '#') {
+    // There is a fragment part.
+    const char* fragment_start = hash_pos + 1;
+    parsed_uri->fragment =
+        NormalizeEscapes(fragment_start, strlen(fragment_start));
+  } else {
+    parsed_uri->fragment = NULL;
+  }
+
+  // The first '?' or '#' separates the hierarchical part from the
+  // optional query.
+  const char* question_pos = rest + strcspn(rest, "?#");
+  if (*question_pos == '?') {
+    // There is a query part.
+    const char* query_start = question_pos + 1;
+    parsed_uri->query =
+        NormalizeEscapes(query_start, (hash_pos - query_start));
+  } else {
+    parsed_uri->query = NULL;
+  }
+
+  const char* path_start = rest;
+  if (rest[0] == '/' && rest[1] == '/') {
+    // There is an authority part.
+    const char* authority_start = rest + 2;  // 2 for '//'.
+
+    intptr_t authority_len =
+        ParseAuthority(authority_start, parsed_uri);
+    if (authority_len < 0) {
+      ClearParsedUri(parsed_uri);
+      return false;
+    }
+    path_start = authority_start + authority_len;
+  } else {
+    parsed_uri->userinfo = NULL;
+    parsed_uri->host = NULL;
+    parsed_uri->port = NULL;
+  }
+
+  // The path is the substring between the authority and the query.
+  parsed_uri->path = NormalizeEscapes(path_start, (question_pos - path_start));
+  return true;
+}
+
+
+static char* RemoveLastSegment(char* current, char* base) {
+  if (current == base) {
+    return current;
+  }
+  ASSERT(current > base);
+  for (current--; current > base; current--) {
+    if (*current == '/') {
+      // We have found the beginning of the last segment.
+      return current;
+    }
+  }
+  ASSERT(current == base);
+  return current;
+}
+
+
+static intptr_t SegmentLength(const char* input) {
+  const char* cp = input;
+
+  // Include initial slash in the segment, if any.
+  if (*cp == '/') {
+    cp++;
+  }
+
+  // Don't include trailing slash in the segment.
+  cp += strcspn(cp, "/");
+  return cp - input;
+}
+
+
+// See RFC 3986 Section 5.2.4: Remove Dot Segments.
+static const char* RemoveDotSegments(const char* path) {
+  const char* input = path;
+
+  // The output path will always be less than or equal to the size of
+  // the input path.
+  Zone* zone = Thread::Current()->zone();
+  char* buffer = zone->Alloc<char>(strlen(path) + 1);  // +1 for '\0'
+  char* output = buffer;
+
+  while (*input != '\0') {
+    if (strncmp("../", input, 3) == 0) {
+      // Discard initial "../" from the input.  It's junk.
+      input += 3;
+
+    } else if (strncmp("./", input, 3) == 0) {
+      // Discard initial "./" from the input.  It's junk.
+      input += 2;
+
+    } else if (strncmp("/./", input, 3) == 0) {
+      // Advance past the "/." part of the input.
+      input += 2;
+
+    } else if (strcmp("/.", input) == 0) {
+      // Pretend the input just contains a "/".
+      input = "/";
+
+    } else if (strncmp("/../", input, 4) == 0) {
+      // Advance past the "/.." part of the input and remove one
+      // segment from the output.
+      input += 3;
+      output = RemoveLastSegment(output, buffer);
+
+    } else if (strcmp("/..", input) == 0) {
+      // Pretend the input contains a "/" and remove one segment from
+      // the output.
+      input = "/";
+      output = RemoveLastSegment(output, buffer);
+
+    } else if (strcmp("..", input) == 0) {
+      // The input has been reduced to nothing useful.
+      input += 2;
+
+    } else if (strcmp(".", input) == 0) {
+      // The input has been reduced to nothing useful.
+      input += 1;
+
+    } else {
+      intptr_t segment_len = SegmentLength(input);
+      if (input[0] != '/' && output != buffer) {
+        *output = '/';
+        output++;
+      }
+      strncpy(output, input, segment_len);
+      output += segment_len;
+      input += segment_len;
+    }
+  }
+  *output = '\0';
+  return buffer;
+}
+
+
+// See RFC 3986 Section 5.2.3: Merge Paths.
+static const char* MergePaths(const char* base_path, const char* ref_path) {
+  Zone* zone = Thread::Current()->zone();
+  if (base_path[0] == '\0') {
+    // If the base_path is empty, we prepend '/'.
+    return zone->PrintToString("/%s", ref_path);
+  }
+
+  // We need to find the last '/' in base_path.
+  const char* last_slash = strrchr(base_path, '/');
+  if (last_slash == NULL) {
+    // There is no slash in the base_path.  Return the ref_path unchanged.
+    return ref_path;
+  }
+
+  // We found a '/' in the base_path.  Cut off everything after it and
+  // add the ref_path.
+  intptr_t truncated_base_len = last_slash - base_path;
+  intptr_t ref_path_len = strlen(ref_path);
+  intptr_t len = truncated_base_len + ref_path_len + 1;  // +1 for '/'
+  char* buffer = zone->Alloc<char>(len + 1);  // +1 for '\0'
+
+  // Copy truncated base.
+  strncpy(buffer, base_path, truncated_base_len);
+
+  // Add a slash.
+  buffer[truncated_base_len] = '/';
+
+  // Copy the ref_path.
+  strncpy((buffer + truncated_base_len + 1), ref_path, ref_path_len);
+
+  // Add the trailing '\0'.
+  buffer[len] = '\0';
+
+  return buffer;
+}
+
+
+static char* BuildUri(const ParsedUri& uri) {
+  Zone* zone = Thread::Current()->zone();
+  ASSERT(uri.path != NULL);
+
+  const char* fragment = uri.fragment == NULL ? "" : uri.fragment;
+  const char* fragment_separator = uri.fragment == NULL ? "" : "#";
+  const char* query = uri.query == NULL ? "" : uri.query;
+  const char* query_separator = uri.query == NULL ? "" : "?";
+
+  // If there is no scheme for this uri, just build a relative uri of
+  // the form: "path[?query][#fragment]".  This occurs when we resolve
+  // relative urls inside a "dart:" library.
+  if (uri.scheme == NULL) {
+    ASSERT(uri.userinfo == NULL && uri.host == NULL && uri.port == NULL);
+    return zone->PrintToString("%s%s%s%s%s",
+                               uri.path, query_separator, query,
+                               fragment_separator, fragment);
+  }
+
+  // Uri with no authority: "scheme:path[?query][#fragment]"
+  if (uri.host == NULL) {
+    ASSERT(uri.userinfo == NULL && uri.port == NULL);
+    return zone->PrintToString("%s:%s%s%s%s%s",
+                               uri.scheme, uri.path, query_separator, query,
+                               fragment_separator, fragment);
+  }
+
+  const char* user = uri.userinfo == NULL ? "" : uri.userinfo;
+  const char* user_separator = uri.userinfo == NULL ? "" : "@";
+  const char* port = uri.port == NULL ? "" : uri.port;
+  const char* port_separator = uri.port == NULL ? "" : ":";
+
+  // If the path doesn't start with a '/', add one.  We need it to
+  // separate the path from the authority.
+  const char* path_separator = ((uri.path[0] == '\0' || uri.path[0] == '/')
+                                ? "" : "/");
+
+  // Uri with authority:
+  //   "scheme://[userinfo@]host[:port][/]path[?query][#fragment]"
+  return zone->PrintToString(
+      "%s://%s%s%s%s%s%s%s%s%s%s%s",  // There is *nothing* wrong with this.
+      uri.scheme, user, user_separator, uri.host, port_separator, port,
+      path_separator, uri.path, query_separator, query,
+      fragment_separator, fragment);
+}
+
+
+// See RFC 3986 Section 5: Reference Resolution
+bool ResolveUri(const char* ref_uri,
+                const char* base_uri,
+                const char** target_uri) {
+  // Parse the reference uri.
+  ParsedUri ref;
+  if (!ParseUri(ref_uri, &ref)) {
+    *target_uri = NULL;
+    return false;
+  }
+
+  ParsedUri target;
+  if (ref.scheme != NULL) {
+    if (strcmp(ref.scheme, "dart") == 0) {
+      Zone* zone = Thread::Current()->zone();
+      *target_uri = zone->MakeCopyOfString(ref_uri);
+      return true;
+    }
+
+    // When the ref_uri specifies a scheme, the base_uri is ignored.
+    target.scheme = ref.scheme;
+    target.userinfo = ref.userinfo;
+    target.host = ref.host;
+    target.port = ref.port;
+    target.path = RemoveDotSegments(ref.path);
+    target.query = ref.query;
+    target.fragment = ref.fragment;
+    *target_uri = BuildUri(target);
+    return true;
+  }
+
+  // Parse the base uri.
+  ParsedUri base;
+  if (!ParseUri(base_uri, &base)) {
+    *target_uri = NULL;
+    return false;
+  }
+
+  if ((base.scheme != NULL) && strcmp(base.scheme, "dart") == 0) {
+    Zone* zone = Thread::Current()->zone();
+    *target_uri = zone->MakeCopyOfString(ref_uri);
+    return true;
+  }
+
+  if (ref.host != NULL) {
+    // When the ref_uri specifies an authority, we only use the base scheme.
+    target.scheme = base.scheme;
+    target.userinfo = ref.userinfo;
+    target.host = ref.host;
+    target.port = ref.port;
+    target.path = RemoveDotSegments(ref.path);
+    target.query = ref.query;
+    target.fragment = ref.fragment;
+    *target_uri = BuildUri(target);
+    return true;
+  }
+
+  if (ref.path[0] == '\0') {
+    // Empty path.  Use most parts of base_uri.
+    target.scheme = base.scheme;
+    target.userinfo = base.userinfo;
+    target.host = base.host;
+    target.port = base.port;
+    target.path = base.path;
+    target.query = ((ref.query == NULL) ? base.query : ref.query);
+    target.fragment = ref.fragment;
+    *target_uri = BuildUri(target);
+    return true;
+
+  } else if (ref.path[0] == '/') {
+    // Absolute path.  ref_path wins.
+    target.scheme = base.scheme;
+    target.userinfo = base.userinfo;
+    target.host = base.host;
+    target.port = base.port;
+    target.path = RemoveDotSegments(ref.path);
+    target.query = ref.query;
+    target.fragment = ref.fragment;
+    *target_uri = BuildUri(target);
+    return true;
+
+  } else {
+    // Relative path.  We need to merge the base path and the ref path.
+
+    if (base.scheme == NULL && base.host == NULL && base.path[0] != '/') {
+      // The dart:core Uri class handles resolving a relative uri
+      // against a second relative uri specially, in a way not
+      // described in the RFC.  We do not need to support this for
+      // library resolution.  If we need to implement this later, we
+      // can.
+      *target_uri = NULL;
+      return false;
+    }
+
+    target.scheme = base.scheme;
+    target.userinfo = base.userinfo;
+    target.host = base.host;
+    target.port = base.port;
+    target.path = RemoveDotSegments(MergePaths(base.path, ref.path));
+    target.query = ref.query;
+    target.fragment = ref.fragment;
+    *target_uri = BuildUri(target);
+    return true;
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/uri.h b/runtime/vm/uri.h
new file mode 100644
index 0000000..453b371
--- /dev/null
+++ b/runtime/vm/uri.h
@@ -0,0 +1,33 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_URI_H_
+#define VM_URI_H_
+
+#include "platform/utils.h"
+#include "vm/globals.h"
+
+namespace dart {
+
+struct ParsedUri {
+  const char* scheme;
+  const char* userinfo;
+  const char* host;
+  const char* port;
+  const char* path;
+  const char* query;
+  const char* fragment;
+};
+
+// Parses a uri into its parts.  Returns false if the parse fails.
+bool ParseUri(const char* uri, ParsedUri* parsed_uri);
+
+// Resolves some reference uri with respect to a base uri.
+bool ResolveUri(const char* ref_uri,
+                const char* base_uri,
+                const char** target_uri);
+
+}  // namespace dart
+
+#endif  // VM_URI_H_
diff --git a/runtime/vm/uri_test.cc b/runtime/vm/uri_test.cc
new file mode 100644
index 0000000..34631a5
--- /dev/null
+++ b/runtime/vm/uri_test.cc
@@ -0,0 +1,666 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/uri.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+TEST_CASE(ParseUri_WithScheme_NoQueryNoUser) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042/over/there", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_WithQuery) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042/over/there?name=ferret", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT_STREQ("name=ferret", uri.query);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_WithFragment) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042/over/there#fragment", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT_STREQ("fragment", uri.fragment);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_WithQueryWithFragment) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042/over/there?name=ferret#fragment",
+                  &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT_STREQ("name=ferret", uri.query);
+  EXPECT_STREQ("fragment", uri.fragment);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_WithUser) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://user@example.com:8042/over/there", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT_STREQ("user", uri.userinfo);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_ShortPath) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042/", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_EmptyPath) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo://example.com:8042", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_Rootless1) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo:here", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("here", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_WithScheme_Rootless2) {
+  ParsedUri uri;
+  EXPECT(ParseUri("foo:or/here", &uri));
+  EXPECT_STREQ("foo", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("or/here", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_AbsPath_WithAuthority) {
+  ParsedUri uri;
+  EXPECT(ParseUri("//example.com:8042/over/there", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("example.com", uri.host);
+  EXPECT_STREQ("8042", uri.port);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_AbsPath_NoAuthority) {
+  ParsedUri uri;
+  EXPECT(ParseUri("/over/there", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/over/there", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+// Colons are permitted in path segments, in many cases.
+TEST_CASE(ParseUri_NoScheme_AbsPath_StrayColon) {
+  ParsedUri uri;
+  EXPECT(ParseUri("/ov:er/there", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/ov:er/there", uri.path);
+  EXPECT(uri.query == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_Rootless1) {
+  ParsedUri uri;
+  EXPECT(ParseUri("here", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("here", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_Rootless2) {
+  ParsedUri uri;
+  EXPECT(ParseUri("or/here", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("or/here", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_Empty) {
+  ParsedUri uri;
+  EXPECT(ParseUri("", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_QueryOnly) {
+  ParsedUri uri;
+  EXPECT(ParseUri("?name=ferret", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("", uri.path);
+  EXPECT_STREQ("name=ferret", uri.query);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NoScheme_FragmentOnly) {
+  ParsedUri uri;
+  EXPECT(ParseUri("#fragment", &uri));
+  EXPECT(uri.scheme == NULL);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT_STREQ("fragment", uri.fragment);
+}
+
+
+TEST_CASE(ParseUri_LowerCaseScheme) {
+  ParsedUri uri;
+  EXPECT(ParseUri("ScHeMe:path", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("path", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NormalizeEscapes_PathQueryFragment) {
+  ParsedUri uri;
+  EXPECT(ParseUri(
+      "scheme:/This%09Is A P%61th?This%09Is A Qu%65ry#A Fr%61gment", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/This%09Is%20A%20Path", uri.path);
+  EXPECT_STREQ("This%09Is%20A%20Query", uri.query);
+  EXPECT_STREQ("A%20Fragment", uri.fragment);
+}
+
+
+TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapesPreferred) {
+  ParsedUri uri;
+  EXPECT(ParseUri(
+      "scheme:/%1b%1B", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/%1B%1B", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NormalizeEscapes_Authority) {
+  ParsedUri uri;
+  EXPECT(ParseUri(
+      "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT_STREQ("UsEr%20NaMe", uri.userinfo);  // Normalized, case preserved.
+  EXPECT_STREQ("host.com", uri.host);         // Normalized, lower-cased.
+  EXPECT_STREQ("80", uri.port);
+  EXPECT_STREQ("/", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapeInHost) {
+  ParsedUri uri;
+  EXPECT(ParseUri("scheme://tEst%1b/", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT_STREQ("test%1B", uri.host);  // Notice that %1B is upper-cased.
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/", uri.path);
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ParseUri_BrokenEscapeSequence) {
+  ParsedUri uri;
+  EXPECT(ParseUri(
+      "scheme:/%1g", &uri));
+  EXPECT_STREQ("scheme", uri.scheme);
+  EXPECT(uri.userinfo == NULL);
+  EXPECT(uri.host == NULL);
+  EXPECT(uri.port == NULL);
+  EXPECT_STREQ("/%1g", uri.path);  // Broken sequence is unchanged.
+  EXPECT(uri.query == NULL);
+  EXPECT(uri.fragment == NULL);
+}
+
+
+TEST_CASE(ResolveUri_WithScheme_NoAuthorityNoQuery) {
+  const char* target_uri;
+  EXPECT(ResolveUri("rscheme:/ref/path",
+                    "bscheme://buser@bhost:11/base/path?baseQuery",
+                    &target_uri));
+  EXPECT_STREQ("rscheme:/ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_WithScheme_WithAuthorityWithQuery) {
+  const char* target_uri;
+  EXPECT(ResolveUri("rscheme://ruser@rhost:22/ref/path?refQuery",
+                    "bscheme://buser@bhost:11/base/path?baseQuery",
+                    &target_uri));
+  EXPECT_STREQ("rscheme://ruser@rhost:22/ref/path?refQuery", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoScheme_WithAuthority) {
+  const char* target_uri;
+  EXPECT(ResolveUri("//ruser@rhost:22/ref/path",
+                    "bscheme://buser@bhost:11/base/path?baseQuery",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://ruser@rhost:22/ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_AbsolutePath) {
+  const char* target_uri;
+  EXPECT(ResolveUri("/ref/path",
+                    "bscheme://buser@bhost:11/base/path?baseQuery",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePath) {
+  const char* target_uri;
+  EXPECT(ResolveUri("ref/path",
+                    "bscheme://buser@bhost:11/base/path?baseQuery",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://buser@bhost:11/base/ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathEmptyBasePath) {
+  const char* target_uri;
+  EXPECT(ResolveUri("ref/path",
+                    "bscheme://buser@bhost:11",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathWeirdBasePath) {
+  const char* target_uri;
+  EXPECT(ResolveUri("ref/path",
+                    "bscheme:base",
+                    &target_uri));
+  EXPECT_STREQ("bscheme:ref/path", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPath) {
+  const char* target_uri;
+  EXPECT(ResolveUri("",
+                    "bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
+                    &target_uri));
+  // Note that we drop the base fragment from the resolved uri.
+  EXPECT_STREQ("bscheme://buser@bhost:11/base/path?baseQuery", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithQuery) {
+  const char* target_uri;
+  EXPECT(ResolveUri("?refQuery",
+                    "bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://buser@bhost:11/base/path?refQuery", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithFragment) {
+  const char* target_uri;
+  EXPECT(ResolveUri("#rfragment",
+                    "bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
+                    &target_uri));
+  EXPECT_STREQ("bscheme://buser@bhost:11/base/path?baseQuery#rfragment",
+               target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotSegment) {
+  const char* target_uri;
+  EXPECT(ResolveUri("./refpath",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotSegments) {
+  const char* target_uri;
+  EXPECT(ResolveUri("././refpath",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotDotSegment) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../refpath",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/a/b/refpath", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotDotSegments) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../../refpath",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/a/refpath", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveTooManyDotDotSegments) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../../../../../../../../../refpath",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/refpath", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft1) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../../../../..",
+                    "scheme://auth/a/b/c/d",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/", target_uri);
+}
+
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft2) {
+  const char* target_uri;
+  EXPECT(ResolveUri(".",
+                    "scheme://auth/",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/", target_uri);
+}
+
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsInitialPrefix) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../../../../refpath",
+                    "scheme://auth",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/refpath", target_uri);
+}
+
+
+
+TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsMixed) {
+  const char* target_uri;
+  EXPECT(ResolveUri("../../1/./2/../3/4/../5/././6/../7",
+                    "scheme://auth/a/b/c/d/e",
+                    &target_uri));
+  EXPECT_STREQ("scheme://auth/a/b/1/3/5/7", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NormalizeEscapes_PathQueryFragment) {
+  const char* target_uri;
+  EXPECT(ResolveUri("#A Fr%61gment",
+                    "scheme:/This%09Is A P%61th?This%09Is A Qu%65ry",
+                    &target_uri));
+  EXPECT_STREQ(
+      "scheme:/This%09Is%20A%20Path?This%09Is%20A%20Query#A%20Fragment",
+      target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NormalizeEscapes_UppercaseHexPreferred) {
+  const char* target_uri;
+  EXPECT(ResolveUri("",
+                    "scheme:/%1b%1B",
+                    &target_uri));
+  EXPECT_STREQ("scheme:/%1B%1B",
+               target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NormalizeEscapes_Authority) {
+  const char* target_uri;
+  EXPECT(ResolveUri("",
+                    "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/",
+                    &target_uri));
+  // userinfo is normalized and case is preserved.  host is normalized
+  // and lower-cased.
+  EXPECT_STREQ("scheme://UsEr%20NaMe@host.com:80/", target_uri);
+}
+
+
+TEST_CASE(ResolveUri_NormalizeEscapes_BrokenEscapeSequence) {
+  const char* target_uri;
+  EXPECT(ResolveUri("",
+                    "scheme:/%1g",
+                    &target_uri));
+  // We don't change broken escape sequences.
+  EXPECT_STREQ("scheme:/%1g",
+               target_uri);
+}
+
+
+TEST_CASE(ResolveUri_DataUri) {
+  const char* data_uri =
+      "data:application/dart;charset=utf-8,%20%20%20%20%20%20%20%20import%20%22dart:isolate%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22package:stream_channel/stream_channel.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22package:test/src/runner/plugin/remote_platform_helpers.dart%22;%0A%20%20%20%20%20%20%20%20import%20%22package:test/src/runner/vm/catch_isolate_errors.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22file:///home/sra/xxxx/dev_compiler/test/all_tests.dart%22%20as%20test;%0A%0A%20%20%20%20%20%20%20%20void%20main(_,%20SendPort%20message)%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20channel%20=%20serializeSuite(()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20catchIsolateErrors();%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20test.main;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20new%20IsolateChannel.connectSend(message).pipe(channel);%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20";  // NOLINT
+
+  const char* target_uri;
+  EXPECT(ResolveUri(data_uri,
+                    "bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
+                    &target_uri));
+  EXPECT_STREQ(data_uri, target_uri);
+}
+
+// dart:core Uri allows for the base url to be relative (no scheme, no
+// authory, relative path) but this behavior is not in RFC 3986.  We
+// do not implement this.
+TEST_CASE(ResolveUri_RelativeBase_NotImplemented) {
+  const char* target_uri;
+  EXPECT(!ResolveUri("../r1", "b1/b2", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("..", "b1/b2", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("../..", "b1/b2", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("../../..", "b1/b2", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("../../../r1", "b1/b2", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("../r1", "../../b1/b2/b3", &target_uri));
+  EXPECT(target_uri == NULL);
+
+  EXPECT(!ResolveUri("../../../r1", "../../b1/b2/b3", &target_uri));
+  EXPECT(target_uri == NULL);
+}
+
+
+static const char* TestResolve(const char* base_uri, const char* uri) {
+  const char* target_uri;
+  EXPECT(ResolveUri(uri, base_uri, &target_uri));
+  return target_uri;
+}
+
+
+// This test is ported from sdk/tests/corelib/uri_test.dart (testUriPerRFCs).
+TEST_CASE(ResolveUri_TestUriPerRFCs) {
+  const char* base = "http://a/b/c/d;p?q";
+
+  // From RFC 3986
+  EXPECT_STREQ("g:h",                   TestResolve(base, "g:h"));
+  EXPECT_STREQ("http://a/b/c/g",        TestResolve(base, "g"));
+  EXPECT_STREQ("http://a/b/c/g",        TestResolve(base, "./g"));
+  EXPECT_STREQ("http://a/b/c/g/",       TestResolve(base, "g/"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "/g"));
+  EXPECT_STREQ("http://g",              TestResolve(base, "//g"));
+  EXPECT_STREQ("http://a/b/c/d;p?y",    TestResolve(base, "?y"));
+  EXPECT_STREQ("http://a/b/c/g?y",      TestResolve(base, "g?y"));
+  EXPECT_STREQ("http://a/b/c/d;p?q#s",  TestResolve(base, "#s"));
+  EXPECT_STREQ("http://a/b/c/g#s",      TestResolve(base, "g#s"));
+  EXPECT_STREQ("http://a/b/c/g?y#s",    TestResolve(base, "g?y#s"));
+  EXPECT_STREQ("http://a/b/c/;x",       TestResolve(base, ";x"));
+  EXPECT_STREQ("http://a/b/c/g;x",      TestResolve(base, "g;x"));
+  EXPECT_STREQ("http://a/b/c/g;x?y#s",  TestResolve(base, "g;x?y#s"));
+  EXPECT_STREQ("http://a/b/c/d;p?q",    TestResolve(base, ""));
+  EXPECT_STREQ("http://a/b/c/",         TestResolve(base, "."));
+  EXPECT_STREQ("http://a/b/c/",         TestResolve(base, "./"));
+  EXPECT_STREQ("http://a/b/",           TestResolve(base, ".."));
+  EXPECT_STREQ("http://a/b/",           TestResolve(base, "../"));
+  EXPECT_STREQ("http://a/b/g",          TestResolve(base, "../g"));
+  EXPECT_STREQ("http://a/",             TestResolve(base, "../.."));
+  EXPECT_STREQ("http://a/",             TestResolve(base, "../../"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../g"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../../g"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../../../g"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "/./g"));
+  EXPECT_STREQ("http://a/g",            TestResolve(base, "/../g"));
+  EXPECT_STREQ("http://a/b/c/g.",       TestResolve(base, "g."));
+  EXPECT_STREQ("http://a/b/c/.g",       TestResolve(base, ".g"));
+  EXPECT_STREQ("http://a/b/c/g..",      TestResolve(base, "g.."));
+  EXPECT_STREQ("http://a/b/c/..g",      TestResolve(base, "..g"));
+  EXPECT_STREQ("http://a/b/g",          TestResolve(base, "./../g"));
+  EXPECT_STREQ("http://a/b/c/g/",       TestResolve(base, "./g/."));
+  EXPECT_STREQ("http://a/b/c/g/h",      TestResolve(base, "g/./h"));
+  EXPECT_STREQ("http://a/b/c/h",        TestResolve(base, "g/../h"));
+  EXPECT_STREQ("http://a/b/c/g;x=1/y",  TestResolve(base, "g;x=1/./y"));
+  EXPECT_STREQ("http://a/b/c/y",        TestResolve(base, "g;x=1/../y"));
+  EXPECT_STREQ("http://a/b/c/g?y/./x",  TestResolve(base, "g?y/./x"));
+  EXPECT_STREQ("http://a/b/c/g?y/../x", TestResolve(base, "g?y/../x"));
+  EXPECT_STREQ("http://a/b/c/g#s/./x",  TestResolve(base, "g#s/./x"));
+  EXPECT_STREQ("http://a/b/c/g#s/../x", TestResolve(base, "g#s/../x"));
+  EXPECT_STREQ("http:g",                TestResolve(base, "http:g"));
+
+  // Additional tests (not from RFC 3986).
+  EXPECT_STREQ("http://a/b/g;p/h;s",    TestResolve(base, "../g;p/h;s"));
+
+  base = "s:a/b";
+  EXPECT_STREQ("s:/c", TestResolve(base, "../c"));
+}
+
+
+// This test is ported from sdk/tests/corelib/uri_test.dart (testResolvePath).
+TEST_CASE(ResolveUri_MoreDotSegmentTests) {
+  const char* base = "/";
+  EXPECT_STREQ("/a/g",    TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ("/a/g",    TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ("/mid/6",  TestResolve(base, "mid/content=5/../6"));
+  EXPECT_STREQ("/a/b/e",  TestResolve(base, "a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e",  TestResolve(base, "../a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e",  TestResolve(base, "./a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e",  TestResolve(base, "../a/b/./c/d/../../e"));
+  EXPECT_STREQ("/a/b/e",  TestResolve(base, "./a/b/./c/d/../../e"));
+  EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
+  EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
+  EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
+
+  #define LH "http://localhost"
+  base = LH;
+  EXPECT_STREQ(LH "/a/g",    TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ(LH "/a/g",    TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ(LH "/mid/6",  TestResolve(base, "mid/content=5/../6"));
+  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "../a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "./a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "../a/b/./c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "./a/b/./c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
+  EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
+  EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
+  #undef LH
+}
+
+}  // namespace dart
diff --git a/runtime/vm/verifier.cc b/runtime/vm/verifier.cc
index 78b4697..5491f1d 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/verifier.cc
@@ -20,7 +20,7 @@
 void VerifyObjectVisitor::VisitObject(RawObject* raw_obj) {
   if (raw_obj->IsHeapObject()) {
     uword raw_addr = RawObject::ToAddr(raw_obj);
-    if (raw_obj->IsFreeListElement()) {
+    if (raw_obj->IsFreeListElement() || raw_obj->IsForwardingCorpse()) {
       if (raw_obj->IsMarked()) {
         FATAL1("Marked free list element encountered %#" Px "\n", raw_addr);
       }
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index edb97e4..3c11343 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -506,6 +506,9 @@
     'unicode_test.cc',
     'unit_test.cc',
     'unit_test.h',
+    'uri.cc',
+    'uri.h',
+    'uri_test.cc',
     'utils_test.cc',
     'verified_memory.cc',
     'verified_memory.h',
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index dc17044..0f6754f 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -169,6 +169,21 @@
 }
 
 
+char* Zone::MakeCopyOfStringN(const char* str, intptr_t len) {
+  ASSERT(len >= 0);
+  for (intptr_t i = 0; i < len; i++) {
+    if (str[i] == '\0') {
+      len = i;
+      break;
+    }
+  }
+  char* copy = Alloc<char>(len + 1);  // +1 for '\0'
+  strncpy(copy, str, len);
+  copy[len] = '\0';
+  return copy;
+}
+
+
 char* Zone::ConcatStrings(const char* a, const char* b, char join) {
   intptr_t a_len = (a == NULL) ? 0 : strlen(a);
   const intptr_t b_len = strlen(b) + 1;  // '\0'-terminated.
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index dc7b25c..d8ecef5 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -45,6 +45,10 @@
   // Make a copy of the string in the zone allocated area.
   char* MakeCopyOfString(const char* str);
 
+  // Make a copy of the first n characters of a string in the zone
+  // allocated area.
+  char* MakeCopyOfStringN(const char* str, intptr_t len);
+
   // Concatenate strings |a| and |b|. |a| may be NULL. If |a| is not NULL,
   // |join| will be inserted between |a| and |b|.
   char* ConcatStrings(const char* a, const char* b, char join = ',');
diff --git a/sdk/bin/dart.bat b/sdk/bin/dart.bat
index 9458999..a6a24de 100644
--- a/sdk/bin/dart.bat
+++ b/sdk/bin/dart.bat
@@ -13,4 +13,4 @@
 
 set arguments=%*
 
-"%SCRIPTPATH%\..\..\build\%DART_CONFIGURATION%\dart.exe" %arguments%
+"%SCRIPTPATH%\..\..\out\%DART_CONFIGURATION%\dart.exe" %arguments%
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index d1a4095..2869680 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -42,7 +42,7 @@
 rem DART_CONFIGURATION defaults to ReleaseX64
 if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
 
-set BUILD_DIR=%DART_ROOT%\build\%DART_CONFIGURATION%
+set BUILD_DIR=%DART_ROOT%\out\%DART_CONFIGURATION%
 
 set PACKAGE_ROOT=%BUILD_DIR%\packages
 
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index 0f33752..8130d98 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -43,7 +43,7 @@
 rem DART_CONFIGURATION defaults to ReleaseX64
 if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
 
-set BUILD_DIR=%DART_ROOT%\build\%DART_CONFIGURATION%
+set BUILD_DIR=%DART_ROOT%\out\%DART_CONFIGURATION%
 
 set PACKAGE_ROOT=%BUILD_DIR%\packages
 
@@ -57,7 +57,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index bca4afb..5fe4ae5 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -32,7 +32,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartdevc.bat b/sdk/bin/dartdevc.bat
index 4e02005..f42c660 100644
--- a/sdk/bin/dartdevc.bat
+++ b/sdk/bin/dartdevc.bat
@@ -39,7 +39,7 @@
 rem DART_CONFIGURATION defaults to ReleaseX64
 if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
 
-set BUILD_DIR=%DART_ROOT%\build\%DART_CONFIGURATION%
+set BUILD_DIR=%DART_ROOT%\out\%DART_CONFIGURATION%
 
 set PACKAGE_ROOT=%BUILD_DIR%\packages
 
@@ -53,7 +53,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartdevc_sdk.bat b/sdk/bin/dartdevc_sdk.bat
index 72c2069..5dbf707 100644
--- a/sdk/bin/dartdevc_sdk.bat
+++ b/sdk/bin/dartdevc_sdk.bat
@@ -32,7 +32,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartdoc.bat b/sdk/bin/dartdoc.bat
index 880ae55..b519129 100644
--- a/sdk/bin/dartdoc.bat
+++ b/sdk/bin/dartdoc.bat
@@ -24,7 +24,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartfmt.bat b/sdk/bin/dartfmt.bat
index f063221..c4ac9aa 100644
--- a/sdk/bin/dartfmt.bat
+++ b/sdk/bin/dartfmt.bat
@@ -30,7 +30,7 @@
 rem DART_CONFIGURATION defaults to ReleaseX64
 if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
 
-set BUILD_DIR=%DART_ROOT%\build\%DART_CONFIGURATION%
+set BUILD_DIR=%DART_ROOT%\out\%DART_CONFIGURATION%
 
 set PACKAGE_ROOT=%BUILD_DIR%\packages
 
@@ -44,7 +44,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/dartfmt_sdk.bat b/sdk/bin/dartfmt_sdk.bat
index 7de72c0..295b977 100644
--- a/sdk/bin/dartfmt_sdk.bat
+++ b/sdk/bin/dartfmt_sdk.bat
@@ -24,7 +24,7 @@
 rem canonical path. Output with a link looks something like this
 rem
 rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
 rem
 rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
 rem surrounded by right angle bracket and left square bracket. Once we get
diff --git a/sdk/bin/pub.bat b/sdk/bin/pub.bat
index 2b8f94b..55ff636 100644
--- a/sdk/bin/pub.bat
+++ b/sdk/bin/pub.bat
@@ -30,7 +30,7 @@
 
 rem Use the Dart binary in the built SDK so pub can find the version file next
 rem to it.
-set BUILD_DIR=%SDK_DIR%\..\build\ReleaseX64
+set BUILD_DIR=%SDK_DIR%\..\out\ReleaseX64
 set PACKAGES_DIR=%BUILD_DIR%\packages
 set DART=%BUILD_DIR%\dart-sdk\bin\dart
 
diff --git a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
index cb8820c..a0c519f 100644
--- a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -5,12 +5,23 @@
 import 'dart:_js_primitives' show printString;
 import 'dart:_js_helper' show patch;
 import 'dart:_interceptors' show JSArray;
+import 'dart:_foreign_helper' show JS;
 
 @patch
 class Symbol implements core.Symbol {
   @patch
   const Symbol(String name)
       : this._name = name;
+
+  @patch
+  int get hashCode {
+    int hash = JS('int|Null', '#._hashCode', this);
+    if (hash != null) return hash;
+    const arbitraryPrime = 664597;
+    hash = 0x1fffffff & (arbitraryPrime * _name.hashCode);
+    JS('', '#._hashCode = #', this, hash);
+    return hash;
+  }
 }
 
 @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
index a74fb12..c181c6d 100644
--- a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
@@ -1206,7 +1206,7 @@
       if (!_receivePort._isClosed) {
         _receivePort._add(msg);
       }
-    }, 'receive $message');
+    }, 'receive');
   }
 
   bool operator ==(var other) => (other is _NativeJsSendPort) &&
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index 481f04d..f1b55bb 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -258,13 +258,13 @@
   }
 
   /**
-   * Return the succeessor of this element in its linked list.
+   * Return the successor of this element in its linked list.
    *
    * Returns `null` if there is no successor in the linked list, or if this
    * entry is not currently in any list.
    */
   E get next {
-    if (identical(this, _next)) return null;
+    if (_list == null || identical(_list.first, _next)) return null;
     return _next;
   }
 
@@ -275,7 +275,7 @@
    * entry is not currently in any list.
    */
   E get previous {
-    if (identical(this, _previous)) return null;
+    if (_list == null || identical(this, _list.first)) return null;
     return _previous;
   }
 
diff --git a/sdk/lib/internal/symbol.dart b/sdk/lib/internal/symbol.dart
index 21d976b..64fcdb3 100644
--- a/sdk/lib/internal/symbol.dart
+++ b/sdk/lib/internal/symbol.dart
@@ -112,10 +112,7 @@
 
   bool operator ==(other) => other is Symbol && _name == other._name;
 
-  int get hashCode {
-    const arbitraryPrime = 664597;
-    return 0x1fffffff & (arbitraryPrime * _name.hashCode);
-  }
+  external int get hashCode;
 
   toString() => 'Symbol("$_name")';
 
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 4e1d8e3..79bfaa5 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -969,7 +969,7 @@
   /**
    * The requested URI for the request.
    *
-   * The returend URI is reconstructed by using http-header fields, to access
+   * The returned URI is reconstructed by using http-header fields, to access
    * otherwise lost information, e.g. host and scheme.
    *
    * To reconstruct the scheme, first 'X-Forwarded-Proto' is checked, and then
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 445f5d5..f125352 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -21,6 +21,16 @@
 final RawReceivePort isolateLifecyclePort = new RawReceivePort();
 final RawReceivePort scriptLoadPort = new RawReceivePort();
 
+abstract class IsolateEmbedderData {
+  void cleanup();
+}
+
+// This is for use by the embedder. It is a map from the isolateId to
+// anything implementing IsolateEmbedderData. When an isolate goes away,
+// the cleanup method will be invoked after being removed from the map.
+final Map<int, IsolateEmbedderData> isolateEmbedderData =
+    new Map<int, IsolateEmbedderData>();
+
 // These must be kept in sync with the declarations in vm/json_stream.h.
 const kInvalidParams = -32602;
 const kInternalError = -32603;
@@ -124,6 +134,10 @@
       break;
       case Constants.ISOLATE_SHUTDOWN_MESSAGE_ID:
         runningIsolates.isolateShutdown(portId, sp);
+        IsolateEmbedderData ied = isolateEmbedderData.remove(portId);
+        if (ied != null) {
+          ied.cleanup();
+        }
       break;
     }
   }
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index f40705a..cb04b8d 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -455,7 +455,7 @@
     int position) {
   bool isFullCompile = cachedCompiler != newCompiler;
   cachedCompiler = newCompiler;
-  if (poiTask == null) {
+  if (poiTask == null || poiTask.compiler != cachedCompiler) {
     poiTask = new PoiTask(cachedCompiler);
     cachedCompiler.tasks.add(poiTask);
   }
@@ -565,7 +565,8 @@
 }
 
 class PoiTask extends CompilerTask {
-  PoiTask(Compiler compiler) : super(compiler.measurer);
+  final Compiler compiler;
+  PoiTask(Compiler compiler) : compiler = compiler, super(compiler.measurer);
 
   String get name => 'POI';
 }
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index aa0daa9..bcdc45e 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -21,18 +21,6 @@
 Language/Expressions/Constants/exception_t01: fail, OK
 Language/Expressions/Constants/exception_t02: fail, OK
 
-# co19 issue #543: invocation of a non-function
-Language/Expressions/Function_Invocation/Function_Expression_Invocation/static_type_t02: fail, OK
-
-# co19 issue #564: URI can be any number adjacent string literals
-Language/Libraries_and_Scripts/URIs/syntax_t14: fail, OK
-Language/Libraries_and_Scripts/URIs/syntax_t15: fail, OK
-
-# co19 issue #615: Expect import missing
-LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
-
-Language/Generics/syntax_t04: StaticWarning # co19 issue #56
-
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
@@ -68,8 +56,6 @@
 LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail, OK
 LibTest/collection/Queue/Queue_class_A01_t01: Fail, OK
 
-
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t19: MissingStaticWarning
 Language/Statements/Switch/last_statement_t03: MissingStaticWarning
 Language/Statements/Assert/type_t04: MissingStaticWarning
 
@@ -83,7 +69,6 @@
 Language/Expressions/Function_Invocation/Unqualified_Invocation/invocation_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/Expressions/Function_Invocation/Unqualified_Invocation/invocation_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
 
-Language/Classes/Superinterfaces/no_member_t05: StaticWarning # co19-roll r667: Please triage this failure
 LibTest/convert/JsonEncoder/JsonEncoder_A01_t01: StaticWarning # co19-roll r667: Please triage this failure
 
 # co19 issue 656
@@ -100,9 +85,6 @@
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t03: StaticWarning # co19-roll r706: Please triage this failure.
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t04: StaticWarning # co19-roll r706: Please triage this failure.
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t05: StaticWarning # co19-roll r706: Please triage this failure.
-Language/Libraries_and_Scripts/Parts/compilation_t04: CompileTimeError # co19-roll r706: Please triage this failure.
-Language/Libraries_and_Scripts/Parts/static_warning_t01: CompileTimeError # co19-roll r706: Please triage this failure.
-Language/Libraries_and_Scripts/Scripts/syntax_t11: CompileTimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: StaticWarning # co19-roll r706: Please triage this failure.
@@ -190,7 +172,6 @@
 # co19-roll r738
 Language/Classes/Classes/method_definition_t06: MissingStaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: StaticWarning # co19-roll r738: Please triage this failure.
@@ -215,8 +196,6 @@
 LayoutTests/fast/dom/remove-named-attribute-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # co19-roll r738: Please triage this failure.
@@ -284,12 +263,6 @@
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: StaticWarning # co19 issue 703
 WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701
-Language/Expressions/Instance_Creation/Const/abstract_class_t01: MissingCompileTimeError # Issue 22010
-Language/Expressions/Instance_Creation/Const/abstract_class_t03: MissingCompileTimeError # Issue 22010
-Language/Types/Interface_Types/subtype_t19: StaticWarning # co19 issue 745
-Language/Types/Interface_Types/subtype_t22: StaticWarning # co19 issue 745
-Language/Types/Interface_Types/subtype_t24: StaticWarning # co19 issue 745
-Language/Statements/Assert/type_t07: StaticWarning # Issue 23663
 
 # isProtocolHandlerRegistered and unregisterProtocolHandler don't exist
 LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # Please triage this failure.
@@ -302,22 +275,16 @@
 LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: StaticWarning # Please triage this failure.
 
 # co19 roll to Sep 29 2015 (3ed795ea02e022ef19c77cf1b6095b7c8f5584d0)
-Language/Classes/Abstract_Instance_Members/invocation_t03: MissingStaticWarning # Please triage this failure.
-Language/Classes/Abstract_Instance_Members/invocation_t04: MissingStaticWarning # Please triage this failure.
 Language/Classes/Getters/static_t01: StaticWarning # Please triage this failure.
 Language/Classes/Getters/type_object_t01: StaticWarning # Please triage this failure.
 Language/Classes/Getters/type_object_t02: StaticWarning # Please triage this failure.
 Language/Classes/Instance_Variables/definition_t03: StaticWarning # Please triage this failure.
-Language/Classes/Setters/syntax_t04: StaticWarning # Please triage this failure.
 Language/Classes/Setters/type_object_t01: StaticWarning # Please triage this failure.
 Language/Classes/Setters/type_object_t02: StaticWarning # Please triage this failure.
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: MissingStaticWarning # Please triage this failure.
 Language/Classes/Static_Methods/type_object_t01: StaticWarning # Please triage this failure.
 Language/Classes/Static_Methods/type_object_t02: StaticWarning # Please triage this failure.
 Language/Classes/method_definition_t06: MissingStaticWarning # Please triage this failure.
-Language/Enums/declaration_equivalent_t03: StaticWarning # Please triage this failure.
-Language/Enums/declaration_equivalent_t05: StaticWarning # Please triage this failure.
-Language/Enums/declaration_equivalent_t08: StaticWarning # Please triage this failure.
 Language/Expressions/Lookup/Method_Lookup/superclass_t07: StaticWarning # Please triage this failure.
 Language/Expressions/Lookup/Method_Lookup/superclass_t08: StaticWarning # Please triage this failure.
 Language/Expressions/Property_Extraction/General_Closurization/expression_evaluation_t01: CompileTimeError # Please triage this failure.
@@ -368,21 +335,116 @@
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: CompileTimeError # Please triage this failure.
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t02: CompileTimeError # Please triage this failure.
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t03: CompileTimeError # Please triage this failure.
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: StaticWarning # Please triage this failure.
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/static_type_t01: StaticWarning # Please triage this failure.
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/static_type_t02: StaticWarning # Please triage this failure.
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/inheritance_t03: StaticWarning # Please triage this failure.
-Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_getters_type_t07: StaticWarning # Please triage this failure.
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError # Please triage this failure.
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError # Please triage this failure.
-Language/Libraries_and_Scripts/Imports/namespace_changes_t10: CompileTimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t04: CompileTimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t05: CompileTimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t09: CompileTimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t10: CompileTimeError # Please triage this failure.
-Language/Mixins/Mixin_Application/abstract_t01: StaticWarning # Please triage this failure.
-Language/Mixins/Mixin_Application/abstract_t02: StaticWarning # Please triage this failure.
 Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError # Please triage this failure.
 Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError # Please triage this failure.
 Language/Mixins/Mixin_Application/warning_t01: MissingStaticWarning # Please triage this failure.
 Language/Mixins/Mixin_Application/warning_t02: MissingStaticWarning # Please triage this failure.
+
+Language/Classes/Getters/static_getter_t02: CompileTimeError # Issue 24534
+Language/Classes/Setters/name_t08: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t09: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t10: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t11: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t12: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t13: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t14: CompileTimeError # Issue 23777
+Language/Classes/Setters/name_t15: CompileTimeError # Issue 23777
+Language/Enums/syntax_t08: MissingCompileTimeError # Please triage this failure.
+Language/Enums/syntax_t09: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Assignment/super_assignment_static_warning_t03: StaticWarning # Issue 15467
+Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t03: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_identifier_t53: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t54: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t55: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t56: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t57: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t58: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t59: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t60: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t61: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t62: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t63: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t64: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t65: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t66: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t67: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t68: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t17: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t18: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t21: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t22: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t23: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t24: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t25: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t26: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t27: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t28: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t29: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t30: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t31: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t32: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Identifier_Reference/evaluation_type_parameter_t02: MissingCompileTimeError # Please triage this failure.
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Super_Closurization: CompileTimeError # Issue 23777
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: CompileTimeError # Please triage this failure.
+Language/Mixins/Mixin_Application/static_warning_t01: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/static_warning_t02: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/superinterfaces_t06: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/superinterfaces_t07: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t11: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t12: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t13: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t14: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t20: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t22: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t23: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t24: CompileTimeError # Issue 26409
+Language/Mixins/Mixin_Application/syntax_t25: CompileTimeError # Issue 26409
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
+
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t01: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t02: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t03: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/positional_parameters_t01: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/named_parameters_t01: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t01: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t02: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/positional_parameters_t01: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/named_parameters_t01: CompileTimeError # Issue 23777
+Language/Expressions/Identifier_Reference/evaluation_library_or_getter_t05: StaticWarning # Misspelled "@static-waning"
+LibTest/core/Set/IterableBase_A01_t01: StaticWarning # Imports libraries with static warnings
+LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: StaticWarning # Imports libraries with static warnings
+LibTest/collection/IterableBase/IterableBase_class_A01_t02: StaticWarning # Imports libraries with static warnings
+LibTest/collection/HashSet/HashSet_class_A01_t01: StaticWarning # Imports libraries with static warnings
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t05: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t06: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t07: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t05: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t06: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t07: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t08: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t09: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t05: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t06: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t07: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t08: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t09: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/static_type_t06: CompileTimeError # Issue 23777
+Language/Expressions/Property_Extraction/General_Closurization/static_type_t07: CompileTimeError # Issue 23777
+Language/Libraries_and_Scripts/Scripts/syntax_t11: Pass, CompileTimeError # Issue 26592
+Language/Libraries_and_Scripts/Parts/compilation_t04: Pass, CompileTimeError # Issue 26592
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index f6e0f6d..4d8a0e7 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -14,35 +14,12 @@
 [ $runtime == vm || $runtime != vm ]
 # Tests that fail everywhere, including the analyzer.
 
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: Pass, Fail, OK # co19 issue 18
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: Pass, Fail, OK # co19 issue 18
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: Pass, Fail, OK # co19 issue 18
-Language/Classes/Constructors/Constant_Constructors/not_a_constant_in_superclass_t01: Pass, Fail, OK # co19 issue 18
-Language/Classes/Constructors/Constant_Constructors/not_a_constant_in_superclass_t02: Pass, Fail, OK # co19 issue 18
-
-# Super is now allowed in mixins and mixins may now extend a subclass of Object.
-Language/09_Mixins/09_Mixins_A01_t01: Skip # co19 issue 9.
-Language/09_Mixins/09_Mixins_A03_t01: Skip # co19 issue 9.
-
-# No longer correct, y#$ now has a meaning. github.com/dart-lang/co19/issues/2
-Language/12_Expressions/30_Identifier_Reference_A01_t03: Skip
-
 LibTest/typed_data/ByteData/buffer_A01_t01: Fail # co19 r736 bug - sent comment.
 
 LibTest/core/RegExp/firstMatch_A01_t01: Fail # co19 issue 742
 
-# These tests are obsolete and need updating.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: Skip # Issue 19019
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: Skip # Issue 19019
-
-# These tests are broken in both Javascript and Dart (co19 folks contacted to fix).
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004_t01: Skip # Issue 21115
-
 [ $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
-
-LibTest/async/Future/Future.error_A01_t01: RuntimeError # co19 issue 712
-LibTest/async/Completer/completeError_A02_t01: RuntimeError # co19 issue 712
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: Fail # co19 issue 687
 LibTest/async/Stream/asBroadcastStream_A02_t01: Fail # co19 issue 687
 
@@ -52,12 +29,12 @@
 Language/Classes/same_name_type_variable_t04: Pass, MissingCompileTimeError, Fail # Issue 14513
 Language/Classes/same_name_type_variable_t07: Pass, MissingCompileTimeError, Fail # Issue 14513
 
-LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
-LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
-LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
+LibTest/math/acos_A01_t01: PASS, FAIL, OK  # Issue 26261 
+LibTest/math/asin_A01_t01: PASS, FAIL, OK  # Issue 26261 
+LibTest/math/atan_A01_t01: PASS, FAIL, OK  # Issue 26261 
 
-LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
-LibTest/math/tan_A01_t01: PASS, FAIL, OK # co19 issue 44
+LibTest/math/cos_A01_t01: PASS, FAIL, OK  # Issue 26261 
+LibTest/math/tan_A01_t01: PASS, FAIL, OK  # Issue 26261 
 
 LibTest/core/Expando/Expando_A03_t01: RuntimeError # Issue 17735
 LibTest/core/Expando/Expando_A03_t03: RuntimeError # Issue 17735
@@ -96,10 +73,3 @@
 
 [ $runtime == dartium || $compiler == dart2js ]
 LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
-
-### CHECKED MODE FAILURES ###
-
-[ $compiler != dart2analyzer && $checked ]
-LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19 issue 22
-LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19 issue 23
-LibTest/collection/LinkedList/lastWhere_A02_t01: RuntimeError # co19 issue 737
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index d12cbfc..b13b657 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -7,6 +7,7 @@
 Language/Classes/Constructors/Generative_Constructors/execution_of_a_superinitializer_t01: RuntimeError, OK # co19 issue 258
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: fail # Issue 13363
 Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t02: fail # Issue 13363
+Language/Classes/Getters/static_getter_t02: CompileTimeError # Issue 24534
 Language/Classes/Getters/type_object_t01: RuntimeError # Please triage this failure
 Language/Classes/Getters/type_object_t02: RuntimeError # Please triage this failure
 Language/Classes/Instance_Methods/same_name_setter_t01: fail # Issue 21201
@@ -14,40 +15,99 @@
 Language/Classes/Setters/name_t02: CompileTimeError # Issue 5023
 Language/Classes/Setters/name_t03: RuntimeError # Issue 5023
 Language/Classes/Setters/name_t07: CompileTimeError # Issue 5023
-Language/Classes/Setters/syntax_t04: RuntimeError # Please triage this failure
+Language/Classes/Setters/name_t08: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t09: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t10: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t11: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t12: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t13: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t14: CompileTimeError # Please triage this failure
+Language/Classes/Setters/name_t15: CompileTimeError # Please triage this failure
+Language/Classes/Setters/static_setter_t06: RuntimeError  # Please triage this failure
 Language/Classes/Setters/type_object_t01: RuntimeError # Please triage this failure
 Language/Classes/Setters/type_object_t02: RuntimeError # Please triage this failure
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError # Please triage this failure
 Language/Classes/Static_Methods/type_object_t01: RuntimeError # Please triage this failure
 Language/Classes/Static_Methods/type_object_t02: RuntimeError # Please triage this failure
-Language/Classes/Superclasses/wrong_superclass_t04: MissingCompileTimeError # Please triage this failure
-Language/Classes/Superclasses/wrong_superclass_t07: MissingCompileTimeError # Please triage this failure
-Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError # Please triage this failure
-Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError # Please triage this failure
-Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError # Please triage this failure
+Language/Classes/definition_t23: CompileTimeError # Please triage this failure
 Language/Classes/same_name_type_variable_t02: Fail # Missing CT error on member with same name a type parameter
 Language/Classes/same_name_type_variable_t03: Fail # Missing CT error on member with same name a type parameter
 Language/Classes/same_name_type_variable_t05: Fail # Missing CT error on member with same name a type parameter
 Language/Classes/same_name_type_variable_t06: Fail # Missing CT error on member with same name a type parameter
 Language/Classes/same_name_type_variable_t08: Fail # Missing CT error on member with same name a type parameter
 Language/Classes/same_name_type_variable_t09: Fail # Missing CT error on member with same name a type parameter
-Language/Enums/restrictions_t01: MissingCompileTimeError # Please triage this failure
-Language/Enums/restrictions_t02: MissingCompileTimeError # Please triage this failure
-Language/Enums/restrictions_t05: MissingCompileTimeError # Please triage this failure
-Language/Enums/restrictions_t06: MissingCompileTimeError # Please triage this failure
-Language/Enums/restrictions_t07: MissingCompileTimeError # Please triage this failure
-Language/Enums/syntax_t02: MissingCompileTimeError # Please triage this failure
 Language/Errors_and_Warnings/compile_error_t06: MissingCompileTimeError # Please triage this failure
 Language/Errors_and_Warnings/compile_error_t07: MissingCompileTimeError # Please triage this failure
+Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
+Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError # Please triage this failure
+Language/Expressions/Await_Expressions/evaluation_throws_t03: RuntimeError # Please triage this failure
+Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError # Please triage this failure
+Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError # Please triage this failure
+Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError # Please triage this failure
+Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError # Issue 26580
+Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError # Issue 26580
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout, Skip # Issue 25967
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout, Skip # Issue 25967
+Language/Expressions/Identifier_Reference/built_in_identifier_t35: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t36: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t37: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t53: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t54: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t55: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t56: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t57: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t58: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t59: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t60: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t61: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t62: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t63: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t64: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t65: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t66: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t67: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t68: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError # Issue 26581
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: MissingCompileTimeError # Issue 25732
 Language/Expressions/Identifier_Reference/syntax_built_in_t01: fail # Issue 21154
+Language/Expressions/Instance_Creation/Const/abstract_class_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Instance_Creation/Const/abstract_class_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError # Please triage this failure
+Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError # Please triage this failure
+Language/Expressions/Maps/key_value_equals_operator_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Maps/static_type_dynamic_t01: CompileTimeError # Maybe ok. Issue 17207
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
 Language/Expressions/Numbers/syntax_t06: fail # Issue 21098
 Language/Expressions/Numbers/syntax_t09: fail # Issue 21098
 Language/Expressions/Object_Identity/Object_Identity/constant_objects_t01: fail # Issue 11551, also related to issue 563, 18738
 Language/Expressions/Object_Identity/Object_Identity/double_t02: fail # Issue 11551, also related to issue 563, 18738
+Language/Expressions/Object_Identity/double_t03: RuntimeError # Please triage this failure
 Language/Expressions/Object_Identity/constant_objects_t01: RuntimeError # Please triage this failure
 Language/Expressions/Object_Identity/double_t02: RuntimeError # Please triage this failure
 Language/Expressions/Object_Identity/object_t02: RuntimeError # Issue 1533 (int/double related)
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t01: CompileTimeError # Issue 24607
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t02: CompileTimeError # Issue 24607
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/named_parameters_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/positional_parameters_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/closurization_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/closurization_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/closurization_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/deferred_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/malbounded_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/malbounded_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/malformed_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/malformed_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/no_such_method_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/no_such_method_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/not_class_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/not_class_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/not_class_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/static_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/static_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Extraction/static_type_t03: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/expression_evaluation_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/expression_evaluation_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/expression_evaluation_t03: CompileTimeError # Please triage this failure
@@ -55,10 +115,25 @@
 Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t03: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t08: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/getter_lookup_t09: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t03: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/method_lookup_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t08: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/setter_lookup_t09: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/static_type_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Closurization/static_type_t07: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/no_accessible_member_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/no_accessible_member_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/General_Closurization/no_accessible_member_t03: CompileTimeError # Please triage this failure
@@ -86,24 +161,83 @@
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/expression_evaluation_t07: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/no_such_method_t01: RuntimeError # Please triage this failure
+
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction: CompileTimeError # Issue 26287
+
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/closurization_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/closurization_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/deferred_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/malbounded_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/malbounded_type_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/malformed_type_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/malformed_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/named_parameters_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/no_such_method_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/no_such_method_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t02: CompileTimeError # Please triage this failure
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/static_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/static_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/static_type_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/static_type_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/positional_parameters_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/getter_closurization_t08: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_closurization_named_params_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_closurization_named_params_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_closurization_positional_params_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_closurization_positional_params_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_identical_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_identical_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/method_identical_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_list_access_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_list_assignment_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t08: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t09: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t10: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t11: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t12: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t13: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t14: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t15: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t16: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_t17: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/operator_closurization_unary_bitwise_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t03: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t04: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t06: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t07: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Ordinary_Member_Closurization/setter_closurization_t08: CompileTimeError # Please triage this failure
+
+Language/Expressions/Property_Extraction/Super_Closurization: CompileTimeError # Issue 26287
+
 Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError # Please triage this failure
 Language/Functions/External_Functions/not_connected_to_a_body_t01: CompileTimeError, OK # Issue 5021
 Language/Generics/syntax_t17: fail # Issue 21203
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError # Please triage this failure
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/Imports/namespace_changes_t10: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t04: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t05: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t09: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t10: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t14: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t15: CompileTimeError # Please triage this failure
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t01: CompileTimeError # Please triage this failure
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: CompileTimeError # Please triage this failure
+Language/Libraries_and_Scripts/Scripts/top_level_main_t05: RuntimeError # Please triage this failure
 Language/Metadata/before_export_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_import_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_library_t01: RuntimeError # Please triage this failure
@@ -111,22 +245,40 @@
 Language/Metadata/before_type_param_t01: CompileTimeError # Please triage this failure
 Language/Metadata/before_typedef_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_variable_t01: RuntimeError # Please triage this failure
-Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_mixin_type_t03: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_mixin_type_t04: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/wrong_type_t02: MissingCompileTimeError # Please triage this failure
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/static_warning_t01: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/static_warning_t02: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/superinterfaces_t06: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/superinterfaces_t07: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t11: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t12: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t13: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t14: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t20: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t22: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t23: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t24: CompileTimeError # Please triage this failure
+Language/Mixins/Mixin_Application/syntax_t25: CompileTimeError # Please triage this failure
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
 Language/Mixins/deferred_t01: MissingCompileTimeError # Please triage this failure
 Language/Mixins/not_object_superclass_t01: MissingCompileTimeError # Please triage this failure
 Language/Mixins/reference_to_super_t01: MissingCompileTimeError # Please triage this failure
 Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t04: MissingCompileTimeError # Checks that other Unicode whitespaces are not allowed:  check NO-BREAK SPACE (U+00A0)
 Language/Reference/Lexical_Rules/whitespace_t06: MissingCompileTimeError # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
+Language/Reference/Operator_Precedence/precedence_12_Shift_t02: RuntimeError # Issue 26573
+Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t04: RuntimeError # Issue 26573
+Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError # Please triage this failure
+Language/Statements/Continue/async_loops_t09: Crash # Please triage this failure
 Language/Statements/Local_Function_Declaration/reference_before_declaration_t01: MissingCompileTimeError # Issue 21050
 Language/Statements/Local_Function_Declaration/reference_before_declaration_t03: MissingCompileTimeError # Issue 21050
+Language/Statements/Try/catch_scope_t01: RuntimeError # Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t02: RuntimeError # Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
+Language/Types/Dynamic_Type_System/deferred_type_error_t01: RuntimeError # Please triage this failure
 Language/Types/Interface_Types/subtype_t27: Skip # Times out or crashes. Issue 21174
 Language/Types/Interface_Types/subtype_t30: fail # Issue 14654
 Language/Types/Interface_Types/subtype_t28: Pass, Fail, Crash # Stack overflow. Issue 25282
@@ -143,7 +295,13 @@
 LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/convert/JsonEncoder/convert_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
-LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/DateTime/microsecond_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/DateTime/parse_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/DateTime/to8601String_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/DateTime/to8601String_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/DateTime/to8601String_A01_t03: RuntimeError # Please triage this failure
 LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/List_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/core/List/getRange_A03_t01: RuntimeError, OK # Tests that fail because they use the legacy try-catch syntax. co19 issue 184.
@@ -286,30 +444,54 @@
 LibTest/typed_data/Uint8List/Uint8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8List/Uint8List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8List/Uint8List_A02_t01: fail # co19-roll r576: Please triage this failure
-Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this
-WebPlatformTest/DOMEvents/approved/domnodeinserted_t01: Skip # Issue 51
+Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
 WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Pass, Slow
+Language/Expressions/Function_Invocation/async_invokation_t04: RuntimeError, Pass # co19 issue 57
 
 [ $compiler == dart2js && $checked ]
-Language/Errors_and_Warnings/static_warning_t01: RuntimeError # Please triage this failure
 Language/Errors_and_Warnings/static_warning_t02: RuntimeError # Please triage this failure
 Language/Errors_and_Warnings/static_warning_t03: RuntimeError # Please triage this failure
 Language/Errors_and_Warnings/static_warning_t04: RuntimeError # Please triage this failure
 Language/Errors_and_Warnings/static_warning_t05: RuntimeError # Please triage this failure
 Language/Errors_and_Warnings/static_warning_t06: RuntimeError # Please triage this failure
+Language/Expressions/Assignment/super_assignment_dynamic_error_t01: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_dynamic_async_t03: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_dynamic_asyncs_t03: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_dynamic_syncs_t03: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_form_3_async_t03: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_form_3_asyncs_t03: RuntimeError # Please triage this failure
+Language/Expressions/Function_Expressions/static_type_form_3_syncs_t03: RuntimeError # Please triage this failure
+Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError # Please triage this failure
+Language/Expressions/If_null_Expressions/static_type_t02: RuntimeError # Please triage this failure
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction/getter_lookup_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Property_Extraction/Super_Closurization/setter_closurization_t09: Timeout, Skip  # Please triage this failure
+Language/Functions/async_return_type_t01: RuntimeError # Please triage this failure
+Language/Functions/generator_return_type_t01: RuntimeError # Please triage this failure
+Language/Functions/generator_return_type_t02: RuntimeError # Please triage this failure
+Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError # co19 issue 60
 Language/Statements/Switch/execution_t01: Fail # Missing type check in switch expression
 Language/Statements/Switch/type_t01: RuntimeError # Issue 16089
+Language/Statements/Return/runtime_type_t04: RuntimeError # Issue 26584
 Language/Types/Static_Types/malformed_type_t01: RuntimeError # Issue 21089
 Language/Types/Dynamic_Type_System/malbounded_type_error_t01: RuntimeError # Issue 21088
 Language/Types/Parameterized_Types/malbounded_t06: RuntimeError # Issue 21088
+#LibTest/async/Future/whenComplete_A01_t01: Timeout, Skip # Please triage this failure
+#LibTest/async/Stream/Stream.eventTransformed_A01_t01: Timeout, Skip # Please triage this failure
+#LibTest/async/Stream/join_A02_t01: Timeout, Skip # Please triage this failure
+#LibTest/async/Stream/last_A02_t01: Timeout, Skip # Please triage this failure
+#LibTest/async/Stream/listen_A03_t01: Timeout, Skip # Please triage this failure
 LibTest/core/Map/Map_class_A01_t04: Slow, Pass
 LibTest/core/Uri/Uri_A06_t03: Slow, Pass
 LibTest/math/Point/operator_mult_A02_t01: RuntimeError # Issue 1533
 
+[ $compiler == dart2js && $checked != true ]
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction/getter_lookup_t02: Timeout, Skip # Please triage this failure
+Language/Expressions/Property_Extraction/Super_Closurization/setter_closurization_t09: CompileTimeError # Please triage this failure
+
 [ $compiler == dart2js && $minified ]
 LibTest/typed_data/Float32List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Float32x4List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
@@ -328,6 +510,24 @@
 LibTest/core/List/List_class_A01_t01: Pass, Timeout
 
 [ $compiler == dart2js && $runtime == jsshell ]
+Language/Expressions/Await_Expressions/execution_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Expressions/Await_Expressions/execution_t02: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Expressions/Await_Expressions/execution_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Expressions/Await_Expressions/execution_t04: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Expressions/Await_Expressions/execution_t05: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Expressions/Await_Expressions/execution_t06: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/For/Asynchronous_For_in/execution_t04: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t02: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t04: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t05: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t06: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t07: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 7728, timer not supported in jsshell
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/async/Future/Future.delayed_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/async/Future/Future.delayed_A03_t01: fail # Issue 7728, timer not supported in jsshell
 LibTest/async/Future/wait_A01_t07: RuntimeError # Issue 7728, timer not supported in jsshell
@@ -362,7 +562,10 @@
 LibTest/core/Stopwatch/start_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/core/Uri/Uri_A06_t03: Pass, Slow
+LibTest/isolate/RawReceivePort/close_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/isolate/ReceivePort/asBroadcastStream_A03_t01: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/isolate/ReceivePort/close_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
 LibTest/typed_data/Float32List/Float32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Float32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
@@ -445,16 +648,9 @@
 # Everything below this point is associated with co19 Issue 747
 #
 LayoutTests/fast/dynamic/insertAdjacentHTML_t01: Pass, RuntimeError
-LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError
-LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError
 LayoutTests/fast/multicol/balance-unbreakable_t01: Pass, RuntimeError
-LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError
-LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance_t01: Pass, RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: Pass, RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance_t02: Pass, RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance_t04: Pass, RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance_t05: Pass, RuntimeError
@@ -466,96 +662,48 @@
 LayoutTests/fast/multicol/newmulticol/balance-images_t01: Pass, RuntimeError
 LayoutTests/fast/multicol/column-width-zero_t01: Pass, RuntimeError
 LayoutTests/fast/multicol/widows_t01: Pass, RuntimeError
-LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError
 LayoutTests/fast/multicol/orphans-relayout_t01: Pass, RuntimeError
-LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
 LayoutTests/fast/media/mq-parsing_t01: Pass, RuntimeError # False passes on Firefox, but trying to keep these grouped with the issue.
 LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Passes on Safari, Issue 23475
 LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: Pass, RuntimeError # False pass on Safari
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/lists/item-not-in-list-line-wrapping_t01: RuntimeError
 LayoutTests/fast/lists/list-style-position-inside_t01: Pass, RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-special-elements_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-inline-parent_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor_t01: RuntimeError
-LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent_t01: RuntimeError
-LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError
-LayoutTests/fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings_t01: RuntimeError
 LayoutTests/fast/overflow/overflow-rtl-vertical-origin_t01: Pass, RuntimeError # False passes on Firefox, but trying to keep these grouped with the issue.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass # False pass
 LayoutTests/fast/table/col-width-span-expand_t01: Skip
-LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError
 LayoutTests/fast/text/font-fallback-synthetic-italics_t01: Pass, RuntimeError
-LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError
 LayoutTests/fast/text/glyph-reordering_t01: Pass, RuntimeError # This is a false pass. The font gets sanitized, so whether it works or not probably depends on default sizes.
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: Pass # This is a false pass. All the content gets sanitized, so there's nothing to assert fail on. If the code did anything it would fail.
 LayoutTests/fast/text/line-break-after-empty-inline-hebrew_t01: Pass, RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-closing-punctuations_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t01: RuntimeError
 LayoutTests/fast/text/regional-indicator-symobls_t01: Pass, Fail
-LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError
 LayoutTests/fast/text/font-fallback-synthetic-italics_t01: RuntimeError
 LayoutTests/fast/text/font-ligatures-linebreak_t01: Skip
 LayoutTests/fast/text/font-ligatures-linebreak-word_t01: Skip
 LayoutTests/fast/text/ipa-tone-letters_t01: Pass, RuntimeError
-LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError
-LayoutTests/fast/url/trivial_t01: RuntimeError
-LayoutTests/fast/url/trivial-segments_t01: RuntimeError
-LayoutTests/fast/url/scheme_t01: RuntimeError
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError
-LayoutTests/fast/url/safari-extension_t01: RuntimeError
-LayoutTests/fast/url/port_t01: RuntimeError
-LayoutTests/fast/url/mailto_t01: RuntimeError
-LayoutTests/fast/url/path-url_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/writing-mode/auto-margins-across-boundaries_t01: RuntimeError
-LayoutTests/fast/writing-mode/display-mutation_t01: RuntimeError
-LayoutTests/fast/writing-mode/percentage-padding_t01: RuntimeError
-LayoutTests/fast/writing-mode/relative-positioning-percentages_t01: RuntimeError
-LayoutTests/fast/writing-mode/block-formatting-context_t01: RuntimeError
 LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: Pass, RuntimeError
 LayoutTests/fast/writing-mode/positionForPoint_t01: Pass, RuntimeError
 LayoutTests/fast/text/font-ligatures-linebreak-word_t01: Skip
 LayoutTests/fast/html/adjacent-html-context-element_t01:RuntimeError
 LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError
-LayoutTests/fast/transforms/transform-inside-overflow-scroll_t01: RuntimeError
 LayoutTests/fast/transforms/transform-hit-test-flipped_t01: Pass, RuntimeError # Passes on Firefox, but is clearly not testing what it's trying to test.
 LayoutTests/fast/transforms/scrollIntoView-transformed_t01: Pass, RuntimeError # False passes on Firefox.
 LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError, Pass # Erratic, but only passes because divs have been entirely removed.
-LayoutTests/fast/transforms/topmost-becomes-bottomost-for-scrolling_t01: RuntimeError
 LayoutTests/fast/table/anonymous-table-section-removed_t01: Skip
 LayoutTests/fast/table/hittest-tablecell-bottom-edge_t01: Skip
 LayoutTests/fast/table/hittest-tablecell-with-borders-bottom-edge_t01: Skip
 LayoutTests/fast/table/table-width-exceeding-max-width_t01: Pass, RuntimeError
-LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError
-LayoutTests/fast/table/resize-table-row_t01: RuntimeError
 LayoutTests/fast/table/min-max-width-preferred-size_t01: Pass, RuntimeError
 LayoutTests/fast/table/margins-flipped-text-direction_t01: Pass, RuntimeError
 LayoutTests/fast/table/html-table-width-max-width-constrained_t01: Pass, RuntimeError
 LayoutTests/fast/table/fixed-table-layout-width-change_t01: Pass, RuntimeError # False passes on Firefox
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-containing-block-with-margin_t01: RuntimeError
 LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: Pass, RuntimeError # Fails on Safari, false pass on others
-LayoutTests/fast/selectors/style-sharing-last-child_t01: RuntimeError
-LayoutTests/fast/selectors/specificity-overflow_t01: RuntimeError
 LayoutTests/fast/ruby/parse-rp_t01: Pass, RuntimeError
-LayoutTests/fast/replaced/table-replaced-element_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError, Pass # Spurious intermittent pass
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError, Pass # Spurious intermittent pass.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: RuntimeError, Pass # Spurious intermittent pass
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr_t01: RuntimeError, Pass # Spurious intermittent pass
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass, RuntimeError
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor-vertical-lr_t01: Pass, RuntimeError
-LayoutTests/fast/parser/stray-param_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
 LayoutTests/fast/parser/parse-wbr_t01: Pass, RuntimeError
-LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError
 WebPlatformTest/html-imports/link-import-null_t01: RuntimeError
 WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t01: RuntimeError
 WebPlatformTest/html/syntax/parsing/math-parse_t03: RuntimeError
@@ -581,6 +729,7 @@
 #
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError
 Language/Expressions/Strings/escape_backspace_t01: Pass, Slow # Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue 22200.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue 22200.
@@ -610,6 +759,8 @@
 LibTest/typed_data/Uint8ClampedList/map_A02_t01: Pass, Slow # Please triage this failure.
 
 [ $compiler == dart2js && $runtime == chrome ]
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 26615
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 26615
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -619,8 +770,6 @@
 LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-timestamps_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-within-callback_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/backgrounds/multiple-backgrounds-computed-style_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/borders/border-width-percent_t01: RuntimeError # Issue 25155
 LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
@@ -631,9 +780,7 @@
 LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # co19 issue 19
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # co19 issue 19
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is behind a flag.
 LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
@@ -648,16 +795,12 @@
 LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-resize-after-paint_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # co19 issue 19
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: Pass, Timeout # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
@@ -669,7 +812,6 @@
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/background-clip-text_t01: RuntimeError # Issue 54
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
@@ -721,35 +863,20 @@
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/MarqueeLayoutTest_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-serialize_t01: RuntimeError # https://github.com/dart-lang/co19/issues/14
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Issue 23506
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Issue https://github.com/dart-lang/co19/issues/46
 LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError # Issue https://github.com/dart-lang/co19/issues/46
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-selector-text_t01: RuntimeError # co19 Issue 15
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/ex-unit-with-no-x-height_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
@@ -765,15 +892,9 @@
 LayoutTests/fast/css/fontfaceset-loadingdone_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/implicit-attach-marking_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/important-js-override_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
@@ -783,16 +904,11 @@
 LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError # Issue 23506
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # https://github.com/dart-lang/co19/issues/47
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-any_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
@@ -805,7 +921,6 @@
 LayoutTests/fast/css/selector-text-escape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/shadow-current-color_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
@@ -825,8 +940,8 @@
 LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/25928
 LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/25928
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: Pass, RuntimeError # Please triage this failure
@@ -835,7 +950,6 @@
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
@@ -868,6 +982,7 @@
 LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: RuntimeError # Issue 25155
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # Please triage this failure
@@ -897,7 +1012,6 @@
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Issue 55
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # Please triage this failure
@@ -906,12 +1020,10 @@
 LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/blur-contenteditable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError # Issue 25155
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/element-names_t01: Pass, RuntimeError # Please triage this failure
@@ -938,9 +1050,8 @@
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
 LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
 LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
@@ -953,7 +1064,6 @@
 LayoutTests/fast/dom/shadow/shadow-disable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Issue 25155
 LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
@@ -1002,7 +1112,8 @@
 LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/filesystem-reference_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
+LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
 LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-opera-007_t01: Skip # Times out. Please triage this failure
@@ -1022,6 +1133,7 @@
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-hit-test-border_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-maxlength_t01: RuntimeError # co19 issue 62
 LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
@@ -1045,8 +1157,6 @@
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/validity-property_t01: RuntimeError # Issue 25155
-LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
-LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
 LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Issue 25155
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # Please triage this failure
@@ -1060,8 +1170,6 @@
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/layers/zindex-hit-test_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
@@ -1070,16 +1178,13 @@
 LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-clip-path-iri_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Issue 23475
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
@@ -1089,22 +1194,19 @@
 LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t09: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # co19 issue 63
 LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/widows_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError # Please triage this failure
@@ -1112,7 +1214,6 @@
 LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
@@ -1130,7 +1231,6 @@
 LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/float-containing-block-with-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
@@ -1199,7 +1299,6 @@
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Issue 25928
 LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
@@ -1436,7 +1535,6 @@
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
@@ -1464,7 +1562,7 @@
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Skip # Times out. Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Skip # Times out. Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Skip # Times out. Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: Pass, RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: Pass, RuntimeError, Timeout # Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
@@ -1474,7 +1572,6 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Issue 25155
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Issue 25155
@@ -1517,7 +1614,6 @@
 LayoutTests/fast/flexbox/intrinsic-min-width-applies-with-fixed-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/article-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError # Please triage this failure
@@ -1546,6 +1642,7 @@
 LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # Please triage this failure
 LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Issue 18251
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # Please triage this failure
 WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
 WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
@@ -1556,10 +1653,13 @@
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == chrome && $system == macos ]
+Language/Expressions/Function_Invocation/async_invokation_t04: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/canvas-test_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/text/glyph-reordering_t01: RuntimeError # Please triage this failure
@@ -1572,6 +1672,7 @@
 LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
@@ -1579,9 +1680,11 @@
 LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
@@ -1598,8 +1701,6 @@
 LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
@@ -1615,9 +1716,11 @@
 LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
@@ -1664,7 +1767,9 @@
 LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # co19 issue #65
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
@@ -1685,6 +1790,8 @@
 
 [ $compiler == dart2js && $runtime == ff ]
 Language/Expressions/Postfix_Expressions/property_decrement_t02: Skip # Times out. Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 26615
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 26615
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -1710,13 +1817,10 @@
 LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-canvas_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-image_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented.
 LayoutTests/fast/canvas/canvas-drawImage-incomplete_t01: RuntimeError # Please triage this failure
@@ -1753,105 +1857,30 @@
 LayoutTests/fast/canvas/canvas-strokeRect-zeroSizeGradient_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-strokeText-invalid-maxWidth_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-strokeText-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/test-setting-canvas-color_t01: Pass, RuntimeError # co19 issue 64 (depends on the FF version)
 LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
@@ -1909,14 +1938,11 @@
 LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/background-clip-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/background-parser-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
@@ -1928,14 +1954,9 @@
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # co19 issue 61
 LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
@@ -1944,19 +1965,15 @@
 LayoutTests/fast/css/css-keyframe-style-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-keyframe-unexpected-end_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-selector-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/focus-display-block-inline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
@@ -1970,7 +1987,6 @@
 LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-image-slice_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
@@ -1983,13 +1999,11 @@
 LayoutTests/fast/css/getPropertyValue-border_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-webkit-text-stroke_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/important-js-override_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError # Please triage this failure
@@ -2022,13 +2036,11 @@
 LayoutTests/fast/css/nested-at-rules_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/overflow-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/padding-start-end_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-escapes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
@@ -2056,7 +2068,6 @@
 LayoutTests/fast/css/selector-text-escape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/sibling-selectors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
@@ -2065,7 +2076,6 @@
 LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # Please triage this failure
@@ -2223,7 +2233,6 @@
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
@@ -2638,7 +2647,6 @@
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/column-width-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
@@ -2650,7 +2658,7 @@
 LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Uses -webkit-* style properties
 LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/initial-column-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError # Please triage this failure
@@ -2670,7 +2678,7 @@
 LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-lr/gap-non-negative_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # co19 issue 63
 LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/gap-non-negative_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
@@ -2684,7 +2692,6 @@
 LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/stray-param_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/strict-img-in-map_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
@@ -2789,7 +2796,6 @@
 LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-invalid-xml_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
@@ -3175,6 +3181,98 @@
 Language/Classes/Constructors/Factories/return_type_t03: Pass, Slow # Issue 25940
 Language/Classes/Constructors/Factories/return_wrong_type_t02: Pass, Slow # Issue 25940
 Language/Classes/Constructors/Factories/return_type_t05: Pass, Slow # Issue 25940
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == ff && $system != windows ]
 LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
@@ -3185,6 +3283,8 @@
 LayoutTests/fast/text/whitespace/nowrap-line-break-after-white-space_t01: Pass, RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == safari ]
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 26615
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 26615
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -3254,7 +3354,6 @@
 LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
@@ -3269,8 +3368,8 @@
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
@@ -3315,10 +3414,9 @@
 LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
@@ -3328,21 +3426,22 @@
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-01_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 LayoutTests/fast/css/content/content-quotes-05_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-property-priority_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Uses FontFace class, not defined for this browser.
 LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
@@ -3350,10 +3449,15 @@
 LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/important-js-override_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-not-with-simple-selector-sequence_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
@@ -3370,6 +3474,8 @@
 LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-font-variant-ligatures_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
@@ -3384,6 +3490,7 @@
 LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
@@ -3392,6 +3499,7 @@
 LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
@@ -3426,6 +3534,7 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -3485,6 +3594,7 @@
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/remove-twice-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
@@ -3502,6 +3612,7 @@
 LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
@@ -3525,12 +3636,12 @@
 LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/location-hash_t01: Skip # Times out. Please triage this failure
@@ -3639,6 +3750,7 @@
 LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
@@ -3690,6 +3802,8 @@
 LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/repaint-scrollbar_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError # Please triage this failure
@@ -3701,7 +3815,6 @@
 LayoutTests/fast/forms/datalist/datalist-child-validation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError # Please triage this failure
@@ -3724,6 +3837,7 @@
 LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/datetimelocal-setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
@@ -3734,7 +3848,6 @@
 LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/interactive-validation-select-crash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/menulist-disabled-selected-option_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/menulist-submit-without-selection_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
@@ -3744,9 +3857,9 @@
 LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/search-popup-crasher_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/select-set-length-with-mutation-remove_t01: RuntimeError
 LayoutTests/fast/forms/select-set-length-with-mutation-reparent_t01: RuntimeError
+LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
@@ -3763,6 +3876,7 @@
 LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Issue 25941
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
@@ -3789,6 +3903,7 @@
 LayoutTests/fast/multicol/balance-unbreakable_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
@@ -3796,19 +3911,18 @@
 LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/orphans-relayout_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
@@ -3930,7 +4044,6 @@
 LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
@@ -3987,6 +4100,8 @@
 LibTest/html/Element/getBoundingClientRect_A01_t02: Pass, RuntimeError # Issue 53
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
@@ -4027,6 +4142,7 @@
 LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
@@ -5637,6 +5753,8 @@
 
 [ $compiler == dart2js && $runtime == ie10 ]
 Language/Expressions/Top_level_Getter_Invocation/17_Getter_Invocation_A03_t02: Skip # Times out. Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 26615
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 26615
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -5666,7 +5784,6 @@
 LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
@@ -5693,7 +5810,6 @@
 LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-clip-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-canvas_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
@@ -5731,7 +5847,6 @@
 LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-to-canvas_t01: Pass, RuntimeError # Issue 22216
 LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/drawImage-with-bad-canvas_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: Pass, RuntimeError # Issue 22216
@@ -5913,7 +6028,6 @@
 LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
@@ -5931,14 +6045,9 @@
 LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/comment-before-charset-external_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-03_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
@@ -5949,18 +6058,15 @@
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-selector-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cssom-remove-shorthand-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-cache-bug_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
@@ -5980,7 +6086,6 @@
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-image-slice_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
@@ -6002,6 +6107,7 @@
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/implicit-attach-marking_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/important-js-override_t01:  RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError # Please triage this failure
@@ -6100,7 +6206,6 @@
 LayoutTests/fast/css/text-align-initial_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError # Please triage this failure
@@ -6336,7 +6441,6 @@
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
@@ -6407,7 +6511,6 @@
 LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/gc-image-element_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # Please triage this failure
@@ -6794,7 +6897,6 @@
 LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError # Please triage this failure
@@ -6822,7 +6924,6 @@
 LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
@@ -6860,7 +6961,6 @@
 LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/residual-style-close-across-n-blocks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
@@ -7007,7 +7107,6 @@
 LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-document-responsetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
@@ -7662,6 +7761,8 @@
 Language/Expressions/Conditional/type_t04: Skip # Times out. Please triage this failure
 Language/Expressions/Identifier_Reference/evaluation_function_t02: Skip # Times out. Please triage this failure
 Language/Statements/Local_Variable_Declaration/syntax_t18: Skip # Times out. Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Issue 26615
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Issue 26615
 Language/Types/Interface_Types/subtype_t37: Skip # Times out. Please triage this failure
 Language/Types/Function_Types/subtype_no_args_t03: Skip # Times out. Please triage this failure
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
@@ -7690,7 +7791,6 @@
 LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
@@ -7717,7 +7817,6 @@
 LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-alpha_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
@@ -7756,7 +7855,6 @@
 LayoutTests/fast/canvas/canvas-to-canvas_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/drawImage-with-bad-canvas_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: Pass, RuntimeError # Please triage this failure
@@ -7779,16 +7877,11 @@
 LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/error-reporting_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/get-active-test_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: Pass, RuntimeError # Please triage this failure
@@ -7807,7 +7900,6 @@
 LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/null-uniform-location_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/point-size_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
@@ -7815,15 +7907,10 @@
 LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/read-pixels-test_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: Skip # Times out. Please triage this failure
@@ -7835,8 +7922,6 @@
 LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-active-bind_t01: Pass, RuntimeError # Please triage this failure
@@ -7851,7 +7936,6 @@
 LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
@@ -7918,7 +8002,6 @@
 LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
@@ -7936,14 +8019,9 @@
 LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/comment-before-charset-external_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-03_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
@@ -7955,18 +8033,15 @@
 LayoutTests/fast/css/css-selector-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-script_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cssom-remove-shorthand-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
@@ -7986,7 +8061,6 @@
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError # Please triage this failure
@@ -8007,6 +8081,7 @@
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/implicit-attach-marking_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/important-js-override_t01:  RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError # Please triage this failure
@@ -8105,7 +8180,6 @@
 LayoutTests/fast/css/text-align-initial_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError # Please triage this failure
@@ -8132,6 +8206,7 @@
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
@@ -8321,7 +8396,6 @@
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
@@ -8390,7 +8464,6 @@
 LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/gc-image-element_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # Please triage this failure
@@ -8771,7 +8844,6 @@
 LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError # Please triage this failure
@@ -8799,7 +8871,6 @@
 LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
@@ -8837,7 +8908,6 @@
 LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/parser/residual-style-close-across-n-blocks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: Pass, RuntimeError # Please triage this failure
@@ -8986,7 +9056,6 @@
 LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-document-responsetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 545123a..a73769a 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -12,13 +12,11 @@
 LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: Pass, RuntimeError # Issue 21605
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 
-[ $compiler == none && $runtime == dartium && $checked  && $system == macos ]
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # 45 roll
-
 [ $compiler == none && $runtime == dartium && $system == windows ]
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: Skip # Timesout Issue 26134
+LayoutTests/fast/css/MarqueeLayoutTest_t01: Pass, RuntimeError # Please triage this failure
 
 [ $compiler == none && $runtime == dartium && $system != windows ]
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -58,7 +56,8 @@
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: Skip # Issue 20540.
 
 [ $compiler == none && $runtime == dartium && $checked ]
-Language/Errors_and_Warnings/static_warning_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # co19-roll r761: Please triage this failure.
 Language/Errors_and_Warnings/static_warning_t02: RuntimeError # Please triage this failure.
 Language/Errors_and_Warnings/static_warning_t03: RuntimeError # Please triage this failure.
 Language/Errors_and_Warnings/static_warning_t04: RuntimeError # Please triage this failure.
@@ -115,7 +114,6 @@
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/css-table-width_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -132,7 +130,6 @@
 LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial-segments_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Dartium 45 roll
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Issue 18251
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -150,7 +147,6 @@
 Language/Classes/Constructors/Generative_Constructors/final_variables_t01: Pass, Fail #: Please triage this failure.
 Language/Classes/Getters/type_object_t01: RuntimeError # Please triage this failure.
 Language/Classes/Getters/type_object_t02: RuntimeError # Please triage this failure.
-Language/Classes/Setters/syntax_t04: RuntimeError # Please triage this failure.
 Language/Classes/Setters/type_object_t01: RuntimeError # Please triage this failure.
 Language/Classes/Setters/type_object_t02: RuntimeError # Please triage this failure.
 Language/Classes/Static_Methods/type_object_t01: RuntimeError # Please triage this failure.
@@ -184,37 +180,72 @@
 Language/Classes/deсlarations_t32: Skip # Times out. Please triage this failure.
 Language/Classes/deсlarations_t33: Skip # Times out. Please triage this failure.
 Language/Classes/deсlarations_t34: Skip # Times out. Please triage this failure.
-Language/Expressions/Instance_Creation/Const/abstract_class_t01: Fail # Issue 22007
-Language/Expressions/Instance_Creation/Const/abstract_class_t03: Fail # Issue 22007
+Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout # Issue 25967
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout # Issue 25967
+Language/Expressions/Identifier_Reference/built_in_identifier_t35: Fail # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t36: Fail # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t37: Fail # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t53: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t54: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t55: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t56: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t57: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t58: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t59: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t60: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t61: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t62: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t63: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t64: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t65: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t66: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t67: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t68: Fail # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: Fail # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: Fail # Issue 25772
 Language/Expressions/Instance_Creation/New/execution_t04: Fail, OK
 Language/Expressions/Instance_Creation/New/execution_t06: Fail, OK
-Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: RuntimeError # Please triage this failure.
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: Fail # Issue 25496
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: Fail # Issue 25496
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t01: RuntimeError # Issue 24607
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t02: RuntimeError # Issue 24607
+
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction: RuntimeError # Issue 26287
+
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t01: RuntimeError # Issue 24607
+
+Language/Expressions/Property_Extraction/Super_Closurization: RuntimeError # Issue 26287
+
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: RuntimeError, OK  # Uses Isolate.spawn.
 Language/Libraries_and_Scripts/Exports/reexport_t01: fail # Dart issue 12916
 Language/Libraries_and_Scripts/Exports/reexport_t02: fail # Dart issue 12916
-Language/Libraries_and_Scripts/Imports/namespace_changes_t10: RuntimeError # Please triage this failure.
 Language/Libraries_and_Scripts/Parts/compilation_t02: Skip # Please triage this failure.
 Language/Libraries_and_Scripts/Parts/syntax_t05: Skip # Times out flakily. Issue 20881
 Language/Libraries_and_Scripts/Scripts/top_level_main_t03: Pass # Issue 14478: This should break.
 Language/Libraries_and_Scripts/Scripts/top_level_main_t03: RuntimeError # co19-roll r786: Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t04: RuntimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t05: RuntimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t09: RuntimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t10: RuntimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t14: RuntimeError # Please triage this failure.
-Language/Libraries_and_Scripts/URIs/syntax_t15: RuntimeError # Please triage this failure.
 Language/Metadata/before_variable_t01: RuntimeError # Please triage this failure.
-Language/Mixins/Mixin_Application/error_t01: Fail # co19 issue 43
-Language/Mixins/Mixin_Application/error_t02: Fail # co19 issue 43
-Language/Mixins/declaring_constructor_t01: Fail # co19 issue 43
+Language/Mixins/Mixin_Application/syntax_t16: RuntimeError # Please triage this failure.
+Language/Mixins/declaring_constructor_t05: Fail # Issue 24767
+Language/Mixins/declaring_constructor_t06: Fail # Issue 24767
 Language/Mixins/not_object_superclass_t01: Fail # Please triage this failure.
 Language/Mixins/reference_to_super_t01: Fail # Please triage this failure.
+Language/Reference/Operator_Precedence/precedence_12_Shift_t02: RuntimeError # Please triage this failure
+Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t04: RuntimeError # Please triage this failure
 Language/Statements/Assert/execution_t02: skip # co19 issue 734
 Language/Statements/Assert/execution_t03: skip # co19 issue 734
 Language/Statements/Assert/type_t02: skip # co19 issue 734
 Language/Statements/Assert/type_t05: skip # co19 issue 734
+Language/Statements/Continue/async_loops_t10: Timeout, Skip # Issue 25748
 Language/Statements/Labels/syntax_t03: fail # Dart issue 2238
 Language/Statements/Switch/syntax_t02: fail # Dart issue 12908
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t01: RuntimeError # Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t02: RuntimeError # Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t04: RuntimeError # Please triage this failure
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -403,17 +434,16 @@
 LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: Skip # co19 issue 732.
 LayoutTests/fast/css/computed-offset-with-zoom_t01: Skip # co19 issue 732.
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: Pass, RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
@@ -435,6 +465,7 @@
 LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/pseudo-any_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
@@ -661,26 +692,16 @@
 LayoutTests/fast/html/imports/import-events_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-inline-parent_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/innerHTML/innerHTML-special-elements_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/layers/zindex-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/lists/item-not-in-list-line-wrapping_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/lists/list-style-position-inside_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -698,13 +719,11 @@
 LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Issue 22111
 LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Passes on Safari, Issue 23475 # co19 issue 11.
 LayoutTests/fast/mediastream/getusermedia_t01: Skip # co19 issue 738
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/balance-unbreakable_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/column-width-zero_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -713,12 +732,8 @@
 LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/newmulticol/balance_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/newmulticol/balance_t02: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/newmulticol/balance_t04: Pass, RuntimeError # co19 issue 11.
@@ -734,14 +749,12 @@
 LayoutTests/fast/multicol/newmulticol/balance_t10: Pass, RuntimeError # I don't understand how, but sometimes passes. # co19 issue 11.
 LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/orphans-relayout_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/widows_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/widows_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/overflow/overflow-rtl-vertical-origin_t01: Pass, RuntimeError # False passes on Firefox, but trying to keep these grouped with the issue. # co19 issue 11.
@@ -753,9 +766,6 @@
 LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/parser/parse-wbr_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/parser/stray-param_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor-vertical-lr_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass # False pass # co19 issue 11.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass, RuntimeError # co19 issue 11.
@@ -765,14 +775,10 @@
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError, Pass, Timeout # Spurious intermittent pass. # co19 issue 11.
 LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError, Pass, Timeout # co19-roll r801: Please triage this failure.
 LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/replaced/table-replaced-element_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/ruby/parse-rp_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/selectors/specificity-overflow_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/selectors/style-sharing-last-child_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -797,7 +803,6 @@
 LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: Skip # co19 issue 732.
 LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: Skip # co19 issue 732.
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/anonymous-table-section-removed_t01: Skip # co19 issue 11.
 LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -825,8 +830,6 @@
 LayoutTests/fast/table/min-width-html-inline-table_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/nested-tables-with-div-offset_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/table/resize-table-row_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -834,13 +837,10 @@
 LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/table/table-width-exceeding-max-width_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: Skip # co19 issue 732.
-LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/find-soft-hyphen_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/find-spaces_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/font-fallback-synthetic-italics_t01: Pass, RuntimeError # co19 issue 11.
@@ -852,7 +852,6 @@
 LayoutTests/fast/text/glyph-reordering_t01: Pass, RuntimeError # This is a false pass. The font gets sanitized, so whether it works or not probably depends on default sizes. # co19 issue 11.
 LayoutTests/fast/text/international/complex-text-rectangle_t01: Skip # co19 issue 732.
 LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: Pass # This is a false pass. All the content gets sanitized, so there's nothing to assert fail on. If the code did anything it would fail. # co19 issue 11.
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: Skip # co19 issue 732.
@@ -860,14 +859,10 @@
 LayoutTests/fast/text/ipa-tone-letters_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/text/ipa-tone-letters_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/line-break-after-empty-inline-hebrew_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/text/line-breaks-after-closing-punctuations_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: Skip # co19 issue 732.
-LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/text/regional-indicator-symobls_t01: Pass, Fail # co19 issue 11.
 LayoutTests/fast/text/regional-indicator-symobls_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -881,44 +876,27 @@
 LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError, Pass # Erratic, but only passes because divs have been entirely removed. # co19 issue 11.
 LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/transforms/scrollIntoView-transformed_t01: Pass, RuntimeError # False passes on Firefox. # co19 issue 11.
-LayoutTests/fast/transforms/topmost-becomes-bottomost-for-scrolling_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/transforms/transform-hit-test-flipped_t01: Pass, RuntimeError # Passes on Firefox, but is clearly not testing what it's trying to test. # co19 issue 11.
-LayoutTests/fast/transforms/transform-inside-overflow-scroll_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/url/anchor_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/url/file-http-base_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/file_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/url/host_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/idna2003_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/idna2008_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/ipv4_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/ipv6_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/url/mailto_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/url/path-url_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/url/path_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/url/port_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/url/query_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/relative-unix_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/relative-win_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/relative_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/url/safari-extension_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/url/safari-extension_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/url/scheme_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/segments_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/standard-url_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/url/trivial-segments_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/url/trivial_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/writing-mode/auto-margins-across-boundaries_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/writing-mode/block-formatting-context_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/writing-mode/display-mutation_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/writing-mode/percentage-padding_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/writing-mode/positionForPoint_t01: Skip # co19 issue 732.
-LayoutTests/fast/writing-mode/relative-positioning-percentages_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-abort_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
@@ -930,7 +908,6 @@
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -944,14 +921,11 @@
 LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xsl/default-html_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Please triage this failure.
 LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19-roll r722: Please triage this failure.
-LibTest/core/DateTime/parse_A01_t02: Skip # Times out. Please triage this failure.
-LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue 22200
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue 22200
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue 22200
@@ -1068,7 +1042,7 @@
 LibTest/isolate/ReceivePort/asBroadcastStream_A04_t02: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/ReceivePort/close_A01_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
-LibTest/isolate/ReceivePort/close_A02_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
+LibTest/isolate/ReceivePort/close_A02_t01: Pass, RuntimeError, Timeout # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
 LibTest/isolate/ReceivePort/contains_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/ReceivePort/distinct_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/ReceivePort/distinct_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
@@ -1306,54 +1280,14 @@
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: Skip # 45 Roll No longer supported.
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: Skip # 45 Roll No longer supported.
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: Skip # 45 Roll failure.
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/important-js-override_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
 LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/string-quote-binary_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
 LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # 45 Roll issue dart-lang/co19/issues/25
-LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError #  45 Roll co19 issue https://github.com/dart-lang/co19/issues/36
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/26
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/27
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
 LayoutTests/fast/encoding/css-charset-dom_t01: Skip #  45 Roll No longer supported see issue https://github.com/dart-lang/co19/issues/35
 LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: Skip #  45 Roll No longer supported.
 LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # 45 roll issue
-LayoutTests/fast/forms/validationMessage_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/28
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/29
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/34
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/30
 LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux but failed on mac bots.
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/31
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/32
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/33
 # Must fix failures below after JsInterop checkin.
 WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Issue 26134
@@ -1383,3 +1317,4 @@
 LibTest/html/Element/insertBefore_A01_t01: RuntimeError # Issue 26134
 LibTest/html/Element/insertAllBefore_A01_t01: RuntimeError # Issue 26134
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: Skip # Issue 26134, timeout
+html/cross_domain_iframe_test: RuntimeError # Issue 26134
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 1ce9410..ed82429 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -27,9 +27,6 @@
 Language/Statements/Assert/type_t05: skip # co19 issue 734
 
 
-LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
-LibTest/core/DateTime/parse_A01_t02: Fail # co19 issue 17.
-
 LibTest/core/DateTime/DateTime.now_A01_t02: Pass, Fail # co19 issue 709
 
 LibTest/isolate/Isolate/spawnUri_A01_t02: Skip # Dart issue 15974
@@ -46,8 +43,6 @@
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) ]
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
-Language/Expressions/Instance_Creation/Const/abstract_class_t01: MissingCompileTimeError # Issue 22007
-Language/Expressions/Instance_Creation/Const/abstract_class_t03: MissingCompileTimeError # Issue 22007
 # With asynchronous loading, the load errors in these tests are no longer recognized as compile errors:
 Language/Libraries_and_Scripts/Imports/invalid_uri_t02: Fail
 Language/Libraries_and_Scripts/Exports/invalid_uri_t02: Fail
@@ -56,6 +51,9 @@
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $mode == debug ]
 LibTest/core/List/List_class_A01_t02: Pass, Slow
 
+[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $system == windows ]
+Language/Expressions/Function_Invocation/async_invokation_t04: Pass, RuntimeError # co19 issue 54
+
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && ($arch != x64 && $arch != simarm64 && $arch != arm64) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
 
@@ -86,14 +84,13 @@
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $mode == debug && $builder_tag == asan ]
 Language/Types/Interface_Types/subtype_t27: Skip  # Issue 21174.
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $arch == arm ]
+[ ($runtime == vm || $runtime == dart_app) && $arch == arm ]
 LibTest/typed_data/Float32x4/operator_multiplication_A01_t01: Fail # Dart issue 24416
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) ]
 # co19 update Sep 29, 2015 (3ed795ea02e022ef19c77cf1b6095b7c8f5584d0)
 Language/Classes/Getters/type_object_t01: RuntimeError # Issue 23721
 Language/Classes/Getters/type_object_t02: RuntimeError # Issue 23721
-Language/Classes/Setters/syntax_t04: RuntimeError # co19 issue 38
 Language/Classes/Setters/type_object_t01: RuntimeError # Issue 23721
 Language/Classes/Setters/type_object_t02: RuntimeError # Issue 23721
 Language/Classes/Static_Methods/type_object_t01: RuntimeError # Issue 23721
@@ -112,34 +109,63 @@
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t06: MissingCompileTimeError # Issue 24472
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t07: MissingCompileTimeError # Issue 24472
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Issue 24472
-Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: CompileTimeError # co19 issue 41
-Language/Libraries_and_Scripts/Imports/namespace_changes_t10: RuntimeError # co19 issue 39
-Language/Libraries_and_Scripts/Parts/compilation_t09: MissingCompileTimeError # co19 issue 40
-Language/Libraries_and_Scripts/URIs/syntax_t04: RuntimeError # co19 issue 42
-Language/Libraries_and_Scripts/URIs/syntax_t05: RuntimeError # co19 issue 42
-Language/Libraries_and_Scripts/URIs/syntax_t09: RuntimeError # co19 issue 42
-Language/Libraries_and_Scripts/URIs/syntax_t10: RuntimeError # co19 issue 42
-Language/Libraries_and_Scripts/URIs/syntax_t14: RuntimeError # co19 issue 42
-Language/Libraries_and_Scripts/URIs/syntax_t15: RuntimeError # co19 issue 42
-Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError # co19 issue 43
-Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError # co19 issue 43
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError # co19 issue 43
-Language/Mixins/not_object_superclass_t01: MissingCompileTimeError # co19 issue 43 and 44
-Language/Mixins/reference_to_super_t01: MissingCompileTimeError # co19 issue 43 and 44
+Language/Expressions/Identifier_Reference/built_in_identifier_t35: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t36: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t37: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t53: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t54: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t55: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t56: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t57: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t58: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t59: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t60: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t61: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t62: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t63: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t64: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t65: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t66: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t67: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_identifier_t68: MissingCompileTimeError # Issue 25733
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: MissingCompileTimeError # Issue 25732
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: MissingCompileTimeError # Issue 25772
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t01: RuntimeError # Issue 24607
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t01: RuntimeError # Issue 24607
+Language/Expressions/Property_Extraction/Named_Constructor_Closurization/identical_t01: RuntimeError # Issue 24607
+Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail # Issue 25967
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail # Issue 25967
+Language/Expressions/Property_Extraction/Anonymous_Constructor_Closurization/identical_t02: RuntimeError # Issue 24607
+Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError # Issue 25765
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $checked ]
-Language/Errors_and_Warnings/static_warning_t01: RuntimeError # co19 issue 45
-Language/Errors_and_Warnings/static_warning_t02: RuntimeError # co19 issue 45
-Language/Errors_and_Warnings/static_warning_t03: RuntimeError # co19 issue 45
-Language/Errors_and_Warnings/static_warning_t04: RuntimeError # co19 issue 45
-Language/Errors_and_Warnings/static_warning_t05: RuntimeError # co19 issue 45
-Language/Errors_and_Warnings/static_warning_t06: RuntimeError # co19 issue 45
+Language/Expressions/Property_Extraction/General_Super_Property_Extraction: CompileTimeError # Issue 26287
+Language/Expressions/Property_Extraction/Super_Closurization: CompileTimeError # Issue 26287
+
+# co19 Roll May 30 2016
+Language/Reference/Operator_Precedence/precedence_12_Shift_t02: RuntimeError # Issue 26573
+Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t04: RuntimeError # Issue 26573
 
 [ $noopt || $compiler == precompiler || $mode == product ]
 Language/Metadata/*: SkipByDesign # Uses dart:mirrors
+Language/Expressions/Null/instance_of_class_null_t01: Skip # Uses dart:mirrors
 
 [ $runtime == dart_precompiled || $runtime == dart_app ]
 LibTest/isolate/Isolate/spawnUri*: Skip # Isolate.spawnUri
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t01: CompileTimeError # spawnUri
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: RuntimeError # spawnUri
+Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError # Unsupported
 
 [ $noopt || $compiler == precompiler ]
 LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Timeout
@@ -152,6 +178,7 @@
 Language/Mixins/Mixin_Application/error_t02: Pass
 Language/Mixins/declaring_constructor_t01: Pass
 
+
 [ ($arch == simdbc || $arch == simdbc64) && $mode == debug ]
 # TODO(vegorov) These tests are very slow on unoptimized SIMDBC
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Timeout
diff --git a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart b/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
index 7f531eb..d4d85ef 100644
--- a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
+++ b/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
@@ -48,9 +48,11 @@
         options: options, showDiagnostics: verbose);
     FormattingDiagnosticHandler diagnostics =
         new FormattingDiagnosticHandler(compiler.provider);
-    HelperAnalyzer analyzer = new HelperAnalyzer(diagnostics);
     Directory dir =
         new Directory.fromUri(Uri.base.resolve('pkg/compiler/lib/'));
+    String helpersUriPrefix = dir.uri.resolve('src/helpers/').toString();
+    HelperAnalyzer analyzer = new HelperAnalyzer(diagnostics, helpersUriPrefix);
+    LibraryElement helperLibrary;
     for (FileSystemEntity entity in dir.listSync(recursive: true)) {
       if (entity is File && entity.path.endsWith('.dart')) {
         Uri file = Uri.base.resolve(nativeToUriPath(entity.path));
@@ -59,6 +61,9 @@
         }
         LibraryElement library = await compiler.analyzeUri(file);
         if (library != null) {
+          if (library.libraryName == 'dart2js.helpers') {
+            helperLibrary = library;
+          }
           library.forEachLocalMember((Element element) {
             if (element is ClassElement) {
               element.forEachLocalMember((AstElement member) {
@@ -71,12 +76,16 @@
         }
       }
     }
+    Expect.isNotNull(helperLibrary, 'Helper library not found');
+    Expect.isTrue(analyzer.isHelper(helperLibrary),
+        "Helper library $helperLibrary is not considered a helper.");
     Expect.isTrue(analyzer.errors.isEmpty, "Errors found.");
   });
 }
 
 class HelperAnalyzer extends TraversalVisitor {
   final FormattingDiagnosticHandler diagnostics;
+  final String helpersUriPrefix;
   List<SourceSpan> errors = <SourceSpan>[];
 
   ResolvedAst resolvedAst;
@@ -86,7 +95,7 @@
 
   AnalyzableElement get analyzedElement => resolvedAst.element;
 
-  HelperAnalyzer(this.diagnostics) : super(null);
+  HelperAnalyzer(this.diagnostics, this.helpersUriPrefix) : super(null);
 
   @override
   void apply(Node node, [_]) {
@@ -105,7 +114,7 @@
 
   bool isHelper(Element element) {
     Uri uri = element.library.canonicalUri;
-    return '$uri'.startsWith('package:compiler/src/helpers/');
+    return '$uri'.startsWith(helpersUriPrefix);
   }
 
   void checkAccess(Node node, MemberElement element) {
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 71d92ae..dffab8a 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -69,7 +69,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 449;
+    int expectedMethodCount = 432;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 1141416..24c42e4 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -258,7 +258,7 @@
     final Type owner;
     final String name;
     final int bound;
-    TypeVariable(this.owner, this.name, this.bound);
+    const TypeVariable(this.owner, this.name, this.bound);
   }''',
   'unwrapException': 'unwrapException(e) {}',
   'voidTypeCheck': 'voidTypeCheck(value) {}',
diff --git a/tests/compiler/dart2js/serialization/equivalence_test.dart b/tests/compiler/dart2js/serialization/equivalence_test.dart
index 7caae28..bd903da 100644
--- a/tests/compiler/dart2js/serialization/equivalence_test.dart
+++ b/tests/compiler/dart2js/serialization/equivalence_test.dart
@@ -9,11 +9,13 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common.dart';
+import 'package:compiler/src/common/resolution.dart';
 import 'package:compiler/src/constants/constructors.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/invariant.dart';
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/elements/visitor.dart';
+import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/ordered_typeset.dart';
 import 'package:compiler/src/serialization/element_serialization.dart';
 import 'package:compiler/src/serialization/equivalence.dart';
@@ -52,10 +54,13 @@
     CompilationResult result = await runCompiler(
         entryPoint: entryPoint, options: [Flags.analyzeAll]);
     Compiler compiler = result.compiler;
-    testSerialization(compiler.libraryLoader.libraries,
-                      compiler.reporter,
-                      outPath: outPath,
-                      prettyPrint: prettyPrint);
+    testSerialization(
+        compiler.libraryLoader.libraries,
+        compiler.reporter,
+        compiler.resolution,
+        compiler.libraryLoader,
+        outPath: outPath,
+        prettyPrint: prettyPrint);
     Expect.isFalse(compiler.reporter.hasReportedError,
         "Unexpected errors occured.");
   });
@@ -64,6 +69,8 @@
 void testSerialization(
     Iterable<LibraryElement> libraries1,
     DiagnosticReporter reporter,
+    Resolution resolution,
+    LibraryProvider libraryProvider,
     {String outPath,
      bool prettyPrint}) {
   Serializer serializer = new Serializer();
@@ -82,7 +89,8 @@
   }
 
   Deserializer deserializer = new Deserializer.fromText(
-      new DeserializationContext(reporter), Uri.parse('out1.data'),
+      new DeserializationContext(reporter, resolution, libraryProvider),
+      Uri.parse('out1.data'),
       text, const JsonSerializationDecoder());
   List<LibraryElement> libraries2 = <LibraryElement>[];
   for (LibraryElement library1 in libraries1) {
@@ -102,7 +110,8 @@
   String text2 = serializer2.toText(const JsonSerializationEncoder());
 
   Deserializer deserializer3 = new Deserializer.fromText(
-      new DeserializationContext(reporter), Uri.parse('out2.data'),
+      new DeserializationContext(reporter, resolution, libraryProvider),
+      Uri.parse('out2.data'),
       text2, const JsonSerializationDecoder());
   for (LibraryElement library1 in libraries1) {
     LibraryElement library2 =
@@ -135,7 +144,10 @@
 checkElementProperties(
     Object object1, object2, String property,
     Element element1, Element element2) {
+  currentCheck =
+      new Check(currentCheck, object1, object2, property, element1, element2);
   const ElementPropertyEquivalence().visit(element1, element2);
+  currentCheck = currentCheck.parent;
 }
 
 /// Checks the equivalence of [constructor1] and [constructor2].
@@ -255,6 +267,16 @@
         element1.isFinal, element2.isFinal);
     check(element1, element2, 'isConst',
         element1.isConst, element2.isConst);
+    check(element1, element2, 'isAbstract',
+        element1.isAbstract, element2.isAbstract);
+    check(element1, element2, 'isStatic',
+        element1.isStatic, element2.isStatic);
+    check(element1, element2, 'isTopLevel',
+        element1.isTopLevel, element2.isTopLevel);
+    check(element1, element2, 'isClassMember',
+        element1.isClassMember, element2.isClassMember);
+    check(element1, element2, 'isInstanceMember',
+        element1.isInstanceMember, element2.isInstanceMember);
   }
 
   @override
@@ -360,7 +382,10 @@
           throw message;
         }
       }
+      currentCheck = new Check(currentCheck, element1, element1,
+          'member:$name', member1, member2);
       visit(member1, member2);
+      currentCheck = currentCheck.parent;
     }
   }
 
@@ -368,15 +393,35 @@
   void visitClassElement(ClassElement element1, ClassElement element2) {
     checkElementIdentities(null, null, null, element1, element2);
     check(element1, element2, 'name',
-          element1.name, element2.name);
-    check(element1, element2, 'sourcePosition',
+        element1.name, element2.name);
+    if (!element1.isUnnamedMixinApplication) {
+      check(element1, element2, 'sourcePosition',
           element1.sourcePosition, element2.sourcePosition);
+    } else {
+      check(element1, element2, 'sourcePosition.uri',
+          element1.sourcePosition.uri, element2.sourcePosition.uri);
+      MixinApplicationElement mixin1 = element1;
+      MixinApplicationElement mixin2 = element2;
+      checkElementIdentities(mixin1, mixin2, 'subclass',
+          mixin1.subclass, mixin2.subclass);
+      checkTypes(mixin1, mixin2, 'mixinType',
+          mixin1.mixinType, mixin2.mixinType);
+    }
     checkElementIdentities(
         element1, element2, 'library',
         element1.library, element2.library);
     checkElementIdentities(
         element1, element2, 'compilationUnit',
         element1.compilationUnit, element2.compilationUnit);
+    checkTypeLists(
+        element1, element2, 'typeVariables',
+        element1.typeVariables, element2.typeVariables);
+    checkTypes(
+        element1, element2, 'thisType',
+        element1.thisType, element2.thisType);
+    checkTypes(
+        element1, element2, 'rawType',
+        element1.rawType, element2.rawType);
     check(element1, element2, 'isObject',
         element1.isObject, element2.isObject);
     checkTypeLists(element1, element2, 'typeVariables',
@@ -391,27 +436,27 @@
       EnumClassElement enum1 = element1;
       EnumClassElement enum2 = element2;
       checkElementLists(enum1, enum2, 'enumValues',
-                        enum1.enumValues, enum2.enumValues);
+          enum1.enumValues, enum2.enumValues);
     }
     if (!element1.isObject) {
       checkTypes(element1, element2, 'supertype',
           element1.supertype, element2.supertype);
     }
     check(element1, element2, 'hierarchyDepth',
-          element1.hierarchyDepth, element2.hierarchyDepth);
+        element1.hierarchyDepth, element2.hierarchyDepth);
     checkTypeLists(
         element1, element2, 'allSupertypes',
         element1.allSupertypes.toList(),
         element2.allSupertypes.toList());
     OrderedTypeSet typeSet1 = element1.allSupertypesAndSelf;
-    OrderedTypeSet typeSet2 = element1.allSupertypesAndSelf;
+    OrderedTypeSet typeSet2 = element2.allSupertypesAndSelf;
     checkListEquivalence(
         element1, element2, 'allSupertypes',
         typeSet1.levelOffsets,
         typeSet2.levelOffsets,
         check);
     check(element1, element2, 'allSupertypesAndSelf.levels',
-          typeSet1.levels, typeSet2.levels);
+        typeSet1.levels, typeSet2.levels);
     checkTypeLists(
         element1, element2, 'supertypes',
         typeSet1.supertypes.toList(),
@@ -435,7 +480,20 @@
         getConstructors(element1),
         getConstructors(element2));
 
+    checkElementIdentities(element1, element2, 'defaultConstructor',
+        element1.lookupDefaultConstructor(),
+        element2.lookupDefaultConstructor());
+
     visitMembers(element1, element2);
+
+    ClassElement superclass1 = element1.superclass;
+    ClassElement superclass2 = element2.superclass;
+    while (superclass1 != null && superclass1.isMixinApplication) {
+      checkElementProperties(element1, element2, 'supermixin',
+          superclass1, superclass2);
+      superclass1 = superclass1.superclass;
+      superclass2 = superclass2.superclass;
+    }
   }
 
   @override
@@ -550,8 +608,13 @@
     check(
         element1, element2, 'name',
         element1.name, element2.name);
-    check(element1, element2, 'sourcePosition',
+    if (!element1.isSynthesized) {
+      check(element1, element2, 'sourcePosition',
           element1.sourcePosition, element2.sourcePosition);
+    } else {
+      check(element1, element2, 'sourcePosition.uri',
+          element1.sourcePosition.uri, element2.sourcePosition.uri);
+    }
     checkListEquivalence(
         element1, element2, 'parameters',
         element1.parameters, element2.parameters,
diff --git a/tests/compiler/dart2js/serialization/helper.dart b/tests/compiler/dart2js/serialization/helper.dart
index a7d185c..3f2b429 100644
--- a/tests/compiler/dart2js/serialization/helper.dart
+++ b/tests/compiler/dart2js/serialization/helper.dart
@@ -88,6 +88,9 @@
       if (test.preserializedSourceFiles != null) {
         sourceFiles.addAll(test.preserializedSourceFiles);
       }
+      if (test.unserializedSourceFiles != null) {
+        sourceFiles.addAll(test.unserializedSourceFiles);
+      }
       List<Uri> resolutionInputs = <Uri>[];
       for (SerializedData data in dataList) {
         data.expandMemorySourceFiles(sourceFiles);
@@ -196,9 +199,13 @@
   for (String key in test.preserializedSourceFiles.keys) {
     uriList.add(Uri.parse('memory:$key'));
   }
+  Map<String, String> sourceFiles = serializedData.toMemorySourceFiles();
+  sourceFiles.addAll(test.preserializedSourceFiles);
+  if (test.unserializedSourceFiles != null) {
+    sourceFiles.addAll(test.unserializedSourceFiles);
+  }
   Compiler compiler = compilerFor(
-      memorySourceFiles:
-          serializedData.toMemorySourceFiles(test.preserializedSourceFiles),
+      memorySourceFiles: sourceFiles,
       resolutionInputs: serializedData.toUris(),
       options: [Flags.analyzeOnly, Flags.analyzeMain]);
   compiler.librariesToAnalyzeWhenRun = uriList;
diff --git a/tests/compiler/dart2js/serialization/members_test.dart b/tests/compiler/dart2js/serialization/members_test.dart
new file mode 100644
index 0000000..ef23e87
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/members_test.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization.class_members_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/resolution/class_members.dart';
+import 'package:compiler/src/serialization/equivalence.dart';
+import '../memory_compiler.dart';
+import 'helper.dart';
+import 'test_helper.dart';
+
+
+main(List<String> args) {
+  Arguments arguments = new Arguments.from(args);
+  asyncTest(() async {
+    SerializedData serializedData =
+    await serializeDartCore(arguments: arguments);
+    if (arguments.filename != null) {
+      Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
+      await checkClassMembers(
+          serializedData, entryPoint, verbose: arguments.verbose);
+    } else {
+      await checkClassMembers(
+          serializedData, Uris.dart_core, verbose: arguments.verbose);
+    }
+  });
+}
+
+Future checkClassMembers(
+    SerializedData serializedData,
+    Uri entryPoint,
+    {bool verbose: false}) async {
+
+  Compiler compilerNormal = compilerFor(
+      options: [Flags.analyzeAll]);
+  await compilerNormal.run(entryPoint);
+
+  Compiler compilerDeserialized = compilerFor(
+      memorySourceFiles: serializedData.toMemorySourceFiles(),
+      resolutionInputs: serializedData.toUris(),
+      options: [Flags.analyzeAll]);
+  await compilerDeserialized.run(entryPoint);
+
+  checkAllMembers(compilerNormal, compilerDeserialized, verbose: true);
+}
+
+void checkAllMembers(
+    Compiler compiler1,
+    Compiler compiler2,
+    {bool verbose: false}) {
+  checkLoadedLibraryMembers(
+      compiler1,
+      compiler2,
+      (Element member1) => member1 is ClassElement,
+      checkMembers,
+      verbose: verbose);
+}
+
+
+/// Check equivalence of members of [class1] and [class2].
+void checkMembers(
+    Compiler compiler1, ClassMemberMixin class1,
+    Compiler compiler2, ClassMemberMixin class2,
+    {bool verbose: false}) {
+  if (verbose) {
+    print('Checking $class1 vs $class2');
+  }
+  MembersCreator.computeAllClassMembers(compiler1.resolution, class1);
+  MembersCreator.computeAllClassMembers(compiler2.resolution, class2);
+
+  check(class1, class2, 'interfaceMemberAreClassMembers',
+      class1.interfaceMembersAreClassMembers,
+      class2.interfaceMembersAreClassMembers);
+  class1.forEachClassMember((Member member1) {
+    Name name1 = member1.name;
+    Name name2 = convertName(name1, compiler2);
+    checkMember(class1, class2, 'classMember:$name1',
+        member1, class2.lookupClassMember(name2));
+  });
+
+  class1.forEachInterfaceMember((MemberSignature member1) {
+    Name name1 = member1.name;
+    Name name2 = convertName(name1, compiler2);
+    checkMemberSignature(class1, class2, 'interfaceMember:$name1',
+        member1, class2.lookupInterfaceMember(name2));
+  });
+}
+
+Name convertName(Name name, Compiler compiler) {
+  if (name.isPrivate) {
+    LibraryElement library =
+        compiler.libraryLoader.lookupLibrary(name.library.canonicalUri);
+    if (!areElementsEquivalent(name.library, library)) {
+      throw 'Libraries ${name.library} and ${library} are not equivalent';
+    }
+    name = new Name(name.text, library, isSetter: name.isSetter);
+  }
+  return name;
+}
+
+void checkMember(ClassElement class1, ClassElement class2, String property,
+    Member member1, Member member2) {
+  if (member2 == null) {
+    print('$class1 class members:');
+    class1.forEachClassMember((m) => print(' ${m.name} $m'));
+    print('$class2 class members:');
+    class2.forEachClassMember((m) => print(' ${m.name} $m'));
+    throw "No member ${member1.name} in $class2 for $property";
+  }
+  checkMemberSignature(class1, class2, property, member1, member2);
+  checkElementIdentities(class1, class2, '$property.element',
+      member1.element, member2.element);
+  check(class1, class2, '$property.declarer',
+      member1.declarer, member2.declarer, areTypesEquivalent);
+  check(class1, class2, '$property.isStatic',
+      member1.isStatic, member2.isStatic);
+  check(class1, class2, '$property.isDeclaredByField',
+      member1.isDeclaredByField, member2.isDeclaredByField);
+  check(class1, class2, '$property.isAbstract',
+      member1.isAbstract, member2.isAbstract);
+  if (member1.isAbstract && member1.implementation != null) {
+    checkMember(class1, class2, '$property.implementation',
+        member1.implementation, member2.implementation);
+  }
+}
+
+void checkMemberSignature(ClassElement class1, ClassElement class2,
+    String property,
+    MemberSignature member1, MemberSignature member2) {
+  if (member2 == null) {
+    print('$class1 interface members:');
+    class1.forEachInterfaceMember((m) => print(' ${m.name} $m'));
+    print('$class2 interface members:');
+    class2.forEachInterfaceMember((m) => print(' ${m.name} $m'));
+    throw "No member ${member1.name} in $class2 for $property";
+  }
+  check(class1, class2, '$property.name',
+      member1.name, member2.name, areNamesEquivalent);
+  check(class1, class2, '$property.type',
+      member1.type, member2.type, areTypesEquivalent);
+  check(class1, class2, '$property.functionType',
+      member1.functionType, member2.functionType, areTypesEquivalent);
+  check(class1, class2, '$property.isGetter',
+      member1.isGetter, member2.isGetter);
+  check(class1, class2, '$property.isSetter',
+      member1.isSetter, member2.isSetter);
+  check(class1, class2, '$property.isMethod',
+      member1.isMethod, member2.isMethod);
+}
diff --git a/tests/compiler/dart2js/serialization/model_test.dart b/tests/compiler/dart2js/serialization/model_test.dart
index dd86acd..d7eeed6 100644
--- a/tests/compiler/dart2js/serialization/model_test.dart
+++ b/tests/compiler/dart2js/serialization/model_test.dart
@@ -45,6 +45,10 @@
      int index,
      Test test,
      bool verbose: false}) async {
+  if (test != null && test.name == 'Disable tree shaking through reflection') {
+    // TODO(johnniwinther): Support serialization of metadata.
+    return;
+  }
 
   String testDescription = test != null ? test.name : '${entryPoint}';
   String id = index != null ? '$index: ' : '';
@@ -220,8 +224,17 @@
       }
     }
     if (!found) {
+      if (child.isInstantiated) {
+        print('Missing subclass ${child.cls} of ${node1.cls} '
+            'in ${node2.directSubclasses}');
+        print(compiler1.world.dump(
+            verbose ? compiler1.coreClasses.objectClass : node1.cls));
+        print(compiler2.world.dump(
+            verbose ? compiler2.coreClasses.objectClass : node2.cls));
+      }
       Expect.isFalse(child.isInstantiated,
-          'Missing subclass ${child.cls} of ${node1.cls}');
+          'Missing subclass ${child.cls} of ${node1.cls} in '
+              '${node2.directSubclasses}');
     }
   }
   checkMixinUses(compiler1, compiler2, node1.cls, node2.cls, verbose: verbose);
diff --git a/tests/compiler/dart2js/serialization/test_data.dart b/tests/compiler/dart2js/serialization/test_data.dart
index 49f3f44..87a580f 100644
--- a/tests/compiler/dart2js/serialization/test_data.dart
+++ b/tests/compiler/dart2js/serialization/test_data.dart
@@ -308,12 +308,90 @@
 class C = S with M;
 ''',
       }),
+
+  const Test('Import mirrors, thus checking import paths', const {
+    'main.dart': '''
+import 'dart:mirrors';
+main() {}
+''',
+  },
+      expectedWarningCount: 1),
+
+  const Test('Serialized symbol literal', const {
+    'main.dart': '''
+import 'lib.dart';
+main() => m();
+''',
+  }, preserializedSourceFiles: const {
+    'lib.dart': '''
+m() => print(#main);
+''',
+  }),
+
+  const Test('Indirect unserialized library', const {
+    'main.dart': '''
+import 'a.dart';
+main() => foo();
+''',
+  }, preserializedSourceFiles: const {
+    'a.dart': '''
+import 'memory:b.dart';
+foo() => bar();
+''',
+  }, unserializedSourceFiles: const {
+    'b.dart': '''
+import 'memory:a.dart';
+bar() => foo();
+''',
+  }),
+
+  const Test('Multiple structurally identical mixins', const {
+    'main.dart': '''
+class S {}
+class M {}
+class C1 extends S with M {}
+class C2 extends S with M {}
+main() {
+  new C1();
+  new C2();
+}
+''',
+  }),
+
+  const Test('Deferred loading', const {
+    'main.dart': '''
+import 'a.dart' deferred as lib;
+main() {
+  lib.foo();
+}
+''',
+    'a.dart': '''
+void foo() {}
+''',
+  }),
+
+  const Test('fromEnvironment constants', const {
+    'main.dart': '''
+main() => const String.fromEnvironment("foo");
+''',
+  }),
+
+  const Test('Disable tree shaking through reflection', const {
+    'main.dart': '''
+import 'dart:mirrors';
+
+main() {
+  reflect(null).invoke(#toString, []).reflectee;
+}
+''',
+  }, expectedWarningCount: 1),
 ];
 
 class Test {
   final String name;
   final Map sourceFiles;
   final Map preserializedSourceFiles;
+  final Map unserializedSourceFiles;
   final int expectedErrorCount;
   final int expectedWarningCount;
   final int expectedHintCount;
@@ -323,6 +401,7 @@
       this.name,
       this.sourceFiles,
       {this.preserializedSourceFiles,
+      this.unserializedSourceFiles,
       this.expectedErrorCount: 0,
       this.expectedWarningCount: 0,
       this.expectedHintCount: 0,
diff --git a/tests/compiler/dart2js/serialization/test_helper.dart b/tests/compiler/dart2js/serialization/test_helper.dart
index 496d0e3..4bbed39 100644
--- a/tests/compiler/dart2js/serialization/test_helper.dart
+++ b/tests/compiler/dart2js/serialization/test_helper.dart
@@ -4,6 +4,7 @@
 
 library dart2js.serialization_test_helper;
 
+import 'dart:collection';
 import 'package:compiler/src/common/resolution.dart';
 import 'package:compiler/src/constants/expressions.dart';
 import 'package:compiler/src/dart_types.dart';
@@ -12,6 +13,40 @@
 import 'package:compiler/src/serialization/equivalence.dart';
 import 'package:compiler/src/tree/nodes.dart';
 
+Check currentCheck;
+
+class Check {
+  final Check parent;
+  final Object object1;
+  final Object object2;
+  final String property;
+  final Object value1;
+  final Object value2;
+
+  Check(this.parent, this.object1, this.object2, this.property, this.value1, this.value2);
+
+  String printOn(StringBuffer sb, String indent) {
+    if (parent != null) {
+      indent = parent.printOn(sb, indent);
+      sb.write('\n$indent|\n');
+    }
+    sb.write("${indent}property='$property'\n ");
+    sb.write("${indent}object1=$object1 (${object1.runtimeType})\n ");
+    sb.write("${indent}value=${value1 == null ? "null" : "'$value1'"} ");
+    sb.write("(${value1.runtimeType}) vs\n ");
+    sb.write("${indent}object2=$object2 (${object2.runtimeType})\n ");
+    sb.write("${indent}value=${value2 == null ? "null" : "'$value2'"} ");
+    sb.write("(${value2.runtimeType})");
+    return ' $indent';
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    printOn(sb, '');
+    return sb.toString();
+  }
+}
+
 /// Strategy for checking equivalence.
 ///
 /// Use this strategy to fail early with contextual information in the event of
@@ -99,15 +134,12 @@
 /// [value2] respectively, are equal and throw otherwise.
 bool check(var object1, var object2, String property, var value1, var value2,
            [bool equivalence(a, b) = equality]) {
+  currentCheck = new Check(
+      currentCheck, object1, object2, property, value1, value2);
   if (!equivalence(value1, value2)) {
-    throw "property='$property'\n "
-          "object1=$object1 (${object1.runtimeType})\n "
-          "value=${value1 == null ? "null" : "'$value1'"} "
-          "(${value1.runtimeType}) <>\n "
-          "object2=$object2 (${object2.runtimeType})\n "
-          "value=${value2 == null ? "null" : "'$value2'"} "
-          "(${value2.runtimeType})";
+    throw currentCheck;
   }
+  currentCheck = currentCheck.parent;
   return true;
 }
 
@@ -119,6 +151,8 @@
     Object object1, Object object2, String property,
     Iterable list1, Iterable list2,
     void checkEquivalence(o1, o2, property, a, b)) {
+  currentCheck =
+      new Check(currentCheck, object1, object2, property, list1, list2);
   for (int i = 0; i < list1.length && i < list2.length; i++) {
     checkEquivalence(
         object1, object2, property,
@@ -138,6 +172,7 @@
         '`${property}` on $object1:\n ${list1.join('\n ')}\n'
         '`${property}` on $object2:\n ${list2.join('\n ')}';
   }
+  currentCheck = currentCheck.parent;
   return true;
 }
 
@@ -244,7 +279,8 @@
   if (type1 == null || type2 == null) {
     return check(object1, object2, property, type1, type2);
   } else {
-    return const TypeEquivalence(const CheckStrategy()).visit(type1, type2);
+    return check(object1, object2, property, type1, type2,
+        (a, b) => const TypeEquivalence(const CheckStrategy()).visit(a, b));
   }
 }
 
@@ -268,7 +304,8 @@
   if (exp1 == null || exp2 == null) {
     return check(object1, object2, property, exp1, exp2);
   } else {
-    return const ConstantEquivalence(const CheckStrategy()).visit(exp1, exp2);
+    return check(object1, object2, property, exp1, exp2,
+        (a, b) => const ConstantEquivalence(const CheckStrategy()).visit(a, b));
   }
 }
 
@@ -302,6 +339,15 @@
       ClassElement class2 = member2;
       if (!class1.isResolved) return;
 
+      if (hasProperty(member1)) {
+        if (areElementsEquivalent(member1, member2)) {
+          checkMemberProperties(
+              compiler1, member1,
+              compiler2, member2,
+              verbose: verbose);
+        }
+      }
+
       class1.forEachLocalMember((m1) {
         checkMembers(m1, class2.localLookup(m1.name));
       });
diff --git a/tests/corelib/uri_test.dart b/tests/corelib/uri_test.dart
index f1dce7a..30b6242 100644
--- a/tests/corelib/uri_test.dart
+++ b/tests/corelib/uri_test.dart
@@ -130,9 +130,13 @@
   // Test non-URI base (no scheme, no authority, relative path).
   base = Uri.parse("a/b/c?_#_");
   testResolve("a/b/g?q#f", "g?q#f");
+  testResolve("./", "../..");
   testResolve("../", "../../..");
   testResolve("a/b/", ".");
   testResolve("c", "../../c");
+  base = Uri.parse("../../a/b/c?_#_");  // Initial ".." in base url.
+  testResolve("../../a/d", "../d");
+  testResolve("../../../d", "../../../d");
 
   base = Uri.parse("s:a/b");
   testResolve("s:/c", "../c");
diff --git a/tests/html/html.status b/tests/html/html.status
index d39e5b9..57c3849 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -284,6 +284,7 @@
 event_test: RuntimeError # Safarimobilesim does not support WheelEvent
 
 [ $runtime == safari ]
+audiobuffersourcenode_test/functional: RuntimeError
 input_element_test/supported_month: RuntimeError
 input_element_test/supported_time: RuntimeError
 input_element_test/supported_week: RuntimeError
diff --git a/tests/language/initializing_formal_access_test.dart b/tests/language/initializing_formal_access_test.dart
new file mode 100644
index 0000000..3d3ceed
--- /dev/null
+++ b/tests/language/initializing_formal_access_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// DartOptions=--initializing-formal-access
+
+import "package:expect/expect.dart";
+
+class C {
+  final int x;
+  final int y;
+
+  const C.constant(this.x) : y = x + 1;
+
+  C(this.x) : y = x + 1 {
+    int z = x + 2;
+    assert(z == y + 1);
+  }
+}
+
+main() {
+  C c = new C(2);
+  Expect.equals(c.x, 2);
+  Expect.equals(c.y, 3);
+  const C cc = const C.constant(4);
+  Expect.equals(cc.x, 4);
+  Expect.equals(cc.y, 5);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index d744e27..9657b54 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -53,6 +53,9 @@
 generic_methods_function_type_test: CompiletimeError # Issue 25869
 generic_methods_type_expression_test: CompiletimeError # Issue 25869
 
+# Experimental feature: Use initializing formals in initializers and constructor body.
+initializing_formal_access_test: CompiletimeError # TODO(eernst): Create a suitable sdk issue.
+
 [ ($compiler == none || $compiler == precompiler || $compiler == dart2app || $compiler == dart2appjit) && ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) ]
 
 class_keyword_test/02: MissingCompileTimeError # Issue 13627
@@ -92,6 +95,7 @@
 main_test/42: Fail # Issue 20028
 mirror_in_static_init_test: Fail # Issue 22071
 vm/debug_break_enabled_vm_test/*: Skip # Issue 14651.
+
 # Experimental feature: Syntactic support for generic methods.
 generic_methods_test: RuntimeError # Issue 25869
 generic_functions_test: RuntimeError # Issue 25869
@@ -100,6 +104,10 @@
 generic_methods_new_test: RuntimeError # Issue 25869
 generic_methods_function_type_test: RuntimeError # Issue 25869
 generic_methods_type_expression_test: RuntimeError # Issue 25869
+
+# Experimental feature: Use initializing formals in initializers and constructor body.
+initializing_formal_access_test: RuntimeError # TODO(eernst): create a suitable sdk issue.
+
 config_import_test: Skip  # Issue 26250
 
 [ $compiler == none && $runtime == dartium && $system == linux && $arch != x64 ]
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index a0e3ee5..8525e33 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -509,3 +509,6 @@
 generic_methods_new_test: CompiletimeError # Issue 25868
 generic_methods_function_type_test: CompiletimeError # Issue 25868
 generic_methods_type_expression_test: CompiletimeError # Issue 25868
+
+# Experimental feature: Use initializing formals in initializers and constructor body.
+initializing_formal_access_test: CompiletimeError # TODO(eernst): Create a suitable sdk issue.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b61dd39..bb54e5c 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -54,6 +54,9 @@
 generic_methods_function_type_test: CompiletimeError # DartOptions not passed to compiler.
 generic_methods_type_expression_test: CompiletimeError # DartOptions not passed to compiler.
 
+# Experimental feature: Use initializing formals in initializers and constructor body.
+initializing_formal_access_test: CompiletimeError # DartOptions not passed to compiler.
+
 [ $compiler == dart2js ]
 invocation_mirror_empty_arguments_test: Fail # Issue 24331
 nan_identical_test: Fail # Issue 11551
diff --git a/tests/language/regress_26453_test.dart b/tests/language/regress_26453_test.dart
new file mode 100644
index 0000000..32d6f59
--- /dev/null
+++ b/tests/language/regress_26453_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// The program crashed with segfault because we when we first compile foo
+// and bar we allocate all four variables (a, b, c and d) to the context.
+// When we compile foo the second time (with optimizations) we allocate
+// only c and d to the context. This happened because parser folds away
+// "${a}" and "${b}" as constant expressions when parsing bar on its own,
+// i.e. the expressions were not parsed again and thus a and b were not
+// marked as captured.
+// This caused a mismatch between a context that bar expects and that
+// the optimized version of foo produces.
+
+foo() {
+  const a = 1;
+  const b = 2;
+  var c = 3;
+  var d = 4;
+
+  bar() {
+    if ("${a}" != "1") throw "failed";
+    if ("${b}" != "2") throw "failed";
+    if ("${c}" != "3") throw "failed";
+    if ("${d}" != "4") throw "failed";
+  }
+
+  bar();
+}
+
+main() {
+  for (var i = 0; i < 50000; i++) foo();
+}
diff --git a/tests/language/regress_26543_1_test.dart b/tests/language/regress_26543_1_test.dart
new file mode 100644
index 0000000..8c425de
--- /dev/null
+++ b/tests/language/regress_26543_1_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file. 
+
+// Regression test for issue 26543
+
+class C {
+  var x;
+  C() : x = null ?? <int, int>{} {}
+}
+
+main() {
+  print(new C());
+}
\ No newline at end of file
diff --git a/tests/language/regress_26543_2_test.dart b/tests/language/regress_26543_2_test.dart
new file mode 100644
index 0000000..36c06f0
--- /dev/null
+++ b/tests/language/regress_26543_2_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file. 
+
+// Regression test for issue 26543
+
+class C {
+  var x, y;
+  C() : x = null ?? <int, int>{}, y = 0 {}
+}
+
+main() {
+  print(new C());
+}
\ No newline at end of file
diff --git a/tests/language/regress_26543_3_test.dart b/tests/language/regress_26543_3_test.dart
new file mode 100644
index 0000000..379e7567
--- /dev/null
+++ b/tests/language/regress_26543_3_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file. 
+
+// Regression test for issue 26543
+
+class C {
+  var x, y;
+  C() : x = 0, y = null ?? <int, int>{} {}
+}
+
+main() {
+  print(new C());
+}
\ No newline at end of file
diff --git a/tests/lib/collection/linked_list_test.dart b/tests/lib/collection/linked_list_test.dart
index 3ed06b7..785ebe7 100644
--- a/tests/lib/collection/linked_list_test.dart
+++ b/tests/lib/collection/linked_list_test.dart
@@ -14,6 +14,55 @@
 }
 
 
+testPreviousNext() {
+  var list = new LinkedList<MyEntry>();
+  Expect.throws(() => list.first);
+  Expect.throws(() => list.last);
+  Expect.equals(0, list.length);
+
+  for (int i = 0; i < 3; i++) {
+    list.add(new MyEntry(i));
+  }
+  Expect.equals(3, list.length);
+
+  var entry = list.first;
+  Expect.isNull(entry.previous);
+  Expect.equals(0, entry.value);
+  entry = entry.next;
+  Expect.equals(1, entry.value);
+  entry = entry.next;
+  Expect.equals(2, entry.value);
+  Expect.isNull(entry.next);
+  entry = entry.previous;
+  Expect.equals(1, entry.value);
+  entry = entry.previous;
+  Expect.equals(0, entry.value);
+  Expect.isNull(entry.previous);
+}
+
+testUnlinked() {
+  var unlinked = new MyEntry(0);
+  Expect.isNull(unlinked.previous);
+  Expect.isNull(unlinked.next);
+  var list = new LinkedList<MyEntry>();
+  list.add(unlinked);
+  Expect.isNull(unlinked.previous);
+  Expect.isNull(unlinked.next);
+  list.remove(unlinked);
+  Expect.isNull(unlinked.previous);
+  Expect.isNull(unlinked.next);
+  list.add(unlinked);
+  list.add(new MyEntry(1));
+  Expect.isNull(unlinked.previous);
+  Expect.equals(1, unlinked.next.value);
+  list.remove(unlinked);
+  Expect.isNull(unlinked.previous);
+  Expect.isNull(unlinked.next);
+  list.add(unlinked);
+  Expect.isNull(unlinked.next);
+  Expect.equals(1, unlinked.previous.value);
+}
+
 testInsert() {
   // Insert last.
   var list = new LinkedList<MyEntry>();
@@ -168,6 +217,8 @@
 }
 
 main() {
+  testPreviousNext();
+  testUnlinked();
   testInsert();
   testRemove();
   testBadAdd();
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index e5ec3ae..1eaae3f 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -85,7 +85,8 @@
 
   TestCase _makeNormalTestCase(name, expectations) {
     var command = CommandBuilder.instance.getProcessCommand(
-        'custom', Platform.executable, [Platform.script.toFilePath(), name],
+        'custom', Platform.executable,
+        ['--package-root=${Platform.packageRoot}', Platform.script.toFilePath(), name],
         {});
     return _makeTestCase(name, DEFAULT_TIMEOUT, command, expectations);
   }
diff --git a/tests/standalone/packages_file_test.dart b/tests/standalone/packages_file_test.dart
new file mode 100644
index 0000000..719d3d7
--- /dev/null
+++ b/tests/standalone/packages_file_test.dart
@@ -0,0 +1,975 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+import "dart:convert" show JSON;
+import "package:path/path.dart" as p;
+import "package:async_helper/async_helper.dart";
+
+/// Root directory of generated files.
+/// Path contains trailing slash.
+/// Each configuration gets its own sub-directory.
+Directory fileRoot;
+/// Shared HTTP server serving the files in [httpFiles].
+/// Each configuration gets its own "sub-dir" entry in `httpFiles`.
+HttpServer httpServer;
+/// Directory structure served by HTTP server.
+Map<String, dynamic> httpFiles = {};
+/// List of configurations.
+List<Configuration> configurations = [];
+/// Collection of failing tests and their failure messages.
+///
+/// Each test may fail in more than one way.
+var failingTests = <String, List<String>>{};
+
+main() async {
+  asyncStart();
+  await setUp();
+
+  await runTests();                          /// 01: ok
+  await runTests([spawn]);                   /// 02: ok
+  await runTests([spawn, spawn]);            /// 03: ok
+  await runTests([spawnUriInherit]);         /// 04: ok
+  await runTests([spawnUriInherit, spawn]);  /// 05: ok
+  await runTests([spawn, spawnUriInherit]);  /// 06: ok
+
+  // Test that spawning a new VM with file paths instead of URIs as arguments
+  // gives the same URIs in the internal values.
+  await runTests([asPath]);                  /// 07: ok
+
+  // Test that spawnUri can reproduce the behavior of VM command line parameters
+  // exactly.
+  // (Don't run all configuration combinations in the same test, so
+  // unroll the configurations into multiple groups and run each group
+  // as its own multitest.
+  {
+    var groupCount = 8;
+    var groups = new List.generate(8, (_)=>[]);
+    for (int i = 0; i < configurations.length; i++) {
+      groups[i % groupCount].add(configurations[i]);
+    }
+    var group = -1;
+    group = 0;                               /// 10: ok
+    group = 1;                               /// 11: ok
+    group = 2;                               /// 12: ok
+    group = 3;                               /// 13: ok
+    group = 4;                               /// 14: ok
+    group = 5;                               /// 15: ok
+    group = 6;                               /// 16: ok
+    group = 7;                               /// 17: ok
+    if (group >= 0) {
+      for (var other in groups[group]) {
+        await runTests([spawnUriOther(other)]);
+      }
+    }
+  }
+
+
+  await tearDown();
+
+  if (failingTests.isNotEmpty) {
+    print("Errors found in tests:");
+    failingTests.forEach((test, actual) {
+      print("$test:\n  ${actual.join("\n  ")}");
+    });
+    exit(255);
+  }
+
+  asyncEnd();
+}
+
+/// Test running the test of the configuration through [Isolate.spawn].
+///
+/// This should not change the expected results compared to running it
+/// directly.
+Configuration spawn(Configuration conf) {
+  // TODO(26555): Clean up when fixed.
+  // TEMPORARY FIX FOR ISSUE #26555 (http://dartbug.com/26555)
+  if (conf.expect["iroot"] == null &&
+      conf.expect["iconf"] == null &&
+      conf.expect["pconf"] != null) {
+    // The spawned isolate will do a search for a package file or root,
+    // which is not what the original did. Skip test for now.
+    return null;
+  }
+  // REMOVE WHEN ISSUE FIXED!
+  return conf.update(
+    description: conf.description + "/spawn",
+    main: "spawnMain",
+    newArgs: [conf.mainType],
+    // TEMPORARY FIX FOR ISSUE #26555 (http://dartbug.com/26555)
+    expect: {
+      "proot": conf.expect["iroot"],
+      "pconf": conf.expect["iconf"],
+    }
+    // REMOVE WHEN ISSUE FIXED!
+  );
+}
+
+/// Tests running a spawnUri on top of the configuration before testing.
+///
+/// The `spawnUri` call has no explicit root or config parameter, and
+/// shouldn't search for one, so it implicitly inherits the current isolate's
+/// actual root or configuration.
+Configuration spawnUriInherit(Configuration conf) {
+  if (conf.expect["iroot"] == null &&
+      conf.expect["iconf"] == null &&
+      conf.expect["pconf"] != null) {
+    // This means that the specified configuration file didn't exist.
+    // spawning a new URI to "inherit" that will actually do an automatic
+    // package resolution search with results that are unpredictable.
+    // That behavior will be tested in a setting where we have more control over
+    // the files around the spawned URI.
+    return null;
+  }
+  return conf.update(
+    description: conf.description + "/spawnUri-inherit",
+    main: "spawnUriMain",
+    // encode null parameters as "-". Windows fails if using empty string.
+    newArgs: [conf.mainFile, "-", "-", "false"],
+    expect: {
+      "proot": conf.expect["iroot"],
+      "pconf": conf.expect["iconf"],
+    }
+  );
+}
+
+/// Tests running a spawnUri with an explicit configuration different
+/// from the original configuration.
+///
+/// Duplicates the explicit parameters as arguments to the spawned isolate.
+ConfigurationTransformer spawnUriOther(Configuration other) {
+  return (Configuration conf) {
+    bool search = (other.config == null) && (other.root == null);
+    return conf.update(
+      description: "${conf.description} -spawnUri-> ${other.description}",
+      main: "spawnUriMain",
+      newArgs: [other.mainFile,
+                other.config ?? "-", other.root ?? "-", "$search"],
+      expect: other.expect
+    );
+  };
+}
+
+
+/// Convert command line parameters to file paths.
+///
+/// This only works on the command line, not with `spawnUri`.
+Configuration asPath(Configuration conf) {
+  bool change = false;
+
+  String toPath(String string) {
+    if (string == null) return null;
+    if (string.startsWith("file:")) {
+      change = true;
+      return new File.fromUri(Uri.parse(string)).path;
+    }
+    return string;
+  }
+
+  var mainFile = toPath(conf.mainFile);
+  var root = toPath(conf.root);
+  var config = toPath(conf.config);
+  if (!change) return null;
+  return conf.update(description: conf.description + "/as path",
+                     mainFile: mainFile, root: root, config: config);
+}
+
+/// --------------------------------------------------------------
+
+
+Future setUp() async {
+  fileRoot = createTempDir();
+  // print("FILES: $fileRoot");
+  httpServer = await startServer(httpFiles);
+  // print("HTTPS: ${httpServer.address.address}:${httpServer.port}");
+  createConfigurations();
+}
+
+Future tearDown() async {
+  fileRoot.deleteSync(recursive: true);
+  await httpServer.close();
+}
+
+typedef Configuration ConfigurationTransformer(Configuration conf);
+
+Future runTests([List<ConfigurationTransformer> transformations]) async {
+  outer: for (var config in configurations) {
+    if (transformations != null) {
+      for (int i = transformations.length - 1; i >= 0; i--) {
+        config = transformations[i](config);
+        if (config == null) {
+          continue outer;  // Can be used to skip some tests.
+        }
+      }
+    }
+    await testConfiguration(config);
+  }
+}
+
+// Creates a combination of configurations for running the Dart VM.
+//
+// The combinations covers most configurations of implicit and explicit
+// package configurations over both file: and http: file sources.
+// It also specifies the expected values of the following for a VM
+// run in that configuration.
+//
+// * `Process.packageRoot`
+// * `Process.packageConfig`
+// * `Isolate.packageRoot`
+// * `Isolate.packageRoot`
+// * `Isolate.resolvePacakgeUri` of various inputs.
+// * A variable defined in a library loaded using a `package:` URI.
+//
+// The configurations all have URIs as `root`, `config` and `mainFile` strings,
+// have empty argument lists and `mainFile` points to the the `main.dart` file.
+void createConfigurations() {
+  add(String description, String mainDir, {String root, String config,
+      Map file, Map http, Map expect}) {
+    var id = freshName("conf");
+
+    file ??= {};
+    http ??= {};
+
+    // Fix-up paths.
+    String fileUri = fileRoot.uri.resolve("$id/").toString();
+    String httpUri =
+        "http://${httpServer.address.address}:${httpServer.port}/$id/";
+
+    String fixPath(String path) {
+      return path?.replaceAllMapped(fileHttpRegexp, (match) {
+        if (path.startsWith("%file/", match.start)) return fileUri;
+        return httpUri;
+      });
+    }
+
+    void fixPaths(Map dirs) {
+      for (var name in dirs.keys) {
+        var value = dirs[name];
+        if (value is Map) {
+          Map subDir = value;
+          fixPaths(subDir);
+        } else {
+          var newValue = fixPath(value);
+          if (newValue != value) dirs[name] = newValue;
+        }
+      }
+    }
+
+    if (!mainDir.endsWith("/")) mainDir += "/";
+    // Insert main files into the main-dir map.
+    Map mainDirMap;
+    {
+      if (mainDir.startsWith("%file/")) {
+        mainDirMap = file;
+      } else {
+        mainDirMap = http;
+
+      }
+      var parts = mainDir.split('/');
+      for (int i = 1; i < parts.length - 1; i++) {
+        var dirName = parts[i];
+        mainDirMap = mainDirMap[dirName] ?? (mainDirMap[dirName] = {});
+      }
+    }
+
+    mainDirMap["main"] = testMain;
+    mainDirMap["spawnMain"] = spawnMain.replaceAll("%mainDir/", mainDir);
+    mainDirMap["spawnUriMain"] = spawnUriMain;
+
+    mainDir = fixPath(mainDir);
+    root = fixPath(root);
+    config = fixPath(config);
+    fixPaths(file);
+    fixPaths(http);
+    // These expectations are default. If not overridden the value will be
+    // expected to be null. That is, you can't avoid testing the actual
+    // value of these, you can only change what value to expect.
+    // For values not included here (commented out), the result is not tested
+    // unless a value (maybe null) is provided.
+    fixPaths(expect);
+
+    expect = {
+      "pconf":   null,
+      "proot":   null,
+      "iconf":   null,
+      "iroot":   null,
+      // "foo":   null,
+      "foo/":    null,
+      "foo/bar": null,
+      "foo.x":  "qux",
+    }..addAll(expect ?? const {});
+
+    // Add http files to the http server.
+    if (http.isNotEmpty) {
+      httpFiles[id] = http;
+    }
+    // Add file files to the file system.
+    if (file.isNotEmpty) {
+      createFiles(fileRoot, id, file);
+    }
+
+    configurations.add(new Configuration(
+        description: description,
+        root: root,
+        config: config,
+        mainFile: mainDir + "main.dart",
+        args: const [],
+        expect: expect));
+  }
+
+  // The `test` function can generate file or http resources.
+  // It replaces "%file/" with URI of the root directory of generated files and
+  // "%http/" with the URI of the HTTP server's root in appropriate contexts
+  // (all file contents and parameters).
+
+  // Tests that only use one scheme to access files.
+  for (var scheme in ["file", "http"]) {
+
+    /// Run a test in the current scheme.
+    ///
+    /// The files are served either through HTTP or in a local directory.
+    /// Use "%$scheme/" to refer to the root of the served files.
+    addScheme(description, main, {expect, files, args, root, config}) {
+      add("$scheme/$description", main, expect: expect,
+        root: root, config: config,
+        file: (scheme == "file") ? files : null,
+        http: (scheme == "http") ? files : null);
+    }
+
+    {
+      // No parameters, no .packages files or packages/ dir.
+      // A "file:" source realizes there is no configuration and can't resolve
+      // any packages, but a "http:" source assumes a "packages/" directory.
+      addScheme("no resolution",
+        "%$scheme/",
+        files: {},
+        expect: (scheme == "file") ? {
+          "foo.x": null
+        } : {
+          "iroot": "%http/packages/",
+          "foo/": "%http/packages/foo/",
+          "foo/bar": "%http/packages/foo/bar",
+          "foo.x": null,
+        });
+    }
+
+    {
+      // No parameters, no .packages files,
+      // packages/ dir exists and is detected.
+      var files = {"packages": fooPackage};
+      addScheme("implicit packages dir","%$scheme/",
+        files: files,
+        expect: {
+          "iroot": "%$scheme/packages/",
+          "foo/": "%$scheme/packages/foo/",
+          "foo/bar": "%$scheme/packages/foo/bar",
+        });
+    }
+
+    {
+      // No parameters, no .packages files in current dir, but one in parent,
+      // packages/ dir exists and is used.
+      //
+      // Should not detect the .packages file in parent directory.
+      // That file is empty, so if it is used, the system cannot resolve "foo".
+      var files = {"sub": {"packages": fooPackage},
+                   ".packages": ""};
+      addScheme("implicit packages dir overrides parent .packages",
+        "%$scheme/sub/",
+        files: files,
+        expect: {
+          "iroot": "%$scheme/sub/packages/",
+          "foo/": "%$scheme/sub/packages/foo/",
+          "foo/bar": "%$scheme/sub/packages/foo/bar",
+          // "foo.x": "qux",  // Blocked by issue http://dartbug.com/26482
+        });
+    }
+
+    {
+      // No parameters, a .packages file next to entry is found and used.
+      // A packages/ directory is ignored.
+      var files = {".packages": "foo:pkgs/foo/",
+                   "packages": {},
+                   "pkgs": fooPackage};
+      addScheme("implicit .packages file", "%$scheme/",
+        files: files,
+        expect: {
+          "iconf": "%$scheme/.packages",
+          "foo/": "%$scheme/pkgs/foo/",
+          "foo/bar": "%$scheme/pkgs/foo/bar",
+        });
+    }
+
+    {
+      // No parameters, a .packages file in parent dir, no packages/ dir.
+      // With a file: URI, find the .packages file.
+      // WIth a http: URI, assume a packages/ dir.
+      var files = {"sub": {},
+                   ".packages": "foo:pkgs/foo/",
+                   "pkgs": fooPackage};
+      addScheme(".packages file in parent", "%$scheme/sub/",
+        files: files,
+        expect: (scheme == "file") ? {
+          "iconf": "%file/.packages",
+          "foo/": "%file/pkgs/foo/",
+          "foo/bar": "%file/pkgs/foo/bar",
+        } : {
+          "iroot": "%http/sub/packages/",
+          "foo/": "%http/sub/packages/foo/",
+          "foo/bar": "%http/sub/packages/foo/bar",
+          "foo.x": null,
+        });
+    }
+
+    {
+      // Specified package root that doesn't exist.
+      // Ignores existing .packages file and packages/ dir.
+      addScheme("explicit root not there",
+        "%$scheme/",
+        files: {"packages": fooPackage,
+                ".packages": "foo:%$scheme/packages/"},
+        root: "%$scheme/notthere/",
+        expect: {
+          "proot": "%$scheme/notthere/",
+          "iroot": "%$scheme/notthere/",
+          "foo/": "%$scheme/notthere/foo/",
+          "foo/bar": "%$scheme/notthere/foo/bar",
+          "foo.x": null,
+        });
+    }
+
+    {
+      // Specified package config that doesn't exist.
+      // Ignores existing .packages file and packages/ dir.
+      addScheme("explicit config not there",
+        "%$scheme/",
+        files: {".packages": "foo:packages/foo/",
+                "packages": fooPackage},
+        config: "%$scheme/.notthere",
+        expect: {
+          "pconf": "%$scheme/.notthere",
+          "iconf": null,   // <- Only there if actually loaded (unspecified).
+          "foo/": null,
+          "foo/bar": null,
+          "foo.x": null,
+        });
+    }
+
+    {
+      // Specified package root with no trailing slash.
+      // The Platform.packageRoot and Isolate.packageRoot has a trailing slash.
+      var files = {".packages": "foo:packages/foo/",
+                   "packages": {},
+                   "pkgs": fooPackage};
+      addScheme("explicit package root, no slash", "%$scheme/",
+        files: files,
+        root: "%$scheme/pkgs",
+        expect: {
+          "proot": "%$scheme/pkgs/",
+          "iroot": "%$scheme/pkgs/",
+          "foo/": "%$scheme/pkgs/foo/",
+          "foo/bar": "%$scheme/pkgs/foo/bar",
+        });
+    }
+
+    {
+      // Specified package root with trailing slash.
+      var files = {".packages": "foo:packages/foo/",
+                   "packages": {},
+                   "pkgs": fooPackage};
+      addScheme("explicit package root, slash", "%$scheme/",
+        files: files,
+        root: "%$scheme/pkgs",
+        expect: {
+          "proot": "%$scheme/pkgs/",
+          "iroot": "%$scheme/pkgs/",
+          "foo/": "%$scheme/pkgs/foo/",
+          "foo/bar": "%$scheme/pkgs/foo/bar",
+        });
+    }
+
+    {
+      // Specified package config.
+      var files = {".packages": "foo:packages/foo/",
+                   "packages": {},
+                   ".pkgs": "foo:pkgs/foo/",
+                   "pkgs": fooPackage};
+      addScheme("explicit package config file", "%$scheme/",
+        files: files,
+        config: "%$scheme/.pkgs",
+        expect: {
+          "pconf": "%$scheme/.pkgs",
+          "iconf": "%$scheme/.pkgs",
+          "foo/": "%$scheme/pkgs/foo/",
+          "foo/bar": "%$scheme/pkgs/foo/bar",
+        });
+    }
+
+    {
+      // Specified package config as data: URI.
+      // The package config can be specified as a data: URI.
+      // (In that case, relative URI references in the config file won't work).
+      var files = {".packages": "foo:packages/foo/",
+                   "packages": {},
+                   "pkgs": fooPackage};
+      var dataUri = "data:,foo:%$scheme/pkgs/foo/\n";
+      addScheme("explicit data: config file", "%$scheme/",
+        files: files,
+        config: dataUri,
+        expect: {
+          "pconf": dataUri,
+          "iconf": dataUri,
+          "foo/": "%$scheme/pkgs/foo/",
+          "foo/bar": "%$scheme/pkgs/foo/bar",
+        });
+    }
+  }
+
+  // Tests where there are files on both http: and file: sources.
+
+  for (var entryScheme in const ["file", "http"]) {
+    for (var pkgScheme in const ["file", "http"]) {
+      // Package root.
+      if (entryScheme != pkgScheme) {
+        // Package dir and entry point on different schemes.
+        var files = {};
+        var https = {};
+        (entryScheme == "file" ? files : https)["main"] = testMain;
+        (pkgScheme == "file" ? files : https)["pkgs"] = fooPackage;
+        add("$pkgScheme pkg/$entryScheme main", "%$entryScheme/",
+          file: files, http: https,
+          root: "%$pkgScheme/pkgs/",
+          expect: {
+            "proot": "%$pkgScheme/pkgs/",
+            "iroot": "%$pkgScheme/pkgs/",
+            "foo/": "%$pkgScheme/pkgs/foo/",
+            "foo/bar": "%$pkgScheme/pkgs/foo/bar",
+            "foo.x": "qux",
+          });
+      }
+      // Package config. The configuration file may also be on either source.
+      for (var configScheme in const ["file", "http"]) {
+        // Don't do the boring stuff!
+        if (entryScheme == configScheme && entryScheme == pkgScheme) continue;
+        // Package config, packages and entry point not all on same scheme.
+        var files = {};
+        var https = {};
+        (entryScheme == "file" ? files : https)["main"] = testMain;
+        (configScheme == "file" ? files : https)[".pkgs"] =
+            "foo:%$pkgScheme/pkgs/foo/\n";
+        (pkgScheme == "file" ? files : https)["pkgs"] = fooPackage;
+        add("$pkgScheme pkg/$configScheme config/$entryScheme main",
+          "%$entryScheme/",
+          file: files, http: https,
+          config: "%$configScheme/.pkgs",
+          expect: {
+            "pconf": "%$configScheme/.pkgs",
+            "iconf": "%$configScheme/.pkgs",
+            "foo/": "%$pkgScheme/pkgs/foo/",
+            "foo/bar": "%$pkgScheme/pkgs/foo/bar",
+            "foo.x": "qux",
+          });
+      }
+    }
+  }
+}
+
+
+// ---------------------------------------------------------
+// Helper functionality.
+
+var fileHttpRegexp = new RegExp(r"%(?:file|http)/");
+
+// Executes a test in a configuration.
+//
+// The test must specify which main file to use
+// (`main`, `spawnMain` or `spawnUriMain`)
+// and any arguments which will be used by `spawnMain` and `spawnUriMain`.
+//
+// The [expect] map may be used to override the expectations of the
+// configuration on a value-by-value basis. Passing, e.g., `{"pconf": null}`
+// will override only the `pconf` (`Platform.packageConfig`) expectation.
+Future testConfiguration(Configuration conf) async {
+  print("-- ${conf.description}");
+  var description = conf.description;
+  try {
+    var output = await execDart(conf.mainFile,
+                                root: conf.root,
+                                config: conf.config,
+                                scriptArgs: conf.args);
+    match(JSON.decode(output), conf.expect, description, output);
+  } catch (e, s) {
+    // Unexpected error calling execDart or parsing the result.
+    // Report it and continue.
+    print("ERROR running $description: $e\n$s");
+    failingTests.putIfAbsent(description, () => []).add("$e");
+  }
+}
+
+
+/// Test that the output of running testMain matches the expectations.
+///
+/// The output is a string which is parse as a JSON literal.
+/// The resulting map is always mapping strings to strings, or possibly `null`.
+/// The expectations can have non-string values other than null,
+/// they are `toString`'ed  before being compared (so the caller can use a URI
+/// or a File/Directory directly as an expectation).
+void match(Map actuals, Map expectations, String desc, String actualJson) {
+  for (var key in expectations.keys) {
+    var expectation = expectations[key]?.toString();
+    var actual = actuals[key];
+    if (expectation != actual) {
+      print("ERROR: $desc: $key: Expected: <$expectation> Found: <$actual>");
+      failingTests.putIfAbsent(desc, ()=>[]).add(
+          "$key: $expectation != $actual");
+    }
+  }
+}
+
+const String improt = "import";  // Avoid multitest import rewriting.
+
+/// Script that prints the current state and the result of resolving
+/// a few package URIs. This script will be invoked in different settings,
+/// and the result will be parsed and compared to the expectations.
+const String testMain = """
+$improt "dart:convert" show JSON;
+$improt "dart:io" show Platform, Directory;
+$improt "dart:isolate" show Isolate;
+$improt "package:foo/foo.dart" deferred as foo;
+main(_) async {
+  String platformRoot = await Platform.packageRoot;
+  String platformConfig = await Platform.packageConfig;
+  Directory cwd = Directory.current;
+  Uri script = Platform.script;
+  Uri isolateRoot = await Isolate.packageRoot;
+  Uri isolateConfig = await Isolate.packageConfig;
+  Uri base = Uri.base;
+  Uri res1 = await Isolate.resolvePackageUri(Uri.parse("package:foo"));
+  Uri res2 = await Isolate.resolvePackageUri(Uri.parse("package:foo/"));
+  Uri res3 = await Isolate.resolvePackageUri(Uri.parse("package:foo/bar"));
+  String fooX = await foo
+    .loadLibrary()
+    .timeout(const Duration(seconds: 1))
+    .then((_) => foo.x, onError: (_) => null);
+  print(JSON.encode({
+    "cwd": cwd.path,
+    "base": base?.toString(),
+    "script": script?.toString(),
+    "proot": platformRoot,
+    "pconf": platformConfig,
+    "iroot" : isolateRoot?.toString(),
+    "iconf" : isolateConfig?.toString(),
+    "foo": res1?.toString(),
+    "foo/": res2?.toString(),
+    "foo/bar": res3?.toString(),
+    "foo.x": fooX?.toString(),
+  }));
+}
+""";
+
+/// Script that spawns a new Isolate using Isolate.spawnUri.
+///
+/// Takes URI of target isolate, package config, package root and
+/// automatic package resolution-flag parameters as command line arguments.
+/// Any further arguments are forwarded to the spawned isolate.
+const String spawnUriMain = """
+$improt "dart:isolate";
+$improt "dart:async";
+main(args) async {
+  Uri target = Uri.parse(args[0]);
+  Uri config = (args[1] == "-") ? null : Uri.parse(args[1]);
+  Uri root = (args[2] == "-") ? null : Uri.parse(args[2]);
+  bool search = args[3] == "true";
+  var restArgs = args.skip(4).toList();
+  // Port keeps isolate alive until spawned isolate terminates.
+  var port = new RawReceivePort();
+  port.handler = (res) async {
+    port.close();  // Close on exit or first error.
+    if (res != null) {
+      await new Future.error(res[0], new StackTrace.fromString(res[1]));
+    }
+  };
+  Isolate.spawnUri(target, restArgs, null,
+                   packageRoot: root, packageConfig: config,
+                   automaticPackageResolution: search,
+                   onError: port.sendPort, onExit: port.sendPort);
+}
+""";
+
+/// Script that spawns a new Isolate using Isolate.spawn.
+///
+/// Uses the first argument to select which target to spawn.
+/// Should be either "test", "uri" or "spawn".
+const String spawnMain = """
+$improt "dart:async";
+$improt "dart:isolate";
+$improt "%mainDir/main.dart" as test;
+$improt "%mainDir/spawnUriMain.dart" as spawnUri;
+main(List<String> args) async {
+  // Port keeps isolate alive until spawned isolate terminates.
+  var port = new RawReceivePort();
+  port.handler = (res) async {
+    port.close();  // Close on exit or first error.
+    if (res != null) {
+      await new Future.error(res[0], new StackTrace.fromString(res[1]));
+    }
+  };
+  var arg = args.first;
+  var rest = args.skip(1).toList();
+  var target;
+  if (arg == "main") {
+    target = test.main;
+  } else if (arg == "spawnUriMain") {
+    target = spawnUri.main;
+  } else {
+    target = main;
+  }
+  Isolate.spawn(target, rest, onError: port.sendPort, onExit: port.sendPort);
+}
+""";
+
+/// A package directory containing only one package, "foo", with one file.
+const Map fooPackage = const { "foo": const { "foo": "var x = 'qux';" }};
+
+
+/// Runs the Dart executable with the provided parameters.
+///
+/// Captures and returns the output.
+Future<String> execDart(String script,
+                        {String root, String config,
+                         Iterable<String> scriptArgs}) async {
+  var checked = false;
+  assert((checked = true));
+  // TODO: Find a way to change CWD before running script.
+  var executable = Platform.executable;
+  var args = [];
+  if (checked) args.add("--checked");
+  if (root != null) args.add("--package-root=$root");
+  if (config != null) args.add("--packages=$config");
+  args.add(script);
+  if (scriptArgs != null) {
+    args.addAll(scriptArgs);
+  }
+  return Process.run(executable, args).then((results) {
+    if (results.exitCode != 0 || results.stderr.isNotEmpty) {
+      throw results.stderr;
+    }
+    return results.stdout;
+  });
+}
+
+/// Creates a number of files and subdirectories.
+///
+/// The [content] is the content of the directory itself. The map keys are
+/// names and the values are either strings that represent Dart file contents
+/// or maps that represent subdirectories.
+void createFiles(Directory tempDir, String subDir, Map content) {
+  Directory createDir(Directory base, String name) {
+    Directory newDir = new Directory(p.join(base.path, name));
+    newDir.createSync();
+    return newDir;
+  }
+
+  void createTextFile(Directory base, String name, String content) {
+    File newFile = new File(p.join(base.path, name));
+    newFile.writeAsStringSync(content);
+  }
+
+  void createRecursive(Directory dir, Map map) {
+    for (var name in map.keys) {
+      var content = map[name];
+      if (content is String) {
+        // If the name starts with "." it's a .packages file, otherwise it's
+        // a dart file. Those are the only files we care about in this test.
+        createTextFile(dir,
+                       name.startsWith(".") ? name : name + ".dart",
+                       content);
+      } else {
+        assert(content is Map);
+        var subdir = createDir(dir, name);
+        createRecursive(subdir, content);
+      }
+    }
+  }
+
+  createRecursive(createDir(tempDir, subDir), content);
+}
+
+/// Start an HTTP server which serves a directory/file structure.
+///
+/// The directories and files are described by [files].
+///
+/// Each map key is an entry in a directory. A `Map` value is a sub-directory
+/// and a `String` value is a text file.
+/// The file contents are run through [fixPaths] to allow them to be self-
+/// referential.
+Future<HttpServer> startServer(Map files) async {
+  return (await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0))
+      ..forEach((request) {
+        var result = files;
+        onFailure: {
+          for (var part in request.uri.pathSegments) {
+            if (part.endsWith(".dart")) {
+              part = part.substring(0, part.length - 5);
+            }
+            if (result is Map) {
+              result = result[part];
+            } else {
+              break onFailure;
+            }
+          }
+          if (result is String) {
+            request.response..write(result)
+                            ..close();
+            return;
+          }
+        }
+        request.response..statusCode = HttpStatus.NOT_FOUND
+                        ..close();
+      });
+}
+
+// Counter used to avoid reusing temporary file or directory names.
+//
+// Used when adding extra files to an existing directory structure,
+// and when creating temporary directories.
+//
+// Some platform temporary-directory implementations are timer based,
+// and creating two temp-dirs withing a short duration may cause a collision.
+int tmpNameCounter = 0;
+
+// Fresh file name.
+String freshName([String base = "tmp"]) => "$base${tmpNameCounter++}";
+
+Directory createTempDir() {
+  return Directory.systemTemp.createTempSync(freshName("pftest-"));
+}
+
+typedef void ConfigUpdate(Configuration configuration);
+
+/// The configuration for a single test.
+class Configuration {
+  /// The "description" of the test - a description of the set-up.
+  final String description;
+  /// The package root parameter passed to the Dart isolate.
+  ///
+  /// At most one of [root] and [config] should be supplied. If both are
+  /// omitted, a VM will search for a packages file or dir.
+  final String root;
+  /// The package configuration file location passed to the Dart isolate.
+  final String config;
+  /// Path to the main file to run.
+  final String mainFile;
+  /// List of arguments to pass to the main function.
+  final List<String> args;
+  /// The expected values for `Platform.package{Root,Config}`,
+  /// `Isolate.package{Root,Config}` and resolution of package URIs
+  /// in a `foo` package.
+  ///
+  /// The results are found by running the `main.dart` file inside [mainDir].
+  /// The tests can run this file after doing other `spawn` or `spawnUri` calls.
+  final Map expect;
+
+  Configuration({this.description,
+                 this.root,
+                 this.config,
+                 this.mainFile,
+                 this.args,
+                 this.expect});
+
+  // Gets the type of main file, one of `main`, `spawnMain` or `spawnUriMain`.
+  String get mainType {
+    var lastSlash = mainFile.lastIndexOf("/");
+    if (lastSlash < 0) {
+      // Assume it's a Windows path.
+      lastSlash = mainFile.lastIndexOf(r"\");
+    }
+    var name = mainFile.substring(lastSlash + 1, mainFile.length - 5);
+    assert(name == "main" || name == "spawnMain" || name == "spawnUriMain");
+    return name;
+  }
+
+  String get mainPath {
+    var lastSlash = mainFile.lastIndexOf("/");
+    if (lastSlash < 0) {
+      // Assume it's a Windows path.
+      lastSlash = mainFile.lastIndexOf(r"\");
+    }
+    return mainFile.substring(0, lastSlash + 1);
+  }
+
+  /// Create a new configuration from the old one.
+  ///
+  /// [description] is new description.
+  ///
+  /// [main] is one of `main`, `spawnMain` or `spawnUriMain`, and changes
+  /// the [Configuration.mainFile] to a different file in the same directory.
+  ///
+  /// [mainFile] overrides [Configuration.mainFile] completely, and ignores
+  /// [main].
+  ///
+  /// [newArgs] are prepended to the existing [Configuration.args].
+  ///
+  /// [args] overrides [Configuration.args] completely and ignores [newArgs].
+  ///
+  /// [expect] overrides individual expectations.
+  ///
+  /// [root] and [config] overrides the existing values.
+  Configuration update({
+      String description,
+      String main,
+      String mainFile,
+      String root,
+      String config,
+      List<String> args,
+      List<String> newArgs,
+      Map expect
+    }) {
+    return new Configuration(
+      description: description ?? this.description,
+      root: root ?? this.root,
+      config: config ?? this.config,
+      mainFile: mainFile ??
+          ((main == null) ? this.mainFile : "${this.mainPath}$main.dart"),
+      args:
+          args ?? (<String>[]..addAll(newArgs ?? const <String>[])
+                             ..addAll(this.args)),
+      expect: expect == null
+          ? this.expect
+          : new Map.from(this.expect)..addAll(expect ?? const {}));
+  }
+
+  // For debugging.
+  String toString() {
+    return "Configuration($description\n"
+      "  root  : $root\n"
+      "  config: $config\n"
+      "  main  : $mainFile\n"
+      "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
+      ") : expect {\n${expect.keys.map((k) =>
+           '  "$k"'.padRight(6) + ":${JSON.encode(expect[k])}\n").join()}"
+      "}";
+  }
+}
+
+
+// Inserts the file with generalized [name] at [path] with [content].
+//
+// The [path] is a directory where the file is created. It must start with
+// either '%file/' or '%http/' to select the structure to put it into.
+//
+// The [name] should not have a trailing ".dart" for Dart files. Any file
+// not starting with "." is assumed to be a ".dart" file.
+void insertFileAt(Map file, Map http,
+                  String path, String name, String content) {
+  var parts = path.split('/').toList();
+  var dir = (parts[0] == "%file") ? file : http;
+  for (var i = 1; i < parts.length - 1; i++) {
+    var entry = parts[i];
+    dir = dir[entry] ?? (dir[entry] = {});
+  }
+  dir[name] = content;
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 4ab080c..d0cad39 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -7,6 +7,9 @@
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
 
+packages_file_test: Pass, Slow
+packages_file_test/none: Skip   # contains no tests.
+
 package/invalid_uri_test: Fail, OK # CompileTimeErrors intentionally
 package/scenarios/packages_file_strange_formatting/empty_package_dir_test: Fail, OK # CompileTimeErrors intentionally
 package/scenarios/empty_packages_file/empty_packages_file_discovery_test: Fail, OK # CompileTimeErrors intentionally
@@ -18,6 +21,9 @@
 
 issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
 
+[ ($runtime != vm || $compiler != none) && $compiler != dartanalyzer && $compiler != dart2analyzer ]
+packages_file_test: Skip # Uses Platform.executable
+
 [ ($runtime != vm && $runtime != dart_precompiled && $runtime != dart_app) && ($runtime != drt || $compiler != none)) ]
 no_assert_test: Fail, OK # This is testing a vm flag.
 
@@ -181,6 +187,7 @@
 io/skipping_dart2js_compilations_test: Fail # Issue 19551.
 verbose_gc_to_bmu_test: Skip
 io/platform_resolved_executable_test/06: RuntimeError  # Issue 23641
+io/process_sync_test: Pass, Timeout # Issue 24596
 io/sleep_test: Pass, Fail # Issue 25757
 
 [ $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv5te && $mode == debug ]
diff --git a/tools/.packages b/tools/.packages
new file mode 100644
index 0000000..888665a
--- /dev/null
+++ b/tools/.packages
@@ -0,0 +1,9 @@
+# The test runner logic depends on `package:yaml`, because it is not structured
+# as a pub package, we generated this file manually to contain all of yaml's
+# transitive dependencies.
+charcode:../third_party/pkg/charcode/lib/
+collection:../third_party/pkg/collection/lib/
+path:../third_party/pkg/path/lib/
+source_span:../third_party/pkg/source_span/lib/
+string_scanner:../third_party/pkg/string_scanner/lib/
+yaml:../third_party/pkg/yaml/lib/
diff --git a/tools/VERSION b/tools/VERSION
index 64279a9..a19c07d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 17
+MINOR 18
 PATCH 0
-PRERELEASE 6
-PRERELEASE_PATCH 4
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/dartium/buildbot_annotated_steps.py b/tools/dartium/buildbot_annotated_steps.py
index a4d7fc3..61faf75 100755
--- a/tools/dartium/buildbot_annotated_steps.py
+++ b/tools/dartium/buildbot_annotated_steps.py
@@ -30,9 +30,12 @@
 
 def RunDartTests(mode, component, suite, arch, checked, test_filter=None,
                  is_win_ninja=False):
-  """Runs the Dart WebKit Layout tests.
+  """Runs tests using the Dart test.py or the layout test runner.
   """
-  cmd = [sys.executable]
+  cmd = []
+  if sys.platform.startswith('linux'):
+    cmd = ['xvfb-run', '-a']
+  cmd.append(sys.executable)
   script = os.path.join(DART_PATH, 'tools', 'dartium', 'test.py')
   cmd.append(script)
   cmd.append('--buildbot')
diff --git a/tools/dartium/upload_steps.py b/tools/dartium/upload_steps.py
index 2ab3fc8..d0a7cb0 100755
--- a/tools/dartium/upload_steps.py
+++ b/tools/dartium/upload_steps.py
@@ -238,18 +238,21 @@
   dir_name = os.path.dirname(layout_test_results_dir)
   base_name = os.path.basename(layout_test_results_dir)
   cwd = os.getcwd()
-  os.chdir(dir_name)
+  try:
+    os.chdir(dir_name)
 
-  archive_name = 'layout_test_results.zip'
-  archive.ZipDir(archive_name, base_name)
+    archive_name = 'layout_test_results.zip'
+    archive.ZipDir(archive_name, base_name)
 
-  target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
-                     checked + '-' + version + '.zip'])
-  status = OldUploadFile(os.path.abspath(archive_name), GS_SITE + target)
-  os.remove(archive_name)
-  if status == 0:
-    print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
-  else:
+    target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
+                       checked + '-' + version + '.zip'])
+    status = OldUploadFile(os.path.abspath(archive_name), GS_SITE + target)
+    os.remove(archive_name)
+    if status == 0:
+      print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
+    else:
+      print '@@@STEP_FAILURE@@@'
+  except:
     print '@@@STEP_FAILURE@@@'
   os.chdir(cwd)
 
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index 8c8343c..015ae81 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -8,8 +8,8 @@
 # Now we need to override some settings and add some new ones.
 
 vars.update({
-  "dartium_chromium_commit": "b6b6b76417ce80120ee48b662a7c7ef257723494",
-  "dartium_webkit_commit": "586bcb7d9e5c46c84a3c9d1f43f26343da78548a",
+  "dartium_chromium_commit": "ef7d4ae18c646aea34c07a7ef62de7342c3b8c12",
+  "dartium_webkit_commit": "b7c1bc7268a2b3bdd0cbf59998d99624b3e1a4e9",
   "chromium_base_revision": "338390",
 
   # We use mirrors of all github repos to guarantee reproducibility and
@@ -68,7 +68,7 @@
   "web_components_rev": "@6349e09f9118dce7ae1b309af5763745e25a9d61",
   "WebCore_rev": "@a86fe28efadcfc781f836037a80f27e22a5dad17",
 
-  "co19_rev": "@3ed795ea02e022ef19c77cf1b6095b7c8f5584d0",
+  "co19_rev": "@3f0a4bc9a080a792cdf5f093147a900f99ea301f",
 })
 
 deps.update({
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index 8708d6d..2aa561b 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -19,8 +19,17 @@
       # order.
       'Dart_Android_Base': {
         'abstract': 1,
-        'cflags': [ '-Wno-abi', '-Wall', '-W', '-Wno-unused-parameter',
-                    '-Wnon-virtual-dtor', '-fno-rtti', '-fno-exceptions',],
+        'cflags': [
+          # No -Werror due to warnings in stl.
+          '<@(common_gcc_warning_flags)',
+          '-Wnon-virtual-dtor',
+          '-Wvla',
+          '-Woverloaded-virtual',
+          '-g3',
+          '-ggdb3',
+          '-fno-rtti',
+          '-fno-exceptions',
+        ],
         'target_conditions': [
           ['_toolset=="target"', {
             'defines': [
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 05292bf..8b61127 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -18,16 +18,11 @@
           '<@(common_gcc_warning_flags)',
           '-Wnon-virtual-dtor',
           '-Wvla',
-          '-Wno-conversion-null',
           '-Woverloaded-virtual',
           '-g3',
           '-ggdb3',
-          # TODO(iposva): Figure out if we need to pass anything else.
-          #'-ansi',
           '-fno-rtti',
           '-fno-exceptions',
-          # '-fvisibility=hidden',
-          # '-fvisibility-inlines-hidden',
           '-fstack-protector',
           '-Wa,--noexecstack',
         ],
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index adcc1d4..68a08c5 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -10,6 +10,11 @@
     'configurations': {
       'Dart_Win_Base': {
         'abstract': 1,
+        'msvs_configuration_attributes': {
+          'OutputDirectory': '<(DEPTH)\\out\\$(ConfigurationName)',
+          'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
+          'CharacterSet': '1',
+        },
         'defines': [
           '_HAS_EXCEPTIONS=0',  # disable C++ exceptions use in C++ std. libs.
         ],
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index e9fed49..3f755dd 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -18,6 +18,9 @@
 // CommandOutput.exitCode in subclasses of CommandOutput.
 import "dart:io" as io;
 import "dart:math" as math;
+
+import 'package:yaml/yaml.dart';
+
 import 'android.dart';
 import 'dependency_graph.dart' as dgraph;
 import "browser_controller.dart";
@@ -463,13 +466,33 @@
   String _destinationFile;
   Map<String, Map> _dependencyOverrides;
 
-  ModifyPubspecYamlCommand._(
-      this._pubspecYamlFile, this._destinationFile, this._dependencyOverrides)
+  ModifyPubspecYamlCommand._(this._pubspecYamlFile,
+      this._destinationFile, this._dependencyOverrides)
       : super._("modify_pubspec") {
     assert(_pubspecYamlFile.endsWith("pubspec.yaml"));
     assert(_destinationFile.endsWith("pubspec.yaml"));
   }
 
+  static Map<String, Map> _filterOverrides(
+      String pubspec, Map<String, Map> overrides) {
+    if (overrides.isEmpty) return overrides;
+    var yaml = loadYaml(pubspec);
+    var deps = yaml['dependencies'];
+    var filteredOverrides = <String, Map>{};
+    if (deps != null) {
+      for (var d in deps.keys) {
+        if (!overrides.containsKey(d)) {
+          // pub depends on compiler_unsupported instead of compiler
+          // The dependency is so hackish that we currently ignore it here.
+          if (d == 'compiler_unsupported') continue;
+          throw "Repo doesn't have package $d used in $pubspec";
+        }
+        filteredOverrides[d] = overrides[d];
+      }
+    }
+    return filteredOverrides;
+  }
+
   String get reproductionCommand =>
       "Adding necessary dependency overrides to '$_pubspecYamlFile' "
       "(destination = $_destinationFile).";
@@ -485,12 +508,13 @@
     var destinationFile = new io.File(_destinationFile);
     var lockfile = new io.File(pubspecLockFile);
     return file.readAsString().then((String yamlString) {
+      var overrides = _filterOverrides(yamlString, _dependencyOverrides);
       var dependencyOverrideSection = new StringBuffer();
       if (_dependencyOverrides.isNotEmpty) {
         dependencyOverrideSection.write("\n"
             "# This section was autogenerated by test.py!\n"
             "dependency_overrides:\n");
-        _dependencyOverrides.forEach((String packageName, Map override) {
+        overrides.forEach((String packageName, Map override) {
           dependencyOverrideSection.write("  $packageName:\n");
           override.forEach((overrideKey, overrideValue) {
             dependencyOverrideSection
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 8bc8e9a..5fe73cc 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -437,6 +437,7 @@
      *  dart/
      *      pkg/PACKAGE_NAME
      *      third_party/pkg/PACKAGE_NAME
+     *      third_party/pkg_tested/PACKAGE_NAME
      *      runtime/observatory/PACKAGE_NAME
      *      sdk/lib/_internal/PACKAGE_NAME
      */
@@ -450,6 +451,7 @@
     var futures = [
       listDir(dartDir.append('pkg'), isValid),
       listDir(dartDir.append('third_party').append('pkg'), isValid),
+      listDir(dartDir.append('third_party').append('pkg_tested'), isValid),
       listDir(dartDir.append('runtime').append('observatory'), isValid),
       listDir(dartDir.append('sdk').append('lib').append('_internal'), isValid),
     ];
@@ -2235,12 +2237,10 @@
   static String outputDir(Map configuration) {
     var result = '';
     var system = configuration['system'];
-    if (system == 'linux' || system == 'android') {
+    if (system == 'linux' || system == 'android' || system == 'windows') {
       result = 'out/';
     } else if (system == 'macos') {
       result = 'xcodebuild/';
-    } else if (system == 'windows') {
-      result = 'build/';
     } else {
       throw new Exception('Unknown operating system: "$system"');
     }
diff --git a/tools/utils.py b/tools/utils.py
index c4be5af..0611bdd 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -221,7 +221,7 @@
 
 # Mapping table between OS and build output location.
 BUILD_ROOT = {
-  'win32': os.path.join('build'),
+  'win32': os.path.join('out'),
   'linux': os.path.join('out'),
   'freebsd': os.path.join('out'),
   'macos': os.path.join('xcodebuild'),
